From 830fc26df6bdbc35a796b9df6fd4fa4ba5326750 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                |   403 +
 .../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 +
 .../hal/intel/ipu6/aal/Camera3HALModule.cpp   |   233 +
 camera/hal/intel/ipu6/aal/Camera3Stream.cpp   |   663 +
 camera/hal/intel/ipu6/aal/Camera3Stream.h     |   183 +
 camera/hal/intel/ipu6/aal/HALv3Interface.h    |    32 +
 camera/hal/intel/ipu6/aal/HALv3Utils.cpp      |   144 +
 camera/hal/intel/ipu6/aal/HALv3Utils.h        |    73 +
 .../intel/ipu6/aal/IntelAEStateMachine.cpp    |   304 +
 .../hal/intel/ipu6/aal/IntelAEStateMachine.h  |   135 +
 .../intel/ipu6/aal/IntelAFStateMachine.cpp    |   437 +
 .../hal/intel/ipu6/aal/IntelAFStateMachine.h  |   145 +
 .../intel/ipu6/aal/IntelAWBStateMachine.cpp   |   227 +
 .../hal/intel/ipu6/aal/IntelAWBStateMachine.h |   131 +
 camera/hal/intel/ipu6/aal/MetadataConvert.cpp |  2269 +++
 camera/hal/intel/ipu6/aal/MetadataConvert.h   |   143 +
 camera/hal/intel/ipu6/aal/PostProcessor.cpp   |   196 +
 camera/hal/intel/ipu6/aal/PostProcessor.h     |    58 +
 camera/hal/intel/ipu6/aal/RequestManager.cpp  |   797 +
 camera/hal/intel/ipu6/aal/RequestManager.h    |   112 +
 camera/hal/intel/ipu6/aal/ResultProcessor.cpp |   500 +
 camera/hal/intel/ipu6/aal/ResultProcessor.h   |   185 +
 .../hal/intel/ipu6/aal/chrome/HALv3Header.h   |    20 +
 camera/hal/intel/ipu6/include/api/ICamera.h   |   578 +
 .../hal/intel/ipu6/include/api/Parameters.h   |  2614 +++
 camera/hal/intel/ipu6/include/cameranvm.h     |   112 +
 .../hal/intel/ipu6/include/gcss/GCSSParser.h  |    69 +
 camera/hal/intel/ipu6/include/gcss/gcss.h     |   284 +
 .../intel/ipu6/include/gcss/gcss_aic_utils.h  |   330 +
 .../intel/ipu6/include/gcss/gcss_isp_utils.h  |   153 +
 .../hal/intel/ipu6/include/gcss/gcss_item.h   |   272 +
 .../hal/intel/ipu6/include/gcss/gcss_keys.h   |   144 +
 .../hal/intel/ipu6/include/gcss/gcss_utils.h  |   642 +
 .../ipu6/include/gcss/graph_query_manager.h   |   157 +
 .../hal/intel/ipu6/include/gcss/graph_utils.h |   454 +
 .../ipu6/include/ia_cipf/ia_cipf_types.h      |   414 +
 .../ipu6/include/ia_cipf_css/ia_cipf_css.h    |  1021 +
 .../intel/ipu6/include/ia_imaging/AIQResult.h |    28 +
 .../intel/ipu6/include/ia_imaging/CCAMacro.h  |    72 +
 .../ipu6/include/ia_imaging/CCAStorage.h      |    33 +
 .../intel/ipu6/include/ia_imaging/IIPUAic.h   |   254 +
 .../ipu6/include/ia_imaging/IntelCCATypes.h   |   538 +
 .../intel/ipu6/include/ia_imaging/ia_aec.h    |    81 +
 .../ipu6/include/ia_imaging/ia_aec_types.h    |   143 +
 .../ipu6/include/ia_imaging/ia_aic_myriad.h   |   181 +
 .../intel/ipu6/include/ia_imaging/ia_aiq.h    |   621 +
 .../include/ia_imaging/ia_aiq_deprecated.h    |   266 +
 .../ipu6/include/ia_imaging/ia_aiq_types.h    |   909 +
 .../ipu6/include/ia_imaging/ia_aiqb_encode.h  |    81 +
 .../ipu6/include/ia_imaging/ia_aiqb_parser.h  |   134 +
 .../intel/ipu6/include/ia_imaging/ia_alloc.h  |   121 +
 .../intel/ipu6/include/ia_imaging/ia_bcomp.h  |    89 +
 .../ipu6/include/ia_imaging/ia_bcomp_types.h  |    68 +
 .../intel/ipu6/include/ia_imaging/ia_ccat.h   |   556 +
 .../ipu6/include/ia_imaging/ia_ccat_types.h   |   236 +
 .../ipu6/include/ia_imaging/ia_cmc_parser.h   |    47 +
 .../ia_imaging/ia_cmc_parser_deprecated.h     |    42 +
 .../ipu6/include/ia_imaging/ia_cmc_types.h    |  1471 ++
 .../include/ia_imaging/ia_configuration.h     |    60 +
 .../ipu6/include/ia_imaging/ia_coordinate.h   |   149 +
 .../intel/ipu6/include/ia_imaging/ia_dpc.h    |   133 +
 .../intel/ipu6/include/ia_imaging/ia_dvs.h    |   286 +
 .../include/ia_imaging/ia_dvs_deprecated.h    |    96 +
 .../ipu6/include/ia_imaging/ia_dvs_types.h    |   304 +
 .../ipu6/include/ia_imaging/ia_emd_decoder.h  |   103 +
 .../ipu6/include/ia_imaging/ia_emd_types.h    |   205 +
 .../intel/ipu6/include/ia_imaging/ia_exc.h    |   153 +
 .../include/ia_imaging/ia_exc_deprecated.h    |   171 +
 .../ipu6/include/ia_imaging/ia_intrinsics.h   |   138 +
 .../include/ia_imaging/ia_intrinsics_types.h  |    58 +
 .../ipu6/include/ia_imaging/ia_isp_bxt.h      |   916 +
 .../ia_imaging/ia_isp_bxt_deprecated.h        |   641 +
 .../ia_imaging/ia_isp_bxt_statistics_types.h  |   192 +
 .../include/ia_imaging/ia_isp_bxt_types.h     |   202 +
 .../ipu6/include/ia_imaging/ia_isp_types.h    |    97 +
 .../intel/ipu6/include/ia_imaging/ia_lard.h   |   150 +
 .../intel/ipu6/include/ia_imaging/ia_log.h    |    93 +
 .../intel/ipu6/include/ia_imaging/ia_ltm.h    |   146 +
 .../include/ia_imaging/ia_ltm_deprecated.h    |   103 +
 .../ipu6/include/ia_imaging/ia_ltm_types.h    |   151 +
 .../ipu6/include/ia_imaging/ia_me_corner.h    |   142 +
 .../ipu6/include/ia_imaging/ia_mkn_decoder.h  |   138 +
 .../ipu6/include/ia_imaging/ia_mkn_encoder.h  |   167 +
 .../ipu6/include/ia_imaging/ia_mkn_types.h    |   165 +
 .../intel/ipu6/include/ia_imaging/ia_nvm.h    |   183 +
 .../hal/intel/ipu6/include/ia_imaging/ia_ob.h |    92 +
 .../intel/ipu6/include/ia_imaging/ia_p2p.h    |  1977 ++
 .../ipu6/include/ia_imaging/ia_p2p_types.h    |   221 +
 .../ipu6/include/ia_imaging/ia_pal_direct.h   |    80 +
 .../ipu6/include/ia_imaging/ia_pal_exports.h  |    38 +
 .../include/ia_imaging/ia_pal_types_isp.h     |    54 +
 .../ia_imaging/ia_pal_types_isp_ids_autogen.h |   378 +
 .../ia_pal_types_isp_parameters_autogen.h     | 15980 ++++++++++++++++
 .../include/ia_imaging/ia_statistics_types.h  |   111 +
 .../intel/ipu6/include/ia_imaging/ia_types.h  |   316 +
 .../intel/ipu6/include/ia_imaging/ia_view.h   |   163 +
 .../ipu6/include/ia_imaging/ia_view_types.h   |   220 +
 .../include/ia_imaging/pvl_blink_detection.h  |   218 +
 .../ipu6/include/ia_imaging/pvl_config.h      |    93 +
 .../include/ia_imaging/pvl_eye_detection.h    |   161 +
 .../include/ia_imaging/pvl_face_detection.h   |   275 +
 .../include/ia_imaging/pvl_face_recognition.h |   478 +
 .../include/ia_imaging/pvl_image_montage.h    |   234 +
 .../ia_imaging/pvl_landmark_detection.h       |   140 +
 .../include/ia_imaging/pvl_mouth_detection.h  |   159 +
 .../include/ia_imaging/pvl_object_tracking.h  |   243 +
 .../ipu6/include/ia_imaging/pvl_panorama.h    |   267 +
 .../ia_imaging/pvl_pedestrian_detection.h     |   227 +
 .../ia_imaging/pvl_perspective_control.h      |   413 +
 .../include/ia_imaging/pvl_smile_detection.h  |   247 +
 .../intel/ipu6/include/ia_imaging/pvl_types.h |   177 +
 .../intel/ipu6/include/ia_tools/css_types.h   |    62 +
 .../hal/intel/ipu6/include/ia_tools/ia_list.h |   116 +
 .../hal/intel/ipu6/include/linux/ipu-isys.h   |    51 +
 .../intel/ipu6/include/utils/ScopedAtrace.h   |    73 +
 .../ipu6/modules/algowrapper/IntelAiq.cpp     |   136 +
 .../intel/ipu6/modules/algowrapper/IntelAiq.h |    53 +
 .../ipu6/modules/algowrapper/IntelCmc.cpp     |    63 +
 .../intel/ipu6/modules/algowrapper/IntelCmc.h |    37 +
 .../ipu6/modules/algowrapper/IntelDvs.cpp     |   190 +
 .../intel/ipu6/modules/algowrapper/IntelDvs.h |    57 +
 .../algowrapper/IntelFaceDetection.cpp        |   149 +
 .../modules/algowrapper/IntelFaceDetection.h  |    44 +
 .../algowrapper/IntelIspParamAdaptor.cpp      |   139 +
 .../algowrapper/IntelIspParamAdaptor.h        |    45 +
 .../ipu6/modules/algowrapper/IntelLard.cpp    |    71 +
 .../ipu6/modules/algowrapper/IntelLard.h      |    34 +
 .../ipu6/modules/algowrapper/IntelLtm.cpp     |    65 +
 .../intel/ipu6/modules/algowrapper/IntelLtm.h |    33 +
 .../ipu6/modules/algowrapper/IntelMkn.cpp     |    70 +
 .../intel/ipu6/modules/algowrapper/IntelMkn.h |    36 +
 .../ipu6/modules/algowrapper/IntelPGParam.cpp |  1271 ++
 .../ipu6/modules/algowrapper/IntelPGParam.h   |   247 +
 .../ipu6/modules/algowrapper/StatsTypes.h     |    46 +
 .../algowrapper/graph/GraphConfigImpl.cpp     |   876 +
 .../algowrapper/graph/GraphConfigImpl.h       |   185 +
 .../algowrapper/graph/GraphConfigPipe.cpp     |  2059 ++
 .../algowrapper/graph/GraphConfigPipe.h       |   326 +
 .../ipu6/modules/ia_cipr/include/Buffer.h     |    64 +
 .../ipu6/modules/ia_cipr/include/Command.h    |    51 +
 .../ipu6/modules/ia_cipr/include/Context.h    |    70 +
 .../ipu6/modules/ia_cipr/include/Event.h      |    41 +
 .../ipu6/modules/ia_cipr/include/Types.h      |   189 +
 .../ipu6/modules/ia_cipr/include/Utils.h      |    30 +
 .../ipu6/modules/ia_cipr/include/css_types.h  |    61 +
 .../ipu6/modules/ia_cipr/include/ia_cipr.h    |   142 +
 .../modules/ia_cipr/include/ia_cipr_alloc.h   |   152 +
 .../modules/ia_cipr/include/ia_cipr_memory.h  |   210 +
 .../ia_cipr/include/ia_cipr_memory_device.h   |    56 +
 .../modules/ia_cipr/include/ia_cipr_psys.h    |   495 +
 .../ipu6/modules/ia_cipr/include/ipu-psys.h   |   112 +
 .../intel/ipu6/modules/ia_cipr/src/Buffer.cpp |   384 +
 .../ipu6/modules/ia_cipr/src/Command.cpp      |   212 +
 .../ipu6/modules/ia_cipr/src/Context.cpp      |   322 +
 .../intel/ipu6/modules/ia_cipr/src/Event.cpp  |   118 +
 .../intel/ipu6/modules/ia_cipr/src/Utils.cpp  |    63 +
 .../src/common/ia_cipr_memory_common.cpp      |   511 +
 .../src/common/ia_cipr_memory_common.h        |    34 +
 .../src/common/ia_cipr_memory_device_ops.h    |    38 +
 .../modules/ia_cipr/src/common/ia_list.cpp    |   118 +
 .../ipu6/modules/ia_cipr/src/common/ia_list.h |   111 +
 .../ia_cipr/src/linux/ia_cipr_alloc.cpp       |    99 +
 .../ia_cipr/src/linux/ia_cipr_psys.cpp        |   778 +
 .../ia_css/ipu6/include/assert_support.h      |   210 +
 .../ia_css/ipu6/include/cpu_mem_support.h     |   239 +
 .../ia_css/ipu6/include/error_support.h       |   112 +
 .../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 +
 .../include/ia_css_isa_parameter_defs_dep.h   |   580 +
 .../ipu6/include/ia_css_kernel_bitmap.h       |   262 +
 .../ipu6/include/ia_css_kernel_bitmap_impl.h  |   340 +
 .../ia_css_kernel_bitmap_storage_class.h      |    30 +
 .../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 +
 .../include/ia_css_program_group_data_defs.h  |   244 +
 .../include/ia_css_program_group_data_impl.h  |   461 +
 .../ipu6/include/ia_css_program_group_param.h |   295 +
 .../include/ia_css_program_group_param.sim.h  |   155 +
 .../ia_css_program_group_param_private.h      |    85 +
 .../ia_css_program_group_param_types.h        |    66 +
 .../ipu6/include/ia_css_psys_buffer_set.h     |   290 +
 .../include/ia_css_psys_data_storage_class.h  |    30 +
 .../ipu6/include/ia_css_psys_data_trace.h     |   104 +
 .../ia_css_psys_dynamic_storage_class.h       |    30 +
 .../ipu6/include/ia_css_psys_dynamic_trace.h  |   105 +
 .../ipu6/include/ia_css_psys_kernel_trace.h   |   105 +
 .../ipu6/include/ia_css_psys_manifest_types.h |   108 +
 .../ipu6/include/ia_css_psys_param_trace.h    |   104 +
 .../include/ia_css_psys_private_pg_data.h     |    53 +
 .../ia_css/ipu6/include/ia_css_psys_process.h |   395 +
 .../include/ia_css_psys_process.hsys.kernel.h |   159 +
 .../include/ia_css_psys_process.hsys.user.h   |    94 +
 .../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 +
 .../ia_css_psys_process_group.hsys.user.h     |   224 +
 .../include/ia_css_psys_process_group.psys.h  |    61 +
 .../ia_css_psys_process_group_cmd_impl.h      |   280 +
 .../include/ia_css_psys_process_group_impl.h  |  1846 ++
 .../ipu6/include/ia_css_psys_process_impl.h   |   694 +
 .../ia_css_psys_process_private_types.h       |   135 +
 .../ipu6/include/ia_css_psys_process_types.h  |    98 +
 .../ia_css_psys_program_group_manifest.h      |   320 +
 ...ss_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 +
 .../ia_css_psys_program_group_private.h       |   278 +
 .../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 +
 .../ia_css_psys_program_manifest.sim.h        |    65 +
 .../ia_css_psys_program_manifest_impl.h       |   577 +
 .../include/ia_css_psys_sim_storage_class.h   |    30 +
 .../ipu6/include/ia_css_psys_sim_trace.h      |    97 +
 .../ia_css_psys_static_storage_class.h        |    30 +
 .../ipu6/include/ia_css_psys_static_trace.h   |   105 +
 .../ipu6/include/ia_css_psys_terminal.h       |   403 +
 .../include/ia_css_psys_terminal.hsys.user.h  |   257 +
 .../ipu6/include/ia_css_psys_terminal_impl.h  |  2053 ++
 .../include/ia_css_psys_terminal_manifest.h   |   621 +
 .../ia_css_psys_terminal_manifest.hsys.user.h |    40 +
 .../ia_css_psys_terminal_manifest.sim.h       |    50 +
 .../ia_css_psys_terminal_manifest_impl.h      |   745 +
 .../ia_css_psys_terminal_private_types.h      |   102 +
 .../ipu6/include/ia_css_psys_transport.h      |    96 +
 .../ipu6/include/ia_css_psys_transport_dep.h  |    66 +
 .../ia_css/ipu6/include/ia_css_psysapi.h      |    25 +
 .../ipu6/include/ia_css_psysapi_fw_version.h  |    35 +
 .../ipu6/include/ia_css_psysapi_trace.h       |    80 +
 .../modules/ia_css/ipu6/include/ia_css_rbm.h  |   199 +
 .../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 +
 .../ipu6/include/ia_css_rbm_storage_class.h   |    38 +
 .../ia_css/ipu6/include/ia_css_rbm_trace.h    |    79 +
 .../ia_css/ipu6/include/ia_css_terminal.h     |   187 +
 .../ipu6/include/ia_css_terminal_base_types.h |    53 +
 .../ipu6/include/ia_css_terminal_defs.h       |   209 +
 .../ipu6/include/ia_css_terminal_impl.h       |   497 +
 .../ipu6/include/ia_css_terminal_manifest.h   |   233 +
 .../ia_css_terminal_manifest_base_types.h     |    75 +
 .../include/ia_css_terminal_manifest_impl.h   |   391 +
 .../include/ia_css_terminal_manifest_types.h  |   349 +
 .../ipu6/include/ia_css_terminal_types.h      |   477 +
 .../ia_css/ipu6/include/ia_css_trace.h        |  1002 +
 .../ipu6/include/ipu_device_acb_devices.h     |    58 +
 .../ipu6/include/ipu_device_gp_devices.h      |   205 +
 .../ia_css/ipu6/include/math_support.h        |   328 +
 .../ia_css/ipu6/include/misc_support.h        |    78 +
 .../ipu6/include/pg_control_init_framework.h  |    78 +
 .../ia_css/ipu6/include/platform_support.h    |   194 +
 .../ia_css/ipu6/include/print_support.h       |   121 +
 .../ipu6/include/psys_system_global_impl.h    |   504 +
 .../ia_css/ipu6/include/storage_class.h       |    55 +
 .../ia_css/ipu6/include/type_support.h        |    82 +
 .../ipu6/include/vied_nci_acb_route_type.h    |    41 +
 .../include/vied_nci_psys_resource_model.h    |   380 +
 .../include/vied_nci_psys_system_global.h     |   186 +
 .../ia_css/ipu6/src/ia_css_kernel_bitmap.c    |   151 +
 .../ipu6/src/ia_css_program_group_data.c      |    28 +
 .../ipu6/src/ia_css_program_group_param.c     |   769 +
 .../ia_css/ipu6/src/ia_css_psys_process.c     |  1038 +
 .../ipu6/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 ++
 .../ipu6/src/ia_css_psys_program_manifest.c   |   972 +
 .../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 +
 .../modules/ia_css/ipu6/src/ia_css_terminal.c |    22 +
 .../ipu6/src/ia_css_terminal_manifest.c       |    22 +
 .../ia_css/ipu6/src/vied_nci_psys_system.c    |    28 +
 .../ia_css/ipu6se/include/assert_support.h    |   210 +
 .../ia_css/ipu6se/include/cpu_mem_support.h   |   239 +
 .../ia_css/ipu6se/include/error_support.h     |   112 +
 .../ia_css/ipu6se/include/frame_support.h     |    63 +
 .../ia_css/ipu6se/include/ia_css_base_types.h |    55 +
 .../include/ia_css_isa_parameter_defs.h       |   789 +
 .../include/ia_css_isa_parameter_defs_dep.h   |   580 +
 .../ipu6se/include/ia_css_kernel_bitmap.h     |   262 +
 .../include/ia_css_kernel_bitmap_impl.h       |   340 +
 .../ia_css_kernel_bitmap_storage_class.h      |    30 +
 .../include/ia_css_kernel_user_param_types.h  |    88 +
 .../include/ia_css_param_storage_class.h      |    30 +
 .../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 +
 .../include/ia_css_program_group_param.h      |   295 +
 .../include/ia_css_program_group_param.sim.h  |   155 +
 .../ia_css_program_group_param_private.h      |    85 +
 .../ia_css_program_group_param_types.h        |    66 +
 .../ipu6se/include/ia_css_psys_buffer_set.h   |   290 +
 .../include/ia_css_psys_data_storage_class.h  |    30 +
 .../ipu6se/include/ia_css_psys_data_trace.h   |   104 +
 .../ia_css_psys_dynamic_storage_class.h       |    30 +
 .../include/ia_css_psys_dynamic_trace.h       |   105 +
 .../ipu6se/include/ia_css_psys_kernel_trace.h |   105 +
 .../include/ia_css_psys_manifest_types.h      |   108 +
 .../ipu6se/include/ia_css_psys_param_trace.h  |   104 +
 .../include/ia_css_psys_private_pg_data.h     |    53 +
 .../ipu6se/include/ia_css_psys_process.h      |   395 +
 .../include/ia_css_psys_process.hsys.kernel.h |   159 +
 .../include/ia_css_psys_process.hsys.user.h   |    94 +
 .../ipu6se/include/ia_css_psys_process.psys.h |    54 +
 .../include/ia_css_psys_process_group.h       |   487 +
 .../ia_css_psys_process_group.hsys.kernel.h   |   379 +
 .../ia_css_psys_process_group.hsys.user.h     |   224 +
 .../include/ia_css_psys_process_group.psys.h  |    61 +
 .../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 +
 .../ia_css_psys_process_private_types.h       |   135 +
 .../include/ia_css_psys_process_types.h       |    98 +
 .../ia_css_psys_program_group_manifest.h      |   320 +
 ...ss_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 +
 .../ia_css_psys_program_group_private.h       |   278 +
 .../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 +
 .../ia_css_psys_program_manifest.sim.h        |    65 +
 .../ia_css_psys_program_manifest_impl.h       |   577 +
 .../include/ia_css_psys_sim_storage_class.h   |    30 +
 .../ipu6se/include/ia_css_psys_sim_trace.h    |    97 +
 .../ia_css_psys_static_storage_class.h        |    30 +
 .../ipu6se/include/ia_css_psys_static_trace.h |   105 +
 .../ipu6se/include/ia_css_psys_terminal.h     |   403 +
 .../include/ia_css_psys_terminal.hsys.user.h  |   257 +
 .../include/ia_css_psys_terminal_impl.h       |  2053 ++
 .../include/ia_css_psys_terminal_manifest.h   |   621 +
 .../ia_css_psys_terminal_manifest.hsys.user.h |    40 +
 .../ia_css_psys_terminal_manifest.sim.h       |    50 +
 .../ia_css_psys_terminal_manifest_impl.h      |   745 +
 .../ia_css_psys_terminal_private_types.h      |   102 +
 .../ipu6se/include/ia_css_psys_transport.h    |    96 +
 .../include/ia_css_psys_transport_dep.h       |    47 +
 .../ia_css/ipu6se/include/ia_css_psysapi.h    |    25 +
 .../include/ia_css_psysapi_fw_version.h       |    35 +
 .../ipu6se/include/ia_css_psysapi_trace.h     |    80 +
 .../ia_css/ipu6se/include/ia_css_rbm.h        |   199 +
 .../ia_css/ipu6se/include/ia_css_rbm_impl.h   |   410 +
 .../ipu6se/include/ia_css_rbm_manifest.h      |   146 +
 .../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 +
 .../include/ia_css_terminal_base_types.h      |    53 +
 .../ipu6se/include/ia_css_terminal_defs.h     |   209 +
 .../ipu6se/include/ia_css_terminal_impl.h     |   497 +
 .../ipu6se/include/ia_css_terminal_manifest.h |   233 +
 .../ia_css_terminal_manifest_base_types.h     |    75 +
 .../include/ia_css_terminal_manifest_impl.h   |   391 +
 .../include/ia_css_terminal_manifest_types.h  |   349 +
 .../ipu6se/include/ia_css_terminal_types.h    |   477 +
 .../ia_css/ipu6se/include/ia_css_trace.h      |  1002 +
 .../ipu6se/include/ipu_device_acb_devices.h   |    39 +
 .../ipu6se/include/ipu_device_gp_devices.h    |   195 +
 .../ia_css/ipu6se/include/math_support.h      |   328 +
 .../ia_css/ipu6se/include/misc_support.h      |    78 +
 .../include/pg_control_init_framework.h       |    78 +
 .../ia_css/ipu6se/include/platform_support.h  |   194 +
 .../ia_css/ipu6se/include/print_support.h     |   121 +
 .../ipu6se/include/psys_system_global_impl.h  |   504 +
 .../ia_css/ipu6se/include/storage_class.h     |    55 +
 .../ia_css/ipu6se/include/type_support.h      |    82 +
 .../ipu6se/include/vied_nci_acb_route_type.h  |    41 +
 .../include/vied_nci_psys_resource_model.h    |   342 +
 .../include/vied_nci_psys_system_global.h     |   186 +
 .../ia_css/ipu6se/src/ia_css_kernel_bitmap.c  |   151 +
 .../ipu6se/src/ia_css_program_group_data.c    |    28 +
 .../ipu6se/src/ia_css_program_group_param.c   |   769 +
 .../ia_css/ipu6se/src/ia_css_psys_process.c   |  1038 +
 .../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 +
 .../src/ia_css_psys_terminal_manifest.c       |   776 +
 .../modules/ia_css/ipu6se/src/ia_css_rbm.c    |    19 +
 .../ia_css/ipu6se/src/ia_css_terminal.c       |    22 +
 .../ipu6se/src/ia_css_terminal_manifest.c     |    22 +
 .../ia_css/ipu6se/src/vied_nci_psys_system.c  |    28 +
 .../ipu6/modules/memory/Camera3BufferPool.cpp |   133 +
 .../ipu6/modules/memory/Camera3BufferPool.h   |    51 +
 .../modules/memory/chrome/Camera3Buffer.cpp   |   555 +
 .../modules/memory/chrome/Camera3Buffer.h     |   169 +
 .../ipu6/modules/sandboxing/IPCCommon.cpp     |   110 +
 .../intel/ipu6/modules/sandboxing/IPCCommon.h |   113 +
 .../modules/sandboxing/IPCGraphConfig.cpp     |   495 +
 .../ipu6/modules/sandboxing/IPCGraphConfig.h  |   171 +
 .../ipu6/modules/sandboxing/IPCIntelAiq.cpp   |  1167 ++
 .../ipu6/modules/sandboxing/IPCIntelAiq.h     |   367 +
 .../ipu6/modules/sandboxing/IPCIntelCmc.cpp   |   259 +
 .../ipu6/modules/sandboxing/IPCIntelCmc.h     |    96 +
 .../ipu6/modules/sandboxing/IPCIntelDvs.cpp   |   724 +
 .../ipu6/modules/sandboxing/IPCIntelDvs.h     |   247 +
 .../ipu6/modules/sandboxing/IPCIntelFD.cpp    |    63 +
 .../ipu6/modules/sandboxing/IPCIntelFD.h      |    32 +
 .../ipu6/modules/sandboxing/IPCIntelLard.cpp  |   298 +
 .../ipu6/modules/sandboxing/IPCIntelLard.h    |   103 +
 .../ipu6/modules/sandboxing/IPCIntelLtm.cpp   |   337 +
 .../ipu6/modules/sandboxing/IPCIntelLtm.h     |   118 +
 .../ipu6/modules/sandboxing/IPCIntelMkn.cpp   |    81 +
 .../ipu6/modules/sandboxing/IPCIntelMkn.h     |    64 +
 .../modules/sandboxing/IPCIntelPGParam.cpp    |   552 +
 .../ipu6/modules/sandboxing/IPCIntelPGParam.h |   180 +
 .../modules/sandboxing/IPCIspParamAdaptor.cpp |   558 +
 .../modules/sandboxing/IPCIspParamAdaptor.h   |   170 +
 .../sandboxing/client/GraphConfigImpl.cpp     |   189 +
 .../sandboxing/client/GraphConfigImpl.h       |    78 +
 .../modules/sandboxing/client/IntelAiq.cpp    |   317 +
 .../ipu6/modules/sandboxing/client/IntelAiq.h |    74 +
 .../sandboxing/client/IntelAlgoClient.cpp     |   385 +
 .../sandboxing/client/IntelAlgoClient.h       |   116 +
 .../sandboxing/client/IntelAlgoCommon.cpp     |   129 +
 .../sandboxing/client/IntelAlgoCommon.h       |    67 +
 .../modules/sandboxing/client/IntelCmc.cpp    |   108 +
 .../ipu6/modules/sandboxing/client/IntelCmc.h |    58 +
 .../modules/sandboxing/client/IntelDvs.cpp    |   356 +
 .../ipu6/modules/sandboxing/client/IntelDvs.h |    79 +
 .../sandboxing/client/IntelFaceDetection.cpp  |   121 +
 .../sandboxing/client/IntelFaceDetection.h    |    48 +
 .../client/IntelIspParamAdaptor.cpp           |   197 +
 .../sandboxing/client/IntelIspParamAdaptor.h  |    59 +
 .../modules/sandboxing/client/IntelLard.cpp   |   138 +
 .../modules/sandboxing/client/IntelLard.h     |    50 +
 .../modules/sandboxing/client/IntelLtm.cpp    |   136 +
 .../ipu6/modules/sandboxing/client/IntelLtm.h |    53 +
 .../modules/sandboxing/client/IntelMkn.cpp    |   122 +
 .../ipu6/modules/sandboxing/client/IntelMkn.h |    53 +
 .../sandboxing/client/IntelPGParam.cpp        |   268 +
 .../modules/sandboxing/client/IntelPGParam.h  |    69 +
 .../sandboxing/server/GraphConfigServer.cpp   |   164 +
 .../sandboxing/server/GraphConfigServer.h     |    44 +
 .../sandboxing/server/IntelAiqServer.cpp      |   337 +
 .../sandboxing/server/IntelAiqServer.h        |    50 +
 .../sandboxing/server/IntelAlgoServer.cpp     |   484 +
 .../sandboxing/server/IntelAlgoServer.h       |   110 +
 .../sandboxing/server/IntelCmcServer.cpp      |    92 +
 .../sandboxing/server/IntelCmcServer.h        |    40 +
 .../sandboxing/server/IntelDvsServer.cpp      |   316 +
 .../sandboxing/server/IntelDvsServer.h        |    54 +
 .../sandboxing/server/IntelFDServer.cpp       |    62 +
 .../modules/sandboxing/server/IntelFDServer.h |    39 +
 .../sandboxing/server/IntelLardServer.cpp     |   112 +
 .../sandboxing/server/IntelLardServer.h       |    40 +
 .../sandboxing/server/IntelLtmServer.cpp      |   108 +
 .../sandboxing/server/IntelLtmServer.h        |    40 +
 .../sandboxing/server/IntelMknServer.cpp      |   128 +
 .../sandboxing/server/IntelMknServer.h        |    45 +
 .../sandboxing/server/IntelPGParamServer.cpp  |   232 +
 .../sandboxing/server/IntelPGParamServer.h    |    56 +
 .../server/IspParamAdaptorServer.cpp          |   158 +
 .../sandboxing/server/IspParamAdaptorServer.h |    44 +
 camera/hal/intel/ipu6/src/3a/AiqCore.cpp      |   961 +
 camera/hal/intel/ipu6/src/3a/AiqCore.h        |   214 +
 camera/hal/intel/ipu6/src/3a/AiqEngine.cpp    |   522 +
 camera/hal/intel/ipu6/src/3a/AiqEngine.h      |   149 +
 camera/hal/intel/ipu6/src/3a/AiqResult.cpp    |   182 +
 camera/hal/intel/ipu6/src/3a/AiqResult.h      |   109 +
 .../intel/ipu6/src/3a/AiqResultStorage.cpp    |   286 +
 .../hal/intel/ipu6/src/3a/AiqResultStorage.h  |   246 +
 camera/hal/intel/ipu6/src/3a/AiqSetting.cpp   |   359 +
 camera/hal/intel/ipu6/src/3a/AiqSetting.h     |   153 +
 .../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      |   256 +
 camera/hal/intel/ipu6/src/3a/AiqUnit.h        |   155 +
 camera/hal/intel/ipu6/src/3a/AiqUtils.cpp     |   660 +
 camera/hal/intel/ipu6/src/3a/AiqUtils.h       |   185 +
 camera/hal/intel/ipu6/src/3a/Dvs.cpp          |   616 +
 camera/hal/intel/ipu6/src/3a/Dvs.h            |   119 +
 camera/hal/intel/ipu6/src/3a/DvsResult.cpp    |   105 +
 camera/hal/intel/ipu6/src/3a/DvsResult.h      |    48 +
 .../intel/ipu6/src/3a/I3AControlFactory.cpp   |    35 +
 .../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          |   545 +
 camera/hal/intel/ipu6/src/3a/Ltm.h            |   185 +
 camera/hal/intel/ipu6/src/3a/MakerNote.cpp    |   151 +
 camera/hal/intel/ipu6/src/3a/MakerNote.h      |   139 +
 .../hal/intel/ipu6/src/3a/SensorManager.cpp   |   327 +
 camera/hal/intel/ipu6/src/3a/SensorManager.h  |   111 +
 .../ipu6/src/3a/intel3a/Intel3AParameter.cpp  |   713 +
 .../ipu6/src/3a/intel3a/Intel3AParameter.h    |   104 +
 .../ipu6/src/3a/intel3a/Intel3AResult.cpp     |   172 +
 .../intel/ipu6/src/3a/intel3a/Intel3AResult.h |    45 +
 .../hal/intel/ipu6/src/core/BufferQueue.cpp   |   286 +
 camera/hal/intel/ipu6/src/core/BufferQueue.h  |   206 +
 .../hal/intel/ipu6/src/core/CameraBuffer.cpp  |   401 +
 camera/hal/intel/ipu6/src/core/CameraBuffer.h |   169 +
 .../hal/intel/ipu6/src/core/CameraDevice.cpp  |  1177 ++
 camera/hal/intel/ipu6/src/core/CameraDevice.h |   284 +
 .../hal/intel/ipu6/src/core/CameraEvent.cpp   |    83 +
 camera/hal/intel/ipu6/src/core/CameraEvent.h  |    50 +
 .../hal/intel/ipu6/src/core/CameraEventType.h |   111 +
 .../hal/intel/ipu6/src/core/CameraStream.cpp  |   230 +
 camera/hal/intel/ipu6/src/core/CameraStream.h |   118 +
 .../hal/intel/ipu6/src/core/CaptureUnit.cpp   |   482 +
 camera/hal/intel/ipu6/src/core/CaptureUnit.h  |   194 +
 camera/hal/intel/ipu6/src/core/DeviceBase.cpp |   442 +
 camera/hal/intel/ipu6/src/core/DeviceBase.h   |   171 +
 .../intel/ipu6/src/core/IspParamAdaptor.cpp   |   964 +
 .../hal/intel/ipu6/src/core/IspParamAdaptor.h |   153 +
 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 +
 .../hal/intel/ipu6/src/core/PSysProcessor.cpp |   890 +
 .../hal/intel/ipu6/src/core/PSysProcessor.h   |   130 +
 .../intel/ipu6/src/core/ProcessorManager.cpp  |   125 +
 .../intel/ipu6/src/core/ProcessorManager.h    |    71 +
 .../hal/intel/ipu6/src/core/RequestThread.cpp |   547 +
 .../hal/intel/ipu6/src/core/RequestThread.h   |   154 +
 .../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  |   216 +
 camera/hal/intel/ipu6/src/core/SofSource.h    |    63 +
 camera/hal/intel/ipu6/src/core/StreamSource.h |    48 +
 .../intel/ipu6/src/core/SwImageProcessor.cpp  |   158 +
 .../intel/ipu6/src/core/SwImageProcessor.h    |    46 +
 .../hal/intel/ipu6/src/core/SyncManager.cpp   |   198 +
 camera/hal/intel/ipu6/src/core/SyncManager.h  |    58 +
 .../ipu6/src/core/psysprocessor/PGCommon.cpp  |  1214 ++
 .../ipu6/src/core/psysprocessor/PGCommon.h    |   240 +
 .../ipu6/src/core/psysprocessor/PGUtils.cpp   |   194 +
 .../ipu6/src/core/psysprocessor/PGUtils.h     |    86 +
 .../ipu6/src/core/psysprocessor/PSysDAG.cpp   |   737 +
 .../ipu6/src/core/psysprocessor/PSysDAG.h     |   154 +
 .../core/psysprocessor/PipeLiteExecutor.cpp   |  1121 ++
 .../src/core/psysprocessor/PipeLiteExecutor.h |   193 +
 .../src/core/psysprocessor/PolicyManager.cpp  |   168 +
 .../src/core/psysprocessor/PolicyManager.h    |    79 +
 camera/hal/intel/ipu6/src/fd/FaceBase.h       |    81 +
 .../hal/intel/ipu6/src/fd/FaceDetection.cpp   |   530 +
 camera/hal/intel/ipu6/src/fd/FaceDetection.h  |   120 +
 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 +
 .../ipu6/src/image_process/IImageProcessor.h  |    46 +
 .../ipu6/src/image_process/ImageConverter.cpp |   798 +
 .../ipu6/src/image_process/ImageConverter.h   |    59 +
 .../src/image_process/PostProcessorBase.cpp   |   318 +
 .../src/image_process/PostProcessorBase.h     |   118 +
 .../src/image_process/PostProcessorCore.cpp   |   141 +
 .../src/image_process/PostProcessorCore.h     |    68 +
 .../ipu6/src/image_process/ProcessType.h      |    30 +
 .../chrome/ImageProcessorCore.cpp             |   234 +
 .../image_process/chrome/ImageProcessorCore.h |    44 +
 .../hal/intel/ipu6/src/iutils/CameraDump.cpp  |   409 +
 camera/hal/intel/ipu6/src/iutils/CameraDump.h |   170 +
 .../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 +
 .../intel/ipu6/src/iutils/ScopedAtrace.cpp    |    63 +
 .../ipu6/src/iutils/SwImageConverter.cpp      |   406 +
 .../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  |   631 +
 camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h    |    74 +
 .../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 +
 .../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  |   224 +
 camera/hal/intel/ipu6/src/jpeg/JpegMaker.h    |    57 +
 .../ipu6/src/jpeg/chrome/JpegEncoderCore.cpp  |    76 +
 .../ipu6/src/jpeg/chrome/JpegEncoderCore.h    |    39 +
 .../intel/ipu6/src/jpeg/sw/SWJpegEncoder.cpp  |   772 +
 .../intel/ipu6/src/jpeg/sw/SWJpegEncoder.h    |   184 +
 .../ipu6/src/metadata/CameraMetadata.cpp      |   435 +
 .../intel/ipu6/src/metadata/CameraMetadata.h  |   200 +
 .../ipu6/src/metadata/ParameterGenerator.cpp  |   356 +
 .../ipu6/src/metadata/ParameterGenerator.h    |   115 +
 .../ipu6/src/metadata/ParameterHelper.cpp     |    84 +
 .../intel/ipu6/src/metadata/ParameterHelper.h |   142 +
 .../intel/ipu6/src/metadata/Parameters.cpp    |  2011 ++
 .../src/metadata/icamera_metadata_base.cpp    |   976 +
 .../ipu6/src/metadata/icamera_metadata_base.h |   445 +
 .../src/metadata/icamera_metadata_tag_info.c  |  2654 +++
 .../ipu6/src/metadata/icamera_metadata_tags.h |  1005 +
 .../ipu6/src/platformdata/AiqInitData.cpp     |   629 +
 .../intel/ipu6/src/platformdata/AiqInitData.h |   229 +
 .../ipu6/src/platformdata/CameraParser.cpp    |  1926 ++
 .../ipu6/src/platformdata/CameraParser.h      |   128 +
 .../intel/ipu6/src/platformdata/CameraTypes.h |   226 +
 .../ipu6/src/platformdata/ParserBase.cpp      |   165 +
 .../intel/ipu6/src/platformdata/ParserBase.h  |   102 +
 .../ipu6/src/platformdata/PlatformData.cpp    |  1331 ++
 .../ipu6/src/platformdata/PlatformData.h      |  1152 ++
 .../ipu6/src/platformdata/PolicyParser.cpp    |   226 +
 .../ipu6/src/platformdata/PolicyParser.h      |    73 +
 .../ipu6/src/platformdata/gc/FormatUtils.cpp  |   338 +
 .../ipu6/src/platformdata/gc/FormatUtils.h    |    34 +
 .../ipu6/src/platformdata/gc/GraphConfig.cpp  |   199 +
 .../ipu6/src/platformdata/gc/GraphConfig.h    |    88 +
 .../platformdata/gc/GraphConfigManager.cpp    |   179 +
 .../src/platformdata/gc/GraphConfigManager.h  |    85 +
 .../ipu6/src/platformdata/gc/GraphUtils.cpp   |   112 +
 .../ipu6/src/platformdata/gc/GraphUtils.h     |    27 +
 .../ipu6/src/platformdata/gc/HalStream.h      |    74 +
 .../ipu6/src/platformdata/gc/IGraphConfig.h   |   199 +
 .../src/platformdata/gc/IGraphConfigManager.h |    43 +
 .../src/platformdata/gc/custom_gcss_keys.h    |    50 +
 .../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 +
 .../intel/ipu6/src/v4l2/V4l2DeviceFactory.cpp |   126 +
 .../intel/ipu6/src/v4l2/V4l2DeviceFactory.h   |    61 +
 627 files changed, 185329 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/AIQResult.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h
 create mode 100644 camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.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_direct.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/Buffer.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Event.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.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/Buffer.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp
 create mode 100644 camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp
 create mode 100755 camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp
 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..3d64b0f34b36
--- /dev/null
+++ b/camera/hal/intel/ipu6/BUILD.gn
@@ -0,0 +1,403 @@
+#
+#  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/Buffer.cpp",
+    "modules/ia_cipr/src/Command.cpp",
+    "modules/ia_cipr/src/Context.cpp",
+    "modules/ia_cipr/src/Event.cpp",
+    "modules/ia_cipr/src/Utils.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/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/ia_cipr/src/Utils.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..df06df03d7a5
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3Stream.cpp
@@ -0,0 +1,663 @@
+/*
+ * 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 <vector>
+#include <utility>
+#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,
+                             bool isHALStream) :
+    mCameraId(cameraId),
+    mEventCallback(callback),
+    mPostProcessType(icamera::POST_PROCESS_NONE),
+    mStreamState(false),
+    mHALStream(halStream),
+    mMaxNumReqInProc(maxNumReqInProc),
+    mBufferPool(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),
+    mIsHALStream(isHALStream)
+{
+    LOG1("[%p]@%s, mMaxNumReqInProc:%d, inputStream:%p, stream:%dx%d, format:%d, type:%d",
+         this, __func__, mMaxNumReqInProc, inputStream,
+         mHALStream.width, mHALStream.height, mHALStream.format, mStream.stream_type);
+
+    mPostProcessor = std::unique_ptr<PostProcessor>(new PostProcessor(mCameraId, stream));
+    mCaptureRequest.clear();
+    mQueuedBuffer.clear();
+    if (mIsHALStream) {
+        mBufferPool = 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("[%p]@%s", this, __func__);
+
+    setActive(false);
+
+    for (auto& buf : mBuffers) {
+        buf.second->unlock();
+    }
+
+    mBuffers.clear();
+    std::lock_guard<std::mutex> l(mLock);
+    mCaptureResultMap.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, [%p] wait sof timeout, skip alignment this time", __func__, this);
+    }
+    LOG2("%s, [%p] running post processing align with sof event", __func__, this);
+}
+
+bool Camera3Stream::threadLoop()
+{
+    LOG1("[%p] isHALStream: %d @%s", this, mIsHALStream, __func__);
+
+    if (!waitCaptureResultReady()) {
+        return true;
+    }
+
+    auto captureResult = mCaptureResultMap.begin();
+    std::shared_ptr<CaptureResult> result = captureResult->second;
+    uint32_t frameNumber = captureResult->first;
+
+    // dequeue buffer from HAL
+    icamera::camera_buffer_t *buffer = nullptr;
+    icamera::Parameters parameter;
+    std::shared_ptr<Camera3Buffer> inputCam3Buf = result->inputCam3Buf;
+    std::shared_ptr<StreamComInfo> halOutput = nullptr;
+
+    if (!inputCam3Buf && mIsHALStream) {
+        LOG1("[%p]@ dqbuf for frameNumber %d", this, frameNumber);
+        int ret = icamera::camera_stream_dqbuf(mCameraId, mHALStream.id, &buffer, &parameter);
+        CheckError(ret != icamera::OK || !buffer, true,
+                    "[%p]failed to dequeue buffer, ret %d", this, ret);
+        LOG2("[%p]@ %s, buffer->timestamp:%lld addr %p",
+              this, __func__, buffer->timestamp, buffer->addr);
+
+        int32_t userRequestId = 0;
+        if (parameter.getUserRequestId(userRequestId) == icamera::OK) {
+            {
+            std::unique_lock<std::mutex> lock(mLock);
+            if (mCaptureResultMap.find(static_cast<uint32_t>(userRequestId)) !=
+                mCaptureResultMap.end()) {
+                frameNumber = static_cast<uint32_t>(userRequestId);
+                result = mCaptureResultMap[frameNumber];
+            }
+            }
+        }
+
+        // sync before notify listeners
+        bool needAlignment = false;
+
+        if (mHALStream.usage != icamera::CAMERA_STREAM_OPAQUE_RAW
+            && mPostProcessType != icamera::POST_PROCESS_NONE) {
+            needAlignment = true;
+        } else {
+            for (auto &iter : mListeners) {
+                if (!iter->getCaptureRequest(frameNumber)) {
+                    continue;
+                }
+                needAlignment = true;
+            }
+        }
+        if (needAlignment) {
+            handleSofAlignment();
+        }
+
+        halOutput = std::make_shared<StreamComInfo>();
+        {
+        std::unique_lock<std::mutex> lock(mLock);
+
+        /* get the Camera3Buffer object of camera_buffer_t dqueued from HAL
+        ** check the 3 sources, HAL stream request; listener stream request; buffer pool
+        */
+        if (mQueuedBuffer.find(frameNumber) != mQueuedBuffer.end()) {
+            /* check buffer pool first, the HAL stream may use buffer from pool even itself
+            ** or it's listener has requested buffer
+            */
+            halOutput->cam3Buf = mQueuedBuffer[frameNumber];
+        } else if (mCaptureRequest.find(frameNumber) != mCaptureRequest.end()) {
+            if (buffer->addr == mCaptureRequest[frameNumber]->cam3Buf->data()) {
+                halOutput->cam3Buf = mCaptureRequest[frameNumber]->cam3Buf;
+            }
+        } else {
+            std::shared_ptr<StreamComInfo> request = nullptr;;
+            for (auto &iter : mListeners) {
+                request = iter->getCaptureRequest(frameNumber);
+                if (request && request->cam3Buf->data() == buffer->addr) {
+                    halOutput->cam3Buf = request->cam3Buf;
+                    break;
+                }
+            }
+        }
+
+        CheckError(!halOutput->cam3Buf, true, "can't identify the buffer source");
+        halOutput->parameter = parameter;
+        halOutput->cam3Buf->setTimeStamp(buffer->timestamp);
+        }
+
+        for (auto &iter : mListeners) {
+            iter->notifyListenerBufferReady(frameNumber, halOutput);
+        }
+
+        if (!getCaptureRequest(frameNumber)) {
+            // HAL stream is triggered by listener, itself not requested, start next loop
+            std::unique_lock<std::mutex> lock(mLock);
+            mCaptureResultMap.erase(frameNumber);
+            return true;
+        }
+    } else if (!inputCam3Buf) {
+        // listener stream get the buffer from HAL stream
+        std::unique_lock<std::mutex> lock(mLock);
+        if (mHALStreamOutput.find(frameNumber) == mHALStreamOutput.end()) {
+            LOGE("[%p] can't find HAL stream output", this);
+            return true;
+        }
+        halOutput = mHALStreamOutput[frameNumber];
+        mHALStreamOutput.erase(frameNumber);
+    }
+
+    {
+    std::unique_lock<std::mutex> lock(mLock);
+    mCaptureResultMap.erase(frameNumber);
+    }
+
+    icamera::camera_buffer_t outCamBuf = {};
+    shared_ptr<Camera3Buffer> outCam3Buf = nullptr;
+
+    // start process buffers, HAL stream and listeners will do the same process
+    if (!inputCam3Buf) {
+        outCam3Buf = halOutput->cam3Buf;
+        if (outCam3Buf) {
+            outCamBuf = outCam3Buf->getHalBuffer();
+        }
+        parameter = halOutput->parameter;
+    }
+
+    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__, outCamBuf.addr, ccBuf->data());
+        if (mPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
+            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
+            icamera::PlatformData::acquireMakernoteData(mCameraId, outCamBuf.timestamp, &parameter);
+        }
+        // handle normal postprocess
+        if (mPostProcessType != icamera::POST_PROCESS_NONE) {
+            LOG2("%s, do software postProcessing for sequence: %ld", __func__, outCamBuf.sequence);
+            icamera::status_t status = mPostProcessor->doPostProcessing(outCam3Buf, parameter, ccBuf);
+            CheckError(status != icamera::OK, true, "@%s, doPostProcessing fails, mPostProcessType:%d",
+                  __func__, mPostProcessType);
+        } else if (outCam3Buf->data() != ccBuf->data()) {
+            MEMCPY_S(ccBuf->data(), ccBuf->size(), outCam3Buf->data(), outCam3Buf->size());
+        }
+    } else if (inputCam3Buf) {
+        parameter = result->param;
+        LOG1("[%p] @%s process input frameNumber: %d", this, __func__, frameNumber);
+        if (mInputPostProcessType & icamera::POST_PROCESS_JPEG_ENCODING) {
+            dumpOutputFmt = V4L2_PIX_FMT_JPEG;
+            icamera::PlatformData::acquireMakernoteData(mCameraId, inputCam3Buf->getTimeStamp(),
+                                                        &parameter);
+        }
+
+        inputCam3Buf->dumpImage(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());
+        }
+    }
+
+    faceRunningByCondition(ccBuf->getHalBuffer());
+
+    ccBuf->dumpImage(frameNumber, icamera::DUMP_AAL_OUTPUT, dumpOutputFmt);
+    ccBuf->unlock();
+    ccBuf->deinit();
+    ccBuf->getFence(&result->outputBuffer);
+
+    if (inputCam3Buf || mHALStream.usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
+        // notify shutter done
+        ShutterEvent shutterEvent = {frameNumber, inputCam3Buf ? 0 : outCamBuf.timestamp};
+        mEventCallback->shutterDone(shutterEvent);
+
+        // notify metadata done
+        MetadataEvent event = {frameNumber, &parameter};
+        mEventCallback->metadataDone(event);
+    }
+
+    // notify frame done
+    BufferEvent bufferEvent = {};
+    bufferEvent.frameNumber = frameNumber;
+    if (!inputCam3Buf) {
+        bufferEvent.timestamp = outCamBuf.timestamp;
+    }
+    bufferEvent.outputBuffer = &result->outputBuffer;
+
+    mEventCallback->bufferDone(bufferEvent);
+    if (!inputCam3Buf) {
+        std::unique_lock<std::mutex> lock(mLock);
+        mCaptureRequest.erase(frameNumber);
+    }
+
+    return true;
+}
+
+void Camera3Stream::faceRunningByCondition(const icamera::camera_buffer_t &buffer) {
+    if (!mFaceDetection)
+        return;
+
+    LOG2("[%p]@%s", this, __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;
+            }
+        }
+        LOG2("%s, Currently running one time face detection every %d frames",
+             __func__, mFDRunInterval);
+    }
+
+    mFrameCnt = ++mFrameCnt % mFDRunInterval;
+}
+
+void Camera3Stream::requestExit()
+{
+    LOG1("[%p]@%s", this, __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,
+                                  uint32_t frame_number)
+{
+    LOG1("[%p] isHALStream: %d @%s", this, mIsHALStream, __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");
+
+    std::shared_ptr<StreamComInfo> streamInfo = std::make_shared<StreamComInfo>();
+    streamInfo->cam3Buf = nullptr;
+    {
+    std::lock_guard<std::mutex> l(mLock);
+
+    if (inputCam3Buf) {
+        LOG1("[%p] frameNumber %d input buffer requested ", this, frame_number);
+        return icamera::OK;
+    }
+
+    if (mPostProcessType == icamera::POST_PROCESS_NONE) {
+        streamInfo->cam3Buf = ccBuf;
+    }
+    mCaptureRequest[frame_number] = streamInfo;
+    }
+
+    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("[%p]@%s, frameNumber:%d", this, __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;
+
+    mCaptureResultMap[frameNumber] = result;
+    mBufferDoneCondition.notify_one();
+}
+
+int Camera3Stream::setActive(bool state)
+{
+    LOG1("[%p]@%s isHALStream: %d state %d", this, __func__, mIsHALStream, 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);
+        }
+
+        if (mIsHALStream) {
+            mBufferPool->createBufferPool(mCameraId, mMaxNumReqInProc, mHALStream);
+            LOG2("@%s, HAL stream create BufferPool", __func__);
+        }
+
+        if (mInputPostProcessor) {
+            mInputPostProcessor->configure(mStream, *mInputStream.get());
+            mInputPostProcessType = mInputPostProcessor->getPostProcessType();
+        }
+    } else if (mStreamState && !state) {
+        mPostProcessType = icamera::POST_PROCESS_NONE;
+
+        if (mInputPostProcessor) {
+            mInputPostProcessType = icamera::POST_PROCESS_NONE;
+        }
+
+        if (mBufferPool) {
+            mBufferPool->destroyBufferPool();
+        }
+
+        // Exit Camera3Stream thread
+        requestExit();
+    }
+
+    mStreamState = state;
+
+    return icamera::OK;
+}
+
+void Camera3Stream::activateFaceDetection(unsigned int maxFaceNum)
+{
+    LOG1("[%p]@%s maxFaceNum %d, mCameraId %d", this, __func__, maxFaceNum, mCameraId);
+
+    mFaceDetection = icamera::FaceDetection::createInstance(mCameraId, maxFaceNum, mHALStream.id,
+                                                            mHALStream.width, mHALStream.height);
+}
+
+void Camera3Stream::addListener(Camera3Stream *listener)
+{
+    mListeners.push_back(listener);
+}
+
+/* fetch the buffers will be queued to Hal, the buffer has 3 sources:
+** 1st using HAL stream's request, then the buffer->addr should equal request->cam3Buf->addr()
+** 2nd if using listener buffer directly
+** 3rd using bufferpool, the buffer from pool is stored in mQueuedBuffer
+*/
+bool Camera3Stream::fetchRequestBuffers(icamera::camera_buffer_t *buffer, uint32_t frameNumber)
+{
+    if (!mIsHALStream) return false;
+    LOG1("[%p]@%s isHALStream: %d frameNumber %d", this, __func__, mIsHALStream, frameNumber);
+
+    int requestStreamCount = 0;
+    std::shared_ptr<StreamComInfo> request = nullptr;;
+    std::shared_ptr<Camera3Buffer> buf = nullptr;
+
+    // search from listeners, check if any one provided a buffer, count request stream Number
+    for (auto &iter : mListeners) {
+        request = iter->getCaptureRequest(frameNumber);
+        if (request) {
+            requestStreamCount++;
+            buf = request->cam3Buf ? request->cam3Buf : buf;
+        }
+    }
+
+    // if the HAL stream has a buffer, prefer use HAL stream's buffer to qbuf/dqbuf
+    request = getCaptureRequest(frameNumber);
+    if (request) {
+        requestStreamCount++;
+        buf = request->cam3Buf ? request->cam3Buf : buf;
+    }
+
+    if (!requestStreamCount) {
+        // no stream requested
+        return false;
+    }
+
+    /* Fix me... stream buffer sync for 2 or more streams use the same buffer dqueud from HAL
+    ** if >= 2 streams request in same frame, we use buffer pool temporary.
+    ** to do: prefer to use user buffer to avoid memcpy
+    */
+    if (!buf || requestStreamCount >= 2) {
+        LOG1("[%p]@%s get buffer from pool", this, __func__);
+        if (mBufferPool) {
+            buf = mBufferPool->acquireBuffer();
+            CheckError(buf == nullptr, false, "no available internal buffer");
+            // using buffer pool, store the buffer, then can return it when frame done
+            mQueuedBuffer[frameNumber]= buf;
+        } else {
+            return false;
+        }
+    }
+
+    *buffer = buf->getHalBuffer();
+    // Fill the specific setting
+    buffer->s.usage = mHALStream.usage;
+    buffer->s.id = mHALStream.id;
+
+    return true;
+}
+
+// to check if a HW stream is triggered by it's listener
+void Camera3Stream::checkListenerRequest(uint32_t frameNumber)
+{
+    if (!mIsHALStream) return;
+
+    LOG1("[%p]@%s, frameNumber:%d", this, __func__, frameNumber);
+
+    bool listenerRequested = false;
+    for (auto &iter : mListeners) {
+        listenerRequested |= iter->getCaptureRequest(frameNumber) != nullptr;
+    }
+
+    if (!getCaptureRequest(frameNumber) && listenerRequested) {
+        // HW stream is enabled by listener's request
+        std::shared_ptr<CaptureResult> result = std::make_shared<CaptureResult>();
+        LOG1("[%p]@%s, frameNumber:%d HAL stream only listener requested", this, __func__, frameNumber);
+        if (result) {
+            std::lock_guard<std::mutex> l(mLock);
+            result->frameNumber = frameNumber;
+            result->inputCam3Buf = nullptr;
+            mCaptureResultMap[frameNumber] = result;
+        }
+        mBufferDoneCondition.notify_one();
+    }
+}
+
+void Camera3Stream::notifyListenerBufferReady(uint32_t frameNumber,
+                                              const std::shared_ptr<StreamComInfo> &halOutput)
+{
+    LOG1("[%p] @%s", this, __func__);
+    std::lock_guard<std::mutex> l(mLock);
+    if (mCaptureRequest.find(frameNumber) != mCaptureRequest.end()) {
+        mHALStreamOutput[frameNumber] = halOutput;
+        mBufferDoneCondition.notify_one();
+    }
+}
+
+std::shared_ptr<StreamComInfo> Camera3Stream::getCaptureRequest(uint32_t frameNumber)
+{
+    std::lock_guard<std::mutex> l(mLock);
+    std::shared_ptr<StreamComInfo> request = nullptr;
+
+    if (mCaptureRequest.find(frameNumber) != mCaptureRequest.end()) {
+        request = mCaptureRequest[frameNumber];
+    }
+    return request;
+}
+
+bool Camera3Stream::waitCaptureResultReady()
+{
+    std::unique_lock<std::mutex> lock(mLock);
+    /* 1st loop, the HAL and listener stream wait on the CaptureResult BufferDoneCondition
+    ** if the CaptureResultVector not empty.
+    ** 2nd loop, the CaptureResult is not empty, and the HAL stream will start to dqbuf
+    ** the listener stream should wait HAL Stream send out buffer ready event if it doesn't have
+    ** inputCam3Buf. 3rd loop(listener stream only) both vecotr are not empty, return true
+    */
+    // HAL stream and listener stream should wait RequestManager notification
+    bool needWaitBufferReady = mCaptureResultMap.empty();
+    // listeners stream should wait HAL output buffer if not has input buffer
+    if (!mIsHALStream && !mCaptureResultMap.empty()) {
+        auto captureResult = mCaptureResultMap.begin();
+        std::shared_ptr<CaptureResult> result = captureResult->second;
+        needWaitBufferReady = !result->inputCam3Buf && mHALStreamOutput.empty();
+    }
+    if (needWaitBufferReady) {
+        std::cv_status ret = mBufferDoneCondition.wait_for(
+                lock,
+                std::chrono::nanoseconds(kMaxDuration * SLOWLY_MULTIPLIER));
+        if (ret == std::cv_status::timeout) {
+            LOGW("[%p]%s, wait buffer ready time out", this, __func__);
+        }
+        // return false to make the threadLoop run again
+        return false;
+    }
+
+    return true;
+}
+
+void Camera3Stream::requestStreamDone(uint32_t frameNumber)
+{
+    if (!mIsHALStream) return;
+
+    LOG1("[%p] @%s frameNumber: %d", this, __func__, frameNumber);
+
+    /* release buffers. if the buffer used to qbuf/dqbuf is from listener or HAL stream, it will
+    ** be released in its stream, because now we use buffer pool to sync buffer between frames
+    */
+    std::unique_lock<std::mutex> lock(mLock);
+    if (mQueuedBuffer.find(frameNumber) != mQueuedBuffer.end()) {
+        // if HAL stream using buffer from pool to qbuf/dqbuf, return it
+        mBufferPool->returnBuffer(mQueuedBuffer[frameNumber]);
+        mQueuedBuffer.erase(frameNumber);
+    }
+}
+} // 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..c4b437682d98
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/Camera3Stream.h
@@ -0,0 +1,183 @@
+/*
+ * 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 <memory>
+#include <utility>
+
+#include "FaceDetection.h"
+#include <hardware/camera3.h>
+#include "PostProcessor.h"
+#include "ResultProcessor.h"
+#include "Thread.h"
+#include "Camera3BufferPool.h"
+
+#define HARDWARE_VIDEO_STREAM_NUM 2
+#define HARDWARE_STREAM_NUM (HARDWARE_VIDEO_STREAM_NUM + 2) // 1 opaque raw stream, 1 still stream
+
+namespace camera3 {
+
+struct CaptureResult {
+    uint32_t frameNumber;
+    camera3_stream_buffer_t outputBuffer;
+    buffer_handle_t handle;
+    std::shared_ptr<Camera3Buffer> inputCam3Buf;
+    icamera::Parameters param;
+};
+
+struct StreamComInfo {
+    std::shared_ptr<Camera3Buffer> cam3Buf;
+    icamera::Parameters parameter;
+};
+
+/**
+ * \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,
+                  bool isHWStream = false);
+    virtual ~Camera3Stream();
+
+    virtual bool threadLoop();
+    virtual void requestExit();
+
+    int processRequest(const std::shared_ptr<Camera3Buffer> &inputCam3Buf,
+                       const camera3_stream_buffer_t &outputBuffer,
+                       uint32_t frameNumber);
+
+    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);
+    void addListener(Camera3Stream *listener);
+    // fetch the buffers will be queued to Hal, HAL stream only
+    bool fetchRequestBuffers(icamera::camera_buffer_t *buffer, uint32_t frameNumber);
+    // check if the HW stream should be enabled by listener request
+    void checkListenerRequest(uint32_t frameNumber);
+    // called by RequestManager indicates the frame is done, release buffers
+    void requestStreamDone(uint32_t frameNumber);
+
+ private:
+    void handleSofAlignment();
+    /* get the request status anf Camera3Buf of this stream
+    ** return nullptr if stream not requested the frame
+    */
+    std::shared_ptr<StreamComInfo> getCaptureRequest(uint32_t frameNumber);
+    void notifyListenerBufferReady(uint32_t frameNumber,
+                                   const std::shared_ptr<StreamComInfo> &halOutput);
+
+    /* HAL stream or listener stream to wait capture buffer result ready to process
+    ** called in ThreadLoop, return false if need to start next loop wait for more event
+    ** return true to continue the threadloop
+    */
+    bool waitCaptureResultReady();
+
+ 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> mBufferPool;
+
+    camera3_stream_t mStream;
+
+    /* key is frame number, value is CaptureResult */
+    std::map<uint32_t, std::shared_ptr<CaptureResult>> mCaptureResultMap;
+    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;
+
+    bool mIsHALStream;
+
+    /* save the stream request output buffer, each stream can accept maxNumReqInProc
+    ** request. used by HAL stream to get listener request status
+    */
+    std::unordered_map<uint32_t, std::shared_ptr<StreamComInfo>> mCaptureRequest;
+    std::vector<Camera3Stream *> mListeners;
+    // HAL streams output result, listener stream will wait on it before process
+    std::unordered_map<uint32_t, std::shared_ptr<StreamComInfo>> mHALStreamOutput;
+
+    // save buffer obj when HAL choose buffer from pool to do qbuf/dqbuf
+    std::unordered_map<uint32_t, std::shared_ptr<Camera3Buffer>> mQueuedBuffer;
+
+    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..c3fe20a8eac4
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/HALv3Utils.cpp
@@ -0,0 +1,144 @@
+/*
+ * 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, int usage)
+{
+    LOG1("@%s", __func__);
+
+    int format = -1;
+    switch (halFormat) {
+        case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
+            if (IS_ZSL_USAGE(usage)) {
+                format = icamera::PlatformData::getISysRawFormat(cameraId);
+            } else {
+                format = V4L2_PIX_FMT_NV12;
+            }
+            break;
+        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, camera3Stream.usage);
+    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 (IS_ZSL_USAGE(camera3Stream.usage)) {
+        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..08e94313799a
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/HALv3Utils.h
@@ -0,0 +1,73 @@
+/*
+ * 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)
+#define IS_ZSL_USAGE(usage) (((usage) & GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL)
+
+#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 usage);
+    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..1954b4da6cca
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/IntelAFStateMachine.cpp
@@ -0,0 +1,437 @@
+/*
+ * 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
+
+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) {
+        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..f7f2707d9447
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/MetadataConvert.cpp
@@ -0,0 +1,2269 @@
+/*
+ * 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 <unordered_map>
+
+#include "Errors.h"
+#include "Utils.h"
+
+#include "ICamera.h"
+#include "HALv3Utils.h"
+#include "MetadataConvert.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},
+};
+
+static bool isValueSupported(uint8_t mode, const icamera::CameraMetadata *caps, uint32_t tag) {
+    icamera_metadata_ro_entry entry = caps->find(tag);
+    if (entry.count > 0) {
+       for (size_t i = 0; i < entry.count; i++) {
+           if (mode == entry.data.u8[i])
+                return true;
+       }
+    }
+    return false;
+}
+
+MetadataConvert::MetadataConvert(int cameraId) :
+    mCameraId(cameraId)
+{
+    LOG1("@%s, mCameraId %d", __func__, mCameraId);
+}
+
+MetadataConvert::~MetadataConvert()
+{
+    LOG1("@%s", __func__);
+}
+
+int MetadataConvert::constructDefaultMetadata(int cameraId, android::CameraMetadata *settings)
+{
+    LOG1("@%s", __func__);
+    const icamera::CameraMetadata *meta = StaticCapability::getInstance(cameraId)->getCapability();
+
+    // 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);
+
+    // Flash
+    mode = ANDROID_FLASH_MODE_OFF;
+    settings->update(ANDROID_FLASH_MODE, &mode, 1);
+
+    mode = ANDROID_FLASH_STATE_UNAVAILABLE;
+    uint32_t tag = CAMERA_FLASH_INFO_AVAILABLE;
+    icamera_metadata_ro_entry roEntry = meta->find(tag);
+    if (roEntry.count == 1 && roEntry.data.u8[0] == CAMERA_FLASH_INFO_AVAILABLE_TRUE) {
+        mode = ANDROID_FLASH_STATE_READY;
+    }
+    settings->update(ANDROID_FLASH_STATE, &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(int32_t cameraId, int type,
+                                                  android::CameraMetadata *settings) {
+    const icamera::CameraMetadata *caps = StaticCapability::getInstance(cameraId)->getCapability();
+
+    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;
+    uint8_t edgeMode = ANDROID_EDGE_MODE_FAST;
+    uint8_t nrMode   = ANDROID_NOISE_REDUCTION_MODE_FAST;
+    uint8_t sdMode   = ANDROID_SHADING_MODE_FAST;
+    uint8_t hpMode   = ANDROID_HOT_PIXEL_MODE_FAST;
+
+    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_ZERO_SHUTTER_LAG:
+        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+        edgeMode = ANDROID_EDGE_MODE_ZERO_SHUTTER_LAG;
+        nrMode = ANDROID_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG;
+        sdMode = ANDROID_SHADING_MODE_HIGH_QUALITY;
+        hpMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY;
+        break;
+    case CAMERA3_TEMPLATE_STILL_CAPTURE:
+        afMode = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+        edgeMode = ANDROID_EDGE_MODE_HIGH_QUALITY;
+        nrMode = ANDROID_NOISE_REDUCTION_MODE_HIGH_QUALITY;
+        sdMode = ANDROID_SHADING_MODE_HIGH_QUALITY;
+        hpMode = ANDROID_HOT_PIXEL_MODE_HIGH_QUALITY;
+        break;
+    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 modes are supported or not.
+    if (!isValueSupported(afMode, caps, CAMERA_AF_AVAILABLE_MODES))
+         afMode = ANDROID_CONTROL_AF_MODE_OFF;
+    if (!isValueSupported(edgeMode, caps, CAMERA_EDGE_AVAILABLE_EDGE_MODES))
+         edgeMode = ANDROID_EDGE_MODE_FAST;
+    if (!isValueSupported(nrMode, caps, CAMERA_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES))
+         nrMode = ANDROID_NOISE_REDUCTION_MODE_FAST;
+    if (!isValueSupported(sdMode, caps, CAMERA_SHADING_AVAILABLE_MODES))
+        sdMode = ANDROID_SHADING_MODE_FAST;
+    if (!isValueSupported(hpMode, caps, CAMERA_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES))
+        hpMode = ANDROID_HOT_PIXEL_MODE_FAST;
+
+    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);
+    settings->update(ANDROID_EDGE_MODE, &edgeMode, 1);
+    settings->update(ANDROID_NOISE_REDUCTION_MODE, &nrMode, 1);
+    settings->update(ANDROID_SHADING_MODE, &sdMode, 1);
+    settings->update(ANDROID_HOT_PIXEL_MODE, &hpMode, 1);
+
+    uint32_t 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, bool forceConvert)
+{
+    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, forceConvert);
+
+    // ANDROID_STATISTICS
+
+    // ANDROID_LED
+
+    // ANDROID_REPROCESS
+
+     return icamera::OK;
+}
+
+int MetadataConvert::HALMetadataToRequestMetadata(const icamera::Parameters &parameter,
+                                                  android::CameraMetadata *settings, int cameraId) {
+    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
+    convertRequestParameter(parameter, settings, cameraId);
+
+    // 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, bool forceConvert)
+{
+    // 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
+        || forceConvert) {
+        // 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) {
+            parameter->setSensitivityIso(entry.data.i32[0]);
+        }
+
+        // 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;
+            }
+
+            if (frameDuration != 0) {
+                float fps = NSEC_PER_SEC / frameDuration;
+                parameter->setFrameRate(fps);
+            }
+        }
+    } else {
+        // Clear manual settings then AE algorithm works
+        int64_t exposureTime = 0;
+        parameter->setExposureTime(exposureTime);
+        int32_t iso = 0;
+        parameter->setSensitivityIso(iso);
+        float fps = 0.0;
+        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::convertRequestParameter(const icamera::Parameters &parameter,
+                                             android::CameraMetadata *settings, int cameraId) {
+    const icamera::CameraMetadata *meta = StaticCapability::getInstance(cameraId)->getCapability();
+
+    uint32_t tag = CAMERA_REQUEST_PIPELINE_MAX_DEPTH;
+    icamera_metadata_ro_entry entry = meta->find(tag);
+    uint8_t depth = (entry.count == 1) ? *entry.data.u8 : 6;
+
+    settings->update(ANDROID_REQUEST_PIPELINE_DEPTH, &depth, 1);
+
+    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);
+    }
+
+    int32_t iso;
+    if (parameter.getSensitivityIso(iso) == 0) {
+        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);
+        }
+    }
+
+    icamera::CameraMetadata meta;
+    icamera::ParameterHelper::copyMetadata(parameter, &meta);
+
+    uint32_t tag = CAMERA_SENSOR_ROLLING_SHUTTER_SKEW;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count == 1) {
+        int64_t rollingShutter = entry.data.i64[0] * 1000;  // us -> ns
+        settings->update(ANDROID_SENSOR_ROLLING_SHUTTER_SKEW, &rollingShutter, entry.count);
+    }
+
+    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)
+{
+    camera_metadata_entry entry = settings->find(ANDROID_STATISTICS_FACE_DETECT_MODE);
+    if (entry.count == 1 && entry.data.u8[0] == 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 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
+
+    // ANDROID_HOT_PIXEL
+
+    // ANDROID_NOISE_REDUCTION
+
+    // ANDROID_SHADING
+    icamera::camera_shading_mode_t shadingMode;
+    uint8_t saMode = ANDROID_SHADING_MODE_OFF;
+    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;
+    ret = parameter.getLensShadingMapMode(lensShadingMapMode);
+    if (ret == icamera::OK) {
+        uint8_t lensSMMode;
+        ret = getAndroidValue(lensShadingMapMode, shadingModeTable,
+                              ARRAY_SIZE(shadingModeTable), &lensSMMode);
+        if (ret == icamera::OK) {
+             settings->update(ANDROID_STATISTICS_LENS_SHADING_MAP_MODE, &lensSMMode, 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);
+
+    entry = meta.find(CAMERA_CONTROL_MAX_REGIONS);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_CONTROL_MAX_REGIONS, entry.data.i32, entry.count);
+    }
+}
+
+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);
+    }
+
+    tag = CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS;
+    entry = meta.find(tag);
+    if (entry.count > 0) {
+        settings->update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+                         entry.data.i32, entry.count);
+    }
+
+    tag = CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS;
+    entry = meta.find(tag);
+    if (entry.count > 0) {
+        settings->update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
+                         entry.data.i64, entry.count);
+    }
+
+    tag = CAMERA_SCALER_AVAILABLE_STALL_DURATIONS;
+    entry = meta.find(tag);
+    if (entry.count > 0) {
+        settings->update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, entry.data.i64, entry.count);
+    }
+}
+
+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);
+        settings->update(ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY, &range[1], 1);
+    } 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 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);
+
+    float aperture = 0.0;
+    if (icamera::OK == parameter.getLensAperture(aperture)) {
+        settings->update(ANDROID_LENS_INFO_AVAILABLE_APERTURES, &aperture, 1);
+    }
+
+    float filterDensity = 0.0;
+    if (icamera::OK == parameter.getLensFilterDensity(filterDensity)) {
+        settings->update(ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES, &filterDensity, 1);
+    }
+
+    uint32_t tag = CAMERA_LENS_INFO_AVAILABLE_FOCAL_LENGTHS;
+    icamera_metadata_entry entry = meta.find(tag);
+    if (entry.count >= 1) {
+        settings->update(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, entry.data.f, entry.count);
+    }
+
+    float hyperfocalDistance = 0.0;
+    if (icamera::OK == parameter.getLensHyperfocalDistance(hyperfocalDistance)) {
+        settings->update(ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE, &hyperfocalDistance, 1);
+    }
+
+    float minFocusDistance = 0.0;
+    if (icamera::OK == parameter.getLensMinFocusDistance(minFocusDistance)) {
+        settings->update(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, &minFocusDistance, 1);
+    }
+
+    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_BLACK_LEVEL_LOCK,
+        ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
+        ANDROID_COLOR_CORRECTION_GAINS,
+        ANDROID_COLOR_CORRECTION_TRANSFORM,
+        ANDROID_CONTROL_AE_ANTIBANDING_MODE,
+        ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
+        ANDROID_CONTROL_AE_LOCK,
+        ANDROID_CONTROL_AE_MODE,
+        ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
+        ANDROID_CONTROL_AF_MODE,
+        ANDROID_CONTROL_AE_REGIONS,
+        ANDROID_CONTROL_AF_REGIONS,
+        ANDROID_CONTROL_AF_TRIGGER,
+        ANDROID_CONTROL_AWB_LOCK,
+        ANDROID_CONTROL_AWB_MODE,
+        ANDROID_CONTROL_CAPTURE_INTENT,
+        ANDROID_CONTROL_EFFECT_MODE,
+        ANDROID_CONTROL_MODE,
+        ANDROID_CONTROL_SCENE_MODE,
+        ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
+        ANDROID_EDGE_MODE,
+        ANDROID_FLASH_MODE,
+        ANDROID_JPEG_ORIENTATION,
+        ANDROID_JPEG_QUALITY,
+        ANDROID_JPEG_THUMBNAIL_QUALITY,
+        ANDROID_JPEG_THUMBNAIL_SIZE,
+        ANDROID_SCALER_CROP_REGION,
+        ANDROID_STATISTICS_FACE_DETECT_MODE,
+        ANDROID_SENSOR_FRAME_DURATION,
+        ANDROID_SENSOR_EXPOSURE_TIME,
+        ANDROID_SENSOR_SENSITIVITY,
+        ANDROID_HOT_PIXEL_MODE,
+        ANDROID_LENS_APERTURE,
+        ANDROID_LENS_FOCAL_LENGTH,
+        ANDROID_LENS_FOCUS_DISTANCE,
+        ANDROID_LENS_FILTER_DENSITY,
+        ANDROID_LENS_OPTICAL_STABILIZATION_MODE,
+        ANDROID_NOISE_REDUCTION_MODE,
+        ANDROID_REQUEST_ID,
+        ANDROID_REQUEST_TYPE,
+        ANDROID_TONEMAP_MODE,
+        ANDROID_TONEMAP_PRESET_CURVE,
+        ANDROID_TONEMAP_GAMMA,
+        ANDROID_SHADING_MODE,
+        ANDROID_STATISTICS_LENS_SHADING_MAP_MODE
+    };
+    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_COLOR_CORRECTION_MODE,
+        ANDROID_COLOR_CORRECTION_GAINS,
+        ANDROID_COLOR_CORRECTION_TRANSFORM,
+        ANDROID_COLOR_CORRECTION_ABERRATION_MODE,
+        ANDROID_CONTROL_AE_ANTIBANDING_MODE,
+        ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
+        ANDROID_CONTROL_AE_LOCK,
+        ANDROID_CONTROL_AE_MODE,
+        ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
+        ANDROID_CONTROL_AF_MODE,
+        ANDROID_CONTROL_AE_REGIONS,
+        ANDROID_CONTROL_AF_REGIONS,
+        ANDROID_CONTROL_AF_TRIGGER,
+        ANDROID_CONTROL_AWB_LOCK,
+        ANDROID_CONTROL_AWB_MODE,
+        ANDROID_CONTROL_CAPTURE_INTENT,
+        ANDROID_CONTROL_EFFECT_MODE,
+        ANDROID_CONTROL_MODE,
+        ANDROID_CONTROL_SCENE_MODE,
+        ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
+        ANDROID_CONTROL_AE_STATE,
+        ANDROID_CONTROL_AF_STATE,
+        ANDROID_CONTROL_AWB_STATE,
+        ANDROID_SYNC_FRAME_NUMBER,
+        ANDROID_EDGE_MODE,
+        ANDROID_FLASH_MODE,
+        ANDROID_JPEG_ORIENTATION,
+        ANDROID_JPEG_QUALITY,
+        ANDROID_JPEG_THUMBNAIL_QUALITY,
+        ANDROID_JPEG_THUMBNAIL_SIZE,
+        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_SCALER_CROP_REGION,
+        ANDROID_SENSOR_FRAME_DURATION,
+        ANDROID_SENSOR_EXPOSURE_TIME,
+        ANDROID_SENSOR_SENSITIVITY,
+        ANDROID_HOT_PIXEL_MODE,
+        ANDROID_REQUEST_PIPELINE_DEPTH,
+        ANDROID_SHADING_MODE,
+        ANDROID_STATISTICS_FACE_DETECT_MODE,
+        ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE,
+        ANDROID_STATISTICS_LENS_SHADING_MAP_MODE,
+        ANDROID_STATISTICS_SCENE_FLICKER,
+        ANDROID_NOISE_REDUCTION_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_COLOR_CORRECTION_AVAILABLE_ABERRATION_MODES,
+        ANDROID_CONTROL_AVAILABLE_MODES,
+        ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
+        ANDROID_CONTROL_AE_AVAILABLE_MODES,
+        ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
+        ANDROID_CONTROL_AE_COMPENSATION_RANGE,
+        ANDROID_CONTROL_AE_COMPENSATION_STEP,
+        ANDROID_CONTROL_AE_LOCK_AVAILABLE,
+        ANDROID_CONTROL_AF_AVAILABLE_MODES,
+        ANDROID_CONTROL_AVAILABLE_EFFECTS,
+        ANDROID_CONTROL_AVAILABLE_SCENE_MODES,
+        ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES,
+        ANDROID_CONTROL_AWB_AVAILABLE_MODES,
+        ANDROID_CONTROL_AWB_LOCK_AVAILABLE,
+        ANDROID_EDGE_AVAILABLE_EDGE_MODES,
+        ANDROID_FLASH_INFO_AVAILABLE,
+        ANDROID_HOT_PIXEL_AVAILABLE_HOT_PIXEL_MODES,
+        ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL,
+        ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES,
+        ANDROID_LENS_FACING,
+        ANDROID_LENS_INFO_AVAILABLE_APERTURES,
+        ANDROID_LENS_INFO_AVAILABLE_FILTER_DENSITIES,
+        ANDROID_LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION,
+        ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION,
+        ANDROID_LENS_INFO_HYPERFOCAL_DISTANCE,
+        ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
+        ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS,
+        ANDROID_NOISE_REDUCTION_AVAILABLE_NOISE_REDUCTION_MODES,
+        ANDROID_REQUEST_AVAILABLE_CAPABILITIES,
+        ANDROID_REQUEST_MAX_NUM_INPUT_STREAMS,
+        ANDROID_REQUEST_MAX_NUM_OUTPUT_STREAMS,
+        ANDROID_REQUEST_PARTIAL_RESULT_COUNT,
+        ANDROID_REQUEST_PIPELINE_MAX_DEPTH,
+        ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS,
+        ANDROID_REQUEST_AVAILABLE_RESULT_KEYS,
+        ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS,
+        ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM,
+        ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+        ANDROID_SCALER_CROPPING_TYPE,
+        ANDROID_SENSOR_BLACK_LEVEL_PATTERN,
+        ANDROID_SENSOR_ORIENTATION,
+        ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
+        ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT,
+        ANDROID_SENSOR_INFO_EXPOSURE_TIME_RANGE,
+        ANDROID_SENSOR_INFO_MAX_FRAME_DURATION,
+        ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE,
+        ANDROID_SENSOR_INFO_SENSITIVITY_RANGE,
+        ANDROID_SENSOR_INFO_PHYSICAL_SIZE,
+        ANDROID_SENSOR_INFO_WHITE_LEVEL,
+        ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE,
+        ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES,
+        ANDROID_SENSOR_MAX_ANALOG_SENSITIVITY,
+        ANDROID_SHADING_AVAILABLE_MODES,
+        ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES,
+        ANDROID_STATISTICS_INFO_MAX_FACE_COUNT,
+        ANDROID_SYNC_MAX_LATENCY,
+        ANDROID_TONEMAP_AVAILABLE_TONE_MAP_MODES,
+        ANDROID_TONEMAP_MAX_CURVE_POINTS
+    };
+    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
+    tag = CAMERA_SHADING_AVAILABLE_MODES;
+    entry = meta.find(tag);
+    if (entry.count != 0) {
+        settings->update(ANDROID_SHADING_AVAILABLE_MODES, entry.data.u8, entry.count);
+    }
+
+    // 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());
+    }
+}
+
+StaticCapability::StaticCapability(int cameraId) :
+    mCameraId(cameraId) {
+    LOG2("@%s, mCameraId %d", __func__, mCameraId);
+
+    icamera::camera_info_t cameraInfo = {};
+    icamera::get_camera_info(mCameraId, cameraInfo);
+    icamera::ParameterHelper::copyMetadata(*cameraInfo.capability, &mMetadata);
+}
+
+StaticCapability::~StaticCapability() {
+    LOG2("@%s, mCameraId: %d", __func__, mCameraId);
+}
+
+std::mutex StaticCapability::sLock;
+std::unordered_map<int, StaticCapability*> StaticCapability::sInstances;
+
+StaticCapability* StaticCapability::getInstance(int cameraId) {
+    std::lock_guard<std::mutex> lock(sLock);
+    if (sInstances.find(cameraId) == sInstances.end()) {
+        sInstances[cameraId] = new StaticCapability(cameraId);
+    }
+
+    return sInstances[cameraId];
+}
+
+void StaticCapability::releaseInstance(int cameraId) {
+    std::lock_guard<std::mutex> lock(sLock);
+    if (sInstances.find(cameraId) != sInstances.end()) {
+        StaticCapability* capability = sInstances[cameraId];
+        sInstances.erase(cameraId);
+        delete capability;
+    }
+}
+} // 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..e1e88d442e10
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/MetadataConvert.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.
+ */
+
+#pragma once
+
+#include <hardware/camera3.h>
+#include "HALv3Header.h"
+
+#include <unordered_map>
+
+#include "Parameters.h"
+#include "FaceDetection.h"
+#include "ParameterHelper.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(int cameraId, android::CameraMetadata *settings);
+    static int updateDefaultRequestSettings(int cameraId, int type,
+                                            android::CameraMetadata *settings);
+
+    static int requestMetadataToHALMetadata(const android::CameraMetadata &settings,
+                                            icamera::Parameters *parameter, bool forceConvert);
+    static int HALMetadataToRequestMetadata(const icamera::Parameters &parameter,
+                                            android::CameraMetadata *settings, int cameraId);
+    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 convertRequestParameter(const icamera::Parameters &parameter,
+                                       android::CameraMetadata *settings, int cameraId);
+    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, bool forceConvert);
+    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;
+};
+
+class StaticCapability {
+ public:
+     const icamera::CameraMetadata* getCapability() { return &mMetadata; }
+     static StaticCapability* getInstance(int cameraId);
+     static void releaseInstance(int cameraId);
+
+ private:
+    StaticCapability(int cameraId);
+    virtual ~StaticCapability();
+
+ private:
+    // Guard for singleton instance creation.
+    static std::mutex sLock;
+    static std::unordered_map<int, StaticCapability*> sInstances;
+
+    icamera::CameraMetadata mMetadata;
+    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..eff8c9face57
--- /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, stream.usage)
+        && 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, stream.usage);
+        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, stream.usage);
+        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, stream.usage)) {
+        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..5569457c7d02
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/RequestManager.cpp
@@ -0,0 +1,797 @@
+/*
+ * 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 <vector>
+#include <map>
+#include <utility>
+#include <algorithm>
+#include <list>
+#include <unordered_map>
+#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),
+    mInputStreamConfigured(false),
+    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);
+    StaticCapability::getInstance(mCameraId);
+
+    android::CameraMetadata defaultRequestSettings;
+    // Get static metadata
+    MetadataConvert::HALCapabilityToStaticMetadata(parameter, &defaultRequestSettings);
+
+    // Get defalut settings
+    MetadataConvert::constructDefaultMetadata(mCameraId, &defaultRequestSettings);
+    MetadataConvert::HALMetadataToRequestMetadata(parameter, &defaultRequestSettings, mCameraId);
+
+    mDefaultRequestSettings[CAMERA3_TEMPLATE_PREVIEW] = defaultRequestSettings;
+    MetadataConvert::updateDefaultRequestSettings(mCameraId, 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;
+    StaticCapability::releaseInstance(mCameraId);
+    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;
+    }
+
+    icamera::stream_t requestStreams[kMaxStreamNum]; // not include CAMERA3_STREAM_INPUT stream
+    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++;
+            mInputStreamConfigured = true;
+        } else if (stream->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
+            inputStreamNum++;
+            outStreamNum++;
+            mInputStreamConfigured = true;
+        } else {
+            LOGE("@%s, Unknown stream type %d!", __func__, stream->stream_type);
+            return icamera::BAD_VALUE;
+        }
+        // In ZSL case, RAW input and YUV input will be configured together.
+        CheckError(inputStreamNum > 2, icamera::BAD_VALUE, "Too many input streams : %d !", inputStreamNum);
+    }
+    CheckError(outStreamNum == 0, icamera::BAD_VALUE, "No output streams!");
+
+    /*
+     * Configure stream
+     */
+    int requestStreamNum = 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++) {
+        /*
+         * 1, for CAMERA3_STREAM_INPUT stream, format YCbCr_420_888 is for YUV reprocessing,
+         *    other formats (like IMPLEMENTATION_DEFINED, RAW_OPAQUE) are for RAW reprocessing.
+         * 2, for CAMERA3_STREAM_BIDIRECTIONAL stream, it is for RAW reprocessing.
+         * 3, for CAMERA3_STREAM_OUTPUT stream, if format is IMPLEMENTATION_DEFINED and
+         *    usage doesn't include COMPOSE or TEXTURE, it is for RAW reprocessing.
+         *    if format is RAW_OPAQUE, it is for RAW reprocessing.
+         */
+        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);
+            } else {
+                stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
+            }
+            stream_list->streams[i]->max_buffers = 1;
+            continue;
+        } else if (stream_list->streams[i]->stream_type == CAMERA3_STREAM_BIDIRECTIONAL) {
+            stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
+        } else {
+            if (stream_list->streams[i]->format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
+                inputStreamNum > 0) {
+                if (!(stream_list->streams[i]->usage & (GRALLOC_USAGE_HW_COMPOSER |
+                                                        GRALLOC_USAGE_HW_TEXTURE))) {
+                    stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
+                }
+            } else if (stream_list->streams[i]->format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
+                stream_list->streams[i]->usage |= GRALLOC_USAGE_HW_CAMERA_ZSL;
+            }
+        }
+
+        ret = HalV3Utils::fillHALStreams(mCameraId, *stream_list->streams[i], &requestStreams[requestStreamNum]);
+        CheckError(ret != icamera::OK, ret, "failed to fill requestStreams[%d], ret:%d", ret, requestStreamNum);
+
+        if (!yuvStream && stream_list->streams[i]->format != HAL_PIXEL_FORMAT_BLOB &&
+            !IS_ZSL_USAGE(stream_list->streams[i]->usage)) {
+            yuvStream = &requestStreams[requestStreamNum];
+        }
+        if (requestStreams[requestStreamNum].usage == icamera::CAMERA_STREAM_PREVIEW
+            || requestStreams[requestStreamNum].usage == icamera::CAMERA_STREAM_VIDEO_CAPTURE)
+            needAssignPreviewStream = false;
+
+        requestStreamNum++;
+    }
+    if (needAssignPreviewStream && yuvStream) {
+        yuvStream->usage = icamera::CAMERA_STREAM_PREVIEW;
+    }
+
+    CLEAR(mHALStream);
+
+    int halStreamFlag[kMaxStreamNum];
+    int halStreamNum = chooseHALStreams(requestStreamNum, halStreamFlag, requestStreams);
+    CheckError(halStreamNum <= 0 || halStreamNum > HARDWARE_STREAM_NUM, halStreamNum, "failed to find HAL stream");
+
+    // index of stream in mHALStream
+    int halStreamIndex = 0;
+    // map the stream index in requestStreams[] to the HAL stream index in mHALStream[]
+    std::map<int, int> streamToHALIndex;
+    for (int i = 0; i < requestStreamNum; i++) {
+        // fill HAL stream with right requestStreams object
+        if (halStreamFlag[i] == i) {
+            mHALStream[halStreamIndex] = requestStreams[i];
+            streamToHALIndex[i] = halStreamIndex;
+            halStreamIndex++;
+        }
+    }
+
+    icamera::stream_config_t streamCfg = {
+        halStreamNum,
+        mHALStream,
+        icamera::camera_stream_configuration_mode_t::CAMERA_STREAM_CONFIGURATION_MODE_AUTO
+    };
+
+    for (int i = 0; i < requestStreamNum; i++) {
+        const icamera::stream_t& s = requestStreams[i];
+        LOG1("@%s, requestStreams[%d]: w:%d, h:%d, f:%d, u:%d", __func__, i, s.width, s.height,
+             s.format, s.usage);
+    }
+
+    for (int i = 0; i < halStreamNum; i++) {
+        const icamera::stream_t& s = mHALStream[i];
+        LOG1("@%s, configured 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
+    requestStreamNum = 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;
+        }
+
+        /* use halStreamFlag[] to find it's HAL stream index in requestStreams
+        ** streamToHALIndex to find it's HAL Stream index in mHALStream[]*/
+        int halStreamIndex = streamToHALIndex[halStreamFlag[requestStreamNum]];
+        bool isHALStream = halStreamFlag[requestStreamNum] == requestStreamNum;
+        CheckError(halStreamIndex < 0 || halStreamIndex >= halStreamNum,
+                   icamera::BAD_VALUE, "failed to find hal stream %d", halStreamIndex);
+        Camera3Stream *s = new Camera3Stream(mCameraId,
+                                             mResultProcessor,
+                                             mHALStream[halStreamIndex].max_buffers,
+                                             mHALStream[halStreamIndex],
+                                             *stream,
+                                             inputStream,
+                                             isHALStream);
+        s->setActive(true);
+        stream->priv = s;
+        stream->max_buffers = mHALStream[halStreamIndex].max_buffers;
+        stream->usage |= GRALLOC_USAGE_HW_CAMERA_WRITE | GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_NEVER;
+        mCamera3StreamVector.push_back(s);
+
+        requestStreamNum++;
+        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);
+
+    // bind streams to HAL streams
+    for (int i = 0; i < mCamera3StreamVector.size(); i++) {
+        if (halStreamFlag[i] != i)
+            mCamera3StreamVector[halStreamFlag[i]]->addListener(mCamera3StreamVector[i]);
+    }
+
+    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 && !IS_ZSL_USAGE(s->usage)) {
+            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(mCameraId, 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]);
+
+    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;
+    }
+
+    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");
+
+        camera_metadata_entry entry = mLastSettings.find(ANDROID_SENSOR_TIMESTAMP);
+        if (entry.count == 1) {
+            inputCam3Buf->setTimeStamp(entry.data.i64[0]);
+        }
+
+        if (IS_ZSL_USAGE(request->input_buffer->stream->usage)) {
+            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);
+    param.setUserRequestId(static_cast<int32_t>(request->frame_number));
+
+    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 (mInputStreamConfigured || aStream->format == HAL_PIXEL_FORMAT_BLOB) {
+            param.setMakernoteMode(icamera::MAKERNOTE_MODE_JPEG);
+        }
+
+        ret = lStream->processRequest(opaqueRawInfo.sequence >= 0 ? nullptr : inputCam3Buf,
+                                      request->output_buffers[i],
+                                      request->frame_number);
+        CheckError(ret != icamera::OK, ret, "Failed to process request, ret:%d", ret);
+    }
+
+    // Convert metadata to Parameters
+    bool forceConvert = inputCam3Buf ? true : false;
+    MetadataConvert::requestMetadataToHALMetadata(mLastSettings, &param, forceConvert);
+
+    mResultProcessor->registerRequest(request, inputCam3Buf);
+
+    if (!inputCam3Buf || opaqueRawInfo.sequence >= 0) {
+        icamera::camera_buffer_t *buffer[HARDWARE_STREAM_NUM] = {nullptr};
+        int numBuffers = 0;
+        for (auto &stream : mCamera3StreamVector) {
+            if (stream->fetchRequestBuffers(&mCameraBufferInfo[index].halBuffer[numBuffers],
+                                                request->frame_number)) {
+                mCameraBufferInfo[index].halBuffer[numBuffers].sequence = opaqueRawInfo.sequence;
+                mCameraBufferInfo[index].halBuffer[numBuffers].timestamp = opaqueRawInfo.timestamp;
+                buffer[numBuffers] = &mCameraBufferInfo[index].halBuffer[numBuffers];
+                numBuffers++;
+            }
+        }
+        ret = icamera::camera_stream_qbuf(mCameraId, buffer, numBuffers, &param);
+        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);
+    }
+
+    for (auto &stream : mCamera3StreamVector) {
+        /* incase the HAL stream is not requested by user request, scan all the HAL
+        ** streams check if any one is triggered by listener
+        */
+        stream->checkListenerRequest(request->frame_number);
+    }
+
+    mCameraBufferInfo[index].frameInProcessing = true;
+    mCameraBufferInfo[index].frameNumber = request->frame_number;
+
+    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  frame %d", __func__, frameNumber);
+
+    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();
+
+    for (auto &stream : mCamera3StreamVector) {
+        stream->requestStreamDone(frameNumber);
+    }
+}
+
+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;
+}
+
+int RequestManager::chooseHALStreams(const uint32_t requestStreamNum, int* halStreamFlag,
+                                     icamera::stream_t *halStreamList)
+{
+    int activeHALNum = 0;
+    int avaVideoSlot = HARDWARE_VIDEO_STREAM_NUM;
+    vector<icamera::stream_t *> videoHALStream;
+    int videoMaxResStreamIndex = -1;
+    int stillHALStreamIndex = -1;
+
+    // HAL stream with configure index
+    std::unordered_map<icamera::stream_t *, int> videoHALStreamIndex;
+    /* save streams with their configure index, the index in this deque is
+    ** their priority to be HWStream, from low to high
+    */
+    std::list<std::pair<icamera::stream_t *, int>> videoHALStreamOrder;
+    // anchor where to insert next potential HAL stream in videoHALStreamOrder
+    auto anchor = videoHALStreamOrder.end();
+    // save sorted hal streams with their configure index
+    std::vector<std::pair<icamera::stream_t *, int>> requestStreams;
+
+    int opaqueCount = 0;
+    int stillCount = 0;
+    int videoCount = 0;
+    for (uint32_t i = 0; i < requestStreamNum; i++) {
+        // set flags to it's index, every stream is a HAL stream by default
+        halStreamFlag[i] = i;
+        if (halStreamList[i].usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
+            opaqueCount++;
+        } else if (halStreamList[i].usage == icamera::CAMERA_STREAM_STILL_CAPTURE) {
+            stillCount++;
+        } else {
+            videoCount++;
+        }
+    }
+    // if HAL stream slots are enough for all streams, make all streams as HAL stream
+    if (opaqueCount <= 1 && stillCount <= 1 && videoCount <= avaVideoSlot) {
+        return requestStreamNum;
+    }
+
+    for (uint32_t i = 0; i < requestStreamNum; i++) {
+        // clear the flags to invalid value
+        halStreamFlag[i] = -1;
+        requestStreams.push_back(std::make_pair(&halStreamList[i], i));
+    }
+
+    // sort stream by resolution, easy to find largest resolution stream
+    std::sort(requestStreams.begin(), requestStreams.end(),
+              [](std::pair<icamera::stream_t *, int> &s1, std::pair<icamera::stream_t *, int> &s2) {
+                if (s1.first->width * s1.first->height > s2.first->width * s2.first->height)
+                    return true;
+                else
+                    return false;
+            });
+
+    for (uint32_t i = 0; i < requestStreamNum; i++) {
+        icamera::stream_t *s = requestStreams[i].first;
+        int index = requestStreams[i].second;
+        if (s->usage == icamera::CAMERA_STREAM_OPAQUE_RAW) {
+            // choose hal stream for opaque stream, only 1 opaque stream
+            halStreamFlag[index] = index;
+            activeHALNum++;
+        } else if (s->usage == icamera::CAMERA_STREAM_STILL_CAPTURE) {
+            // choose hal stream for still streams, choose the MAX resolution
+            if (stillHALStreamIndex == -1) {
+                stillHALStreamIndex = index;
+                activeHALNum++;
+            }
+        } else {
+            // videoHALStream stores different resolution streams
+            if (videoMaxResStreamIndex == -1) {
+                // choose max resolution video stream
+                anchor = videoHALStreamOrder.insert(anchor, std::make_pair(s, index));
+                videoHALStream.push_back(s);
+            } else {
+                bool found = false;
+                // choose different resolution stream
+                for (auto &vs : videoHALStream) {
+                    if (s->width == vs->width && s->height == vs->height) {
+                        found = true;
+                        break;
+                    }
+                }
+                if (found) {
+                    /* same resolution stream put in the front of list, has low priority
+                    ** to be HALStream
+                    */
+                    videoHALStreamOrder.push_front(std::make_pair(s, index));
+                } else {
+                    /* different resolution stream has higher priority than same ones, insert
+                    ** it in front of MaxResolution stream or last different resolution stream
+                    */
+                    anchor = videoHALStreamOrder.insert(anchor, std::make_pair(s, index));
+                    videoHALStream.push_back(s);
+                }
+            }
+        }
+    }
+
+    if (stillHALStreamIndex >= 0) {
+        for (uint32_t i = 0; i < requestStreamNum; i++) {
+            // has only 1 Still HAL stream, other still stream should be listeners
+            if (halStreamList[i].usage == icamera::CAMERA_STREAM_STILL_CAPTURE) {
+                halStreamFlag[i] = stillHALStreamIndex;
+            }
+        }
+    }
+
+    // videoHALStream store selected HALStreams
+    videoHALStream.clear();
+    /* scan videoHALStreamOrder from back to front by the priority,
+    ** and put them into Video HAL stream slot
+    */
+    while (avaVideoSlot > 0 && !videoHALStreamOrder.empty()) {
+        auto stream = videoHALStreamOrder.back();
+        videoHALStream.push_back(stream.first);
+        videoHALStreamIndex[stream.first] = stream.second;
+        halStreamFlag[stream.second] = stream.second;
+        activeHALNum++;
+        avaVideoSlot--;
+        videoHALStreamOrder.pop_back();
+    }
+
+    //scan other streams not been put into HAL slot, bind to the HAL stream
+    while (!videoHALStreamOrder.empty()) {
+        auto stream = videoHALStreamOrder.back();
+        videoHALStreamOrder.pop_back();
+        int index = stream.second;
+        icamera::stream_t *s = stream.first;
+        // search same resolution in video HAL streams
+        int slot;
+        for (slot = 0; slot < videoHALStream.size(); slot++) {
+            if (s->width == videoHALStream.at(slot)->width
+                && s->height == videoHALStream.at(slot)->height)
+                break;
+        }
+        if (slot != videoHALStream.size()) {
+            // bind to same resolution slot
+            halStreamFlag[index] = videoHALStreamIndex[videoHALStream.at(slot)];
+        } else {
+            // bind to max resolution slot
+            halStreamFlag[index] = videoHALStreamIndex[videoHALStream.at(0)];
+        }
+    }
+    LOG1("has %d HAL Streams", activeHALNum);
+    for (int i=0; i < requestStreamNum; i++)
+        LOG1("user Stream %d bind to HAL Stream %d", i, halStreamFlag[i]);
+
+    return activeHALNum;
+}
+
+} // 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..98b1e09be60e
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/RequestManager.h
@@ -0,0 +1,112 @@
+/*
+ * 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;
+    std::vector<Camera3Stream*> mCamera3StreamVector;
+    bool mInputStreamConfigured;
+
+    std::condition_variable mRequestCondition;
+    // mRequestLock is used to protect mRequestInProgress
+    std::mutex mRequestLock;
+    uint32_t mRequestInProgress;
+    android::CameraMetadata mLastSettings;
+    icamera::stream_t mHALStream[HARDWARE_STREAM_NUM];
+
+    /* choose HAL stream to do qbuf/dqbuf from stream list.
+    ** halStreamFlag: array keeps the result.
+    ** halStreamFlag[i] = n means the halStreams[i] is the Listener of halStreams[n]
+    ** if i==n, then the stream is HAL stream.
+    ** return value is the total Number of HAL streams
+    */
+    int chooseHALStreams(const uint32_t requestStreamNum, int* halStreamFlag, icamera::stream_t *halStreams);
+};
+
+} // 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..f46d3aa33f70
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/ResultProcessor.cpp
@@ -0,0 +1,500 @@
+/*
+ * 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(cameraId, this));
+
+    mCamera3AMetadata = new Camera3AMetadata(mCameraId);
+    gettimeofday(&mRequestTime, nullptr);
+
+    mLastParams.sensorExposure = -1;
+    mLastParams.sensorIso = -1;
+}
+
+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());
+
+    if (inputCam3Buf) {
+        mInputCam3Bufs[req.frameNumber] = inputCam3Buf;
+    }
+    mRequestStateVector.push_back(req);
+
+    return icamera::OK;
+}
+
+int ResultProcessor::shutterDone(const ShutterEvent &event)
+{
+    std::lock_guard<std::mutex> l(mLock);
+    bool inputBuffer = mInputCam3Bufs.find(event.frameNumber) != mInputCam3Bufs.end();
+    for (uint32_t i = 0; i < mRequestStateVector.size(); i++) {
+        if (mRequestStateVector.at(i).frameNumber != event.frameNumber ||
+            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::metadataDone(const MetadataEvent &event)
+{
+    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;
+            }
+        }
+    }
+
+    if (metaMem) {
+        camera3_capture_result_t result;
+        CLEAR(result);
+        result.frame_number = event.frameNumber;
+        result.output_buffers = nullptr;
+        result.num_output_buffers = 0;
+
+        if (mInputCam3Bufs.find(result.frame_number) == mInputCam3Bufs.end()) {
+            android::CameraMetadata* metaResult = metaMem->getMetadata();
+            MetadataConvert::HALMetadataToRequestMetadata(*(event.parameter),
+                                                          metaResult, mCameraId);
+            updateMetadata(*(event.parameter), metaResult);
+            mCamera3AMetadata->process3Astate(*(event.parameter), *metaResult);
+        }
+
+        result.result = metaMem->getMemory();
+        result.partial_result = 1;
+        mCallbackOps->process_capture_result(mCallbackOps, &result);
+
+        LOG2("@%s frame_number:%u, metadataDone", __func__, event.frameNumber);
+    }
+
+    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) {
+            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;
+}
+
+int ResultProcessor::bufferDone(const BufferEvent &event)
+{
+    camera3_capture_result_t result;
+    CLEAR(result);
+
+    result.frame_number = event.frameNumber;
+    result.output_buffers = event.outputBuffer;
+    result.num_output_buffers = 1;
+    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++;
+            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;
+    int32_t sensorIso = 0;
+    parameter.getExposureTime(exposure);
+    parameter.getSensitivityIso(sensorIso);
+
+    // If the state of black level lock is ON in the first request, the value must be set ON.
+    // Other request sets the black level lock value according sensor exposure time and iso.
+    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
+                    && sensorIso == mLastParams.sensorIso) ||
+                    (-1 == mLastParams.sensorExposure
+                    && -1 == 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 = sensorIso;
+}
+
+// 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(int cameraId, ResultProcessor *resultProcessor)
+    : mCameraId(cameraId),
+      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);
+
+            icamera::Parameters parameter;
+            icamera::camera_get_parameters(mCameraId, parameter, data.data.buffer_ready.sequence);
+            MetadataEvent metadataEvent = {data.data.buffer_ready.frameNumber, &parameter};
+            mResultProcessor->metadataDone(metadataEvent);
+            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..e73fcf850d82
--- /dev/null
+++ b/camera/hal/intel/ipu6/aal/ResultProcessor.h
@@ -0,0 +1,185 @@
+/*
+ * 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 MetadataEvent {
+    uint32_t frameNumber;
+    const icamera::Parameters *parameter;
+};
+
+struct ShutterEvent {
+    uint32_t frameNumber;
+    uint64_t timestamp;
+};
+
+struct BufferEvent {
+    uint32_t frameNumber;
+    uint64_t timestamp;
+    const camera3_stream_buffer_t *outputBuffer;
+};
+
+struct ReferenceParam {
+    int64_t sensorExposure;
+    int32_t sensorIso;
+};
+
+/**
+ * \brief An interface used to callback buffer event.
+ */
+class CallbackEventInterface {
+public:
+    CallbackEventInterface() {}
+    virtual ~CallbackEventInterface() {}
+
+    virtual int metadataDone(const MetadataEvent &event) = 0;
+    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 metadataDone(const MetadataEvent &event);
+    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(int cameraId, ResultProcessor *resultProcessor);
+        ~ResultThread();
+
+        void sendEvent(const icamera::camera_msg_data_t &data);
+    private:
+        virtual bool threadLoop();
+
+    private:
+        const uint64_t kMaxDuration = 2000000000; // 2000ms
+        int mCameraId;
+        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..6e75e1b0311a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/api/ICamera.h
@@ -0,0 +1,578 @@
+/*
+ * 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
+ *******************************************************************************
+ *     Version        0.62       Add sequence in camera_get_parameters to fetch settings
+ * ------------------------------------------------------------------------------
+ *
+ */
+
+#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
+ * \param[in]
+ *   long sequence: sequence used to find target parameter and results, default is -1
+ *
+ * \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, long sequence = -1);
+
+/**************************************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..2f600fc7712b
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/api/Parameters.h
@@ -0,0 +1,2614 @@
+/*
+ * 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.
+ *     Version        0.73       Remove supported_stream_config_t structure.
+ *     Version        0.74       Add API to support sensor iso.
+ *     Version        0.75       Add API to support lens static info about apertures,
+ *                               filter densities, min focus densities and hyperfocal distance.
+ *
+ *
+ * ------------------------------------------------------------------------------
+ */
+
+#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 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;
+    long sequence;
+} 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] stream_array_t& config
+     *
+     * \return 0 if Stream Configs supported, otherwise non-0 value is returned.
+     */
+    int getSupportedStreamConfig(stream_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 sensor ISO, will overwrite value of setSensitivityGain.
+     * The sensor ISO only take effect when ae mode set to manual.
+     *
+     * \param[in] int32 iso
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int setSensitivityIso(int32_t iso);
+
+    /**
+     * \brief Get sensor iso.
+     *
+     * \param[out] int32 iso
+     *
+     * \return 0 if sensor iso was set, non-0 means no sensor iso was set.
+     */
+    int getSensitivityIso(int& iso) 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 Get lens aperture.
+     *
+     * \param[out] aperture
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int getLensAperture(float &aperture) const;
+
+    /**
+     * \brief Get lens filter density.
+     *
+     * \param[out] filter density
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int getLensFilterDensity(float &filterDensity) const;
+
+    /**
+     * \brief Get lens min focus distance.
+     *
+     * \param[out] min focus distance
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int getLensMinFocusDistance(float &minFocusDistance) const;
+
+    /**
+     * \brief Get lens hyperfocal distance.
+     *
+     * \param[out] hyperfocal distance
+     *
+     * \return 0 if set successfully, otherwise non-0 value is returned.
+     */
+    int getLensHyperfocalDistance(float &hyperfocalDistance) 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;
+
+    /**
+     * \brief Set user request id
+     *
+     * \param[in] user request id
+     *
+     * \return 0 if successfully, otherwise non-0 value is returned.
+     */
+    int setUserRequestId(int32_t userRequestId);
+
+    /**
+     * \brief Get user request id
+     *
+     * \param[out] user request id
+     *
+     * \return 0 if successfully, otherwise non-0 value is returned.
+     */
+    int getUserRequestId(int32_t& userRequestId) 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..d601cb6f6aad
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/GCSSParser.h
@@ -0,0 +1,69 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2015-2018 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 __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..d937cce5be49
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss.h
@@ -0,0 +1,284 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2016-2018 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 __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..9dcbbab80175
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_aic_utils.h
@@ -0,0 +1,330 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2017-2018 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 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..6050307c2927
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_isp_utils.h
@@ -0,0 +1,153 @@
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2018 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 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..dbe34c649d02
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_item.h
@@ -0,0 +1,272 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2015-2018 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 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..5bd0f2907f0e
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_keys.h
@@ -0,0 +1,144 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2015-2018 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.
+ */
+
+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..2b656ff83401
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/gcss_utils.h
@@ -0,0 +1,642 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2015-2018 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 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..d5dbf7675058
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/graph_query_manager.h
@@ -0,0 +1,157 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2015-2018 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 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..465d47584a32
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/gcss/graph_utils.h
@@ -0,0 +1,454 @@
+
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2017-2018 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 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..63f14ef6aed3
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_cipf/ia_cipf_types.h
@@ -0,0 +1,414 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2013-2018 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 _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..680248b5d2b6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_cipf_css/ia_cipf_css.h
@@ -0,0 +1,1021 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2013-2020 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 _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 tnr_stage_id                  102
+#define tnr_stage_uid                 ia_cipf_external_stage_uid(tnr_stage_id)
+#define veboxtnr_stage_id             101
+#define veboxtnr_stage_uid            ia_cipf_external_stage_uid(veboxtnr_stage_id)
+
+#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 \
+                            || uid == tnr_stage_uid \
+                            || uid == veboxtnr_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/AIQResult.h b/camera/hal/intel/ipu6/include/ia_imaging/AIQResult.h
new file mode 100644
index 000000000000..b3d386b7e2bc
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/AIQResult.h
@@ -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.
+ */
+#pragma once
+
+namespace cca {
+
+// TODO: port AiqResult.cpp/.h into this class, along with deep copy functions
+//       from AiqUtils.cpp/.h from libcamhal.
+
+class AIQResult {
+public:
+    AIQResult();
+    virtual ~AIQResult();
+};
+}//cca
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h b/camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h
new file mode 100644
index 000000000000..f86d3a7ff488
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/CCAMacro.h
@@ -0,0 +1,72 @@
+/*
+ * 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 <stdint.h>
+
+namespace cca {
+
+/*
+ * TODO:
+ * This config file should be generated automatically to support different
+ * platforms or products, because the below defintions should depend on
+ * sensor, IPU, etc.
+ */
+const uint32_t MAX_CPF_LEN = 1024 * 1024 * 4;
+const uint32_t MAX_NVM_LEN = 1024 * 2;
+const uint32_t MAX_AIQD_LEN = 1024 * 1024;
+const uint32_t MAX_MKN_LEN = 1024 * 1024;
+const uint32_t MAX_MKN_SECTION_SIZE = 100000;
+const uint32_t MAX_CMC_LEN = 1024 * 1024;
+const uint32_t DEFAULT_FPS = 30;
+const uint32_t MAX_NUM_EXPOSURE = 4;
+const uint32_t MAX_NUM_STATS = 2;
+const uint32_t MAX_NUM_AF_STATS = 1;
+const uint32_t MAX_SENSOR = 2;
+const uint32_t MAX_EXPO_PLAN = 4;
+const uint32_t MAX_NUM_FLASH_LEDS = 1;
+const uint32_t MAX_BAYER_ORDER_NUM = 4;
+const uint32_t MAX_DVS_VECTOR_COUNT = 100 * 100;
+const uint32_t MAX_SIS_FRAME_SIZE = 500 * 500 * 4;
+const uint32_t MAX_PAL_SIZE = 1024 * 1024 * 4;
+const uint32_t MAX_PAL_TUNING_SIZE = 1024 * 1024;
+const uint32_t MAX_CUSTOM_CONTROLS_PARAM_SIZE = 128;
+const uint32_t MAX_KERNEL_NUMBERS_IN_PIPE = 128;
+const uint32_t MAX_AF_GRID_WIDTH = 128;
+const uint32_t MAX_AF_GRID_HEIGHT = 128;
+const uint32_t MAX_AF_STATS_GRID_SIZE (MAX_AF_GRID_WIDTH * MAX_AF_GRID_HEIGHT);
+const uint32_t MAX_GRBS_GRID_WIDTH = 150;
+const uint32_t MAX_GRBS_GRID_HEIGHT = 150;
+const uint32_t MAX_RGBS_STATS_GRID_SIZE (MAX_GRBS_GRID_WIDTH * MAX_GRBS_GRID_HEIGHT);
+const uint32_t MAX_STATS_LEN = 1024 * 1024;
+const uint32_t MAX_FACE_NUM = 32;
+const uint32_t MAX_LSC_DIM  = 2;
+const uint32_t MAX_LSC_DIM_SIZE (MAX_LSC_DIM * MAX_LSC_DIM);
+const uint32_t MAX_LSC_GRID_SIZE = 80 * 80;
+const uint32_t MAX_GAMMA_LUT_SIZE = 2048;
+
+
+const uint32_t GDC_Y_BLOCK_WIDTH = 64;
+const uint32_t GDC_UV_BLOCK_WIDTH = 64;
+const uint32_t GDC_Y_BLOCK_HEIGHT = 32;
+const uint32_t GDC_UV_BLOCK_HEIGHT = 16;
+const uint32_t GDC_SPLIT_METADATA_LEN = 4;
+const float GDC_CLIP_MAX_ANGLE = 3.5f;
+
+const uint32_t MAX_KERNEL_NUM_IN_PG = 128;
+const uint32_t MAX_PG_NUM = 5;
+const uint32_t MAX_PG_TERMINAL_NUM = 8;
+}//cca
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h b/camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h
new file mode 100644
index 000000000000..4b1afbdfe87b
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/CCAStorage.h
@@ -0,0 +1,33 @@
+/*
+ * 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 "AIQResult.h"
+// TODO: port AiqResultStorage.h/cpp class from libcamhal here.
+
+namespace cca {
+
+class CCAStorage {
+public:
+    CCAStorage();
+    virtual ~CCAStorage();
+
+private:
+    //TODO: frame indexed stats and result arrays as private member.
+    //      Result is compond structure so define CCAResult, as for stats
+    //      just use ia_xxx structures.
+};
+}//cca
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h b/camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h
new file mode 100644
index 000000000000..2322c2392fb0
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/IIPUAic.h
@@ -0,0 +1,254 @@
+/*
+ * 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 "IntelCCATypes.h"
+#ifdef PAC_ENABLE
+#include "ia_aic_types.h"
+#endif
+
+namespace cca {
+
+/*!
+ * \brief decode stats input parameters
+ */
+typedef struct {
+    long sequenceId;                           /*!< sequence id of the frame to decode from. */
+    const ia_aiq_ae_results* ae_settings;       /*!< AE result for sensor exposure setting. */
+    const ia_bcomp_results* bcomp_settings;     /*!< BComp result for lens VCM and PWM setting. */
+    ia_binary_data* stats;                      /*!< statistics binary. */
+} cca_dec_stats_input;
+
+/*!
+ * \brief decode stats output parameters
+ */
+typedef struct {
+    ia_isp_bxt_statistics_query_results_t stats;   /*!< contents of the binary. */
+    const ia_aiq_rgbs_grid **rgbs_grids;           /*!< rgbs statistics. */
+    const ia_aiq_af_grid **af_grids;               /*!< AF filter. */
+    const ia_aiq_histogram **hist;                 /*!< histogram used for AEC. */
+} cca_dec_stats_output;
+
+/*!
+ * \brief intel 3a plus results for AIC run
+ */
+typedef struct {
+    ia_aiq_frame_params* frame_info;
+    ia_aiq_pa_results_v1* pa_results;
+    ia_aiq_awb_results* awb_results;
+    ia_aiq_ae_results* aec_results;
+    ia_aiq_af_results* af_results;
+    ia_aiq_gbce_results* gbce_results;
+    ia_aiq_sa_results_v1 *sa_results;
+    ia_ltm_drc_params* drc_params;
+    ia_ltm_results* ltm_results;
+    ia_ob_output ob_results;
+    ia_dvs_morph_table* morph_table;
+    ia_dvs_image_transformation* dvs_image_transform;
+    ia_isp_bxt_gdc_limits* mbr_limits;
+    ia_bcomp_results* bcomp_results;
+} cca_3a_plus_results;
+
+#ifdef PAC_ENABLE
+/*!
+ * \brief configure the kernels in cb for AIC
+ */
+typedef struct {
+    int group_id;
+    int fragment_count;
+    ImagingKernelGroup *kernel_group;
+} cca_cb_config;
+
+/*!
+ * \brief configure the kernels in whole pipe for AIC
+ */
+typedef struct {
+    uint32_t cb_num;
+    cca_cb_config cb_config[MAX_PG_NUM];
+} cca_aic_config;
+
+/*!
+ * \brief terminal buffer struct
+ */
+typedef struct {
+    uint32_t terminal_index;
+    size_t buf_size;
+    IaAicBuffer *payload;
+} cca_terminal_buf;
+
+/*!
+ * \brief terminals for one cb
+ */
+typedef struct {
+    int group_id;
+    uint32_t num_terminal;
+    cca_terminal_buf terminal_buf[MAX_PG_TERMINAL_NUM];
+} cca_cb_termal_buf;
+
+typedef struct {
+    uint32_t cb_num;
+    cca_cb_termal_buf cb_terminal_buf[MAX_PG_NUM];
+} cca_aic_terminal_config;
+
+/*!
+ * \brief kernel offset config for AIC
+ */
+typedef struct {
+    int uuid;
+    IaAicBufferTypes terminal_type;
+    uint32_t terminal_index;
+    uint32_t *offsets;
+    uint32_t *sizes;
+    uint32_t num_offsets;
+    uint32_t fragment;
+} cca_kernel_offset;
+
+/*!
+ * \brief kernel offset config for special cb
+ */
+typedef struct {
+    int group_id;
+    uint32_t num_kernels;
+    cca_kernel_offset kernels_offset[MAX_KERNEL_NUM_IN_PG];
+} cca_cb_kernel_offset;
+
+/*!
+ * \brief configure the all kernel offsets in whole pipe for AIC
+ */
+typedef struct {
+    uint32_t cb_num;
+    cca_cb_kernel_offset cb_kernel_offset[MAX_PG_NUM];
+} cca_aic_kernel_offset;
+#endif
+
+/*!
+ * \brief Pure interface exposed to IntelCCA for AIC operations.
+ */
+class IIPUAic {
+public:
+    virtual ~IIPUAic() = default;
+
+    /*!
+     * \brief init all the IPU handles with aiqb/cmc.
+     *
+     * \param[in] aiqb                   Mandatory.\n
+     *                                   tuning file.
+     * \param[in] cmc                    Mandatory.\n
+     *                                   CCA global initial parameters.
+     * \param[in] max_stats_width        Mandatory.\n
+     *                                   max statistics grid width.
+     * \param[in] max_stats_height       Mandatory.\n
+     *                                   max statistics grid height.
+     * \param[in] max_num_stats_in       Mandatory.\n
+     *                                   max number of stats related to hdr/multi-sensor.
+     * \param[in] mkn                    Mandatory.\n
+     *                                   maker note buffer.
+     * \return                           Error code.
+     */
+    virtual ia_err init(const ia_binary_data *aiqb, const ia_cmc_t *cmc, uint32_t max_stats_width,
+                        uint32_t max_stats_height, uint32_t max_num_stats_in, ia_mkn *mkn) = 0;
+
+    /*!
+     * \brief run AIC parameters with graph config & Intel3A results.
+     *
+     * \param[in] params                 Mandatory.\n
+     *                                   AIQ plus parameters and stats.
+     * \param[out] pal                   Mandatory.\n
+     *                                   AIC results.
+     * \return                                  Error code.
+     */
+    virtual ia_err run(const cca_pal_input_params& params, cca_3a_plus_results& aaaResults, cca_pal_result& pal) = 0;
+
+    /*!
+     * \brief update tuning file aiqb.
+     *
+     * \param[in] aiqb                       Mandatory.\n
+     *                                       Tuning file.
+     * \param[in] cmc                        Mandatory.\n
+     *                                       Parsed cmc data.
+     * \return                               Error code.
+     */
+    virtual ia_err updateTuning(const ia_binary_data *aiqb, const ia_cmc_t *cmc) = 0;
+
+#ifdef PAC_ENABLE
+    /*!
+     * \brief configure cb including kernels group and kernels offset.
+     *
+     * \param[in] conf                          Mandatory.\n
+     *                                          graph config for all kernels.
+     * \param[in] offset                        Mandatory.\n
+     *                                          buffer offsets for all kernels.
+     * \param[out] termConfig                   Mandatory.\n
+     *                                          the memory needed by terminals of cb.
+     * \return                                  Error code.
+     */
+    virtual ia_err config(const cca_aic_config &conf, const cca_aic_kernel_offset &offset, cca_aic_terminal_config &termConfig) = 0;
+    /*!
+     * \brief register terminal buffers.
+     *
+     * \param[in] termConfig                    Mandatory.\n
+     *                                          the memory needed by terminals of cb.
+     * \return                                  Error code.
+     */
+    virtual ia_err registerBuf(const cca_aic_terminal_config &termConfig) = 0;
+    /*!
+     * \brief get AIC buffers for FW input after runing PAL.
+     *
+     * \param[out] termConfig                   Mandatory.\n
+     *                                          terminal memory of cb filled with IPU params.
+     * \return                                  Error code.
+     */
+    virtual ia_err getBuf(cca_aic_terminal_config &termConfig) = 0;
+    /*!
+     * \brief decode statistics for a specific type(AIQ, LTM, DVS stats).
+     *
+     * \param[in] groupId                Mandatory.\n
+     *                                   group id of CB.
+     * \param[in] seqId                  Mandatory.\n
+     *                                   sequence id for streaming.
+     * \param[out] stats                 Mandatory.\n
+     *                                   decoded statistics.
+     * \return                           Error code.
+     */
+    virtual ia_err decodeStats(int groupId, long seqId, IaCcatStatistics *stats) = 0;
+
+#else
+    /*!
+     * \brief decode statistics for a specific type(AIQ, LTM, DVS stats) <=IPU6.
+     *
+     * \param[in] decParams              Mandatory.\n
+     *                                   statistics info from FW.
+     * \param[out] results               Mandatory.\n
+     *                                   results of parsing statistics from FW.
+     * \return                           Error code.
+     */
+    virtual ia_err decodeStats(const cca_dec_stats_input &decParams, cca_dec_stats_output &results) = 0;
+
+#endif
+     /*!
+     * \brief deinit all the AIC handles.
+     */
+    virtual void deinit() = 0;
+
+    /*!
+     * \brief get the IPU HW version.
+     *
+     * \return                                  IPU HW version.
+     */
+    virtual const char* getVersion() = 0;
+};
+}//cca
diff --git a/camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.h b/camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.h
new file mode 100644
index 000000000000..8865839516fd
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/IntelCCATypes.h
@@ -0,0 +1,538 @@
+/*
+ * 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_aiq.h"
+#include "ia_types.h"
+#include "ia_ob.h"
+#include "ia_lard.h"
+#include "ia_ltm.h"
+#include "ia_dvs.h"
+#include "ia_view.h"
+#include "ia_cmc_types.h"
+#include "ia_cmc_parser.h"
+#include "ia_isp_bxt.h"
+#include "ia_bcomp.h"
+#include "ia_mkn_encoder.h"
+#ifdef PAC_ENABLE
+#include "ia_aic_types.h"
+#else
+#include "ia_isp_types.h"
+#endif
+
+#include "CCAMacro.h"
+
+namespace cca {
+
+typedef struct
+{
+    size_t size;
+    uint8_t buf[MAX_CPF_LEN];
+} cca_cpf;
+
+typedef struct
+{
+    size_t size;
+    uint8_t buf[MAX_NVM_LEN];
+} cca_nvm;
+
+typedef struct
+{
+    size_t size;
+    uint8_t buf[MAX_AIQD_LEN];
+} cca_aiqd;
+
+typedef struct
+{
+    size_t size;
+    uint8_t buf[MAX_MKN_LEN];
+} cca_mkn;
+
+typedef struct
+{
+    size_t size;
+    uint8_t buf[MAX_STATS_LEN];
+} cca_stats_bin;
+
+/*!
+ * \brief bitmap to enable CCA modules in running.
+ */
+enum CCAModuleBitMap
+{
+    CCA_MODULE_AE = 1,
+    CCA_MODULE_AF = 1 << 1,
+    CCA_MODULE_AWB = 1 << 2,
+    CCA_MODULE_PA = 1 << 3,
+    CCA_MODULE_SA = 1 << 4,
+    CCA_MODULE_GBCE = 1 << 5,
+    CCA_MODULE_LTM = 1 << 6,
+    CCA_MODULE_DVS = 1 << 7,
+    CCA_MODULE_OB = 1 << 8,
+    CCA_MODULE_BCOM = 1 << 9,
+    CCA_MODULE_LARD = 1 << 10
+};
+
+/*!
+ * \brief denote the type of statistics.
+ */
+enum CCAStatsType
+{
+    CCA_STATS_RGBS = 0,
+    CCA_STATS_HIST,
+    CCA_STATS_AF,
+    CCA_STATS_YV,
+    CCA_STATS_LTM,
+    CCA_STATS_DVS
+};
+
+typedef struct
+{
+    uint32_t 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_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_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[MAX_SENSOR];       /*!< 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 */
+    uint32_t 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]. */
+    uint32_t manual_exposure_time_us[MAX_NUM_EXPOSURE];         /*!< 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 [MAX_NUM_EXPOSURE];                /*!< 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; */
+    uint16_t manual_iso[MAX_NUM_EXPOSURE];                      /*!< 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_manual_limits manual_limits[MAX_NUM_EXPOSURE];    /*!< Optional. Manual limits which override limits defined in AEC tunings. */
+    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. */
+} cca_ae_input_params;
+
+/*!
+ * \brief exposure results.
+ */
+typedef struct
+{
+    ia_aiq_exposure_sensor_parameters sensor_exposure[MAX_EXPO_PLAN]; /*!< 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;
+} cca_ae_exposure;
+
+/*!
+ *  \brief AEC hist weight map.
+ */
+typedef struct
+{
+    uint16_t width;     /*!< Width of the weight grid. */
+    uint16_t height;    /*!< Height of the weight grid. */
+    uint8_t  weights[MAX_RGBS_STATS_GRID_SIZE]; /*!< Multipliers (weight) of RGB values in the grid. Values range [0, 15]. */
+} cca_hist_weight_grid;
+
+/*!
+ * \brief AEC results.
+ */
+typedef struct
+{
+    cca_ae_exposure exposures[MAX_SENSOR]; /*!< Exposure results to be used in the next frame. */
+    uint32_t num_exposures;                            /*!< The number of calculated exposures. */
+    ia_aiq_flash_parameters flashes[MAX_NUM_FLASH_LEDS]; /*!< Array of flash parameters for each flashes to be used in the next frame. */
+    uint32_t num_flashes;
+    ia_aiq_bracket_mode multiframe;                     /*!< AEC may propose to use multiframe for optimal results. */
+    ia_aiq_aperture_control aperture_control;          /*!< Aperture control parameters. */
+    cca_hist_weight_grid weight_grid;   /*!< AEC weight wap used by next frame. */
+} cca_ae_results;
+
+/*!
+ *  \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.). */
+    uint32_t lens_position;                                     /*!< Mandatory. Current lens position. */
+    uint64_t 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_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. */
+} cca_af_input_params;
+
+typedef struct
+{
+    ia_aiq_af_status status;                           /*!< Focus status */
+    uint32_t next_lens_position;                       /*!< Next lens position */
+    uint16_t current_focus_distance;                   /*!< Current focusing distance [mm] between the lens and object plane */
+    bool final_lens_position_reached;                  /*!< Lens has reached the final lens position */
+} cca_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. */
+} cca_awb_input_params;
+
+/*!
+ * \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 distance_from_convergence;  /*!< Range [0.0f, 1.0f]. Distance from convergence. Value 0.0f means converged. */
+} cca_awb_results;
+
+/*!
+ *  \brief Input parameter structure for GBCE algorithm.
+ */
+typedef struct
+{
+    ia_aiq_frame_use frame_use;             /*!< Deprecated. Not used. */
+    float ev_shift;                         /*!< Optional. Exposure Value shift [-4,4]. */
+} cca_gbce_input_params;
+
+
+/*!
+ * \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[MAX_RGBS_STATS_GRID_SIZE];  /*!< 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. */
+} cca_rgbs_grid;
+
+ /*!
+ * \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[MAX_RGBS_STATS_GRID_SIZE];    /*!< HDR RGBS blocks. */
+    uint32_t grid_width;            /*!< Grid width. */
+    uint32_t grid_height;           /*!< Grid height. */
+    uint32_t 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. */
+} cca_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
+{
+    uint16_t grid_width;    /*!< Number of block elements horizontally in a grid. */
+    uint16_t grid_height;   /*!< Number of block elements vertically in a grid. */
+    uint16_t block_width;   /*!< Block width (bq per block element). */
+    uint16_t block_height;  /*!< Block height (bq per grid element). */
+    int32_t filter_response_1[MAX_AF_STATS_GRID_SIZE];       /*!< Filter response of filter 1 (e.g. low pass, used by auto focus). */
+    int32_t filter_response_2[MAX_AF_STATS_GRID_SIZE];       /*!< Filter response of filter 2 (e.g. high pass, used by auto focus). */
+} cca_af_grid;
+
+/** @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
+{
+    uint32_t      num_faces;                 /**< Number of faces in the recently processed input frame. */
+    ia_atbx_face  faces[MAX_FACE_NUM];       /**< Array of face information. */
+} cca_face_state;
+
+/*!
+ *  \brief Input parameter structure of stats for AIQ algorithm.
+ */
+typedef struct
+{
+    uint64_t frame_id;                  /*!< The frame identifier which identifies to which frame the given statistics correspond. Must be positive. */
+    uint64_t frame_timestamp;           /*!< Mandatory although function will not return error, if not given. Start of frame timestamp in microseconds. */
+    cca_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. */
+    cca_hist_weight_grid weight_grid;     /*!< Weight map to be used in the next frame histogram calculation. */
+} cca_stats_params;
+
+/*!
+*  \brief Input parameter structure for Parameter adaptor.
+*/
+typedef struct
+{
+    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. */
+} cca_pa_input_params;
+
+/*!
+ *  \brief Input parameter structure for Shading Adaptor.
+ */
+typedef struct
+{
+    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 */
+} cca_sa_input_params;
+
+/*!
+ *  \brief output structure for Shading Adaptor.
+ */
+typedef struct
+{
+    uint16_t lsc_grid[MAX_LSC_DIM_SIZE][MAX_LSC_GRID_SIZE];   /*!< Arrays of the LSC grid for all color channels.*/
+    uint16_t width;                            /*!< Width of LSC grid. */
+    uint16_t height;                           /*!< Height of LSC grid. */
+    cmc_bayer_order color_order;               /*!< Bayer order of LSC grid. */
+} cca_sa_results;
+
+/*!
+ *  \brief params for global brightness and contrast enhancement.
+ */
+typedef struct
+{
+    float r_gamma_lut[MAX_GAMMA_LUT_SIZE];          /*!< Gamma LUT for R channel. Range [0.0, 1.0]. */
+    float b_gamma_lut[MAX_GAMMA_LUT_SIZE];          /*!< Gamma LUT for B channel. Range [0.0, 1.0]. */
+    float g_gamma_lut[MAX_GAMMA_LUT_SIZE];          /*!< Gamma LUT for G channel. Range [0.0, 1.0]. */
+    uint32_t gamma_lut_size;                        /*!< size of LUT. */
+} cca_gbce_params;
+
+/*!
+ *  \brief input parameter structure for aiq algorithm comp.
+ */
+typedef struct
+{
+    uint32_t bitmap;                /*!< algo(af,awb,gbce,pa,sa) enable/disable bitmap (CCAModuleBitMap) */
+    cca_af_input_params af_input;
+    cca_awb_input_params awb_input;
+    cca_gbce_input_params gbce_input;
+    cca_pa_input_params pa_input;
+    cca_sa_input_params sa_input;
+} cca_aiq_params;
+
+/*!
+ *  \brief results structure for aiq algorithm comp.
+ */
+typedef struct
+{
+    cca_af_results af_output;
+    cca_awb_results awb_output;
+    cca_sa_results sa_output;
+    cca_gbce_params gbce_output;
+} cca_aiq_results;
+
+/** LTM SIS.
+ * This structure contains LTM statistics.
+ */
+typedef struct
+{
+    ia_image_full_info image_info;       /* image info e.g image resolution */
+    uint32_t size;                       /* length of SIS */
+    uint8_t data[MAX_SIS_FRAME_SIZE];    /* SIS frame */
+} cca_ltm_statistics;
+
+typedef struct
+{
+    ia_ltm_level ltm_level;                 /*!< Mandatory. LTM level. -1 to use tuning defaults.*/
+    float ev_shift;                         /*!< Optional. (ob) Exposure Value shift [-4,4]. */
+    uint8_t 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*/
+    int16_t frame_width;                    /*!< Mandatory. Width of the frame where the results will be applied. */
+    int16_t frame_height;
+    cca_ltm_statistics sis;
+} cca_ltm_input_params;
+
+
+/** DVS Motion vectors.
+ * This structure contains DVS statistics.
+ */
+typedef struct
+{
+    uint32_t vector_count;              /* Number of motion vectors */
+    ia_dvs_motion_vector motion_vectors[MAX_DVS_VECTOR_COUNT];   /* Table of local motion vectors. Contains [vector_count] values. */
+} cca_dvs_statistics;
+
+/** DVS configuration.
+ * This structure contains DVS configuration.
+ */
+typedef struct
+{
+    ia_isp_bxt_resolution_info_t gdc_resolution_history;
+    ia_isp_bxt_resolution_info_t gdc_resolution_info;
+    int pre_gdc_top_padding;
+    int pre_gdc_bottom_padding;
+    int gdc_filter_width;
+    int gdc_filter_height;
+    unsigned char* splitMetadata;
+    unsigned int splitMetadataSize;
+} cca_gdc_configuration;
+
+struct cca_dvs_configuration
+{
+    float digital_zoom_ratio;               /* Digital zoom ratio */
+    float digital_zoom_factor;              /* If LGD correction is enabled and envelope is not big enough, small amount of DZ is automatically applied. */
+    ia_dvs_zoom_mode zoom_mode;             /* Digital zooming mode */
+    ia_rectangle zoom_region;               /* Zooming region which defines area to be scaled for the output. */
+    ia_coordinate zoom_coordinate;          /* Zooming coordinate which defines point where digital zoom is applied. */
+    cca_gdc_configuration gdc_input_config; /* Envelope settings for GDC kernel */
+};
+
+/*!
+*  \brief IA_ISP_BXT parameter input structure.
+*/
+typedef struct
+{
+    size_t size;
+    uint8_t data[MAX_PAL_TUNING_SIZE];
+} cca_pal_tuning;
+
+typedef struct
+{
+    size_t size;
+    uint8_t data[MAX_PAL_SIZE];
+} cca_pal_result;
+
+typedef struct
+{
+    int count;
+    float parameters[MAX_CUSTOM_CONTROLS_PARAM_SIZE];
+} cca_custom_control_params;
+
+typedef struct
+{
+    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 */
+} cca_run_kernels;
+
+typedef struct
+{
+    unsigned int kernel_count;                                /*!< Number of kernels in the program group .*/
+    cca_run_kernels run_kernels[MAX_KERNEL_NUMBERS_IN_PIPE];  /*!< 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[MAX_KERNEL_NUMBERS_IN_PIPE];       /*!< The graph of kernels in the program group .*/
+} cca_program_group;
+
+typedef struct
+{
+    bool enable_manual_settings;               /*!< indicate input params is valid. */
+    float color_conversion_matrix[3][3];       /*!< CC matrix. */
+    ia_aiq_color_channels color_gains;         /*!< RGB gains for each color channels. */
+} cca_pa_params;
+
+typedef struct
+{
+    ia_aiq_advanced_ccm_t preferred_acm;       /*!< Optional, manual setting for acm to replace the acm in PA results */
+    uint32_t 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. */
+    uint32_t seq_id;                           /*!< Optional. sequence number for aic run */
+    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. */
+    int8_t manual_brightness;                  /*!< Optional. Manual brightness value range [-128,127]. Value 0 means no change. */
+    int8_t manual_contrast;                    /*!< Optional. Manual contrast value range [-128,127]. Value 0 means no change. */
+    int8_t 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 */
+    int8_t 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.*/
+    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_media_format media_format;              /*!< Mandatory. Selected Digital television output format.(e.g. BT709) */
+    cca_program_group program_group;           /*!< Program group parameters for running AIC */
+    cca_custom_control_params custom_controls; /*!< Optional. Custom control parameter for interpolating between different tunings.
+                                                    If custom controls are not used, pointer can be set as null.*/
+    cca_pal_tuning 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_view_config_t view_params;              /*!< Optional. View parameters for running in GDC5 mode.*/
+    cca_pa_params manual_pa_setting;           /*!< Optional. manual settings (ccm & gain) for pa results.*/
+    cca_gbce_params manual_gbce_setting;       /*!< Optional. manual settings (gamma lut) for gbce results.*/
+} cca_pal_input_params;
+
+/*!
+*  \brief cmc parsed structure.
+*/
+typedef struct
+{
+    uint16_t base_iso;
+} cca_cmc;
+
+struct cca_init_params{
+    cca_cpf aiq_cpf;
+    cca_nvm aiq_nvm;
+    cca_aiqd aiq_aiqd;
+    unsigned int bitmap;       /*!< Mandatory. list all components (CCAModuleBitMap) that need initialization. */
+    ia_lard_input_params lardTag;
+    //BComp init params
+    float conversionGainRatio;
+    ia_bcomp_dol_mode_t dolMode;
+    //DVS
+    float dvsZoomRatio;
+    float digitalZoomFactor;
+    bool enableVideoStablization;
+    cca_gdc_configuration gdcConfig;
+    cca_init_params() :
+        conversionGainRatio(1),
+        dolMode(ia_bcomp_non_dol),
+        dvsZoomRatio(1.0f),
+        digitalZoomFactor(1.0),
+        enableVideoStablization(false)
+        {
+            bitmap = CCA_MODULE_AE | CCA_MODULE_AF | CCA_MODULE_AWB |
+                     CCA_MODULE_PA | CCA_MODULE_SA | CCA_MODULE_GBCE |
+                     CCA_MODULE_LTM | CCA_MODULE_DVS | CCA_MODULE_OB |
+                     CCA_MODULE_BCOM;
+            lardTag.aiq_mode_tag = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
+            lardTag.cmc_mode_tag = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
+            lardTag.isp_mode_index = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
+            lardTag.others_mode_tag = IA_MKN_CHTOUL('D', 'F', 'L', 'T');
+        }
+};
+
+}//cca
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..261591084739
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright 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.
+ */
+
+
+/*!
+ * \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..e02a7c59aeaa
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aec_types.h
@@ -0,0 +1,143 @@
+/*
+ * Copyright 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.
+ */
+
+
+/*!
+ * \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..387aac25018f
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aic_myriad.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..86b284303acb
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq.h
@@ -0,0 +1,621 @@
+/*
+ * Copyright 2012-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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..ef0dfadec7ea
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_deprecated.h
@@ -0,0 +1,266 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..3f485998ac49
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiq_types.h
@@ -0,0 +1,909 @@
+/*
+ * Copyright 2012-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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..47aefb93d45e
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_encode.h
@@ -0,0 +1,81 @@
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2016-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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intels
+* suppliers or licensors in any way.
+*/
+
+/*!
+ * \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..acca5d6e60c6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_aiqb_parser.h
@@ -0,0 +1,134 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2016 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 may contain trade
+ * secrets and proprietary and confidential information of Intel Corporation
+ * and its suppliers and licensors, and 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.
+ *
+ * Unless otherwise agreed by Intel in writing, you may not remove or alter
+ * this notice or any other notice embedded in Materials by Intel or Intels
+ * suppliers or licensors in any way.
+ */
+
+/*!
+ * \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..9ff602d740ab
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_alloc.h
@@ -0,0 +1,121 @@
+/*
+ * Copyright 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.
+ */
+
+ /*!
+  * \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..1ef2a9b4944f
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp.h
@@ -0,0 +1,89 @@
+/*
+ * Copyright 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.
+ */
+/*!
+ * \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..2ba1d7fb2f96
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_bcomp_types.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..b9fcb66b2fe9
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat.h
@@ -0,0 +1,556 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2012-2019 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 may contain trade
+ * secrets and proprietary and confidential information of Intel Corporation
+ * and its suppliers and licensors, and 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.
+ *
+ * Unless otherwise agreed by Intel in writing, you may not remove or alter
+ * this notice or any other notice embedded in Materials by Intel or Intels
+ * suppliers or licensors in any way.
+ */
+
+/*!
+ * \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..4f61aaad9183
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ccat_types.h
@@ -0,0 +1,236 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2012-2019 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 may contain trade
+ * secrets and proprietary and confidential information of Intel Corporation
+ * and its suppliers and licensors, and 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.
+ *
+ * Unless otherwise agreed by Intel in writing, you may not remove or alter
+ * this notice or any other notice embedded in Materials by Intel or Intels
+ * suppliers or licensors in any way.
+ */
+
+/*!
+ * \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..5ac33fcda4e7
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser.h
@@ -0,0 +1,47 @@
+/*
+ * 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 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..db376484a598
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_parser_deprecated.h
@@ -0,0 +1,42 @@
+/*
+ * 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 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..c8c31d9019e2
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_cmc_types.h
@@ -0,0 +1,1471 @@
+/*
+ * Copyright 2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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_hz,                 /*!< Horizon IR */
+    cmc_light_source_a_md,               /*!< A - Incandescent / Tungsten Medium light */
+    cmc_light_source_a_lw,               /*!< A - Incandescent / Tungsten Low light */
+} cmc_light_source;
+#define CMC_NUM_LIGHTSOURCES 24u
+
+/*!
+ * \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..d1cbbedb61ae
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_configuration.h
@@ -0,0 +1,60 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2020 Intel Corporation
+ * All Rights Reserved.
+ * 
+ * This file autogenerated. Do not edit directly!
+ */
+
+#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 ENABLE_AEC
+#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
+#define ENABLE_AF
+#define ENABLE_AWB
+#define ENABLE_GBCE
+#define ENABLE_PA
+#define ENABLE_SA
+#define ENABLE_DSD
+
+#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..63355fb18f2f
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_coordinate.h
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2012-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.
+ */
+
+/*!
+ * \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..b8fcade391e6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dpc.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2012 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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..ed98f395d998
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs.h
@@ -0,0 +1,286 @@
+/*
+ * Copyright 2014-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.
+ */
+
+/*!
+ * \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..1f9335125a63
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_deprecated.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2014-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_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..335aeb090337
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_dvs_types.h
@@ -0,0 +1,304 @@
+/*
+ * Copyright 2014-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_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..6bcdd4f407d6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_decoder.h
@@ -0,0 +1,103 @@
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2014-2016 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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intels
+* suppliers or licensors in any way.
+*/
+
+/*!
+ * \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..419d2a277adc
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_emd_types.h
@@ -0,0 +1,205 @@
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2014-2015 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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intels
+* suppliers or licensors in any way.
+*/
+
+/*!
+ * \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..0ecdead19547
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..9b74ba968015
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_exc_deprecated.h
@@ -0,0 +1,171 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..5fbd1e159aa4
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics.h
@@ -0,0 +1,138 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..e4d980a9e50e
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_intrinsics_types.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright 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.
+ */
+/*!
+ * \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..87c10bfea312
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt.h
@@ -0,0 +1,916 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..556e1f7fa958
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_deprecated.h
@@ -0,0 +1,641 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..a7150cf0f049
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_statistics_types.h
@@ -0,0 +1,192 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..2120ee91badd
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_bxt_types.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright 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;
+
+#pragma pack(push, IA_RESOLUTION_STATIC_GRAPH_PACK)
+typedef struct ia_isp_bxt_resolution_info
+{
+    /*
+     * IMPORTANT! do not do *ANY* change in this struct without coordinate with SW and Tools teams.
+     * This struct is being used by casting data from a binary file and hence cannot be changed.
+     */
+    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
+{
+    /*
+     * IMPORTANT! do not do *ANY* change in this struct without coordinate with SW and Tools teams.
+     * This struct is being used by casting data from a binary file and hence cannot be changed.
+     */
+    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;
+#pragma pack(pop)
+
+/*!
+* \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..3dabf019e15a
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_isp_types.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..2c4b7dd73a24
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_lard.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2012 - 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.
+ */
+
+
+/*!
+ * \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..c7f188863834
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_log.h
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2013 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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..54465a3f1fcb
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm.h
@@ -0,0 +1,146 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..b8dabf306c57
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_deprecated.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..5fc11ffed5a5
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ltm_types.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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..0868dedc5ad0
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_me_corner.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2014-2016 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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..4c0eca5bf7cd
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_decoder.h
@@ -0,0 +1,138 @@
+/*
+ * 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 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..d5da483c497c
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_encoder.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2012-2013, 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_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..d9d06109c986
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_mkn_types.h
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2012-2013, 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_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..b8ee6ceb9f06
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_nvm.h
@@ -0,0 +1,183 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright (c) 2012-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 may contain trade
+ * secrets and proprietary and confidential information of Intel Corporation
+ * and its suppliers and licensors, and 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.
+ *
+ * Unless otherwise agreed by Intel in writing, you may not remove or alter
+ * this notice or any other notice embedded in Materials by Intel or Intels
+ * suppliers or licensors in any way.
+ */
+
+/*!
+ * \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..97c2f3b14477
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_ob.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright 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.
+ */
+/*!
+ * \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..987e1601eb25
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p.h
@@ -0,0 +1,1977 @@
+/*
+ * Copyright 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 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);
+
+/*!
+ *  Returns the required size for the statistics buffer.
+ *
+ *  \param [in] ia_p2p IA_P2P instance handle.
+ */
+int32_t ia_p2p_get_statistics_buffer_size(ia_p2p_handle ia_p2p);
+
+/*!
+ *  Set statistics buffer pointer.
+ *
+ *  \param [in] ia_p2p            IA_P2P instance handle.
+ *  \param [in] statistics_buffer A pointer to statistics buffer. The buffer is allocated and managed by the user. The internal buffer will be used if it is NULL.
+ */
+void ia_p2p_set_statistics_buffer(ia_p2p_handle ia_p2p, void* statistics_buffer);
+
+/*!
+ *  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);
+
+
+/*!
+ *  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,
+    const ia_p2p_fragment_desc* pixel_fragment_descs,
+    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..5bb2db556956
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_p2p_types.h
@@ -0,0 +1,221 @@
+/*
+ * Copyright 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.
+ */
+
+/*!
+ * \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_direct.h b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_direct.h
new file mode 100644
index 000000000000..be276c25a641
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_direct.h
@@ -0,0 +1,80 @@
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2016-2018 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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intel's
+* suppliers or licensors in any way.
+*/
+#pragma once
+#include "ia_aiq_types.h"
+#include "ia_ltm_types.h"
+#include "ia_dvs_types.h"
+#include "ia_isp_bxt_types.h"
+#include "ia_cmc_types.h"
+#include "ia_view_types.h"
+#include "ia_bcomp_types.h"
+
+/*!
+ *\brief Enumeration for direct results UUIDs.
+ * UUIDs are used when fetching direct results from InputData class.
+ */
+typedef enum
+{
+    ia_pal_direct_results_uuid_start,
+    ia_pal_direct_results_uuid_aiq_sa_results = ia_pal_direct_results_uuid_start,
+    ia_pal_direct_results_uuid_aiq_hist_weight_grid,
+    ia_pal_direct_results_uuid_ltm_drc_params,
+    ia_pal_direct_results_uuid_dvs_morph_table,
+    ia_pal_direct_results_uuid_ltm_results,
+    ia_pal_direct_results_uuid_cmc_phase_difference,
+    ia_pal_direct_results_uuid_cmc_general_data,
+    ia_pal_direct_results_uuid_dvs_image_transformation,
+    ia_pal_direct_results_uuid_cmc_parsed_geometric_distortion2,
+    ia_pal_direct_results_uuid_cmc_lateral_chromatic_aberration_correction,
+    ia_pal_direct_results_uuid_cmc_optomechanics,
+    ia_pal_direct_results_uuid_view_params,
+    ia_pal_direct_results_uuid_bcomp_results,
+    ia_pal_direct_results_uuid_count, /* Keep this last */
+} ia_pal_direct_results_uuid;
+
+/*!
+ * \brief Direct results coming from algorithms without conversion to algo API structures.
+ * In case GAIC is not used, for improved PnP, it's not needed to copy large buffers from algorithm results to
+ * algo API structures. Define a structure, where algorithm results can be passed directly to PAL.
+ * ia_pal_direct_results structure must contain only pointers to other structures (no copied structures)!
+ */
+typedef struct
+{
+    ia_aiq_sa_results_v1 const *direct_ia_aiq_sa_results_v1;
+    ia_aiq_hist_weight_grid const *direct_ia_aiq_hist_weight_grid;
+    ia_ltm_drc_params const *direct_ia_ltm_drc_params;
+    ia_dvs_morph_table const *direct_ia_dvs_morph_table;
+    ia_ltm_results const *direct_ia_ltm_results;
+    cmc_phase_difference_t const *direct_cmc_phase_difference_t;
+    cmc_general_data_t const *direct_cmc_general_data_t;
+    ia_dvs_image_transformation const *direct_ia_dvs_image_transformation;
+    cmc_parsed_geometric_distortion2_t const *direct_cmc_parsed_geometric_distortion2_t;
+    cmc_lateral_chromatic_aberration_correction const *direct_cmc_lateral_chromatic_aberration_correction;
+    cmc_optomechanics_t const *direct_cmc_optomechanics_t;
+    ia_view_t const *direct_ia_view_t;
+    ia_bcomp_results const *direct_ia_bcomp_results;
+} ia_pal_direct_results;
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..99492333cf65
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_exports.h
@@ -0,0 +1,38 @@
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2014-2016 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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intel's
+* suppliers or licensors in any way.
+*/
+
+#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..ba5e31958019
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp.h
@@ -0,0 +1,54 @@
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2016-2018 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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intel's
+* suppliers or licensors in any way.
+*/
+
+#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..6eb3502397b2
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_ids_autogen.h
@@ -0,0 +1,378 @@
+
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2020 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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intel's
+* suppliers or licensors in any way.
+*/
+#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 = 32427,
+    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 = 21644,
+    ia_pal_uuid_isp_gdc_sp = 59334,
+    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 = 23171,
+    ia_pal_uuid_isp_gdc_sp_bodr_yuv4n_regs = 58979,
+    ia_pal_uuid_isp_gdc_sp_rifd_yuv4n_regs = 19263,
+    ia_pal_uuid_isp_ifd_gmv = 3429,
+    ia_pal_uuid_isp_ifd_lsc = 41939,
+    ia_pal_uuid_isp_ifd_pdaf = 17744,
+    ia_pal_uuid_isp_ifd_pipe = 45750,
+    ia_pal_uuid_isp_lbff_crop_espa = 36003,
+    ia_pal_uuid_isp_odr_ae = 31658,
+    ia_pal_uuid_isp_odr_af_std = 5134,
+    ia_pal_uuid_isp_odr_af_sve = 5893,
+    ia_pal_uuid_isp_odr_awb_sat = 60027,
+    ia_pal_uuid_isp_odr_awb_std = 24894,
+    ia_pal_uuid_isp_odr_awb_sve = 50498,
+    ia_pal_uuid_isp_odr_burst_isp = 47028,
+    ia_pal_uuid_isp_odr_cv = 48527,
+    ia_pal_uuid_isp_odr_gmv_feature = 17777,
+    ia_pal_uuid_isp_odr_gmv_match = 34399,
+    ia_pal_uuid_isp_odr_ir = 18645,
+    ia_pal_uuid_isp_odr_output_me = 41183,
+    ia_pal_uuid_isp_odr_output_ps = 12936,
+    ia_pal_uuid_isp_odr_pdaf = 49813,
+    ia_pal_uuid_isp_ofs_dp_bodr_regs = 29388,
+    ia_pal_uuid_isp_ofs_mp_bodr_regs = 62627,
+    ia_pal_uuid_isp_ofs_pp_bodr_regs = 40196,
+    ia_pal_uuid_isp_sdp_left_ifd = 46725,
+    ia_pal_uuid_isp_sdp_right_ifd = 44951,
+    ia_pal_uuid_isp_sdp_image_out0_odr = 58608,
+    ia_pal_uuid_isp_sdp_image_pp_odr = 44013,
+    ia_pal_uuid_isp_sdp_map_odr = 60102,
+    ia_pal_uuid_isp_slim_tnr_fp_blend_bifd_yuvnm1_regs = 10246,
+    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_rs4nm1_regs = 35187,
+    ia_pal_uuid_isp_slim_tnr_sp_bc_bifd_yuv4nm1_regs = 59937,
+    ia_pal_uuid_isp_slim_tnr_spatial_bifd_yuvn_regs = 41985,
+    ia_pal_uuid_isp_tnr_fp_blend_bifd_rs4n_regs = 45395,
+    ia_pal_uuid_isp_tnr_fp_bodr_yuvn_regs = 64744,
+    ia_pal_uuid_isp_tnr_mc_fp_bifd_mv16n_regs = 36137,
+    ia_pal_uuid_isp_tnr_mc_fp_rifd_yuvnm1_regs = 46338,
+    ia_pal_uuid_isp_tnr_scale_fp_bodr_yuv4n_regs = 26322,
+    ia_pal_uuid_isp_tnr_scale_sp_bifd_y4n_regs = 44635,
+    ia_pal_uuid_isp_tnr_scale_sp_bodr_y16n_regs = 41947,
+    ia_pal_uuid_isp_tnr_sp_bc_bifd_yuv4n_regs = 41576,
+    ia_pal_uuid_isp_tnr_sp_bc_bodr_rs4n_regs = 8425,
+    ia_pal_uuid_isp_tnr_sp_bc_bifd_mv16n_regs = 53892,
+    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16n_regs = 4109,
+    ia_pal_uuid_isp_tnr_sp_cme_lifd_y16nm1_regs = 15169,
+    ia_pal_uuid_isp_tnr_sp_mc1_rifd_y4nm1_regs = 39601,
+    ia_pal_uuid_isp_tnr_sp_mc2_bifd_mv16n_regs = 25869,
+    ia_pal_uuid_isp_tnr_sp_mc2_rifd_rs4nm1_regs = 5732,
+    ia_pal_uuid_isp_tnr_sp_mc2_rifd_yuv4nm1_regs = 4296,
+    ia_pal_uuid_isp_tnr_sp_rme_bifd_y4n_regs = 13498,
+    ia_pal_uuid_isp_tnr_sp_rme_bodr_mv16n_regs = 38594,
+    ia_pal_uuid_isp_visp_metadata_sodr_regs = 20861,
+    ia_pal_uuid_isp_visp_pixels_bodr_regs = 63075,
+    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_scp = 28247,
+    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;
+
+typedef enum
+{
+    ia_pal_uuid_system_api_io_buffer = 15381,
+    ia_pal_uuid_system_api_tvs_1_0 = 29571,
+
+} ia_system_api_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..710fd59c94c6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_pal_types_isp_parameters_autogen.h
@@ -0,0 +1,15980 @@
+
+/*
+* INTEL CONFIDENTIAL
+* Copyright (c) 2020 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 may contain trade
+* secrets and proprietary and confidential information of Intel Corporation
+* and its suppliers and licensors, and 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.
+*
+* Unless otherwise agreed by Intel in writing, you may not remove or alter
+* this notice or any other notice embedded in Materials by Intel or Intel's
+* suppliers or licensors in any way.
+*/
+#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;
+    /*!< decimation_type 0-Y, 1-RGB, 2-YUV420, 3-YUV422*/
+    int32_t decimation_type;
+
+} 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;
+    /*!< 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];
+    /*!< gdc_modep 0:Homography/Projections/LDC/PostAffine, 1:Homography/Projections/Rotation/LDC/PostAffine, 2:Homography/Projections/Rotation/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, 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[3] Invalid Coordinate Mask to be set. Default value set is for 8 bits.*/
+    int32_t invalid_coord_mask[3];
+    /*!< 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;
+    /*!< stream_dt_for_mipi_packet stream data type as need to be used in the header of mipi packet - not affect the proc*/
+    int32_t stream_dt_for_mipi_packet;
+    /*!< arbiter_pin MIPI CSI arbiter pin location of the stream*/
+    int32_t arbiter_pin;
+    /*!< aligner_data_size amount of valid bits per valid cycle to be accumulate and use the aligner (valid when dpa_bypass is set). LSB represent 2b resolution (meaning value can be 2, 4, 6, 8, … up to 72 which is the size bus)*/
+    int32_t aligner_data_size;
+    /*!< 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_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;
+    /*!< x_start First pixel in the row for the WOI of the FFC, min value 0, max value 1279*/
+    uint32_t x_start;
+    /*!< y_start First pixel in the column for the WOI of the FFC, min value 0, max value 1023*/
+    uint32_t y_start;
+    /*!< woi_width Width of the WOI for the FFC, min value 1, max value 1280*/
+    uint32_t woi_width;
+    /*!< woi_height Height of the WOI for the FFC, min value 1, max value 1024*/
+    uint32_t woi_height;
+    /*!< nonvalid_mask Mask the map values for identifying nonvalid pixels*/
+    uint32_t nonvalid_mask;
+    /*!< nonvalid_value Expected value of nonvalid pixels*/
+    uint32_t nonvalid_value;
+    /*!< pmu_scp_pre_clk_gate_enable if set, enable clock gating for SCP-PRE module managed by pmu*/
+    uint32_t pmu_scp_pre_clk_gate_enable;
+    /*!< pmu_scp_rau_clk_gate_enable if set, enable clock gating for SCP-RAU module managed by pmu*/
+    uint32_t pmu_scp_rau_clk_gate_enable;
+    /*!< pmu_scp_post_clk_gate_enable if set, enable clock gating for SCP-POST module managed by pmu*/
+    uint32_t pmu_scp_post_clk_gate_enable;
+    /*!< hamming_dist_lut[32] 32 deep by 8-bit lookup table for scaling Hamming Distance Values in bcc. Addressed by Hamming Distance, output is scaled value*/
+    uint32_t hamming_dist_lut[32];
+    /*!< sad_lut[256] 256 deep by 8-bit lookup table for scaling color Sum Of Distance Values in bcc. Addressed by SAD, output is scaled value*/
+    uint32_t sad_lut[256];
+    /*!< rau_inverse_lut[106] 106 deep by 16-bit lookup table for scaling color Sum Of Distance Values in bcc. addressed by RAU pixel sum, output is inverse value*/
+    uint32_t rau_inverse_lut[106];
+    /*!< interest_lut[512] 512 deep lookup table for converting thresholds to interest. Data is the 2 bit interest value*/
+    uint32_t interest_lut[512];
+    /*!< alpha_lut[128] 128 deep Alpha lookup table for RSM. Data is the 5 bit Weighting Factor Alpha value*/
+    uint32_t alpha_lut[128];
+    /*!< sub_pixel_lut[4096] 4096 entry lookup table for converting left-right score values to a 5-bit sub-pixel value. Data is 5 bits sub pixel value*/
+    uint32_t sub_pixel_lut[4096];
+    /*!< data_range_lookup[16384] 4 sets of 4096 deep lookup table for converting disparity to range data. 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;
+
+
+
+/* System API Structs */
+
+#pragma pack(push, 4)
+
+typedef struct
+{
+    uint16_t system_api_uuid;
+} ia_pal_system_api_record_header_t;
+
+/*! \system api struct io_buffer
+
+*/
+typedef struct
+{
+    /*!< aligner_data_size amount of valid bits per valid cycle to be accumulate and use the aligner (valid when dpa_bypass is set). LSB represent 2b resolution (meaning value can be 2, 4, 6, 8, … up to 72 which is the size bus)*/
+    int32_t aligner_data_size;
+    /*!< arbiter_pin MIPI CSI arbiter pin location of the stream*/
+    int32_t arbiter_pin;
+    /*!< 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;
+    /*!< stream_dt stream data type as need to be used by the MIPI*/
+    uint8_t stream_dt;
+    /*!< stream_dt_for_mipi_packet stream data type as need to be used in the header of mipi packet - not affect the proc*/
+    int32_t stream_dt_for_mipi_packet;
+    /*!< 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;
+
+/*! \system api struct tvs_1_0
+Trainable visual scaler
+*/
+typedef struct
+{
+    /*!< output_420 Output data format (0: YUV444; 1: YUV420. It will be forced to 1 if either ds_bypass or bypass is enabled)*/
+    uint8_t output_420;
+
+} ia_pal_system_api_tvs_1_0_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..7057b1124c88
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_statistics_types.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright 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.
+ */
+
+#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..b0f2c77786d5
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_types.h
@@ -0,0 +1,316 @@
+/*
+ * Copyright 2012-2020 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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;
+
+#define IA_RESOLUTION_STATIC_GRAPH_PACK 4
+#pragma pack(push, IA_RESOLUTION_STATIC_GRAPH_PACK)
+typedef struct {
+    /*
+     * IMPORTANT! do not do *ANY* change in this struct without coordinate with SW and Tools teams.
+     * This struct is being used by casting data from a binary file and hence cannot be changed.
+     */
+    int left;
+    int top;
+    int right;
+    int bottom;
+} ia_rectangle;
+#pragma pack(pop)
+
+/** 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..7654701f0a87
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view.h
@@ -0,0 +1,163 @@
+/*
+ * Copyright 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.
+ */
+
+
+#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..0c75a357e534
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/ia_view_types.h
@@ -0,0 +1,220 @@
+/*
+ * Copyright 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..4ff38da2ac59
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_blink_detection.h
@@ -0,0 +1,218 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2019 Intel Corporation
+ *
+ * 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 __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..912b3809046e
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_config.h
@@ -0,0 +1,93 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2018 Intel Corporation
+ *
+ * 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 __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..5fcb4aa4c3c3
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_eye_detection.h
@@ -0,0 +1,161 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2018 Intel Corporation
+ *
+ * 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 __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..754d3d9e5a6e
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_detection.h
@@ -0,0 +1,275 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2018 Intel Corporation
+ *
+ * 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 __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..1ce4653a4850
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_face_recognition.h
@@ -0,0 +1,478 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2016 Intel Corporation
+ *
+ * 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 __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..909b4041c3b9
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_image_montage.h
@@ -0,0 +1,234 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2016 Intel Corporation
+ *
+ * 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 __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..122ca08084d4
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_landmark_detection.h
@@ -0,0 +1,140 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2019 Intel Corporation
+ *
+ * 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 __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..2988d11e5540
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_mouth_detection.h
@@ -0,0 +1,159 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2016 Intel Corporation
+ *
+ * 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 __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..3b2220b58662
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_object_tracking.h
@@ -0,0 +1,243 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2018 Intel Corporation
+ *
+ * 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 __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..108314cdd422
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_panorama.h
@@ -0,0 +1,267 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2016 Intel Corporation
+ *
+ * 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 __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..af494293b5a6
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_pedestrian_detection.h
@@ -0,0 +1,227 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2016 Intel Corporation
+ *
+ * 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 __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..74b1ffe7d04b
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_perspective_control.h
@@ -0,0 +1,413 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2018 Intel Corporation
+ *
+ * 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 __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..d6f4998a99ea
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_smile_detection.h
@@ -0,0 +1,247 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2018 Intel Corporation
+ *
+ * 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 __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..1df95531d449
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_imaging/pvl_types.h
@@ -0,0 +1,177 @@
+/*
+ * INTEL CONFIDENTIAL
+ * Copyright 2012-2018 Intel Corporation
+ *
+ * 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 __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..608e67a13b6c
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_tools/css_types.h
@@ -0,0 +1,62 @@
+/*
+ * 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/include/ia_tools/ia_list.h b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
new file mode 100644
index 000000000000..2a99e70e2bf5
--- /dev/null
+++ b/camera/hal/intel/ipu6/include/ia_tools/ia_list.h
@@ -0,0 +1,116 @@
+/*
+ * 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 _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..0eff41b7cbc5
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/IntelPGParam.cpp
@@ -0,0 +1,1271 @@
+/*
+ * 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 = CIPR::callocMemory(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);
+        CheckError(!terminal, BAD_VALUE, "terminal is nullptr");
+
+        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 = CIPR::mallocAlignedMemory(PAGE_ALIGN(pgSize), CIPR::getPageSize());
+    mProcessGroupMemory = reinterpret_cast<ia_css_process_group_t*>(memory);
+    return mProcessGroupMemory;
+}
+
+void IntelPGParam::destroyPGBuffer() {
+    if (mProcessGroupMemory) {
+        CIPR::freeMemory(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 =
+                    CIPR::mallocAlignedMemory(PAGE_ALIGN(mParamPayloads[idx].size),
+                                              CIPR::getPageSize());
+    }
+    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) {
+            CIPR::freeMemory(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,
+                                  (mFragmentConfig ? mFragmentConfig->pixel_fragment_descs[kernelId]
+                                                   : mFragmentDesc),
+                                  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) {
+        CIPR::freeMemory(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..2c28da83a773
--- /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/Utils.h"
+
+#include "ia_tools/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..f29add688e2f
--- /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,
+                                              ia_isp_bxt_resolution_info_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);
+        }
+    }
+    LOG2("%s, %s", __func__, ret != OK ? "No gdc resolution" : "Get gdc resolution successfully");
+
+    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..7163477bab1e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigImpl.h
@@ -0,0 +1,185 @@
+/*
+ * 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 <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, ia_isp_bxt_resolution_info_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..f4114e95dcd9
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/algowrapper/graph/GraphConfigPipe.cpp
@@ -0,0 +1,2059 @@
+/*
+ * 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(!kenerArray, 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;
+    const ia_rectangle *input_crop = &resolutionInfo->input_crop;
+    const ia_rectangle *output_crop = &resolutionInfo->output_crop;
+    if (((resolutionInfo->input_width != resolutionInfo->output_width) ||
+        (resolutionInfo->input_height != resolutionInfo->output_height)) &&
+        ((input_crop->left == 0) && (input_crop->top == 0) && (input_crop->right == 0) &&
+        (input_crop->bottom == 0)) && ((output_crop->left == 0) && (output_crop->top == 0) &&
+        (output_crop->right == 0) &&(output_crop->bottom == 0))) {
+        *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);
+        LOG2("%s, width:%d-%d; height:%d-%d", __func__, resolutionInfo->input_width,
+             resolutionInfo->output_width, resolutionInfo->input_height,
+             resolutionInfo->output_height);
+    }
+    return OK;
+}
+
+const ia_isp_bxt_resolution_info_t *GraphConfigPipe::getScalerKernelResolutionInfo(
+                                                                        uint32_t *kenerArray,
+                                                                        uint32_t sizeArray) {
+    CheckError(!kenerArray, 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,
+                                              ia_isp_bxt_resolution_info_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 = *gdcResolution;
+
+    LOGG("%s: kernel %d, inResolution %dx%d, outResolution %dx%d", __func__,
+         *kernelId, resolution->input_width, resolution->input_height,
+         resolution->output_width, resolution->output_height);
+
+    LOGG("%s: kernel %d, inputCrop %d,%d,%d,%d; outputCrop %d,%d,%d,%d", __func__,
+         *kernelId, resolution->input_crop.left, resolution->input_crop.top,
+         resolution->input_crop.right, resolution->input_crop.bottom,
+         resolution->output_crop.left, resolution->output_crop.top,
+         resolution->output_crop.right, resolution->output_crop.bottom);
+
+    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);
+        CheckError(!connection.stream, UNKNOWN_ERROR, "%s, connection.stream is null.", __func__);
+        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 port name is main, the value of osW and osH are 1.
+        float osW = 1;
+        float osH = 1;
+        if (dpFlag) {
+            (void)getScalerKernelResolutionRatio(dpKernel, DB_KERNEL_SIZE, &osW, &osH);
+            LOG2("%s, dp ratio, osW:%f, osH:%f", __func__, osW, osH);
+        } else if (pppFlag) {
+            (void)getScalerKernelResolutionRatio(pppKernel, PPP_KERNEL_SIZE, &osW, &osH);
+            LOG2("%s, ppp ratio, osW:%f, osH:%f", __func__, 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))) {
+            const ia_rectangle *input_crop = &gdcResolution->input_crop;
+            const ia_rectangle *output_crop = &gdcResolution->output_crop;
+            if (((input_crop->left == 0) && (input_crop->top == 0) && (input_crop->right == 0) &&
+                (input_crop->bottom == 0)) && ((output_crop->left == 0) &&
+                (output_crop->top == 0) && (output_crop->right == 0) &&
+                (output_crop->bottom == 0))) {
+                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);
+            }
+        }
+        LOG2("%s, gdc ratio, gdcScalerW:%f, gdcScalerH:%f", __func__, gdcScalerW, gdcScalerH);
+
+        float b2iDsW = 1;
+        float b2iDsH = 1;
+        (void)getScalerKernelResolutionRatio(dsKernel, DS_KERNEL_SIZE, &b2iDsW, &b2iDsH);
+        LOG2("%s, b2iDs ratio, b2iDsW:%f, b2iDsH:%f", __func__, b2iDsW, b2iDsH);
+
+        scalerW = osW * gdcScalerW * b2iDsW;
+        scalerH = osH * gdcScalerH * b2iDsH;
+        scalerInfo->push_back({streamId, scalerW, scalerH});
+        LOG2("%s, streamId:%d, scalerW:%f, scalerH:%f", __func__, streamId, 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..ef83baebccd3
--- /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, ia_isp_bxt_resolution_info_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/Buffer.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Buffer.h
new file mode 100644
index 000000000000..58c2cdf8da0d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Buffer.h
@@ -0,0 +1,64 @@
+/*
+ * 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 <unordered_set>
+
+#include "Types.h"
+#include "Utils.h"
+
+#include "iutils/Utils.h"
+
+namespace icamera {
+namespace CIPR {
+class Buffer {
+ public:
+    Buffer(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory);
+    Buffer(Buffer* parent, uint32_t offset, uint32_t size);
+    ~Buffer();
+
+    bool isRegion() const;
+    Buffer* getParent();
+    Result getMemoryCpuPtr(void** ptr);
+    Result getMemorySize(int* size);
+    Result attatchDevice(Context* ctx);
+
+ private:
+    MemoryDesc mMemoryDesc;
+    uint32_t mOffset = 0;
+    std::unordered_set<Buffer*> mRegions;
+    bool mInitialized = false;
+    Context* mContext;
+
+ private:
+    Result createWithUserMemory(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory);
+    Result createWithUserMemoryWithCpuPtr(MemoryFlag flags, const MemoryDesc* userMemory);
+    Result createWithUserMemoryCommon(MemoryFlag flags, const MemoryDesc* userMemory);
+
+    Result validateBuffer(const MemoryDesc* memory);
+    Result allocateCommon();
+    Result allocate();
+    Result getMemory(MemoryDesc* mem);
+    Result getMemoryCommon(MemoryDesc* mem);
+    void destroy();
+    friend Command;
+
+    DISALLOW_COPY_AND_ASSIGN(Buffer);
+};
+}  // namespace CIPR
+}  // namespace icamera
+
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h
new file mode 100644
index 000000000000..f6e9835d2a9d
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Command.h
@@ -0,0 +1,51 @@
+/*
+ * 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 <vector>
+
+#include "Buffer.h"
+#include "Types.h"
+#include "Context.h"
+
+#include "iutils/Utils.h"
+
+namespace icamera {
+namespace CIPR {
+class Command {
+ public:
+    explicit Command(const PSysCommandConfig& cfg);
+    ~Command();
+
+    Result getConfig(PSysCommandConfig* cfg);
+    Result setConfig(const PSysCommandConfig& cfg);
+    Result enqueue(Context* ctx);
+
+ private:
+    Result grokBuffers(const PSysCommandConfig& cfg);
+    Result updatePG(const PSysCommandConfig& cfg);
+    Result updateKernel(const PSysCommandConfig& cfg, const MemoryDesc& memory);
+    Result getLegacyPGMem(const PSysCommandConfig& cfg, MemoryDesc* memory);
+
+ private:
+    PSysCommand* mCmd = nullptr;
+    bool mInitialized = false;
+
+    DISALLOW_COPY_AND_ASSIGN(Command);
+};
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h
new file mode 100644
index 000000000000..d8b8923987cd
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Context.h
@@ -0,0 +1,70 @@
+/*
+ * 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 <vector>
+
+#include "Types.h"
+#include "Buffer.h"
+#include "Utils.h"
+
+#include "iutils/Utils.h"
+
+namespace icamera {
+namespace CIPR {
+class ContextPoller;
+class Context : public MemoryOper {
+ public:
+    Context();
+    virtual ~Context();
+
+    Result getCapabilities(PSYSCapability* cap);
+    Result getManifest(uint32_t index, uint32_t* mainfestSize, void* manifest);
+    Result allocate(MemoryDesc* mem) final;
+    Result migrate(MemoryDesc* mem) final;
+    Result getMemory(MemoryDesc* mem, MemoryDesc* out) final;
+    Result destroy(MemoryDesc* mem) final;
+    Result doIoctl(int request, void *ptr);
+    ContextPoller getPoller(int event, int timeout);
+
+ private:
+    enum class Flags
+    {   DEBUG, NONE };
+    int mFd = -1;
+    Flags mInitFlag = Flags::NONE;
+    bool mInitialized;
+
+ private:
+    Result registerBuffer(MemoryDesc* mem);
+    Result unregisterBuffer(MemoryDesc* mem);
+    static Result psysClose(int fd);
+
+    DISALLOW_COPY_AND_ASSIGN(Context);
+};
+
+class ContextPoller {
+ public:
+    int poll();
+ private:
+    int mTimeout;
+    int mEvents;
+    int mFd;
+
+    friend Context;
+};
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Event.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Event.h
new file mode 100644
index 000000000000..cbd17b506bc6
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Event.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.
+ */
+
+#pragma once
+
+#include "Types.h"
+
+#include "iutils/Utils.h"
+
+namespace icamera {
+namespace CIPR {
+class Event {
+ public:
+    explicit Event(const PSysEventConfig& eventConfig);
+    ~Event();
+
+    Result getConfig(PSysEventConfig* eventConfig);
+    Result setConfig(const PSysEventConfig& eventConfig);
+    Result wait(Context* ctx);
+
+ private:
+    PSysEvent* mEvent = nullptr;
+    bool mInitialized = false;
+
+    DISALLOW_COPY_AND_ASSIGN(Event);
+};
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h
new file mode 100644
index 000000000000..f17c8d4983c7
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Types.h
@@ -0,0 +1,189 @@
+/*
+ * 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 <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <vector>
+
+#include "modules/ia_cipr/include/ipu-psys.h"
+
+namespace icamera {
+namespace CIPR {
+enum class Result {
+    OK,
+    GeneralError,
+    NoMemory,
+    DataError,
+    InternalError,
+    InvaildArg,
+    NoEntry,
+    TimeOut,
+    End,
+    Full,
+    Retry,
+    NoImple
+};
+
+enum MemoryFlag : uint32_t {
+    CpuPtr = (uint32_t)(1 << 0),
+    MemoryHandle = (uint32_t)(1 << 1),
+    AllocateCpuPtr =  (uint32_t)(1 << 2),
+    CopyFromUser = (uint32_t)(1 << 3),
+    HardwareOnly = (uint32_t)(1 << 4),
+    ReadOnly = (uint32_t)(1 << 5),
+    WriteOnly = (uint32_t)(1 << 6),
+    UnCached = (uint32_t)(1 << 7),
+    Uninitialized = (uint32_t)(1 << 8),
+    Secured = (uint32_t)(1 << 9),
+    CpuOnly = (uint32_t)(1 << 10),
+    FlushCpuCache = (uint32_t)(1 << 11),
+    Allocated = (uint32_t)(1 << 13),
+    MemoryFromUser = (uint32_t)(1 << 14),
+    Migrated = (uint32_t)(1 << 15),
+    NoFlush = (uint32_t)(1 << 17),
+    PSysAPI = (uint32_t)(1 << 31),
+    DeviceMask = (uint32_t)0xFFFF0000
+};
+
+inline MemoryFlag operator| (MemoryFlag a, MemoryFlag b) {
+    return static_cast<MemoryFlag>(static_cast<uint32_t>(a) |
+                                   static_cast<uint32_t>(b));
+}
+
+inline MemoryFlag operator& (MemoryFlag a, MemoryFlag b) {
+    return static_cast<MemoryFlag>(static_cast<uint32_t>(a) &
+                                   static_cast<uint32_t>(b));
+}
+
+inline MemoryFlag operator~ (MemoryFlag a) {
+    return static_cast<MemoryFlag>(~static_cast<uint32_t>(a));
+}
+
+// NOLINTNEXTLINE
+inline MemoryFlag& operator|= (MemoryFlag& a, MemoryFlag b) {
+    return a = static_cast<MemoryFlag>(static_cast<uint32_t>(a) |
+                                       static_cast<uint32_t>(b));
+}
+
+// NOLINTNEXTLINE
+inline MemoryFlag& operator&= (MemoryFlag& a, MemoryFlag b) {
+    return a = static_cast<MemoryFlag>(static_cast<uint32_t>(a) &
+                                       static_cast<uint32_t>(b));
+}
+
+class Command;
+class Event;
+class Buffer;
+class Context;
+
+typedef ipu_psys_buffer IPUPSysBuffer;
+struct MemoryDesc {
+    uint32_t size;
+    void* cpuPtr;
+    uint64_t handle;
+    MemoryFlag flags;
+    Buffer* anchor;
+    IPUPSysBuffer* sysBuff;
+};
+
+struct PSysEvent {
+    struct ipu_psys_event event;
+    int32_t timeout;
+};
+
+struct PSysEventConfig {
+    uint32_t type;
+    uint64_t id;
+    uint64_t commandToken;
+    uint64_t commandIssueID;
+    uint64_t bufferHandoverBitmap;
+    uint32_t error;
+    int32_t timeout;
+};
+
+const int PSYS_CAP_DRIVER_FIELD_LENGTH = 20;
+const int PSYS_CAP_DEVMODEL_FIELD_LENGTH = 32;
+struct PSYSCapability {
+    uint32_t version;
+    uint8_t driver[PSYS_CAP_DRIVER_FIELD_LENGTH];
+    uint8_t devModel[PSYS_CAP_DEVMODEL_FIELD_LENGTH];
+    uint32_t programGroupCount;
+};
+
+#define psys_command_ext_na         0
+#define psys_command_ext_ppg_0      1
+#define psys_command_ext_ppg_1      2
+struct PSysCmdExtHeader {
+    uint32_t offset;
+    uint64_t size;
+    uint32_t version;
+};
+
+struct ProcessGroupCommand {
+    PSysCmdExtHeader header;
+    uint8_t frameCounter;
+    uint8_t queueID;
+    uint16_t fragmentState;
+    uint64_t eventReqBitmap;
+    uint64_t irqReqBitmap;
+    uint32_t dynamicKernelBitmap[4];
+};
+
+struct PSysCommandConfig {
+    PSysCommandConfig() :
+        id(0), token(0), issueID(0), priority(0), psysFrequency(0),
+        extBuf(nullptr), pgParamsBuf(nullptr), pgManifestBuf(nullptr), pg(nullptr) {}
+    uint64_t id;
+    uint64_t token;
+    uint64_t issueID;
+    uint32_t priority;
+    uint32_t psysFrequency;
+    std::vector<Buffer*> buffers;
+    Buffer* extBuf;
+    Buffer* pgParamsBuf;
+    Buffer* pgManifestBuf;
+    Buffer* pg;
+};
+
+struct PSysCommand {
+    PSysCommand() : pg(nullptr), pgParams(nullptr), pgParamsSize(0),
+    extBuf(nullptr), pgManifestBuf(nullptr)
+    {   memset(&iocCmd, 0, sizeof(iocCmd));  }
+
+    struct ipu_psys_command iocCmd;
+    std::vector<Buffer*> userBuffers;
+    Buffer* pg;
+    void* pgParams;
+    uint32_t pgParamsSize;
+    Buffer* extBuf;
+    Buffer* pgManifestBuf;
+};
+
+class MemoryOper {
+ public:
+    virtual ~MemoryOper() = default;
+
+    virtual Result allocate(MemoryDesc* mem) = 0;
+    virtual Result migrate(MemoryDesc* mem) = 0;
+    virtual Result getMemory(MemoryDesc* mem, MemoryDesc* out) = 0;
+    virtual Result destroy(MemoryDesc* mem) = 0;
+};
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.h b/camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.h
new file mode 100644
index 000000000000..b5c413b2858f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/include/Utils.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.
+ */
+
+#pragma once
+
+#include "Types.h"
+
+namespace icamera {
+namespace CIPR {
+void* mallocMemory(size_t sz);
+void* callocMemory(size_t cnt, size_t sz);
+void* mallocAlignedMemory(size_t sz, size_t fact);
+void freeMemory(void* ptr);
+void memoryCopy(void* dst, size_t dsz, const void* src, size_t sz);
+size_t getPageSize();
+}  // namespace CIPR
+}  // 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/Buffer.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Buffer.cpp
new file mode 100644
index 000000000000..3de9a49bc354
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Buffer.cpp
@@ -0,0 +1,384 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "CIPR_BUFFER"
+
+#include "modules/ia_cipr/include/Context.h"
+#include "modules/ia_cipr/include/Buffer.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+using icamera::CAMERA_DEBUG_LOG_VERBOSE;
+using icamera::CAMERA_DEBUG_LOG_ERR;
+using icamera::CAMERA_DEBUG_LOG_DBG;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+
+namespace icamera {
+namespace CIPR {
+Result Buffer::allocateCommon() {
+    if (mMemoryDesc.flags & MemoryFlag::DeviceMask) {
+        CheckError(mContext == nullptr, Result::InvaildArg,
+                   "%s: device memory flags specified, migrate first!", __func__);
+    }
+
+    CheckError(mMemoryDesc.cpuPtr && !(mMemoryDesc.flags & MemoryFlag::CopyFromUser),
+               Result::InvaildArg, "%s: already allocated", __func__);
+
+    void* cpuPtr = CIPR::mallocMemory(mMemoryDesc.size);
+    CheckError(!cpuPtr, Result::NoMemory, "@%s, cpuPtr is nullptr", __func__);
+
+    if (mMemoryDesc.flags & MemoryFlag::CopyFromUser) {
+        if (mMemoryDesc.cpuPtr) {
+            memoryCopy(cpuPtr, mMemoryDesc.size, mMemoryDesc.cpuPtr, mMemoryDesc.size);
+        } else if (mMemoryDesc.flags & MemoryFlag::MemoryHandle) {
+            icamera::LOGE("%s: copy from handle to host only memory not implemented", __func__);
+            if (cpuPtr)
+                CIPR::freeMemory(cpuPtr);
+            return Result::GeneralError;
+        }
+        mMemoryDesc.flags &= ~MemoryFlag::CopyFromUser;
+    }
+
+    mMemoryDesc.cpuPtr = cpuPtr;
+    mMemoryDesc.flags &= ~MemoryFlag::AllocateCpuPtr;
+    mMemoryDesc.flags |= MemoryFlag::CpuPtr | MemoryFlag::Allocated;
+
+    return Result::OK;
+}
+
+void Buffer::destroy() {
+    if ((mMemoryDesc.flags & MemoryFlag::Allocated) &&
+        (mMemoryDesc.flags & MemoryFlag::CpuPtr) &&
+        mMemoryDesc.cpuPtr) {
+        CIPR::freeMemory(mMemoryDesc.cpuPtr);
+    }
+}
+
+Result Buffer::getMemoryCommon(MemoryDesc* out) {
+    if (mMemoryDesc.flags & MemoryFlag::AllocateCpuPtr) {
+        CheckError(mMemoryDesc.cpuPtr, Result::InternalError,
+                   "%s: ALLOCATE_CPU_PTR not handled but pointer exists!", __func__);
+
+        Result ret = allocate();
+        CheckError(ret != Result::OK, ret, "@%s allocate failed.", __func__);
+    }
+
+    *out = mMemoryDesc;
+    return Result::OK;
+}
+
+Result Buffer::validateBuffer(const MemoryDesc* memory) {
+    bool valid = true;
+    bool haveMemory = false;
+    const MemoryDesc* mem = (memory) ? memory : &mMemoryDesc;
+
+    CheckError(!mInitialized, Result::InternalError, "Buffer::validateBuffer mInitialized error");
+
+    haveMemory = mem->flags & MemoryFlag::Allocated ||
+                 mem->flags & MemoryFlag::MemoryFromUser;
+
+    // cppcheck-suppress clarifyCondition
+    if ((!(mem->flags & MemoryFlag::CpuPtr)) ^ (mem->cpuPtr == nullptr)) {
+        valid &= false;
+    }
+
+    // cppcheck-suppress clarifyCondition
+    if ((!(mem->flags & MemoryFlag::MemoryHandle)) ^ (mem->handle == 0)) {
+        valid &= false;
+    }
+
+    if ((mem->flags & MemoryFlag::CpuOnly) && (mem->flags & MemoryFlag::HardwareOnly)) {
+        valid &= false;
+    }
+
+    if (!haveMemory &&
+        ((mem->flags & MemoryFlag::MemoryHandle) || (mem->flags & MemoryFlag::CpuPtr))) {
+        valid &= false;
+    }
+
+    if (haveMemory && (mem->flags & MemoryFlag::AllocateCpuPtr)) {
+        valid &= false;
+    }
+
+    if (haveMemory && (mem->flags & MemoryFlag::CopyFromUser)) {
+        valid &= false;
+    }
+
+    if (haveMemory && !((mem->flags & MemoryFlag::MemoryHandle) ||
+        (mem->flags & MemoryFlag::CpuPtr) || (mem->flags & MemoryFlag::HardwareOnly))) {
+        valid &= false;
+    }
+
+    return (valid) ? Result::OK : Result::GeneralError;
+}
+
+Result Buffer::allocate() {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+
+    Result ret = mContext ? mContext->allocate(&mMemoryDesc) : allocateCommon();
+    CheckError(ret != Result::OK, ret, "%s: allocation failed", __func__);
+
+    ret = validateBuffer(nullptr);
+    CheckError(ret != Result::OK, ret, "%s: bitfield validation after allocate failed", __func__);
+
+    return Result::OK;
+}
+
+Result Buffer::createWithUserMemory(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory) {
+    if (size < userMemory->size) {
+        icamera::LOG2("%s: requested bytes to allocate less than provided user memory in argument, "
+                      "truncating", __func__);
+    }
+
+    CheckError(userMemory->size < size, Result::InternalError,
+               "@%s: requested bytes to allocate more than provided user memory in argument",
+               __func__);
+
+    if (userMemory->flags & MemoryFlag::CpuPtr) {
+        if (createWithUserMemoryWithCpuPtr(flags, userMemory) != Result::OK) {
+            return Result::InternalError;
+        }
+    } else if (userMemory->flags & MemoryFlag::MemoryHandle) {
+        if (createWithUserMemoryCommon(flags, userMemory) != Result::OK) {
+            return Result::InternalError;
+        }
+    }
+
+    CheckError(userMemory->anchor, Result::InternalError,
+               "@%s: inheriting object from another not supported!", __func__);
+
+    CheckError(mMemoryDesc.cpuPtr == nullptr && mMemoryDesc.handle == 0,
+               Result::InternalError, "@%s: Invalid user memory given as argument!", __func__);
+
+    return Result::OK;
+}
+
+Result Buffer::createWithUserMemoryWithCpuPtr(MemoryFlag flags, const MemoryDesc* userMemory) {
+    CheckError(!userMemory->cpuPtr, Result::InternalError, "@%s: user did not provide pointer with "
+               "IA_CIPR_MEMORY_CPU_PTR", __func__);
+
+    CheckError(userMemory->flags & MemoryFlag::MemoryHandle,
+               Result::InternalError, "@%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
+               "IA_CIPR_MEMORY_HANDLE", __func__);
+
+    CheckError(flags & MemoryFlag::AllocateCpuPtr && !(flags & MemoryFlag::CopyFromUser),
+               Result::InternalError, "@%s: IA_CIPR_MEMORY_CPU_PTR conflict with "
+               "IA_CIPR_MEMORY_ALLOCATE_CPU_PTR", __func__);
+
+    mMemoryDesc.cpuPtr = userMemory->cpuPtr;
+    mMemoryDesc.flags |= MemoryFlag::CpuPtr | MemoryFlag::MemoryFromUser;
+
+    return Result::OK;
+}
+
+Result Buffer::createWithUserMemoryCommon(MemoryFlag flags, const MemoryDesc* userMemory) {
+    CheckError(!userMemory->handle, Result::InternalError, "@%s: user did not provide handle with "
+               "MemoryFlag::MemoryHandle", __func__);
+
+    CheckError(userMemory->flags & MemoryFlag::CpuPtr,
+               Result::InternalError, "@%s: MemoryFlag::MemoryHandle conflict with "
+               "MemoryFlag::cpuPtr", __func__);
+
+    CheckError(flags & MemoryFlag::CopyFromUser, Result::InternalError,
+               "@%s: MemoryFlag::CopyFromUser conflict! ", __func__);
+
+    CheckError(flags & MemoryFlag::AllocateCpuPtr && !(flags & MemoryFlag::MemoryHandle),
+               Result::InternalError, "@%s: MemoryFlag::MemoryHandle conflict with "
+               "MemoryFlag::AllocateCpuPtr", __func__);
+
+    mMemoryDesc.handle = userMemory->handle;
+    mMemoryDesc.flags |= MemoryFlag::MemoryHandle | MemoryFlag::MemoryFromUser;
+
+    return Result::OK;
+}
+
+Buffer::Buffer(uint32_t size, MemoryFlag flags, const MemoryDesc* userMemory) {
+    Result ret;
+    mInitialized = false;
+    mContext = nullptr;
+
+    if (size == 0) {
+        return;
+    }
+
+    memset(&mMemoryDesc, 0, sizeof(MemoryDesc));;
+    mMemoryDesc.anchor = this;
+    mMemoryDesc.size = size;
+
+    if (userMemory) {
+        ret = createWithUserMemory(size, flags, userMemory);
+        CheckError(ret != Result::OK, VOID_VALUE, "@s: Buffer::Buffer Error", __func__);
+        mMemoryDesc.flags |= userMemory->flags;
+    }
+
+    mMemoryDesc.flags |= flags;
+
+    mInitialized = true;
+    ret = validateBuffer(nullptr);
+    if (ret != Result::OK) {
+        icamera::LOG2("Buffer::Buffer validateBuffer Error");
+        mInitialized = false;
+    }
+}
+
+Buffer::Buffer(Buffer* parent, uint32_t offset, uint32_t size) {
+    mInitialized = false;
+    mContext = nullptr;
+
+    if (!parent || size == 0) {
+        return;
+    }
+
+    CheckError(parent->mMemoryDesc.size < offset + size, VOID_VALUE,
+               "%s: parent buffer size %d not enough for region requested (offset %d, size %d)",
+               __func__, parent->mMemoryDesc.size, offset, size);
+
+    CheckError(parent->isRegion(), VOID_VALUE, "%s: Nested regions are illecal", __func__);
+
+    memset(&mMemoryDesc, 0, sizeof(MemoryDesc));
+    mMemoryDesc.size = size;
+    this->mOffset = offset;
+    mMemoryDesc.anchor = parent;
+    mMemoryDesc.flags = parent->mMemoryDesc.flags;
+
+    parent->mRegions.insert(this);
+
+    mInitialized = true;
+}
+
+Buffer::~Buffer() {
+    if (!mInitialized) {
+        return;
+    }
+
+    mInitialized = false;
+
+    if (isRegion()) {
+        if (!mMemoryDesc.anchor) {
+            icamera::LOG2("%s: parent already released", __func__);
+        } else {
+            mMemoryDesc.anchor->mRegions.erase(this);
+        }
+    }
+
+    if (!mRegions.empty()) {
+        icamera::LOG2("%s: parent buffer destroy leaves stale regions", __func__);
+
+        for (auto& x : mRegions) {
+            x->mMemoryDesc.anchor = nullptr;
+            delete x;
+        }
+    }
+
+    if (mContext) {
+        mContext->destroy(&mMemoryDesc);
+    }
+
+    destroy();
+}
+
+bool Buffer::isRegion() const {
+    return mMemoryDesc.anchor != this;
+}
+
+Result Buffer::getMemory(MemoryDesc* out) {
+    Buffer* region = nullptr;
+    Buffer* buffer = this;
+    Result ret;
+
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!out, Result::InvaildArg, "@%s, out is nullptr", __func__);
+
+    if (isRegion()) {
+        region = this;
+        buffer = mMemoryDesc.anchor;
+    }
+
+    if (buffer->mContext) {
+        ret = mContext->getMemory(&buffer->mMemoryDesc, out);
+    } else {
+        ret = buffer->getMemoryCommon(out);
+    }
+    CheckError(ret != Result::OK, ret, "@%s: getMemory() failed", __func__);
+
+    ret = buffer->validateBuffer(out);
+    CheckError(ret != Result::OK, ret, "@%s: bitfield validation failed", __func__);
+
+    if (region) {
+        CheckError(region->mOffset + region->mMemoryDesc.size > out->size, Result::InternalError,
+                   "@%s: memory region doesn't fit in parent store!", __func__);
+
+        if (out->cpuPtr) {
+            out->cpuPtr = reinterpret_cast<uint8_t*>(out->cpuPtr) + region->mOffset;
+        }
+
+        out->size = region->mMemoryDesc.size;
+        out->anchor = region;
+    }
+
+    return Result::OK;
+}
+
+Result Buffer::getMemoryCpuPtr(void** ptr) {
+    CIPR::MemoryDesc memory;
+
+    CheckError(!ptr, Result::InvaildArg, "@%s: ptr == null", __func__);
+
+    auto ret = getMemory(&memory);
+    CheckError(ret != Result::OK, ret, "@%s: getMemory failed.", __func__);
+
+    *ptr = memory.cpuPtr;
+
+    return Result::OK;
+}
+
+Result Buffer::getMemorySize(int* size) {
+    CIPR::MemoryDesc memory = {};
+
+    CheckError(!size, Result::InvaildArg, "@%s: size == 0", __func__);
+
+    auto ret = getMemory(&memory);
+    CheckError(ret != Result::OK, ret, "@%s: getMemory error", __func__);
+
+    *size = memory.size;
+
+    return Result::OK;
+}
+
+Buffer* Buffer::getParent() {
+    if (!isRegion()) {
+        icamera::LOGE("%s: not a child object", __func__);
+        return nullptr;
+    }
+
+    if (!mMemoryDesc.anchor) {
+        return nullptr;
+    }
+    return mMemoryDesc.anchor;
+}
+
+Result Buffer::attatchDevice(Context* ctx) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!ctx, Result::InvaildArg, "@%s, ctx is nullptr", __func__);
+    CheckError(mMemoryDesc.anchor != this, Result::InvaildArg,
+               "%s: buffer regions cannot be independently migrated", __func__);
+
+    mContext = ctx;
+    return mContext->migrate(&mMemoryDesc);
+}
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp
new file mode 100644
index 000000000000..31fd8020e53b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Command.cpp
@@ -0,0 +1,212 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "CIPR_COMMAND"
+
+#include "modules/ia_cipr/include/Command.h"
+
+#include <algorithm>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+using icamera::CAMERA_DEBUG_LOG_VERBOSE;
+using icamera::CAMERA_DEBUG_LOG_ERR;
+using icamera::CAMERA_DEBUG_LOG_DBG;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+
+namespace icamera {
+namespace CIPR {
+Command::Command(const PSysCommandConfig& cfg) {
+    mInitialized = false;
+
+    mCmd = new PSysCommand;
+
+    if (cfg.buffers.size() > 0) {
+        mCmd->iocCmd.bufcount = cfg.buffers.size();
+        mCmd->iocCmd.buffers = static_cast<struct ipu_psys_buffer*>(
+                                    CIPR::callocMemory(cfg.buffers.size(),
+                                    sizeof(struct ipu_psys_buffer)));
+
+        if (!mCmd->iocCmd.buffers) {
+            icamera::LOG2("Could not allocate DMA-BUF handle array");
+            delete mCmd;
+            return;
+        }
+
+        mCmd->userBuffers.resize(cfg.buffers.size());
+        std::fill(mCmd->userBuffers.begin(), mCmd->userBuffers.end(), nullptr);
+    }
+    mInitialized = true;
+}
+
+Command::~Command() {
+    if (!mInitialized)
+        return;
+
+    mInitialized = false;
+    if (!mCmd)
+        return;
+
+    CIPR::freeMemory(mCmd->iocCmd.buffers);
+    delete mCmd;
+}
+
+Result Command::getConfig(PSysCommandConfig* cfg) {
+    CheckError(!mInitialized, Result::InternalError, "@%s mInitialized false", __func__);
+    CheckError(!cfg, Result::InvaildArg, "@%s, cfg is nullptr", __func__);
+
+    cfg->token = mCmd->iocCmd.user_token;
+    cfg->issueID = mCmd->iocCmd.issue_id;
+    cfg->priority = mCmd->iocCmd.priority;
+    cfg->psysFrequency = mCmd->iocCmd.min_psys_freq;
+    cfg->pg = mCmd->pg;
+    cfg->extBuf = mCmd->extBuf;
+    cfg->pgManifestBuf = mCmd->pgManifestBuf;
+    cfg->id = 0;
+
+    cfg->buffers = mCmd->userBuffers;
+
+    return Result::OK;
+}
+
+Result Command::updateKernel(const PSysCommandConfig& cfg, const MemoryDesc& memory) {
+    ProcessGroupCommand* ppg_command_ext =
+                        reinterpret_cast<ProcessGroupCommand*>(memory.cpuPtr);
+
+    CheckError(ppg_command_ext->header.size != memory.size ||
+               ppg_command_ext->header.offset != sizeof(PSysCmdExtHeader) ||
+               (ppg_command_ext->header.version != psys_command_ext_ppg_0 &&
+               ppg_command_ext->header.version != psys_command_ext_ppg_1),
+               Result::InvaildArg, "Invalid command extension buffer received! (%p)", cfg.extBuf);
+
+    if (ppg_command_ext->header.version == psys_command_ext_ppg_1) {
+        CIPR::memoryCopy(&(mCmd->iocCmd.kernel_enable_bitmap),
+                         sizeof(mCmd->iocCmd.kernel_enable_bitmap),
+                         ppg_command_ext->dynamicKernelBitmap,
+                         sizeof(ppg_command_ext->dynamicKernelBitmap));
+    }
+
+    mCmd->iocCmd.frame_counter = static_cast<uint32_t>(ppg_command_ext->frameCounter);
+
+    return Result::OK;
+}
+
+Result Command::getLegacyPGMem(const PSysCommandConfig& cfg, MemoryDesc* memory) {
+    auto ret = cfg.extBuf->getMemory(memory);
+    if (ret != Result::OK && cfg.pgParamsBuf != nullptr) {
+        icamera::LOG2("pg_params_buf-field of CIPR command deprecated!");
+        ret = cfg.pgParamsBuf->getMemory(memory);
+        if (ret != Result::OK) {
+            return ret;
+        }
+    }
+
+    return Result::OK;
+}
+
+Result Command::updatePG(const PSysCommandConfig& cfg) {
+    MemoryDesc memory = {};
+
+    Result ret = cfg.pgManifestBuf->getMemory(&memory);
+    if (ret != Result::OK)
+        return ret;
+
+    mCmd->iocCmd.pg_manifest = memory.cpuPtr;
+    mCmd->iocCmd.pg_manifest_size = memory.size;
+    mCmd->pgManifestBuf = cfg.pgManifestBuf;
+
+    ret = getLegacyPGMem(cfg, &memory);
+    CheckError(ret != Result::OK, ret, "@%s: getLegacyPGMem error", __func__);
+
+    if (memory.flags & MemoryFlag::PSysAPI) {
+        updateKernel(cfg, memory);
+    } else {
+        mCmd->pgParams = memory.cpuPtr;
+        mCmd->pgParamsSize = memory.size;
+    }
+
+    return Result::OK;
+}
+
+Result Command::setConfig(const PSysCommandConfig& cfg) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized == false", __func__);
+    CheckError(mCmd->userBuffers.size() < cfg.buffers.size(), Result::InvaildArg,
+               "Config bufcount cannot be higher than in the command!");
+    CheckError(cfg.buffers.empty() && mCmd->iocCmd.buffers, Result::InvaildArg,
+               "To nullify buffers, create command with bufcount 0");
+
+    Result ret = updatePG(cfg);
+    if (ret != Result::OK)
+        return ret;
+
+    mCmd->extBuf = cfg.extBuf;
+    if (cfg.id != 0) {
+        icamera::LOG2("ID-field of CIPR command deprecated!");
+    }
+
+    mCmd->iocCmd.user_token = cfg.token;
+    mCmd->iocCmd.issue_id = cfg.issueID;
+    mCmd->iocCmd.priority = cfg.priority;
+    mCmd->iocCmd.min_psys_freq = cfg.psysFrequency;
+    mCmd->iocCmd.bufcount = cfg.buffers.size();
+    mCmd->pg = cfg.pg;
+    if (cfg.pg && cfg.pg->mMemoryDesc.sysBuff) {
+        CheckError(!((cfg.pg->mMemoryDesc.sysBuff)->flags & IPU_BUFFER_FLAG_DMA_HANDLE),
+                   Result::GeneralError, "Wrong flag!", __func__);
+
+        mCmd->iocCmd.pg = cfg.pg->mMemoryDesc.sysBuff->base.fd;
+    }
+
+    if (!mCmd->iocCmd.buffers)
+        return Result::OK;
+
+    return grokBuffers(cfg);
+}
+
+Result Command::grokBuffers(const PSysCommandConfig& cfg) {
+    for (size_t i = 0; i < cfg.buffers.size(); ++i) {
+        auto current = cfg.buffers[i];
+        if (!current) {
+            memset(&mCmd->iocCmd.buffers[i], 0, sizeof(mCmd->iocCmd.buffers[i]));
+            continue;
+        } else if (!current->mMemoryDesc.sysBuff && current->isRegion()) {
+            current = current->getParent();
+            CheckError(!current, Result::InvaildArg, "Cannot find the parent of buffer:%p",
+                       cfg.buffers[i]);
+        }
+
+        CheckError(!current->mMemoryDesc.sysBuff ||
+                   !(current->mMemoryDesc.flags & MemoryFlag::Migrated),
+                   Result::InvaildArg, "%s, Cannot queue singular buffer object %p",
+                   __func__, current);
+
+        mCmd->iocCmd.buffers[i] = *current->mMemoryDesc.sysBuff;
+        mCmd->iocCmd.buffers[i].data_offset = current->mOffset;
+        mCmd->iocCmd.buffers[i].bytes_used = current->mMemoryDesc.size;
+    }
+
+    return Result::OK;
+}
+
+Result Command::enqueue(Context* ctx) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!ctx, Result::InvaildArg, "@%s, ctx is nullptr", __func__);
+
+    return ctx->doIoctl(static_cast<int>(IPU_IOC_QCMD), mCmd);
+}
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp
new file mode 100644
index 000000000000..ec4aa340690f
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Context.cpp
@@ -0,0 +1,322 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "CIPR_CONTEXT"
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <poll.h>
+#include <errno.h>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+using icamera::CAMERA_DEBUG_LOG_VERBOSE;
+using icamera::CAMERA_DEBUG_LOG_ERR;
+using icamera::CAMERA_DEBUG_LOG_DBG;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+
+#include "modules/ia_cipr/include/ipu-psys.h"
+#include "modules/ia_cipr/include/Context.h"
+
+const char* DRIVER_NAME = "/dev/ipu-psys0";
+
+namespace icamera {
+namespace CIPR {
+Result Context::allocate(MemoryDesc* mem) {
+    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
+    CheckError(mem->cpuPtr, Result::InvaildArg, "%s: already has an address!", __func__);
+
+    mem->cpuPtr = CIPR::mallocAlignedMemory(mem->size, CIPR::getPageSize());
+    CheckError(!mem->cpuPtr, Result::NoMemory, "@%s, mem is out", __func__);
+
+    if (!(mem->flags & MemoryFlag::Uninitialized)) {
+        memset(mem->cpuPtr, 0, mem->size);
+    }
+
+    mem->flags &= ~MemoryFlag::AllocateCpuPtr;
+    mem->flags |= MemoryFlag::CpuPtr | MemoryFlag::Allocated;
+
+    return Result::OK;
+}
+
+Result Context::migrate(MemoryDesc* mem) {
+    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
+
+    if (mem->flags & MemoryFlag::AllocateCpuPtr) {
+        Result ret = allocate(mem);
+        CheckError(ret != Result::OK, ret, "@%s: allocate failed.", __func__);
+    }
+
+    if (mem->flags & MemoryFlag::PSysAPI) {
+        return Result::OK;
+    }
+
+    return registerBuffer(mem);
+}
+
+Result Context::getMemory(MemoryDesc* mem, MemoryDesc* out) {
+    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
+    CheckError(!out, Result::InvaildArg, "@%s, out is nullptr", __func__);
+
+    if (!(mInitFlag == Context::Flags::DEBUG) && (mem->flags & MemoryFlag::HardwareOnly)) {
+        icamera::LOG2("%s: host cannot access HW only memory!", __func__);
+        return Result::GeneralError;
+    }
+
+    if ((mem->flags & MemoryFlag::MemoryHandle) && !(mem->flags & MemoryFlag::CpuPtr)) {
+        icamera::LOG2("%s: fallback host address mapping not implemented!", __func__);
+        return Result::GeneralError;
+    }
+
+    *out = *mem;
+    return Result::OK;
+}
+
+Result Context::destroy(MemoryDesc* mem) {
+    return unregisterBuffer(mem);
+}
+
+Context::Context() {
+    mInitialized = false;
+    mFd = open(DRIVER_NAME, 0, O_RDWR | O_NONBLOCK);
+    int errnoCopy = errno;
+
+    CheckError(mFd < 0, VOID_VALUE, "%s: Failed to open PSYS device! open returned error: %s",
+               __func__, strerror(errnoCopy));
+
+    mInitFlag = Context::Flags::NONE;
+    mInitialized = true;
+}
+
+Context::~Context() {
+    if (!mInitialized) {
+        return;
+    }
+
+    mInitialized = false;
+
+    int rv = ::close(mFd);
+    int errnoCopy = errno;
+
+    CheckError(rv < 0, VOID_VALUE,
+               "Close returned error: %s", strerror(errnoCopy));
+}
+
+Result Context::getCapabilities(PSYSCapability* cap) {
+    struct ipu_psys_capability psys_capability = {};
+
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!cap, Result::InvaildArg, "@%s, cap is nullptr", __func__);
+
+    Result ret = doIoctl(static_cast<int>(IPU_IOC_QUERYCAP), &psys_capability);
+    CheckError(ret != Result::OK, ret, "%s: failed to retrieve capabilities", __func__);
+
+    cap->version = psys_capability.version;
+    CIPR::memoryCopy(cap->driver, sizeof(cap->driver), psys_capability.driver,
+                     sizeof(psys_capability.driver));
+
+    CIPR::memoryCopy(cap->devModel, sizeof(cap->devModel), psys_capability.dev_model,
+                     sizeof(psys_capability.dev_model));
+
+    cap->programGroupCount = psys_capability.pg_count;
+
+    return Result::OK;
+}
+
+Result Context::getManifest(uint32_t index, uint32_t* mainfestSize, void* manifest) {
+    struct ipu_psys_manifest pg_manifest = {};
+
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!mainfestSize, Result::InvaildArg, "@%s, mainfestSize is nullptr", __func__);
+
+    pg_manifest.index = index;
+    pg_manifest.size = 0;
+    pg_manifest.manifest = manifest;
+
+    Result ret = doIoctl(static_cast<int>(IPU_IOC_GET_MANIFEST), &pg_manifest);
+    CheckError(ret != Result::OK, ret, "%s: Failed to retrieve manifest with index %d",
+               __func__, index);
+
+    *mainfestSize = pg_manifest.size;
+    return Result::OK;
+}
+
+Result Context::doIoctl(int request, void *ptr) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+
+#ifdef ANDROID
+    int res = ::ioctl(mFd, request, ptr);
+#else
+    int res = ::ioctl(mFd, (unsigned int)request, ptr);
+#endif
+    int errnoCopy = errno;
+
+    if (res < 0) {
+        icamera::LOG2("Ioctl returned error: %s", strerror(errnoCopy));
+        switch (errnoCopy) {
+            case ENOMEM:
+                return Result::NoMemory;
+            case EINVAL:
+                return Result::InvaildArg;
+            case EFAULT:
+                return Result::InvaildArg;
+            case ENOENT:
+                return Result::NoEntry;
+            default:
+                return Result::GeneralError;
+        }
+    }
+    return Result::OK;
+}
+
+Result Context::registerBuffer(MemoryDesc* mem) {
+    Result res;
+
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
+    CheckError(mem->flags & MemoryFlag::Migrated, Result::InvaildArg,
+               "Buffer already migrated with device.");
+
+    struct ipu_psys_buffer* ioc_buffer =
+                reinterpret_cast<ipu_psys_buffer*>(callocMemory(1, sizeof(*ioc_buffer)));
+    CheckError(!ioc_buffer, Result::NoMemory, "Could not create psys buffer");
+
+    ioc_buffer->len = mem->size;
+    if (!(mInitFlag == Context::Flags::DEBUG) &&(mem->flags & MemoryFlag::NoFlush ||
+        (mem->flags & MemoryFlag::CpuPtr && (mem->flags & MemoryFlag::HardwareOnly)))) {
+        ioc_buffer->flags |= IPU_BUFFER_FLAG_NO_FLUSH;
+    }
+
+    if (mem->flags & MemoryFlag::CpuPtr) {
+        ioc_buffer->base.userptr = mem->cpuPtr;
+        ioc_buffer->flags |= IPU_BUFFER_FLAG_USERPTR;
+        res = doIoctl(static_cast<int>(IPU_IOC_GETBUF), ioc_buffer);
+
+        if (res != Result::OK) {
+            CIPR::freeMemory(ioc_buffer);
+            return res;
+        }
+
+        if (!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE)) {
+            icamera::LOG2("CIPR: IOC_GETBUF succeed but did not return dma handle");
+            CIPR::freeMemory(ioc_buffer);
+            return Result::InternalError;
+        } else if (ioc_buffer->flags & IPU_BUFFER_FLAG_USERPTR) {
+            icamera::LOG2("CIPR: IOC_GETBUF succeed but did not consume the userptr flag");
+            CIPR::freeMemory(ioc_buffer);
+            return Result::InternalError;
+        }
+    } else if (mem->flags & MemoryFlag::MemoryHandle) {
+        ioc_buffer->base.fd = static_cast<int>(mem->handle);
+        ioc_buffer->flags |= IPU_BUFFER_FLAG_DMA_HANDLE;
+    }
+
+    res = doIoctl(static_cast<int>(IPU_IOC_MAPBUF),
+                  reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
+
+    if (res != Result::OK) {
+        CIPR::freeMemory(ioc_buffer);
+        return res;
+    }
+
+    mem->sysBuff = ioc_buffer;
+    mem->flags |= MemoryFlag::Migrated;
+
+    icamera::LOG2("%s: registered %p -> fd %d size:%u offset:%u bytes_used:%u",
+                  __func__,
+                  mem->cpuPtr,
+                  ioc_buffer->base.fd,
+                  ioc_buffer->len,
+                  ioc_buffer->data_offset,
+                  ioc_buffer->bytes_used);
+
+    return res;
+}
+
+Result Context::unregisterBuffer(MemoryDesc* mem) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized == false", __func__);
+    CheckError(!mem, Result::InvaildArg, "@%s, mem is nullptr", __func__);
+
+    if (mem->sysBuff == nullptr) {
+        return Result::OK;
+    }
+
+    struct ipu_psys_buffer* ioc_buffer = mem->sysBuff;
+    CheckError(!(ioc_buffer->flags & IPU_BUFFER_FLAG_DMA_HANDLE), Result::GeneralError,
+               "Wrong flag!", __func__);
+
+    Result res = doIoctl(static_cast<int>(IPU_IOC_UNMAPBUF),
+                         reinterpret_cast<void*>((intptr_t)ioc_buffer->base.fd));
+    if (res != Result::OK) {
+        icamera::LOG2("%s: cannot unmap buffer fd %d, possibly already unmapped", __func__,
+                      ioc_buffer->base.fd);
+    }
+
+    if (mem->flags & MemoryFlag::CpuPtr) {
+        res = psysClose(ioc_buffer->base.fd);
+        CheckError(res != Result::OK, res, "@%s: pSysClose failed", __func__);
+    }
+
+    CIPR::freeMemory(ioc_buffer);
+    mem->sysBuff = nullptr;
+
+    return res;
+}
+
+Result Context::psysClose(int fd) {
+    int res = close(fd);
+    int error = errno;
+
+    if (res < 0) {
+        icamera::LOG2("Close returned error: %s", strerror(error));
+        switch (error) {
+            case EBADF:
+                return Result::InvaildArg;
+            case EIO:
+            case EINTR:
+            default:
+                return Result::GeneralError;
+        }
+    }
+
+    return Result::OK;
+}
+
+ContextPoller Context::getPoller(int events, int timeout) {
+    ContextPoller poller;
+    poller.mFd = mFd;
+    poller.mEvents = events;
+    poller.mTimeout = timeout;
+
+    return poller;
+}
+
+int ContextPoller::poll() {
+    struct pollfd fds;
+
+    fds.fd = mFd;
+    fds.events = mEvents;
+
+    return ::poll(&fds, 1, mTimeout);
+}
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp
new file mode 100644
index 000000000000..97c5b75e8ce1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Event.cpp
@@ -0,0 +1,118 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "CIPR_EVENT"
+
+#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 <cstring>
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+using icamera::CAMERA_DEBUG_LOG_VERBOSE;
+using icamera::CAMERA_DEBUG_LOG_ERR;
+using icamera::CAMERA_DEBUG_LOG_DBG;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+
+#include "modules/ia_cipr/include/Event.h"
+#include "modules/ia_cipr/include/Utils.h"
+#include "modules/ia_cipr/include/Context.h"
+
+namespace icamera {
+namespace CIPR {
+Event::Event(const PSysEventConfig& eventConfig) {
+    mInitialized = false;
+    mEvent = reinterpret_cast<PSysEvent*>(CIPR::callocMemory(1, sizeof(*mEvent)));
+
+    CheckError(!mEvent, VOID_VALUE, "%s: could not allocate mEvent", __func__);
+
+    if (eventConfig.id != 0) {
+        icamera::LOG2("ID-field of CIPR mEvent deprecated!");
+    }
+
+    mEvent->event.type = eventConfig.type;
+    mEvent->event.user_token = eventConfig.commandToken;
+    mEvent->event.issue_id = eventConfig.commandIssueID;
+    mEvent->event.buffer_idx = 0;
+    mEvent->event.error = eventConfig.error;
+    mEvent->timeout = eventConfig.timeout;
+
+    mInitialized = true;
+}
+
+Event::~Event() {
+    if (!mInitialized) {
+        return;
+    }
+
+    mInitialized = false;
+    CIPR::freeMemory(mEvent);
+}
+
+Result Event::getConfig(PSysEventConfig* eventConfig) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!eventConfig, Result::InvaildArg, "@%s, eventConfig is nullptr", __func__);
+
+    eventConfig->type = mEvent->event.type;
+    eventConfig->commandToken = mEvent->event.user_token;
+    eventConfig->commandIssueID = mEvent->event.issue_id;
+    eventConfig->bufferHandoverBitmap = UINT64_MAX; /* Not used */
+    eventConfig->error = mEvent->event.error;
+    eventConfig->timeout = mEvent->timeout;
+    eventConfig->id = 0;
+
+    return Result::OK;
+}
+
+Result Event::setConfig(const PSysEventConfig& eventConfig) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+
+    mEvent->event.type = eventConfig.type;
+    mEvent->event.user_token = eventConfig.commandToken;
+    mEvent->event.issue_id = eventConfig.commandIssueID;
+    mEvent->event.buffer_idx = 0;
+    mEvent->event.error = eventConfig.error;
+    mEvent->timeout = eventConfig.timeout;
+
+    return Result::OK;
+}
+
+Result Event::wait(Context* ctx) {
+    CheckError(!mInitialized, Result::InternalError, "@%s, mInitialized is false", __func__);
+    CheckError(!ctx, Result::InvaildArg, "@%s, ctx is nullptr", __func__);
+
+    auto poller = ctx->getPoller(POLLIN | POLLHUP | POLLERR, mEvent->timeout);
+    int res = poller.poll();
+    if (res == 1) {
+        return ctx->doIoctl(static_cast<int>(IPU_IOC_DQEVENT), mEvent);
+    } else if (res == 0) {
+        return Result::TimeOut;
+    }
+
+    icamera::LOG2("%s: poll returned error: %s", __func__, strerror(res));
+    return Result::GeneralError;
+}
+}  // namespace CIPR
+}  // namespace icamera
diff --git a/camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp b/camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp
new file mode 100755
index 000000000000..2f241a233cf1
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_cipr/src/Utils.cpp
@@ -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.
+ */
+
+#include <unistd.h>
+#include "modules/ia_cipr/include/Utils.h"
+
+#define LOG_TAG "IA_CIPR_UTILS"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+
+using icamera::CAMERA_DEBUG_LOG_VERBOSE;
+using icamera::CAMERA_DEBUG_LOG_ERR;
+using icamera::CAMERA_DEBUG_LOG_DBG;
+using icamera::CAMERA_DEBUG_LOG_WARNING;
+
+namespace icamera {
+namespace CIPR {
+void* mallocMemory(size_t sz) {
+    return ::malloc(sz);
+}
+
+void* callocMemory(size_t cnt, size_t sz) {
+    return ::calloc(cnt, sz);
+}
+
+void* mallocAlignedMemory(size_t sz, size_t alignment) {
+    void* p = nullptr;
+    int ret = ::posix_memalign(&p, alignment, sz);
+
+    return ret ? nullptr : p;
+}
+
+void freeMemory(void* p) {
+    ::free(p);
+}
+
+void memoryCopy(void* dst, size_t dsz, const void* src, size_t sz) {
+    if (dsz < sz) {
+        icamera::LOG2("%s: destination size < source size, potential coding error", __func__);
+    }
+
+    MEMCPY_S(dst, dsz, src, sz);
+}
+
+size_t getPageSize() {
+    return static_cast<size_t>(sysconf(_SC_PAGESIZE));
+}
+}  // namespace CIPR
+}  // namespace icamera
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..b4619aab0db9
--- /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) 2020 Intel Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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..8c7a6e1b9400
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/ia_css/ipu6/include/pg_control_init_framework.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 __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..c8da2bdde07b
--- /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    (43)
+#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..88a96e3e09c0
--- /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 = IS_ZSL_USAGE(aBuffer->stream->usage) ?
+        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..4fd1710e04f4
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.cpp
@@ -0,0 +1,110 @@
+/*
+ * 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_ISP_ADAPTOR_INIT && cmd <= IPC_ISP_RUN_PAL) {
+        group = IPC_GROUP_PAL;
+    } 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..5606b0a9ee24
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCCommon.h
@@ -0,0 +1,113 @@
+/*
+ * 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_PAL,
+    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..2e69d4af9521
--- /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;
+    ia_isp_bxt_resolution_info_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..c70242a0f6f0
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelDvs.cpp
@@ -0,0 +1,724 @@
+/*
+ * 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_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;
+        bool ret = mIpcAiq.flattenAeResults(*aeResults, &params->aeResultsBase);
+        CheckError(!ret, 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..10f7596c1d4b
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.cpp
@@ -0,0 +1,552 @@
+/*
+ * 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::getPayloadOffsets(const void* pData, int dataSize,
+                                        int payloadCount, const ia_binary_data* payloads,
+                                        int32_t* payloadOffsets) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
+    CheckError(!payloadOffsets, false, "@%s, nullptr payloadOffsets", __func__);
+
+    uintptr_t startAddr = reinterpret_cast<uintptr_t>(pData);
+    for (int i = 0; i < payloadCount; i++) {
+        if (payloads[i].size <= 0)
+            continue;
+
+        int32_t offset = reinterpret_cast<uintptr_t>(payloads[i].data) - startAddr;
+        CheckError((offset > (dataSize - payloads[i].size) || offset < 0), false,
+                   "@%s, error offset %d", __func__, offset);
+        payloadOffsets[i] = offset;
+    }
+    return 0;
+}
+
+bool IPCIntelPGParam::getPayloadData(void* pData, int dataSize,
+                                     int payloadCount, const int32_t* payloadOffsets,
+                                     ia_binary_data* payloads) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
+    CheckError(!payloadOffsets, false, "@%s, nullptr payloadOffsets", __func__);
+
+    unsigned char* startAddr = reinterpret_cast<unsigned char*>(pData);
+    for (int i = 0; i < payloadCount; i++) {
+        if (payloads[i].size <= 0)
+            continue;
+
+        CheckError(payloadOffsets[i] > dataSize - payloads[i].size, false,
+                   "@%s, error offset %d", __func__, payloadOffsets[i]);
+        payloads[i].data = startAddr + payloadOffsets[i];
+    }
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenEncode(void* pData, int dataSize, uintptr_t client,
+                                          unsigned int ipuParamSize, int32_t ipuParamHandle,
+                                          int32_t payloadCount, const ia_binary_data* payloads,
+                                          void* payloadMemory, int payloadMemorySize) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_encode_params), false, "@%s, buffer is small", __func__);
+    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
+    CheckError(payloadCount > IPU_MAX_TERMINAL_COUNT, false, "@%s, wrong payloadCount", __func__);
+    CheckError(!payloadMemory, false, "@%s, wrong payloadMemory", __func__);
+
+    pg_param_encode_params *params = static_cast<pg_param_encode_params*>(pData);
+    params->client = client;
+    params->ipuParamSize = ipuParamSize;
+    params->ipuParamHandle = ipuParamHandle;
+    params->payloadCount = payloadCount;
+    MEMCPY_S(params->payloads, sizeof(params->payloads),
+             payloads, sizeof(ia_binary_data) * payloadCount);
+    getPayloadOffsets(payloadMemory, payloadMemorySize,
+                      payloadCount, payloads, params->payloadOffsets);
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client,
+                                            void* palDataAddr, ia_binary_data* ipuParameters,
+                                            int32_t* payloadCount, ia_binary_data** payloads,
+                                            int32_t** payloadOffsets) {
+    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__);
+    CheckError(!payloadCount, false, "%s, payloadCount is nullptr", __func__);
+    CheckError(!payloads, false, "%s, payloads is nullptr", __func__);
+    CheckError(!payloadOffsets, false, "%s, payloadOffsets 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;
+    *payloadCount = params->payloadCount;
+    *payloads = params->payloads;
+    *payloadOffsets = params->payloadOffsets;
+    return true;
+}
+
+bool IPCIntelPGParam::clientFlattenDecode(void* pData, int dataSize, uintptr_t client,
+                                          int32_t payloadCount, const ia_binary_data* payloads,
+                                          void* payloadMemory, int payloadMemorySize) {
+    CheckError(!pData, false, "@%s, pData is nullptr", __func__);
+    CheckError(dataSize < sizeof(pg_param_decode_params), false, "@%s, size is small", __func__);
+    CheckError(!payloads, false, "@%s, nullptr payloads", __func__);
+    CheckError(payloadCount > IPU_MAX_TERMINAL_COUNT, false, "@%s, wrong payloadCount", __func__);
+    CheckError(!payloadMemory, false, "@%s, wrong payloadMemory", __func__);
+
+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
+    params->client = client;
+    params->payloadCount = payloadCount;
+    MEMCPY_S(params->payloads, sizeof(params->payloads),
+             payloads, sizeof(ia_binary_data) * payloadCount);
+    getPayloadOffsets(payloadMemory, payloadMemorySize,
+                      payloadCount, payloads, params->payloadOffsets);
+    return true;
+}
+
+bool IPCIntelPGParam::serverUnflattenDecode(void* pData, int dataSize, uintptr_t* client,
+                                            int32_t* payloadCount, ia_binary_data** payloads,
+                                            int32_t** payloadOffsets) {
+    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__);
+    CheckError(!payloadCount, false, "%s, payloadCount is nullptr", __func__);
+    CheckError(!payloads, false, "%s, payloads is nullptr", __func__);
+    CheckError(!payloadOffsets, false, "%s, payloadOffsets is nullptr", __func__);
+
+    pg_param_decode_params *params = static_cast<pg_param_decode_params*>(pData);
+    *client = params->client;
+    *payloadCount = params->payloadCount;
+    *payloads = params->payloads;
+    *payloadOffsets = params->payloadOffsets;
+    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..eacb485bc5fe
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/IPCIntelPGParam.h
@@ -0,0 +1,180 @@
+/*
+ * 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;
+    int32_t payloadCount;
+    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];
+    int32_t payloadOffsets[IPU_MAX_TERMINAL_COUNT];
+};
+
+struct pg_param_decode_params {
+    uintptr_t client;
+    int32_t payloadCount;
+    ia_binary_data payloads[IPU_MAX_TERMINAL_COUNT];
+    int32_t payloadOffsets[IPU_MAX_TERMINAL_COUNT];
+
+    // 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 getPayloadOffsets(const void* pData, int dataSize, int payloadCount,
+                           const ia_binary_data* payloads, int32_t* payloadOffsets);
+    bool getPayloadData(void* pData, int dataSize, int payloadCount,
+                        const int32_t* payloadOffsets, ia_binary_data* payloads);
+
+    bool clientFlattenEncode(void* pData, int dataSize, uintptr_t client,
+                             unsigned int ipuParamSize, int32_t ipuParamHandle,
+                             int32_t payloadCount, const ia_binary_data* payloads,
+                             void* payloadMemory, int payloadMemorySize);
+    bool serverUnflattenEncode(void* pData, int dataSize, uintptr_t* client,
+                               void* palDataAddr, ia_binary_data* ipuParameters,
+                               int32_t* payloadCount, ia_binary_data** payloads,
+                               int32_t** payloadOffsets);
+
+    bool clientFlattenDecode(void* pData, int dataSize, uintptr_t client,
+                             int32_t payloadCount, const ia_binary_data* payloads,
+                             void* payloadMemory, int payloadMemorySize);
+    bool serverUnflattenDecode(void* pData, int dataSize, uintptr_t* client,
+                               int32_t* payloadCount, ia_binary_data** payloads,
+                               int32_t** payloadOffsets);
+
+    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..54e4494c9053
--- /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..9bc2cbd0c251
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelAlgoCommon.cpp
@@ -0,0 +1,129 @@
+/*
+ * 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);
+    if (shm->mHandle < 0) {
+        LOGE("@%s, call mBridge->RegisterBuffer fail", __func__);
+        mClient->releaseShmMem(shm->mName, shm->mSize, shm->mFd, shm->mAddr);
+        return false;
+    }
+
+    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..444aaf78381e
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelDvs.cpp
@@ -0,0 +1,356 @@
+/*
+ * 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 "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(mMemImageTransfor.mAddr,
+                                                  mMemImageTransfor.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..91fcdf0b687a
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/client/IntelPGParam.cpp
@@ -0,0 +1,268 @@
+/*
+ * 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__);
+
+    int32_t palHandle = mCommon.getShmMemHandle(ipuParameters->data);
+    bool ret = mIpc.clientFlattenEncode(mMemEncode.mAddr, mMemEncode.mSize, mClient,
+                                        ipuParameters->size, palHandle,
+                                        payloadCount, payloads,
+                                        mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize);
+    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__);
+
+    bool ret = mIpc.clientFlattenDecode(mMemDecode.mAddr, mMemDecode.mSize, mClient,
+                                        payloadCount, payloads,
+                                        mMemAllocatePayloads.mAddr, mMemAllocatePayloads.mSize);
+    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..ed5a5b6ec1d3
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelDvsServer.cpp
@@ -0,0 +1,316 @@
+/*
+ * 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 "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;
+    }
+
+    return mIntelDvss[dvs].get();
+}
+}  // 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..1f67b7d10dde
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.cpp
@@ -0,0 +1,232 @@
+/*
+ * 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
+    package.mPayloadMemory.size = dataSize;
+    package.mPayloadMemory.data = pData;
+
+    return OK;
+}
+
+int IntelPGParamServer::updatePALAndEncode(void* pData, int dataSize, void* palDataAddr) {
+    uintptr_t client = 0;
+    ia_binary_data ipuParameters = {nullptr, 0};
+    int32_t* payloadOffsets = nullptr;
+    ia_binary_data* payloads = nullptr;
+    int32_t payloadCount = 0;
+
+    bool ret = mIpc.serverUnflattenEncode(pData, dataSize, &client, palDataAddr, &ipuParameters,
+                                          &payloadCount, &payloads, &payloadOffsets);
+    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];
+    CheckError(payloadCount != package.mPayloadCount, UNKNOWN_ERROR,
+               "@%s, wrong payloadCount", __func__);
+    ret = mIpc.getPayloadData(package.mPayloadMemory.data, package.mPayloadMemory.size,
+                              payloadCount, payloadOffsets, payloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, getPayloadData fails", __func__);
+
+    int result = package.mPGParamAdapt->updatePALAndEncode(&ipuParameters,
+                                                           payloadCount,
+                                                           payloads);
+    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};
+    int32_t* payloadOffsets = nullptr;
+    ia_binary_data* payloads = nullptr;
+    int32_t payloadCount = 0;
+
+    bool ret = mIpc.serverUnflattenDecode(pData, dataSize, &client,
+                                          &payloadCount, &payloads, &payloadOffsets);
+    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];
+    CheckError(payloadCount != package.mPayloadCount, UNKNOWN_ERROR,
+               "@%s, wrong payloadCount", __func__);
+    ret = mIpc.getPayloadData(package.mPayloadMemory.data, package.mPayloadMemory.size,
+                              payloadCount, payloadOffsets, payloads);
+    CheckError(ret == false, UNKNOWN_ERROR, "@%s, getPayloadData fails", __func__);
+
+    int result = package.mPGParamAdapt->decode(payloadCount, payloads, &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..e49f3cb12e74
--- /dev/null
+++ b/camera/hal/intel/ipu6/modules/sandboxing/server/IntelPGParamServer.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.
+ */
+
+#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_binary_data mPayloadMemory;
+        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..ac2bed5b1031
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqCore.cpp
@@ -0,0 +1,961 @@
+/*
+ * 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 "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),
+    mTimestamp(0),
+    mSensorPixelClock(0.0),
+    mAeForceLock(false),
+    mAwbForceLock(false),
+    mAfForceLock(false),
+    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),
+    mLastEvShift(0.0f) {
+    LOG3A("@%s", __func__);
+
+    mIntel3AParameter = std::unique_ptr<Intel3AParameter>(new Intel3AParameter(cameraId));
+
+    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);
+
+    CLEAR(mLensShadingMapSize);
+
+    // 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 data = {nullptr, 0};
+            ia_err iaErr = aiq->getAiqdData(&data);
+            if (AiqUtils::convertError(iaErr) == OK) {
+                PlatformData::saveAiqd(mCameraId, static_cast<TuningMode>(mode), data);
+            } 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__);
+
+    ia_mkn* mkn = PlatformData::getMknHandle(mCameraId);
+    ia_binary_data *nvmData = PlatformData::getNvm(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 = PlatformData::getCpfAndCmc(mCameraId, nullptr, &aiqData, nullptr,
+                                             &cmcHandle, mode);
+        CheckError(ret != OK, BAD_VALUE, "@%s, getDataAndCmc fails", __func__);
+
+        ia_binary_data* aiqd = nullptr;
+        if (PlatformData::PlatformData::isAiqdEnabled(mCameraId)) {
+            aiqd = PlatformData::getAiqd(mCameraId, mode);
+        }
+
+        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;
+    mSensorPixelClock = descriptor.pixel_clock_freq_mhz;
+    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);
+
+    ia_cmc_t *cmcData = nullptr;
+    int ret = PlatformData::getCpfAndCmc(mCameraId, nullptr, nullptr, nullptr,
+                                         nullptr, mode, &cmcData);
+    CheckError(ret != OK || !cmcData, BAD_VALUE, "@%s get cmc data failed", __func__);
+
+    mHyperFocalDistance = AiqUtils::calculateHyperfocalDistance(*cmcData);
+
+    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;
+    PlatformData::getCpfAndCmc(mCameraId, 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);
+    mGbceParams.ev_shift = param.evShift;
+
+    // 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;
+
+    CheckError(mTuningMode >= TUNING_MODE_MAX, UNKNOWN_ERROR, "mTuningMode overflow!");
+    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);
+    }
+
+    mTimestamp = ispStatistics->frame_timestamp;
+    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);
+
+    aiqResult->mTimestamp = mTimestamp;
+    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);
+    }
+
+    uint16_t pixelInLine = aiqResult->mAeResults.exposures[0].sensor_exposure->line_length_pixels;
+    uint16_t lineInFrame = aiqResult->mAeResults.exposures[0].sensor_exposure->frame_length_lines;
+    aiqResult->mFrameDuration = pixelInLine * lineInFrame / mSensorPixelClock;
+    aiqResult->mRollingShutter = pixelInLine * (mFrameParams.cropped_image_height - 1)
+                                 / mSensorPixelClock;
+    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;
+    bool aeForceRun = mIntel3AParameter->mAeParams.ev_shift != mLastEvShift ||
+                      (!mAeForceLock && (mAeRunTime % mIntel3AParameter->mAePerTicks == 0));
+
+    if (aeForceRun) {
+        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);
+        }
+
+        if (newAeResults->exposures[0].converged) {
+            mLastEvShift = mIntel3AParameter->mAeParams.ev_shift;
+        }
+    }
+
+    mIntel3AParameter->updateAeResult(newAeResults);
+    if (newAeResults) {
+        ret = AiqUtils::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 = AiqUtils::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 = AiqUtils::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..ae7c5492d5a3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqCore.h
@@ -0,0 +1,214 @@
+/*
+ * 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"
+
+#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;
+    unsigned long long mTimestamp;  // Latest statistics timestamp
+    float mSensorPixelClock;
+
+    bool mAeForceLock;
+    bool mAwbForceLock;
+    bool mAfForceLock;
+
+    std::unique_ptr<Intel3AParameter> mIntel3AParameter;
+
+    // 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];
+    float mLastEvShift;
+
+};
+
+} /* 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..8fe8efcc4f71
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.cpp
@@ -0,0 +1,522 @@
+/*
+ * 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);
+
+    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);
+}
+
+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);
+    }
+
+    PlatformData::saveMakernoteData(mCameraId, 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..d4ce931e337d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqEngine.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 "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;
+    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..d67b1f1a54e1
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqResult.cpp
@@ -0,0 +1,182 @@
+/*
+ * 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),
+    mTimestamp(0),
+    mSequence(-1),
+    mTuningMode(TUNING_MODE_VIDEO),
+    mAfDistanceDiopters(0.0f),
+    mSkip(false),
+    mFrameDuration(0),
+    mRollingShutter(0)
+{
+    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;
+    mTimestamp = other.mTimestamp;
+    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;
+    mFrameDuration = other.mFrameDuration;
+    mRollingShutter = other.mRollingShutter;
+
+    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..e9e117e89218
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqResult.h
@@ -0,0 +1,109 @@
+/*
+ * 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;
+    unsigned long long mTimestamp;
+    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;
+
+    int64_t mFrameDuration;   // us
+    int64_t mRollingShutter;  // us
+
+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..1faa01dc3f86
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.cpp
@@ -0,0 +1,359 @@
+/*
+ * 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();
+
+    camera_info_t info = {};
+    PlatformData::getCameraInfo(mCameraId, info);
+    info.capability->getAeCompensationRange(mAiqParam.evRange);
+    info.capability->getAeCompensationStep(mAiqParam.evStep);
+
+    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.getSensitivityIso(mAiqParam.manualIso);
+    params.getBlcAreaMode(mAiqParam.blcAreaMode);
+    params.getAeRegions(mAiqParam.aeRegions);
+    params.getAeConvergeSpeedMode(mAiqParam.aeConvergeSpeedMode);
+    params.getAeConvergeSpeed(mAiqParam.aeConvergeSpeed);
+    params.getRun3ACadence(mAiqParam.run3ACadence);
+
+    int ev = 0;
+    params.getAeCompensation(ev);
+    if (mAiqParam.evStep.denominator == 0) {
+        mAiqParam.evShift = 0.0;
+    } else {
+        ev = CLIP(ev, mAiqParam.evRange.max, mAiqParam.evRange.min);
+        mAiqParam.evShift = static_cast<float>(ev) *
+            mAiqParam.evStep.numerator / mAiqParam.evStep.denominator;
+    }
+
+    params.getFrameRate(mAiqParam.fps);
+    params.getFpsRange(mAiqParam.aeFpsRange);
+    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;
+    manualIso = 0;
+    evShift = 0;
+    evStep = {1, 3};
+    evRange = {-6, 6};
+    fps = 0;
+    aeFpsRange = { 0.0, 0.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, manualIso %d",
+          evShift, manualExpTimeUs, manualGain, manualIso);
+    LOG3A("FPS:%f", fps);
+    LOG3A("FPS range:(%f-%f)", aeFpsRange.min, aeFpsRange.max);
+    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..d2ff1c0e05c8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqSetting.h
@@ -0,0 +1,153 @@
+/*
+ * 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;
+    int32_t manualIso;
+    float evShift;
+    float fps;
+    camera_range_t aeFpsRange;
+    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;
+    camera_range_t evRange;
+    camera_rational_t evStep;
+
+    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..e3965b516b4f
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.cpp
@@ -0,0 +1,256 @@
+/*
+ * 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),
+    // LOCAL_TONEMAP_S
+    mLtm(nullptr),
+    // LOCAL_TONEMAP_E
+    mAiqUnitState(AIQ_UNIT_NOT_INIT)
+{
+    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;
+    }
+
+    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.");
+
+    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..7584e48581f0
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUnit.h
@@ -0,0 +1,155 @@
+/*
+ * 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;
+    // LOCAL_TONEMAP_S
+    Ltm *mLtm;
+    // LOCAL_TONEMAP_E
+    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
+    AiqEngine *mAiqEngine;
+    AiqSetting *mAiqSetting;
+
+    // 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..b55692db6723
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.cpp
@@ -0,0 +1,660 @@
+/*
+ * 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::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] ag %f dg %f Fn %f 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 AiqUtils::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 AiqUtils::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;
+}
+
+int AiqUtils::deepCopyAeResults(const ia_aiq_ae_results& src, ia_aiq_ae_results* dst)
+{
+    LOG3A("@%s", __func__);
+    dumpAeResults(src);
+
+    /**
+     * 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__);
+    dumpAfResults(src);
+
+    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__);
+    dumpAwbResults(src);
+
+    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));
+}
+
+float AiqUtils::calculateHyperfocalDistance(const ia_cmc_t &cmcData) {
+    LOG2("@%s", __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) {
+        LOG2("lut apertures is not provided or zero in the cmc. Using default");
+        return DEFAULT_HYPERFOCAL_DISTANCE;
+    }
+
+    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);
+
+    return (hyperfocalDistanceMillis == 0.0f) ? DEFAULT_HYPERFOCAL_DISTANCE :
+                                                hyperfocalDistanceMillis;
+}
+
+} /* 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..7def8de88ddb
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/AiqUtils.h
@@ -0,0 +1,185 @@
+/*
+ * 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 "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 dumpAeResults(const ia_aiq_ae_results &aeResult);
+int dumpAfResults(const ia_aiq_af_results &afResult);
+int dumpAwbResults(const ia_aiq_awb_results &awbResult);
+
+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);
+
+float calculateHyperfocalDistance(const ia_cmc_t &cmcData);
+
+} // 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..2b881e526607
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/Dvs.cpp
@@ -0,0 +1,616 @@
+/*
+ * 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 <algorithm>
+#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 int DVS_MIN_ENVELOPE = 12;
+const float QUATERNION_CLIP_MAX_ANGLE = 3.5f;
+
+const int DVS_OXDIM_Y = 128;
+const int DVS_OYDIM_Y = 32;
+const int DVS_OXDIM_UV  = 64;
+const int DVS_OYDIM_UV  = 16;
+
+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(mEnvelopeResolution);
+    CLEAR(mImage_transformation);
+
+    mIntelDvs = new IntelDvs();
+}
+
+Dvs::~Dvs() {
+    LOG1("@%s", __func__);
+    delete mIntelDvs;
+}
+
+int Dvs::initDvsHandle(TuningMode tuningMode) {
+    ia_binary_data aiqData;
+    uintptr_t cmcHandle = reinterpret_cast<uintptr_t>(nullptr);
+    int ret = PlatformData::getCpfAndCmc(mCameraId, 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 OK;
+}
+
+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 = mDstResolution.width / 2;
+    config->output_bq.height_bq = mDstResolution.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 = DVS_MIN_ENVELOPE / 2;
+    config->ispfilter_bq.height_bq = DVS_MIN_ENVELOPE / 2;
+
+    // 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->quaternion_clip_max_angle = QUATERNION_CLIP_MAX_ANGLE;
+
+    const float Max_Ratio = 1.45f;
+    int bq_max_width = static_cast<int>(Max_Ratio * static_cast<float>(config->output_bq.width_bq));
+    int bq_max_height =
+                      static_cast<int>(Max_Ratio * static_cast<float>(config->output_bq.height_bq));
+
+    config->envelope_bq.width_bq = mEnvelopeResolution.width / 2 - config->ispfilter_bq.width_bq;
+    config->envelope_bq.height_bq = mEnvelopeResolution.height / 2 - config->ispfilter_bq.height_bq;
+    // envelope should be larger than 0
+    config->envelope_bq.width_bq = max(0, config->envelope_bq.width_bq);
+    config->envelope_bq.height_bq = max(0, config->envelope_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
+        ia_isp_bxt_resolution_info_t resolution;
+        status = gc->getGdcKernelSetting(&gdcKernelId, &resolution);
+        CheckWarning(status != OK, OK, "Failed to get GDC kernel setting, DVS disabled");
+        mSrcResolution.width = resolution.input_width;
+        mSrcResolution.height = resolution.input_height;
+        mDstResolution.width = resolution.output_width;
+        mDstResolution.height = resolution.output_height;
+        mEnvelopeResolution.width = resolution.input_crop.left + resolution.input_crop.right;
+        mEnvelopeResolution.height = resolution.input_crop.top + resolution.input_crop.bottom;
+    }
+    LOG1("%s, GDC kernel setting: id: %u, resolution:src: %dx%d, dst: %dx%d, envelope: %dx%d",
+         __func__, gdcKernelId, mSrcResolution.width, mSrcResolution.height, mDstResolution.width,
+         mDstResolution.height, mEnvelopeResolution.width, mEnvelopeResolution.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..60901c4818ae
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/Dvs.h
@@ -0,0 +1,119 @@
+/*
+ * 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;
+    camera_resolution_t mEnvelopeResolution;
+
+    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..5c4f7ad36a2e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/Ltm.cpp
@@ -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.
+ */
+
+#define LOG_TAG "Ltm"
+
+#include <cmath>
+#include <memory>
+
+#include "Ltm.h"
+
+#include "iutils/Utils.h"
+#include "iutils/Errors.h"
+#include "iutils/CameraLog.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 = PlatformData::getMknHandle(mCameraId);
+    ia_binary_data otherData;
+    int ret = PlatformData::getCpfAndCmc(mCameraId, 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..da8a92036eb8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/MakerNote.cpp
@@ -0,0 +1,151 @@
+/*
+ * 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::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;
+    data->timestamp = 0;
+    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;
+}
+
+void MakerNote::updateTimestamp(int64_t sequence, uint64_t timestamp) {
+    LOG1("@%s", __func__);
+    AutoMutex lock(mMknLock);
+    CheckError(mMknState != INIT, VOID_VALUE, "@%s, mkn isn't initialized", __func__);
+
+    for (auto rit = mMakernoteDataList.rbegin(); rit != mMakernoteDataList.rend(); ++rit) {
+        if ((*rit)->sequence == sequence) {
+            LOG2("@%s, found sequence %ld for request sequence %ld, timestamp %ld", __func__,
+                 (*rit)->sequence, sequence, timestamp);
+            (*rit)->timestamp = timestamp;
+            break;
+        }
+    }
+}
+
+void MakerNote::acquireMakernoteData(uint64_t timestamp, Parameters *param) {
+    LOG1("@%s", __func__);
+    AutoMutex lock(mMknLock);
+    CheckError(mMknState != INIT, VOID_VALUE, "@%s, mkn isn't initialized", __func__);
+
+    for (auto rit = mMakernoteDataList.rbegin(); rit != mMakernoteDataList.rend(); ++rit) {
+        if ((*rit)->timestamp > 0 && timestamp >= (*rit)->timestamp) {
+            LOG2("@%s, found timestamp %ld for request timestamp %ld", __func__,
+                 (*rit)->timestamp, timestamp);
+            param->setMakernoteData((*rit)->section, (*rit)->size);
+            break;
+        }
+    }
+}
+
+}  // 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..d06ae67f3dec
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/MakerNote.h
@@ -0,0 +1,139 @@
+/*
+ * 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;
+    uint64_t timestamp;
+    unsigned int size;
+    char section[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
+
+    MakernoteData() {
+        sequence = -1;
+        timestamp = 0;
+        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 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();
+
+    /**
+     * \brief Update timestamp of frame.
+     *
+     * param[in] sequence: the sequence in frame buffer;
+     * param[in] timestamp: the timestamp in frame buffer.
+     *
+     */
+    void updateTimestamp(int64_t sequence, uint64_t timestamp);
+
+    /**
+     * \brief Acquire MakerNote data.
+     *
+     * param[in] timestamp: the timestamp in frame buffer;
+     * param[out] param: Makernote data will be saved in parameters as metadata.
+     *
+     */
+    void acquireMakernoteData(uint64_t timestamp, Parameters *param);
+
+ private:
+    MakerNote();
+    ~MakerNote();
+
+    static MakerNote *getInstanceLocked(int cameraId);
+
+ private:
+    // Should > max request number in processing
+    static const int MAX_MAKER_NOTE_LIST_SIZE = 32;
+
+    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..a1e28bdb3286
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.cpp
@@ -0,0 +1,713 @@
+/*
+ * 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;
+
+    if (param.aeFpsRange.min > 0.01 && param.aeFpsRange.max >= param.aeFpsRange.min) {
+        mAeManualLimits.manual_frame_time_us_max = 1000000 / param.aeFpsRange.min;
+        mAeManualLimits.manual_frame_time_us_min = 1000000 / param.aeFpsRange.max;
+    } else if (param.fps > 0.01) {
+        mAeManualLimits.manual_frame_time_us_max = 1000000 / param.fps;
+        mAeManualLimits.manual_frame_time_us_min = 1000000 / param.fps;
+    }
+
+    camera_range_t etRange = {-1, -1};
+    int ret = PlatformData::getSupportAeExposureTimeRange(mCameraId, param.sceneMode, etRange);
+    if (param.exposureTimeRange.min > 0 &&
+        param.exposureTimeRange.max >= param.exposureTimeRange.min) {
+        if (ret == 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;
+
+    camera_range_t gainRange = {-1, -1};
+    ret = PlatformData::getSupportAeGainRange(mCameraId, param.sceneMode, gainRange);
+    if (param.sensitivityGainRange.min >= 0 &&
+        param.sensitivityGainRange.max >= param.sensitivityGainRange.min) {
+        if (ret == OK) {
+            gainRange.min = CLIP(param.sensitivityGainRange.min, gainRange.max, gainRange.min);
+            gainRange.max = CLIP(param.sensitivityGainRange.max, gainRange.max, gainRange.min);
+        } else {
+            gainRange.min = param.sensitivityGainRange.min;
+            gainRange.max = param.sensitivityGainRange.max;
+        }
+    }
+
+    mAeManualLimits.manual_iso_min = -1;
+    mAeManualLimits.manual_iso_max = -1;
+    if (gainRange.min >= 0 && gainRange.max >= gainRange.min) {
+        ia_binary_data aiqData;
+        ia_cmc_t *cmc = nullptr;
+
+        int ret = PlatformData::getCpfAndCmc(mCameraId, nullptr, &aiqData, nullptr,
+                                             nullptr, param.tuningMode, &cmc);
+        if (ret == OK) {
+            if (cmc != nullptr && cmc->cmc_sensitivity != nullptr) {
+                float isoMin = convertdBGainToISO(gainRange.min, cmc->cmc_sensitivity->base_iso);
+                float isoMax = convertdBGainToISO(gainRange.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);
+                }
+            }
+        }
+    }
+
+    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::setManualIso(const aiq_parameter_t& param)
+{
+    int32_t manualIso = param.manualIso;
+    if (manualIso <= 0 || param.aeDistributionPriority == DISTRIBUTION_SHUTTER) {
+        return;
+    }
+
+    if (mAeManualLimits.manual_iso_min >= 0
+        && mAeManualLimits.manual_iso_max >= mAeManualLimits.manual_iso_min) {
+        manualIso = CLIP(manualIso, mAeManualLimits.manual_iso_max, mAeManualLimits.manual_iso_min);
+    }
+
+    // Will overwrite manual_analog_gain
+    mAeParams.manual_iso = mManualIso;
+    for (unsigned int i = 0; i < mAeParams.num_exposures; i++) {
+        mAeParams.manual_iso[i] = manualIso;
+    }
+
+    LOG3A("%s, manual iso  %d", __func__, manualIso);
+}
+
+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);
+        setManualIso(param);
+        setManualExposure(param);
+    } else {
+        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..a3675a490502
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/3a/intel3a/Intel3AParameter.h
@@ -0,0 +1,104 @@
+/*
+ * 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 setManualIso(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..b3dd6e56cda7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraDevice.cpp
@@ -0,0 +1,1177 @@
+/*
+ * 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();
+    }
+
+    // stop request thread
+    mRequestThread->requestExit();
+    mRequestThread->join();
+
+    deleteStreams();
+
+    mProcessorManager->deleteProcessors();
+
+    m3AControl->deinit();
+
+    mSofSource->deinit();
+
+    mProducer->deinit();
+
+    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);
+        }
+    }
+        for (auto& item : mProcessors) {
+            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);
+    }
+
+    mSofSource->registerListener(EVENT_ISYS_SOF, mRequestThread);
+}
+
+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);
+        }
+    }
+        for (auto& item : mProcessors) {
+            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);
+    }
+
+    mSofSource->removeListener(EVENT_ISYS_SOF, 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) && (mState != DEVICE_CONFIGURE),
+               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);
+
+    ret = mProducer->configure(producerConfigs, configModes);
+    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) {
+        ret = mParamGenerator->getParameters((*ubuffer)->sequence, settings, false);
+    }
+
+    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, long sequence)
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("@%s mCameraId:%d", __func__, mCameraId);
+    AutoMutex   m(mDeviceLock);
+
+    if (sequence >= 0) {
+        // fetch target parameter and results
+        return mParamGenerator->getParameters(sequence, &param, false);
+    }
+
+    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;
+            int32_t userRequestId = 0;
+            int ret = mParamGenerator->getUserRequestId(eventData.data.requestReady.sequence,
+                                                        userRequestId);
+            CheckError(ret != OK, VOID_VALUE, "failed to find request id,  seq %ld",
+                       eventData.data.requestReady.sequence);
+            data.data.buffer_ready.sequence = eventData.data.requestReady.sequence;
+            data.data.buffer_ready.timestamp = eventData.data.requestReady.timestamp;
+            data.data.buffer_ready.frameNumber = static_cast<uint32_t>(userRequestId);
+            mCallback->notify(mCallback, data);
+            PlatformData::updateMakernoteTimeStamp(mCameraId, eventData.data.requestReady.sequence,
+                                                   data.data.buffer_ready.timestamp);
+        }
+        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.setFocusDistance(0.0f);
+    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..43d28f31a5ff
--- /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, long sequence);
+
+    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..bb6a017a5cda
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CameraEventType.h
@@ -0,0 +1,111 @@
+/*
+ * 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;
+    long sequence;
+};
+
+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..af75899159b2
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.cpp
@@ -0,0 +1,482 @@
+/*
+ * 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),
+    mDevice(nullptr),
+    mMaxBufferNum(PlatformData::getMaxRawDataNum(cameraId)),
+    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);
+
+    // Use VIDEO_GENERIC by default.
+    VideoNodeType nodeType = VIDEO_GENERIC;
+
+    mDevice = new MainDevice(mCameraId, nodeType, this);
+
+    // Open and configure the device. 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.
+    int ret = mDevice->openDevice();
+    CheckError(ret != OK, ret, "Open device(%s) failed:%d", mDevice->getName(), ret);
+
+    bool hasPort = mOutputFrameInfo.find(portOfMainDevice) != mOutputFrameInfo.end();
+    const stream_t& stream = hasPort ? mOutputFrameInfo.at(portOfMainDevice) : kDefaultStream;
+
+    ret = mDevice->configure(hasPort ? portOfMainDevice : kDefaultPort, stream, mMaxBufferNum);
+    CheckError(ret != OK, ret, "Configure device(%s) failed:%d", mDevice->getName(), ret);
+
+    return OK;
+}
+
+void CaptureUnit::destroyDevices()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    if (mDevice) {
+        mDevice->closeDevice();
+        delete mDevice;
+        mDevice = nullptr;
+    }
+
+}
+
+/**
+ * Find the device that can handle the given port.
+ */
+DeviceBase* CaptureUnit::findDeviceByPort(Port port)
+{
+    if (mDevice && mDevice->getPort() == port) {
+        return mDevice;
+    }
+
+    return nullptr;
+}
+
+int CaptureUnit::streamOn()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s, mCameraId:%d", __func__, mCameraId);
+
+    if (mDevice) {
+        int ret = mDevice->streamOn();
+        CheckError(ret < 0, INVALID_OPERATION, "Device:%s stream on failed.", mDevice->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);
+
+    if (mDevice) {
+        mDevice->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;
+
+    if (mDevice) {
+        mDevice->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)
+{
+    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());
+    }
+
+    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;
+
+    if (mDevice) {
+        int ret = mDevice->queueBuffer(-1);
+        if (mExitPending) return OK;
+        CheckError(ret != OK, ret, "queueBuffer fails, dev:%s, ret:%d", mDevice->getName(), ret);
+        mDevice->getPredictSequence();
+    }
+
+    return OK;
+}
+
+void CaptureUnit::onDequeueBuffer()
+{
+    processPendingBuffers();
+}
+
+int CaptureUnit::processPendingBuffers()
+{
+    if (mDevice && mDevice->getBufferNumInDevice() < mMaxBuffersInDevice) {
+        LOG2("%s: buffers in device:%d", __func__, mDevice->getBufferNumInDevice());
+
+        if (!mDevice->hasPendingBuffer()) {
+            return OK;
+        }
+
+        int ret = queueAllBuffers();
+        if (mExitPending) return OK;
+        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;
+    if (mDevice) {
+        pollDevs.push_back(mDevice->getV4l2Device());
+        LOG2("@%s: device:%s has %d buffers queued.", __func__,
+             mDevice->getName(), mDevice->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) {
+        if (mDevice && mDevice->getV4l2Device() == readyDevice) {
+            int ret = mDevice->dequeueBuffer();
+            if (mExitPending) return -1;
+
+            if (ret != OK) {
+                LOGE("Device:%s grab frame failed:%d", mDevice->getName(), ret);
+            }
+            break;
+        }
+    }
+
+    return OK;
+}
+
+void CaptureUnit::addFrameAvailableListener(BufferConsumer *listener)
+{
+    LOG1("%s camera id:%d", __func__, mCameraId);
+
+    AutoMutex   l(mLock);
+    if (mDevice) {
+        mDevice->addFrameListener(listener);
+    }
+}
+
+void CaptureUnit::removeFrameAvailableListener(BufferConsumer *listener)
+{
+    LOG1("%s camera id:%d", __func__, mCameraId);
+
+    AutoMutex   l(mLock);
+    if (mDevice) {
+        mDevice->removeFrameListener(listener);
+    }
+}
+
+void CaptureUnit::removeAllFrameAvailableListener()
+{
+    LOG1("%s camera id:%d", __func__, mCameraId);
+
+    AutoMutex   l(mLock);
+    if (mDevice) {
+        mDevice->removeAllFrameListeners();
+    }
+}
+
+void CaptureUnit::registerListener(EventType eventType, EventListener* eventListener)
+{
+    if (mDevice) {
+        mDevice->registerListener(eventType, eventListener);
+    }
+}
+
+void CaptureUnit::removeListener(EventType eventType, EventListener* eventListener)
+{
+    if (mDevice) {
+        mDevice->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..08062ec8bc51
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/CaptureUnit.h
@@ -0,0 +1,194 @@
+/*
+ * 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
+     *
+     * \return OK if succeed, other value indicates failed
+     */
+    virtual int configure(const std::map<Port, stream_t>& outputFrames,
+                          const std::vector<ConfigMode>& configModes);
+
+    // 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;
+    DeviceBase* mDevice;
+    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..df5958a4a20f
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/DeviceBase.cpp
@@ -0,0 +1,442 @@
+/*
+ * 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)),
+        mDevice(nullptr),
+        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..0a766200b8d8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.cpp
@@ -0,0 +1,964 @@
+/*
+ * 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"
+#include "ia_pal_types_isp.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),
+        mCallInfoOffset(-1),
+        mBNLM32Offset(-1),
+        mGCM(nullptr),
+        mAdaptor(nullptr)
+{
+    LOG1("IspParamAdaptor was created for id:%d type:%d", mCameraId, mPgParamType);
+    CLEAR(mFrameParam);
+    CLEAR(mLastPalDataForVideoPipe);
+
+    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();
+
+    {
+        AutoMutex l(mIpuParamLock);
+
+        // Release the memory and clear the mapping
+        for (auto& pgMap: mStreamIdToProgramGroupMap) {
+            delete[] pgMap.second.run_kernels;
+        }
+        mStreamIdToProgramGroupMap.clear();
+        mStreamIdToPGOutSizeMap.clear();
+        releaseIspParamBuffers();
+    }
+
+    CLEAR(mFrameParam);
+    CLEAR(mLastPalDataForVideoPipe);
+    mCallInfoOffset = -1;
+    mBNLM32Offset = -1;
+
+    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);
+
+    ret = PlatformData::getCpfAndCmc(mCameraId, &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()) {
+        AutoMutex l(mIpuParamLock);
+
+        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, ia_binary_data *ipuParam)
+{
+    // 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;
+    CLEAR(mLastPalDataForVideoPipe);
+    mCallInfoOffset = -1;
+    mBNLM32Offset = -1;
+
+    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.
+     */
+    IspParameter *ipuParam = nullptr;
+    {
+        AutoMutex l(mIpuParamLock);
+        mCurIspParamIndex = 0;
+        ipuParam = &(mIspParameters[mCurIspParamIndex]);
+    }
+    CheckError(!ipuParam, UNKNOWN_ERROR, "%s, Failed to get memory for ipuParam", __func__);
+
+    ia_binary_data curIpuParam = {};
+    for (auto& binaryMap : ipuParam->streamIdToDataMap) {
+        inputParams.program_group = &(mStreamIdToProgramGroupMap[binaryMap.first]);
+        inputParams.sensor_frame_params = &mFrameParam;
+        curIpuParam = binaryMap.second;
+        curIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
+
+        PERF_CAMERA_ATRACE_PARAM1_IMAGING("ia_isp_bxt_run", 1);
+
+        int ret = mAdaptor->runPal(mIspAdaptHandle, &inputParams, &curIpuParam);
+        CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
+
+        {
+            AutoMutex l(mIpuParamLock);
+            binaryMap.second.size = curIpuParam.size;
+            ipuParam->dataAvailableMap[binaryMap.first] = true;
+            ipuParam->sequence = -1;
+        }
+    }
+
+    dumpIspParameter(0, curIpuParam);
+
+    return postConfigure(stream.width, stream.height, &curIpuParam);
+}
+
+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 dvsInReso = {};
+    if (graphConfig) {
+        ia_isp_bxt_resolution_info_t resolution = {};
+        uint32_t gdcKernelId;
+        graphConfig->getGdcKernelSetting(&gdcKernelId, &resolution);
+        dvsInReso.width = resolution.input_width;
+        dvsInReso.height = resolution.input_height;
+    }
+
+    ia_binary_data *hwStatsData = (ia_binary_data *)(statsBuffer->getBufferAddr());
+    ConvertInputParam inputParams = {CameraUtils::isMultiExposureCase(tuningMode),
+                                     hwStatsData, &dvsInReso, &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 ++;
+    }
+}
+
+/*
+ * PAL output buffer is a reference data for next output buffer,
+ * but currently a ring buffer is used in HAL, which caused logic mismatching issue.
+ * So temporarily copy lastest call info and BNLM_3_2 into PAL output buffer.
+ */
+void IspParamAdaptor::updatePalDataForVideoPipe(ia_binary_data dest)
+{
+    if (mLastPalDataForVideoPipe.data == nullptr || mLastPalDataForVideoPipe.size == 0)
+        return;
+
+    char* src = static_cast<char*>(mLastPalDataForVideoPipe.data);
+    ia_pal_record_header *header_call_info = nullptr;
+    ia_pal_record_header *header_bnlm_3_2 = nullptr;
+    ia_pal_record_header *header = nullptr;
+    if (mBNLM32Offset >= 0 && mCallInfoOffset >= 0) {
+        header = reinterpret_cast<ia_pal_record_header*>(src + mCallInfoOffset);
+        if (header->uuid == ia_pal_uuid_isp_call_info) {
+            header_call_info = header;
+        }
+        header = reinterpret_cast<ia_pal_record_header*>(src + mBNLM32Offset);
+        if (header->uuid == ia_pal_uuid_isp_bnlm_3_2) {
+            header_bnlm_3_2 = header;
+        }
+    } else {
+        uint32_t offset = 0;
+        // find call_info and bnlm_3_2 data in saved PAL buffer
+        while (offset < mLastPalDataForVideoPipe.size) {
+            ia_pal_record_header *header = reinterpret_cast<ia_pal_record_header*>(src + offset);
+            // check if header is valid or not
+            if (header->uuid == 0 || header->size == 0) {
+                LOGW("%s, source header info isn't correct", __func__);
+                return;
+            }
+
+            if (header->uuid == ia_pal_uuid_isp_call_info) {
+                header_call_info = header;
+                mCallInfoOffset = offset;
+            } else if (header->uuid == ia_pal_uuid_isp_bnlm_3_2) {
+                header_bnlm_3_2 = header;
+                mBNLM32Offset = offset;
+            }
+            offset += header->size;
+        }
+        LOG2("call info offset %d, bnlm_3_2 offset %d", mCallInfoOffset, mBNLM32Offset);
+    }
+
+    // return if not all data is found
+    if (header_call_info == nullptr || header_bnlm_3_2 == nullptr) {
+        LOG2("%s, call info or bnlm_3_2 isn't found", __func__);
+        return;
+    }
+
+    char* destData = static_cast<char*>(dest.data);
+    // update call_info and bnlm_3_2 data
+    if (mBNLM32Offset >= 0 && mCallInfoOffset >= 0) {
+        header = reinterpret_cast<ia_pal_record_header*>(destData + mCallInfoOffset);
+        if (header->uuid == ia_pal_uuid_isp_call_info) {
+            MEMCPY_S(header, header->size, header_call_info, header_call_info->size);
+        }
+        header = reinterpret_cast<ia_pal_record_header*>(destData + mBNLM32Offset);
+        if (header->uuid == ia_pal_uuid_isp_bnlm_3_2) {
+            MEMCPY_S(header, header->size, header_bnlm_3_2, header_bnlm_3_2->size);
+        }
+    }
+
+    LOG2("%s, call info and bnlm_3_2 kernels have been updated", __func__);
+}
+
+/**
+ * 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);
+
+    bool forceUpdate = false;
+    IspParameter *ipuParam = nullptr;
+    {
+        AutoMutex l(mIpuParamLock);
+
+        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;
+            }
+        }
+
+        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();
+        }
+
+        ipuParam = &(mIspParameters[updateIndex]);
+        ipuParam->sequence = -1;
+        LOG2("%s, current isp parameter index:%d, update index:%d, for sequence: %ld, stream %d",
+              __func__, mCurIspParamIndex, updateIndex, settingSequence, streamId);
+    }
+    CheckError(!ipuParam, UNKNOWN_ERROR, "%s, Failed to get memory for ipuParam", __func__);
+
+    ia_isp_bxt_gdc_limits* mbrData = nullptr;
+    ia_binary_data curIpuParam = {};
+    for (auto& binaryMap : ipuParam->streamIdToDataMap) {
+        if (!(streamId == -1 || binaryMap.first == streamId))
+            continue;
+        curIpuParam = binaryMap.second;
+        curIpuParam.size = mStreamIdToPGOutSizeMap[binaryMap.first];
+        if (mStreamIdToMbrDataMap.find(binaryMap.first) != mStreamIdToMbrDataMap.end())
+            mbrData = &(mStreamIdToMbrDataMap[binaryMap.first]);
+
+        // Update some PAL data to lastest PAL result
+        if (binaryMap.first == VIDEO_STREAM_ID) {
+            updatePalDataForVideoPipe(binaryMap.second);
+        }
+        int ret = runIspAdaptL(mStreamIdToProgramGroupMap[binaryMap.first], mbrData,
+                               ispSettings, settingSequence, &curIpuParam, forceUpdate);
+
+        CheckError(ret != OK, ret, "run isp adaptor error for streamId %d, sequence: %ld",
+                               binaryMap.first, settingSequence);
+        {
+            AutoMutex l(mIpuParamLock);
+            binaryMap.second.size = curIpuParam.size;
+            ipuParam->dataAvailableMap[binaryMap.first] = true;
+            ipuParam->sequence = settingSequence;
+
+            if (binaryMap.first == VIDEO_STREAM_ID) {
+                mLastPalDataForVideoPipe = binaryMap.second;
+            }
+        }
+    }
+
+    return OK;
+}
+
+ia_binary_data* IspParamAdaptor::getIpuParameter(long sequence, int streamId)
+{
+    AutoMutex l(mIpuParamLock);
+
+    /* For old version.
+     * We should get the ipu param according to streamId and
+     * sequenceId when there are multi-streams in one pipe.
+     *
+     * This is only for getting the default ipu parameter
+     */
+    if (sequence == -1 && streamId == -1) {
+        return &(mIspParameters[mCurIspParamIndex].streamIdToDataMap.begin()->second);
+    }
+
+    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() &&
+            param.dataAvailableMap.find(streamId) != param.dataAvailableMap.end()) {
+            ipuParam = &param.streamIdToDataMap[streamId];
+            break;
+        }
+    }
+
+    if (!ipuParam) {
+        LOG1("Failed to find ISP parameter for stream id %d, sequence: %ld", streamId, sequence);
+    }
+
+    return ipuParam;
+}
+
+int IspParamAdaptor::getPalOutputDataSize(const ia_isp_bxt_program_group* programGroup)
+{
+    CheckError(programGroup == nullptr, 0, "Request programGroup is nullptr");
+    return mAdaptor->getPalDataSize(const_cast<ia_isp_bxt_program_group*>(programGroup));
+}
+
+/*
+ * 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,
+                                  ia_binary_data *ipuParam, 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.timestamp = aiqResults->mTimestamp;
+    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, ipuParam);
+    }
+    CheckError(ret != OK, UNKNOWN_ERROR, "ISP parameter adaptation has failed %d", ret);
+
+    dumpIspParameter(aiqResults->mSequence, *ipuParam);
+
+    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, ia_binary_data ipuParam) {
+    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, ipuParam.data, ipuParam.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..f621cea2d798
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/IspParamAdaptor.h
@@ -0,0 +1,153 @@
+/*
+ * 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
+    ia_binary_data* getIpuParameter(long sequence = -1, int streamId = -1);
+    int getPalOutputDataSize(const ia_isp_bxt_program_group* programGroup);
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(IspParamAdaptor);
+
+    int initProgramGroupForAllStreams(ConfigMode configMode);
+    int postConfigure(int width, int height, ia_binary_data *ipuParam);
+    void initInputParams(ia_isp_bxt_input_params_v2 *params, PgParamType type);
+
+    int initIspAdaptHandle(ConfigMode configMode, TuningMode tuningMode);
+    void deinitIspAdaptHandle();
+
+    void updatePalDataForVideoPipe(ia_binary_data dest);
+    int runIspAdaptL(ia_isp_bxt_program_group programGroup, ia_isp_bxt_gdc_limits* mbrData,
+                     const IspSettings* ispSettings, long settingSequence,
+                     ia_binary_data *ipuParam, 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, ia_binary_data ipuParam);
+    // 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;
+    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];
+    ia_binary_data mLastPalDataForVideoPipe;
+    int mCallInfoOffset;
+    int mBNLM32Offset;
+    //Guard lock for ipu parameter
+    Mutex mIpuParamLock;
+
+    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..0192f3b8d818
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.cpp
@@ -0,0 +1,890 @@
+/*
+ * 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 <utility>
+
+#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 (5000000)  // 5ms
+
+using std::shared_ptr;
+using std::unique_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),
+        mSofSequence(-1),
+        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;
+    mSofSequence = -1;
+
+    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);
+        unique_ptr<PSysDAG> pSysDAG = unique_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] = std::move(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) {
+        if (!psysDAGPair.second) continue;
+        int ret = psysDAGPair.second->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) {
+        if (!psysDAGPair.second) continue;
+        psysDAGPair.second->start();
+        if (needProducerBuffer && PlatformData::isNeedToPreRegisterBuffer(mCameraId)) {
+            psysDAGPair.second->registerInternalBufs(mInternalBuffers);
+        }
+    }
+
+    return OK;
+}
+
+void PSysProcessor::stop()
+{
+    PERF_CAMERA_ATRACE();
+    LOG1("%s", __func__);
+
+    for (auto &psysDAGPair : mPSysDAGs) {
+        if (!psysDAGPair.second) continue;
+        psysDAGPair.second->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_high;
+        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);
+
+                mSofSequence = eventData.data.sync.sequence;
+                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;
+                }
+            }
+
+            {
+                AutoMutex l(mSofLock);
+                if (srcBuffers.begin()->second->getSequence() >= mSofSequence) {
+                    LOG2("%s, run the frame in next sof: buffer sequence: %ld, sof sequence: %ld",
+                         __func__, srcBuffers.begin()->second->getSequence(), mSofSequence);
+                    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;
+
+        if (!(*hasYuv)) {
+            EventData frameData;
+            frameData.type = EVENT_PSYS_FRAME;
+            frameData.buffer = nullptr;
+            frameData.data.frame.sequence = rawOutputBuffer->getSequence();
+            frameData.data.frame.timestamp.tv_sec = rawOutputBuffer->getTimestamp().tv_sec;
+            frameData.data.frame.timestamp.tv_usec = rawOutputBuffer->getTimestamp().tv_usec;;
+            notifyListeners(frameData);
+            LOG2("%s, frame done for sequence: %ld", __func__, frameData.data.frame.sequence);
+        }
+
+        // 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];
+            // Release source buffers
+            for (const auto& src : *srcBuffers) {
+                mBufferProducer->qbuf(src.first, src.second);
+            }
+            // Update source buffers
+            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 event;
+                    event.type = EVENT_PSYS_REQUEST_BUF_READY;
+                    event.buffer = nullptr;
+                    event.data.requestReady.timestamp = timestamp;
+                    event.data.requestReady.sequence = settingSequence;
+                    notifyListeners(event);
+                    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..4fa982b92eef
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/PSysProcessor.h
@@ -0,0 +1,130 @@
+/*
+ * 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::unique_ptr<PSysDAG>> PSysDAGConfigModeMap;
+
+/**
+  * PSysProcessor runs the Image Process Algorithm 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;
+    long mSofSequence;
+
+    // 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..5c84e65a38d8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/RequestThread.cpp
@@ -0,0 +1,547 @@
+/*
+ * 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),
+    mLastEofSeq(-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;
+    mLastEofSeq = -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_ISYS_SOF: {
+            AutoMutex l(mPendingReqLock);
+            mLastEofSeq = eventData.data.sync.sequence - 1;
+            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);
+    } else if (predictSequence < mLastEofSeq) {
+        // Drop early frames
+        predictSequence = mLastEofSeq;
+    }
+
+    // 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..dba2fd19c90a
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/RequestThread.h
@@ -0,0 +1,154 @@
+/*
+ * 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;
+    long mLastEofSeq;
+    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..d789f6ac3f50
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SofSource.cpp
@@ -0,0 +1,216 @@
+/*
+ * 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__);
+
+    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());
+    }
+
+    deinitDev();
+
+    mIsysReceiverSubDev = V4l2DeviceFactory::getSubDev(mCameraId, subDeviceNodeName);
+
+#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
+
+    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;
+
+    std::vector<V4L2Device*> pollDevs;
+    pollDevs.push_back(mIsysReceiverSubDev);
+    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..3b7ddf02556a
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/SofSource.h
@@ -0,0 +1,63 @@
+/*
+ * 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;
+    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..1fff90dacdb7
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/StreamSource.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 "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) = 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..9b4fd7cf28a6
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.cpp
@@ -0,0 +1,1214 @@
+/*
+ * 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),
+    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(mParamPayload);
+}
+
+PGCommon::~PGCommon()
+{
+}
+
+int PGCommon::init()
+{
+    mDisableDataTermials.clear();
+    mPGParamAdapt = std::unique_ptr<IntelPGParam>(new IntelPGParam(mPGId));
+
+    mCtx = new CIPR::Context();
+    int ret = getCapability();
+    if (ret != OK) return ret;
+
+    // create mManifestBuffer
+    ret = getManifest(mPGId);
+    if (ret != OK) return ret;
+
+    mTerminalBuffers = (CIPR::Buffer**)CIPR::callocMemory(mTerminalCount, sizeof(CIPR::Buffer*));
+    CheckError(!mTerminalBuffers, NO_MEMORY, "Allocate terminal buffers fail");
+    memset(mTerminalBuffers, 0, (mTerminalCount * sizeof(CIPR::Buffer*)));
+
+    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) {
+        CIPR::freeMemory(mTerminalBuffers);
+    }
+
+    delete mManifestBuffer;
+    delete mPGParamsBuffer;
+    delete mPGBuffer;
+    if (mPPGBuffer) {
+        delete mPPGBuffer;
+    }
+    for (auto& item : mBuffers) {
+        delete item.ciprBuf;
+    }
+
+    delete 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(CIPR::Buffer** 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");
+    }
+
+    CIPR::PSysEventConfig eventCfg = {};
+    eventCfg.timeout = kEventTimeout;
+    mEvent = new CIPR::Event(eventCfg);
+
+    return OK;
+}
+
+int PGCommon::createCommand(CIPR::Buffer* pg, CIPR::Command** cmd, CIPR::Buffer** extBuffer, int bufCount)
+{
+    CIPR::PSysCommandConfig cmdCfg;
+    CIPR::ProcessGroupCommand *pgCommand;
+    CIPR::Result ret;
+
+    // Create command with basic setting
+    cmdCfg.buffers.resize(bufCount);
+    std::fill(cmdCfg.buffers.begin(), cmdCfg.buffers.end(), nullptr);
+
+    *cmd = new CIPR::Command(cmdCfg);
+    ret = (*cmd)->getConfig(&cmdCfg);
+    CheckError(ret != CIPR::Result::OK, UNKNOWN_ERROR, "%s, call get_command_config fail", __func__);
+
+    // Create ext buffer
+    *extBuffer = new CIPR::Buffer(sizeof(CIPR::ProcessGroupCommand),
+                                  CIPR::MemoryFlag::AllocateCpuPtr
+                                  | CIPR::MemoryFlag::PSysAPI,
+                                  nullptr);
+
+    ret = (*extBuffer)->attatchDevice(mCtx);
+    CheckError(ret != CIPR::Result::OK, NO_MEMORY, "unable to access extBuffer");
+
+    void* p = nullptr;
+    ret = (*extBuffer)->getMemoryCpuPtr(&p);
+    CheckError(ret != CIPR::Result::OK, NO_MEMORY, "unable to access extBuffer memory");
+    pgCommand = reinterpret_cast<CIPR::ProcessGroupCommand*>(p);
+    CheckError(!pgCommand, NO_MEMORY, "unable to access memory.cpu_ptr");
+
+    pgCommand->header.size = sizeof(CIPR::ProcessGroupCommand);
+    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) {
+        CIPR::memoryCopy(pgCommand->dynamicKernelBitmap, 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.pgParamsBuf = mPPG ? nullptr : mPGParamsBuffer;
+    cmdCfg.pgManifestBuf = mManifestBuffer;
+    cmdCfg.pg = pg;
+    cmdCfg.extBuf = *extBuffer;
+    ret = (*cmd)->setConfig(cmdCfg);
+    CheckError(ret != CIPR::Result::OK, UNKNOWN_ERROR, "%s, call set_command_config fail", __func__);
+
+    return OK;
+}
+
+void PGCommon::destoryCommands()
+{
+    delete mCmd;
+    delete mCmdExtBuffer;
+
+    for (int i = 0; i < PPG_CMD_TYPE_COUNT; i++) {
+        delete mPPGCmd[i];
+        delete mPPGCmdExtBuffer[i];
+    }
+
+    if (mEvent) {
+        delete 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()
+{
+    CIPR::Buffer* 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)
+{
+    CIPR::Buffer* 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__);
+
+    mCmd->getConfig(&mCmdCfg);
+    int bufferCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    mCmdCfg.id = mPGId;
+    mCmdCfg.priority = 1;
+    mCmdCfg.pgParamsBuf = mPPG ? nullptr : mPGParamsBuffer;
+    mCmdCfg.pgManifestBuf = mManifestBuffer;
+    mCmdCfg.pg = mPGBuffer;
+    mCmdCfg.extBuf = mCmdExtBuffer;
+    mCmdCfg.buffers.resize(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
+    CIPR::PSysCommandConfig cmdCfg;
+    mPPGCmd[PPG_CMD_TYPE_START]->getConfig(&cmdCfg);
+
+    // Update config
+    cmdCfg.id = mPGId;
+    cmdCfg.priority = 1;
+    cmdCfg.pgParamsBuf = mPPG ? nullptr : mPGParamsBuffer;
+    cmdCfg.pgManifestBuf = mManifestBuffer;
+    cmdCfg.pg = mPPGBuffer;
+    cmdCfg.extBuf = mPPGCmdExtBuffer[PPG_CMD_TYPE_START];
+    const int terminalCount = ia_css_process_group_get_terminal_count(mProcessGroup);
+    cmdCfg.buffers.resize(terminalCount);
+    std::fill(cmdCfg.buffers.begin(), cmdCfg.buffers.end(), nullptr);
+
+    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()
+{
+    CIPR::PSysCommandConfig cmdCfg;
+
+    mPPGCmd[PPG_CMD_TYPE_STOP]->getConfig(&cmdCfg);
+
+    cmdCfg.id = mCmdCfg.id;
+    cmdCfg.priority = mCmdCfg.priority;
+    cmdCfg.pgParamsBuf = mCmdCfg.pgParamsBuf;
+    cmdCfg.pgManifestBuf = mCmdCfg.pgManifestBuf;
+    cmdCfg.pg = mPPGBuffer;
+    cmdCfg.extBuf = mPPGCmdExtBuffer[PPG_CMD_TYPE_STOP];
+    cmdCfg.buffers.resize(0);
+
+    int ret =  handleCmd(&mPPGCmd[PPG_CMD_TYPE_STOP], &cmdCfg);
+    return ret;
+}
+
+int PGCommon::handleCmd(CIPR::Command** cmd, CIPR::PSysCommandConfig* cmdCfg)
+{
+    CIPR::PSysEventConfig eventCfg = {};
+    mEvent->getConfig(&eventCfg);
+    cmdCfg->issueID = reinterpret_cast<uint64_t>(cmd);
+    eventCfg.commandIssueID = cmdCfg->issueID;
+
+    CIPR::Result ret = (*cmd)->setConfig(*cmdCfg);
+    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call CIPR::Command::setConfig fail", __func__);
+
+    ret = (*cmd)->getConfig(cmdCfg);
+    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call CIPR::Command::getConfig fail", __func__);
+
+    ret = (*cmd)->enqueue(mCtx);
+    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call Context::enqueueCommand() fail %d", __func__, ret);
+
+    // Wait event
+    ret = mEvent->wait(mCtx);
+    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call Context::waitForEvent fail, ret: %d", __func__, ret);
+
+    ret = mEvent->getConfig(&eventCfg);
+    CheckError((ret != CIPR::Result::OK), UNKNOWN_ERROR, "%s, call Event::getConfig() 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);
+    }
+
+    return (eventCfg.error == 0) ? OK : UNKNOWN_ERROR;
+}
+
+int PGCommon::getCapability()
+{
+    CIPR::PSYSCapability cap;
+    int ret = OK;
+    CIPR::Result err = mCtx->getCapabilities(&cap);
+    CheckError((err != CIPR::Result::OK), UNKNOWN_ERROR, "Call Context::getCapabilities() fail, ret:%d", ret);
+
+    LOG1("%s: capability.version:%d", __func__, cap.version);
+    LOG1("%s: capability.driver:%s", __func__, cap.driver);
+    LOG1("%s: capability.devModel:%s", __func__, cap.devModel);
+    LOG1("%s: capability.programGroupCount:%d", __func__, cap.programGroupCount);
+    mPGCount = cap.programGroupCount;
+
+    if (strncmp((char *)cap.devModel, "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.devModel, "ipu4", 4) == 0) {
+        switch (cap.devModel[13]) {
+            case 'B':
+                 mPlatform = IA_P2P_PLATFORM_BXT_B0;
+                 break;
+            default:
+                 LOGE("%s: unsupported psys device model :%s", __func__, cap.devModel);
+                 ret = BAD_VALUE;
+                 break;
+        }
+    } else if (strncmp((char *)cap.devModel, "ipu6", 4) == 0) {
+        mPlatform = IA_P2P_PLATFORM_IPU6;
+        mPPG = true;
+    } else {
+        LOGE("%s: unsupported psys device model : %s", __func__, cap.devModel);
+        ret = BAD_VALUE;
+    }
+
+    return ret;
+}
+
+int PGCommon::getManifest(int pgId)
+{
+    int i = 0;
+
+    for (; i < mPGCount; i++) {
+        CIPR::Buffer* 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;
+
+        CIPR::Result ret = mCtx->getManifest(i, &size, nullptr);
+        if (ret != CIPR::Result::OK) 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 = mCtx->getManifest(i, &size, manifest);
+        if (ret != CIPR::Result::OK) {
+            LOGE("%s, call Context::getManifest() fail", __func__);
+            delete 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;
+        }
+
+        delete manifestBuffer;
+    }
+
+    CheckError((i == mPGCount), BAD_VALUE, "%s, Can't found available pg: %d", __func__, pgId);
+
+    return OK;
+}
+
+CIPR::Buffer* PGCommon::createDMACiprBuffer(int size, int fd)
+{
+    CIPR::MemoryFlag deviceFlags = CIPR::MemoryFlag::MemoryHandle | CIPR::MemoryFlag::NoFlush;
+
+    CIPR::MemoryDesc mem;
+    mem.size = size;
+    mem.flags = CIPR::MemoryFlag::MemoryHandle | CIPR::MemoryFlag::HardwareOnly;
+    mem.handle = fd;
+    mem.cpuPtr = nullptr;
+    mem.anchor = nullptr;
+
+    CIPR::Buffer* buf = new CIPR::Buffer(size, mem.flags | deviceFlags, &mem);
+
+    CIPR::Result ret = buf->attatchDevice(mCtx);
+    if (ret != CIPR::Result::OK) {
+        LOGE("%s, call Buffer::attatchDevice() fail", __func__);
+        delete buf;
+        return nullptr;
+    }
+
+    return buf;
+}
+
+CIPR::Buffer* PGCommon::createUserPtrCiprBuffer(int size, void* ptr)
+{
+    CIPR::Buffer* buf = nullptr;
+    if (ptr == nullptr) {
+        buf = new CIPR::Buffer(size, CIPR::MemoryFlag::AllocateCpuPtr, nullptr);
+    } else {
+        CIPR::MemoryDesc mem;
+        mem.size = size;
+        mem.flags = CIPR::MemoryFlag::CpuPtr;
+        mem.handle = 0;
+        mem.cpuPtr = ptr;
+        mem.anchor = nullptr;
+        buf = new CIPR::Buffer(size, CIPR::MemoryFlag::CpuPtr, &mem);
+    }
+
+    CIPR::Result ret = buf->attatchDevice(mCtx);
+    if (ret != CIPR::Result::OK) {
+        LOGE("%s, call Buffer::attatchDevice() fail", __func__);
+        delete buf;
+        return nullptr;
+    }
+
+    return buf;
+}
+
+void* PGCommon::getCiprBufferPtr(CIPR::Buffer* buffer)
+{
+    CheckError(!buffer, nullptr, "%s, invalid cipr buffer", __func__);
+
+    void* ptr = nullptr;
+    CIPR::Result ret = buffer->getMemoryCpuPtr(&ptr);
+    CheckError((ret != CIPR::Result::OK), nullptr, "%s, call Buffer::getMemoryCpuPtr() fail", __func__);
+
+    return ptr;
+}
+
+int PGCommon::getCiprBufferSize(CIPR::Buffer* buffer)
+{
+    CheckError(!buffer, BAD_VALUE, "%s, invalid cipr buffer", __func__);
+
+    int size = 0;
+    CIPR::Result ret = buffer->getMemorySize(&size);
+    CheckError((ret != CIPR::Result::OK), NO_MEMORY, "%s, call Buffer::getMemorySize() fail", __func__);
+
+    return size;
+}
+
+CIPR::Buffer* 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;
+        }
+    }
+
+    CIPR::Buffer* 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;
+}
+
+CIPR::Buffer* 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;
+        }
+    }
+
+    CIPR::Buffer* 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);
+        if (!terminal) {
+            LOGE("failed to get terminal");
+            fclose(fp);
+            return;
+        }
+        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..92f86012254f
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PGCommon.h
@@ -0,0 +1,240 @@
+/*
+ * 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/Buffer.h"
+#include "modules/ia_cipr/include/Context.h"
+#include "modules/ia_cipr/include/Event.h"
+#include "modules/ia_cipr/include/Command.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(CIPR::Buffer** pgBuffer);
+    int createCommands();
+    int createCommand(CIPR::Buffer* pg, CIPR::Command** cmd, CIPR::Buffer** 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(CIPR::Command** cmd, CIPR::PSysCommandConfig* cmdCfg);
+
+    // Memory helper
+    CIPR::Buffer* createDMACiprBuffer(int size, int fd);
+    CIPR::Buffer* createUserPtrCiprBuffer(int size, void* ptr = nullptr);
+    void* getCiprBufferPtr(CIPR::Buffer* buffer);
+    CIPR::Buffer* registerUserBuffer(int size, void* ptr);
+    CIPR::Buffer* registerUserBuffer(int size, int fd);
+    int getCiprBufferSize(CIPR::Buffer* 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;
+        CIPR::Buffer* baseCiprBuf = nullptr;
+        CIPR::Buffer* ciprBuf = nullptr;
+    };
+
+    static const int kEventTimeout = 8000;
+
+    CIPR::Context* mCtx = nullptr;
+    CIPR::Buffer* mManifestBuffer = nullptr;
+    CIPR::Buffer* mPGParamsBuffer = nullptr;
+    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];
+
+    CIPR::Buffer* mPGBuffer = nullptr;
+    ia_css_process_group_t* mProcessGroup;
+    CIPR::Command* mCmd = nullptr;
+    CIPR::Buffer* mCmdExtBuffer = nullptr;
+
+    bool mPPG;
+    bool mPPGStarted;
+    CIPR::Buffer* mPPGBuffer = nullptr;
+    ia_css_process_group_t* mPPGProcessGroup;
+    CIPR::Command* mPPGCmd[PPG_CMD_TYPE_COUNT] = {nullptr, };
+    CIPR::Buffer* mPPGCmdExtBuffer[PPG_CMD_TYPE_COUNT] = {nullptr, };
+    uint64_t mToken;
+
+    CIPR::PSysCommandConfig mCmdCfg;
+    CIPR::Event* mEvent = nullptr;
+
+    CIPR::Buffer** 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..a8d66f2e1a66
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.cpp
@@ -0,0 +1,737 @@
+/*
+ * 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),
+    mRunAicAfterQbuf(false),
+    mLastTaskSequence(-1)
+{
+    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();
+    mExecutorStreamId.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) == 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);
+        mExecutorStreamId[executor] = streamId;
+    }
+    LOG2("%s, hasVideoPipe: %d, hasStillPipe: %d, enableBundleInSdv: %d",
+         __func__, hasVideoPipe, hasStillPipe, cfg->enableBundleInSdv);
+
+    // Only enable psys bundle with aic when has video pipe only
+    if (!hasStillPipe && PlatformData::psysBundleWithAic(mCameraId)) {
+        mRunAicAfterQbuf = true;
+    }
+
+    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;
+}
+
+/*
+ * Search all the stream Ids in one pipe which provides frame buffer to the output port
+ * mOutputPortToStreamIds: store all the different stream Ids to output port mapping table
+ */
+status_t PSysDAG::searchStreamIdsForOutputPort(PipeExecutor *executor, Port port) {
+    LOG2("@%s, mCameraId:%d", __func__, mCameraId);
+
+    CheckError(!executor || !executor->isOutputEdge(), BAD_VALUE,
+               "%s, the executor is nullptr or is not output edge", __func__);
+
+    if (mOutputPortToStreamIds.find(port) != mOutputPortToStreamIds.end()) {
+        return OK;
+    }
+
+    std::vector<int32_t> streamIds;
+    PipeExecutor *tmpExecutor = executor;
+    // Loop to find the producer executor's stream id
+    do {
+        int32_t streamId = mExecutorStreamId[tmpExecutor];
+        if (std::find(streamIds.begin(), streamIds.end(), streamId) == streamIds.end()) {
+            streamIds.push_back(streamId);
+            LOG2("%s, store the streamId: %d for output port: %d", __func__, streamId, port);
+        }
+
+        tmpExecutor = findExecutorProducer(tmpExecutor);
+    } while (tmpExecutor);
+
+    mOutputPortToStreamIds[port] = streamIds;
+
+    return OK;
+}
+
+/**
+ * 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();
+    mOutputPortToStreamIds.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);
+                    searchStreamIdsForOutputPort(executor, frameInfo.first);
+                    // 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, queue input buffer: dagPort: %d, executorPort: %d, name: %s", __func__,
+                     inputMap.mDagPort, inputMap.mExecutorPort, inputMap.mExecutor->getName());
+            }
+        }
+    }
+
+    // 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);
+                LOG2("%s, queue output buffer, dagPort: %d, executorPort: %d, name: %s", __func__,
+                     outputMap.mDagPort, outputMap.mExecutorPort, outputMap.mExecutor->getName());
+                break;
+            }
+        }
+    }
+
+    return OK;
+}
+
+int PSysDAG::configure(ConfigMode configMode, TuningMode tuningMode)
+{
+    LOG1("@%s, mCameraId:%d", __func__, mCameraId);
+
+    mConfigMode = configMode;
+    mTuningMode = tuningMode;
+    mRunAicAfterQbuf = false;
+    mLastTaskSequence = -1;
+
+    // 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);
+    }
+
+    TaskInfo task = {};
+    {
+        // Save the task data into mOngoingTasks
+        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);
+    }
+
+    // It's too early to runIspAdapt here, and the ipu parameters
+    // may be incorrect when runPipe.
+    bool runIspAdaptor = true;
+
+    // Run aic before queue psys buffer:
+    //  1. disable psys bundle with aic or has still pipe configured
+    //  2. for the first task
+    //  3. need to run aic for current task if drop frame happens
+    long sequence = taskParam.mInputBuffers.at(mDefaultMainInputPort)->getSequence();
+    if (runIspAdaptor && (!mRunAicAfterQbuf ||
+        (mLastTaskSequence == -1) || (sequence > mLastTaskSequence + 1))) {
+        LOG2("%s, run AIC before execute psys for sequence: %ld", __func__, sequence);
+        prepareIpuParams(sequence, false, &task);
+    }
+
+    queueBuffers(taskParam);
+
+    if (runIspAdaptor && mRunAicAfterQbuf) {
+        LOG2("%s, run AIC bundle with execute psys for sequence: %ld", __func__, sequence);
+        // if running psys bundle with aic, current aic result is for next sequence
+        prepareIpuParams((sequence + 1), false, &task);
+    }
+
+    mLastTaskSequence = sequence;
+}
+
+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;
+    {
+        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);
+
+                // Remove the sequence when finish to process the task
+                AutoMutex l(mSequenceLock);
+                for (int i = 0; i < MAX_BUFFER_COUNT; i++) {
+                    if (mOngoingSequence[i] == sequence) {
+                        mOngoingSequence[i] = -1;
+                        break;
+                    }
+                }
+            }
+            // 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, TaskInfo *task)
+{
+    // 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;
+            }
+        }
+    }
+
+    if (task == nullptr) {
+        AutoMutex taskLock(mTaskLock);
+        for (size_t i = 0; i < mOngoingTasks.size(); i++) {
+            if (sequence ==
+                mOngoingTasks[i].mTaskData.mInputBuffers.at(mDefaultMainInputPort)->getSequence()) {
+                task = &mOngoingTasks[i];
+                break;
+            }
+        }
+    }
+    CheckError(!task, UNKNOWN_ERROR,
+               "%s, Failed to find the task for sequence: %ld", __func__, sequence);
+
+    // According to the output port to filter the valid executor stream Ids, and then run AIC
+    std::vector<int32_t> activeStreamIds;
+    for (auto& outputFrame : task->mTaskData.mOutputBuffers) {
+        if (outputFrame.second.get() == nullptr)
+            continue;
+
+        std::map<Port, std::vector<int32_t> >::iterator
+            it = mOutputPortToStreamIds.find(outputFrame.first);
+        CheckError(it == mOutputPortToStreamIds.end(), UNKNOWN_ERROR,
+                   "%s, failed to find streamIds for output port: %d",
+                   __func__, outputFrame.first);
+
+        for (auto& streamId : it->second) {
+            if (std::find(activeStreamIds.begin(), activeStreamIds.end(), streamId)
+                    == activeStreamIds.end()) {
+                activeStreamIds.push_back(streamId);
+            }
+        }
+    }
+    LOG2("%s, the active streamId size for aic(sequence: %ld) is %zu",
+         __func__, sequence, activeStreamIds.size());
+
+    int ret = OK;
+    for (auto& id : activeStreamIds) {
+        ret = mIspParamAdaptor->runIspAdapt(&task->mTaskData.mIspSettings, sequence, id);
+        CheckError(ret != OK, UNKNOWN_ERROR,
+                   "%s, Failed to run AIC: sequence: %ld streamId: %d", __func__, sequence, id);
+    }
+
+    return OK;
+}
+
+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..720af5a42e33
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PSysDAG.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.
+ */
+
+#pragma once
+
+#include <unordered_map>
+
+#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; };
+};
+
+// Used to save all on-processing tasks.
+struct TaskInfo {
+    TaskInfo() : mNumOfValidBuffers(0), mNumOfReturnedBuffers(0) {}
+    PSysTaskData mTaskData;
+    int mNumOfValidBuffers;
+    int mNumOfReturnedBuffers;
+};
+
+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, TaskInfo *task = nullptr);
+
+    /**
+     * 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);
+    status_t searchStreamIdsForOutputPort(PipeExecutor *executor, Port port);
+
+    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::unordered_map<PipeExecutor*, int32_t> mExecutorStreamId;
+    std::map<Port, std::vector<int32_t> > mOutputPortToStreamIds;
+
+    // A lock for protecting task data from being accessed by different threads.
+    Mutex mTaskLock;
+    std::vector<TaskInfo> mOngoingTasks;
+
+    long mOngoingSequence[MAX_BUFFER_COUNT];
+    Mutex mSequenceLock;
+    bool mRunAicAfterQbuf;
+    long mLastTaskSequence;
+
+    /**
+     * 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..cf68ce72d250
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/core/psysprocessor/PipeLiteExecutor.cpp
@@ -0,0 +1,1121 @@
+/*
+ * 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);
+        if (!ipuParameters) {
+            LOG1("%s: executor %s doesn't run for sequence %ld due to no pal",
+                 __func__, mName.c_str(), sequence);
+            return OK;
+        }
+    }
+
+    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..1405e9ccac93
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/fd/FaceBase.h
@@ -0,0 +1,81 @@
+/*
+ * 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_ASYNC (MAX_FACE_FRAME_WIDTH * MAX_FACE_FRAME_HEIGHT)  // only using Y
+#define MAX_FACE_FRAME_SIZE_SYNC (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_ASYNC];
+    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..d75a6664d42e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.cpp
@@ -0,0 +1,530 @@
+/*
+ * 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,
+                                             int width, int height) {
+    LOG1("@%s, cameraId:%d, maxFaceNum:%u, halStreamId:%u, width:%d, height:%d",
+         __func__, cameraId, maxFaceNum, halStreamId, width, height);
+    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, width, height);
+    }
+
+    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,
+                             int width, int height) :
+    mCameraId(cameraId),
+    mInitialized(false),
+    mHalStreamId(halStreamId),
+    mWidth(width),
+    mHeight(height) {
+    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;
+    CheckError(size > MAX_FACE_FRAME_SIZE_SYNC, VOID_VALUE,
+               "face frame buffer is too small!, w:%d,h:%d,size:%d",
+               buffer.s.width, buffer.s.height, size);
+
+    FaceDetectionRunParams *params = acquireRunBuf();
+    CheckError(!params, VOID_VALUE, "Fail to acquire face engine buffer");
+
+    params->size = size;
+    params->width = buffer.s.width;
+    params->height = buffer.s.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.stride * buffer.s.height;
+    CheckError(size > MAX_FACE_FRAME_SIZE_ASYNC, VOID_VALUE,
+               "face frame buffer is too small!, w:%d,h:%d,size:%d",
+               buffer.s.width, buffer.s.height, 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_ASYNC, buffer.addr, size);
+    params->width = buffer.s.width;
+    params->height = buffer.s.height;
+    /* TODO: image.rotation is (mSensorOrientation + mCamOriDetector->getOrientation()) % 360 */
+    params->rotation = mSensorOrientation % 360;
+    params->format = pvl_image_format_gray;
+    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 = fovRatioW * width / (activePixelArray.right - activePixelArray.left);
+    float fovRatioHTmp = fovRatioH * height / (activePixelArray.bottom - activePixelArray.top);
+    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..9cc2433b05d3
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/fd/FaceDetection.h
@@ -0,0 +1,120 @@
+/*
+ * 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,
+                  int width, int height);
+    ~FaceDetection();
+
+    static FaceDetection *createInstance(int cameraId, unsigned int maxFaceNum,
+                                         int32_t halStreamId, int width, int height);
+    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,
+                                         int width, int height) {
+        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..02f53b78528a
--- /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, long sequence)
+{
+    LOG1("@%s, cameraId is %d", __func__, cameraId);
+
+    CameraDevice *device = mCameraDevices[cameraId];
+    checkCameraDevice(device, BAD_VALUE);
+
+    return device->getParameters(param, sequence);
+}
+
+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..1d46319862dd
--- /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, long sequence);
+
+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..1cab3142258d
--- /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, long sequence)
+{
+    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, sequence);
+}
+
+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..80d09722cc55
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.cpp
@@ -0,0 +1,631 @@
+/*
+ * 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 "EXIFMaker"
+
+#include <limits.h>
+#include <unordered_map>
+#include <fstream>
+#include <string>
+
+#include "EXIFMaker.h"
+
+#include "iutils/CameraLog.h"
+#include "iutils/Utils.h"
+#include "ParameterHelper.h"
+
+namespace icamera {
+
+#define DEFAULT_ISO_SPEED 100
+
+// The property file directory
+static const char *CAMERA_CACHE_DIR = "/var/cache/camera/";
+/*
+ * Property file defines product name and manufactory info
+ * Used for EXIF header of JPEG. Format: key=value in each line
+ */
+static const char *CAMERA_PROPERTY_FILE = "camera.prop";
+
+EXIFMaker::EXIFMaker() :
+    mExifSize(-1)
+    ,mInitialized(false)
+    ,mProductName("<not_set>")
+    ,mManufacturerName("<not set>") {
+    LOG2("@%s", __func__);
+
+    CLEAR(mExifAttributes);
+    mMakernoteSection = new unsigned char[MAKERNOTE_SECTION1_SIZE + MAKERNOTE_SECTION2_SIZE];
+    readProperty();
+}
+
+EXIFMaker::~EXIFMaker()
+{
+    LOG2("@%s", __func__);
+    delete [] mMakernoteSection;
+}
+
+void EXIFMaker::readProperty() {
+    LOG2("@%s", __func__);
+    std::string cameraPropertyPath =
+        std::string(CAMERA_CACHE_DIR) + std::string(CAMERA_PROPERTY_FILE);
+    std::fstream props(cameraPropertyPath.c_str(), std::ios::in);
+
+    if (!props.is_open()) {
+        LOG2("There isn't camera property file.");
+        return;
+    }
+
+    const std::string kModel = "ro.product.model";
+    const std::string kManufacturer = "ro.product.manufacturer";
+    const std::string kDelimiter = "=";
+    std::unordered_map<std::string, std::string> properties;
+
+    while (!props.eof()) {
+        size_t pos;
+        std::string line, key, value;
+
+        std::getline(props, line);
+        pos = line.find(kDelimiter);
+        if (pos != std::string::npos) {
+            key = line.substr(0, pos);
+            value = line.substr(pos + 1);
+            properties[key] = value;
+            LOG2("%s, new key,value: %s,%s", __func__, key.c_str(), value.c_str());
+        }
+    }
+
+    if (properties.find(kManufacturer) != properties.end()) {
+        mManufacturerName = properties[kManufacturer];
+    }
+    if (properties.find(kModel) != properties.end()) {
+        mProductName = properties[kModel];
+    }
+}
+
+/**
+ * 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.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(const Parameters &params) {
+    LOG1("@%s", __func__);
+
+    int64_t expTime = 0;
+    params.getExposureTime(expTime);
+
+    if (expTime > 0) {
+        // EXIF exposure rational value is in seconds and the unit of exposure time in 3A is usecs
+        mExifAttributes.exposure_time.num = expTime;
+        mExifAttributes.exposure_time.den = 1000000;
+        uint32_t tv = APEX_EXPOSURE_TO_SHUTTER(
+            static_cast<double>(expTime) / mExifAttributes.exposure_time.den);
+        mExifAttributes.shutter_speed.num = tv * 65536;
+        mExifAttributes.shutter_speed.den = 65536;
+    } else {
+        mExifAttributes.exposure_time.num = 0;
+        mExifAttributes.exposure_time.den = 1;
+        mExifAttributes.shutter_speed.num = 0;
+        mExifAttributes.shutter_speed.den = 1;
+    }
+
+    float stepEv = 1 / 3.0f;
+    icamera::camera_rational_t aeCompensationStep;
+    if (params.getAeCompensationStep(aeCompensationStep) == 0) {
+        stepEv = static_cast<float>(aeCompensationStep.numerator) / aeCompensationStep.denominator;
+    }
+
+    int32_t ev = 0;
+    float evBias = 0;
+    if (params.getAeCompensation(ev) == 0) {
+        evBias = static_cast<float>(ev) * stepEv;
+    }
+
+    // exposure bias. unit is APEX value. -99.99 to 99.99
+    const int evLowerBound = -100, evUpperBound = 100;
+    if (evBias > evLowerBound && evBias < evUpperBound) {
+        mExifAttributes.exposure_bias.num = static_cast<int>(evBias) * 100;
+        mExifAttributes.exposure_bias.den = 100;
+        LOG2("EXIF: Ev = %.2f", evBias);
+    } else {
+        mExifAttributes.exposure_bias.num = 0;
+        mExifAttributes.exposure_bias.den = 100;
+        LOG2("EXIF: Invalid Ev!");
+    }
+
+    int32_t iso;
+    mExifAttributes.iso_speed_rating = DEFAULT_ISO_SPEED;
+    if (params.getSensitivityIso(iso) == 0) {
+        mExifAttributes.iso_speed_rating = iso;
+    }
+
+    LOG2("EXIF: ISO=%d", mExifAttributes.iso_speed_rating);
+    LOG2("EXIF: shutter speed=%u/%u",
+         mExifAttributes.shutter_speed.num, mExifAttributes.shutter_speed.den);
+    LOG2("EXIF: exposure time=%u/%u",
+         mExifAttributes.exposure_time.num, mExifAttributes.exposure_time.den);
+}
+
+/*
+ * 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),
+                  mManufacturerName.c_str(), strlen(mManufacturerName.c_str()));
+
+    copyAttribute(mExifAttributes.model, sizeof(mExifAttributes.model),
+                  mProductName.c_str(), strlen(mProductName.c_str()));
+
+    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..908492d9d39d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/EXIFMaker.h
@@ -0,0 +1,74 @@
+/*
+ * 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 <string>
+
+#include "ExifCreater.h"
+#include "EXIFMetaData.h"
+#include "iutils/Utils.h"
+
+namespace icamera {
+
+/**
+ * \class EXIFMaker
+ *
+ */
+class EXIFMaker {
+
+public:
+    EXIFMaker();
+    ~EXIFMaker();
+
+    void readProperty();
+    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(const Parameters &params);
+
+private: // member variables
+    ExifCreater mEncoder;
+    exif_attribute_t mExifAttributes;
+    size_t mExifSize;
+    bool mInitialized;
+    unsigned char *mMakernoteSection;
+    std::string mProductName;
+    std::string mManufacturerName;
+
+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..e519eb8a7e4e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.cpp
@@ -0,0 +1,224 @@
+/*
+ * 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(parameter);
+
+    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);
+
+    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;
+}
+
+}  // 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..89c9790e34c2
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/jpeg/JpegMaker.h
@@ -0,0 +1,57 @@
+/*
+ * 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 <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);
+
+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..c07207f6eeb8
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.cpp
@@ -0,0 +1,356 @@
+/*
+ * 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 "ParameterHelper.h"
+#include "ParameterGenerator.h"
+
+namespace icamera {
+
+#define MIN_TONEMAP_POINTS 64
+#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 > 0 && mTonemapMaxCurvePoints < MIN_TONEMAP_POINTS) {
+        LOGW("%s: wrong tonemap points", __func__);
+        mTonemapMaxCurvePoints = 0;
+    }
+    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]);
+
+        // Initialize P_IN, P_OUT values [(P_IN, P_OUT), ..]
+        for (int32_t i = 0; i < mTonemapMaxCurvePoints; i++) {
+            float index = static_cast<float>(i);
+            mTonemapCurveRed[i * 2] = index / (mTonemapMaxCurvePoints - 1);
+            mTonemapCurveRed[i * 2 + 1] = index / (mTonemapMaxCurvePoints - 1);
+            mTonemapCurveBlue[i * 2] = index / (mTonemapMaxCurvePoints - 1);
+            mTonemapCurveBlue[i * 2 + 1] = index / (mTonemapMaxCurvePoints - 1);
+            mTonemapCurveGreen[i * 2] = index / (mTonemapMaxCurvePoints - 1);
+            mTonemapCurveGreen[i * 2 + 1] = index / (mTonemapMaxCurvePoints - 1);
+        }
+    }
+}
+
+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);
+    int32_t userRequestId = 0;
+    int ret = param->getUserRequestId(userRequestId);
+    if (ret == OK) {
+        mRequestParams[index].param.setUserRequestId(userRequestId);
+    }
+    // Update Jpeg related settings
+    int rotation = 0;
+    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)
+{
+    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);
+        }
+    }
+
+    generateParametersL(sequence, param);
+    return OK;
+}
+
+int ParameterGenerator::getUserRequestId(long sequence, int32_t& userRequestId)
+{
+    CHECK_SEQUENCE(sequence);
+    long index = sequence % kStorageSize;
+
+    AutoMutex l(mParamsLock);
+    CheckError((sequence != mRequestParams[index].sequence), UNKNOWN_ERROR,
+               "Can't find requestId for seq %ld, saved %ld",
+               sequence, mRequestParams[index].sequence);
+
+    return mRequestParams[index].param.getUserRequestId(userRequestId);
+}
+
+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->setSensitivityIso(aiqResult->mAeResults.exposures[0].exposure->iso);
+    float fps = 1000000.0 / aiqResult->mFrameDuration;
+    params->setFrameRate(fps);
+
+    // 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 updateCommonMetadata(params, aiqResult);
+}
+
+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;
+}
+
+int ParameterGenerator::updateCommonMetadata(Parameters *params, const AiqResult *aiqResult) {
+    CameraMetadata metadata;
+
+    metadata.update(CAMERA_SENSOR_ROLLING_SHUTTER_SKEW, &aiqResult->mRollingShutter, 1);
+
+    ParameterHelper::merge(metadata, params);
+    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..91f3c427ee0d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/ParameterGenerator.h
@@ -0,0 +1,115 @@
+/*
+ * 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);
+    int getUserRequestId(long sequence, int32_t& userRequestId);
+
+    /**
+     * \brief Get the parameters for the frame indicated by the sequence id.
+     */
+    int getParameters(long sequence, Parameters *param, bool mergeResultOnly = true);
+    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);
+
+    int updateCommonMetadata(Parameters *params, const AiqResult *aiqResult);
+
+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..36fee0d12c83
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/Parameters.cpp
@@ -0,0 +1,2011 @@
+/*
+ * 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::setSensitivityIso(int32_t iso)
+{
+    ParameterHelper::AutoWLock wl(mData);
+    return ParameterHelper::getMetadata(mData).update(CAMERA_SENSOR_SENSITIVITY, &iso, 1);
+}
+
+int Parameters::getSensitivityIso(int32_t& iso) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_SENSOR_SENSITIVITY);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    iso = entry.data.i32[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(stream_array_t& config) const
+{
+    config.clear();
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, INTEL_INFO_AVAILABLE_CONFIGURATIONS);
+    const int streamConfMemberNum = sizeof(stream_t) / sizeof(int);
+    if (entry.count == 0 || entry.count % streamConfMemberNum != 0) {
+        return NAME_NOT_FOUND;
+    }
+
+    stream_t cfg;
+    CLEAR(cfg);
+
+    for (size_t i = 0; i < entry.count; i += streamConfMemberNum) {
+        MEMCPY_S(&cfg, sizeof(stream_t), &entry.data.i32[i], sizeof(stream_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::getLensAperture(float &aperture) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_AVAILABLE_APERTURES);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    aperture = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::getLensFilterDensity(float &filterDensity) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData,
+                                                   CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    filterDensity = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::getLensMinFocusDistance(float &minFocusDistance) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    minFocusDistance = entry.data.f[0];
+    return OK;
+}
+
+int Parameters::getLensHyperfocalDistance(float &hyperfocalDistance) const
+{
+    ParameterHelper::AutoRLock rl(mData);
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+    hyperfocalDistance = entry.data.f[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;
+}
+
+int Parameters::setUserRequestId(int32_t userRequestId) {
+    ParameterHelper::AutoWLock wl(mData);
+
+    return ParameterHelper::getMetadata(mData).update(CAMERA_REQUEST_ID, &userRequestId, 1);
+}
+
+int Parameters::getUserRequestId(int32_t& userRequestId) const {
+    ParameterHelper::AutoRLock rl(mData);
+
+    auto entry = ParameterHelper::getMetadataEntry(mData, CAMERA_REQUEST_ID);
+    if (entry.count != 1) {
+        return NAME_NOT_FOUND;
+    }
+
+    userRequestId = entry.data.i32[0];
+    return OK;
+}
+
+} // 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..5f70485f7e88
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tag_info.c
@@ -0,0 +1,2654 @@
+/*
+ * 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  },
+    { "availableStallDurations",       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   },
+    { "availableModes",                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] = {
+    { "availableConfigurations",       ICAMERA_TYPE_INT32  },
+    { "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;
+                case CAMERA_EDGE_MODE_ZERO_SHUTTER_LAG:
+                    msg = "ZERO_SHUTTER_LAG";
+                    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;
+                case CAMERA_NOISE_REDUCTION_MODE_MINIMAL:
+                    msg = "MINIMAL";
+                    ret = 0;
+                    break;
+                case CAMERA_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG:
+                    msg = "ZERO_SHUTTER_LAG";
+                    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_AVAILABLE_STALL_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_SHADING_AVAILABLE_MODES: {
+            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_CONFIGURATIONS: {
+            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..39bd959bec07
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/metadata/icamera_metadata_tags.h
@@ -0,0 +1,1005 @@
+/*
+ * 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_AVAILABLE_STALL_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_AVAILABLE_MODES,                   // byte[]       | public
+    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_CONFIGURATIONS =             // int32[]      | hidden
+            INTEL_INFO_START,
+    INTEL_INFO_AVAILABLE_FEATURES,                    // enum[]       | public
+    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,
+    CAMERA_EDGE_MODE_ZERO_SHUTTER_LAG,
+} 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,
+    CAMERA_NOISE_REDUCTION_MODE_MINIMAL,
+    CAMERA_NOISE_REDUCTION_MODE_ZERO_SHUTTER_LAG,
+} 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..a2e01e0e19fa
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.cpp
@@ -0,0 +1,629 @@
+/*
+ * 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 "AiqUtils.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::getAiqd()
+{
+    return mDataPtr ? &mBinaryData : nullptr;
+}
+
+void AiqdData::saveAiqd(const ia_binary_data& data)
+{
+    LOG1("%s", __func__);
+
+    if (!mDataPtr || data.size != mBinaryData.size) {
+        mDataPtr.reset(new char[data.size]);
+        mBinaryData.size = data.size;
+        mBinaryData.data = mDataPtr.get();
+    }
+    MEMCPY_S(mBinaryData.data, mBinaryData.size, data.data, data.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(const ia_binary_data& cpfData, const LardTagConfig* lardTagCfg)
+{
+    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) {
+        LOG1("AIQB file supported by lard.");
+        ia_lard_input_params lardInputParams;
+        initLardInputParam(*iaLard, lardTagCfg, &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(const ia_lard& iaLard,
+                                 const LardTagConfig* lardTagCfg,
+                                 ia_lard_input_params* lardInputParam)
+{
+    if (!lardTagCfg) {
+        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(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','C','M','C'), &count, &tags);
+    lardInputParam->cmc_mode_tag = isTagValid(lardTagCfg->cmcTag, count, tags) ? \
+                                   lardTagCfg->cmcTag : FOURCC_TO_UL('D','F','L','T');
+
+    mLard->getTagList(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','A','I','Q'), &count, &tags);
+    lardInputParam->aiq_mode_tag = isTagValid(lardTagCfg->aiqTag, count, tags) ? \
+                                   lardTagCfg->aiqTag : FOURCC_TO_UL('D','F','L','T');
+
+    mLard->getTagList(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','I','S','P'), &count, &tags);
+    lardInputParam->isp_mode_index = isTagValid(lardTagCfg->ispTag, count, tags) ? \
+                                     lardTagCfg->ispTag : FOURCC_TO_UL('D','F','L','T');
+
+    mLard->getTagList(const_cast<ia_lard*>(&iaLard), FOURCC_TO_UL('L','T','H','R'), &count, &tags);
+    lardInputParam->others_mode_tag = isTagValid(lardTagCfg->othersTag, count, tags) ? \
+                                      lardTagCfg->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(const std::string& sensorName,
+                   const std::string& camCfgDir,
+                   const std::vector<TuningConfig>& tuningCfg,
+                   const std::vector<LardTagConfig>& lardTagCfg)
+{
+    LOG1("@%s:Sensor Name = %s", __func__, sensorName.c_str());
+
+    LardTagConfig* oneLardTagCfg = nullptr;
+
+    CLEAR(mCpfConfig);
+    for (auto &cfg : tuningCfg) {
+        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(camCfgDir, cfg.aiqbName) != OK) {
+                LOGE("load file %s failed, sensor %s", cfg.aiqbName.c_str(), sensorName.c_str());
+                continue;
+            }
+        }
+
+        oneLardTagCfg = nullptr;
+        for (size_t i = 0; i < lardTagCfg.size(); i++) {
+            if (cfg.tuningMode == lardTagCfg[i].tuningMode) {
+                oneLardTagCfg = const_cast<LardTagConfig*>(&lardTagCfg[i]);
+                break;
+            }
+        }
+
+        CpfConf* cpfConf = new CpfConf();
+
+        cpfConf->init(mCpfData[cfg.aiqbName], oneLardTagCfg);
+        mCpfConfig[cfg.tuningMode] = cpfConf;
+    }
+}
+
+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(const std::string& camCfgDir, std::string* cpfPathName)
+{
+    LOG1("@%s, cpfPathName:%p", __func__, cpfPathName);
+    CheckError(!cpfPathName, BAD_VALUE, "@%s, cpfPathName is nullptr", __func__);
+
+    std::vector<string> configFilePath;
+    configFilePath.push_back("./");
+    configFilePath.push_back(camCfgDir);
+    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(const std::string& camCfgDir, const std::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(camCfgDir, &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::getCpfAndCmc(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(const std::string& sensorName,
+                         const std::string& camCfgDir,
+                         const std::vector<TuningConfig>& tuningCfg,
+                         const std::vector<LardTagConfig>& lardTagCfg,
+                         const std::string& nvmDir,
+                         int maxNvmSize) :
+    mSensorName(sensorName),
+    mCamCfgDir(camCfgDir),
+    mNvmDir(nvmDir),
+    mMaxNvmSize(maxNvmSize),
+    mTuningCfg(tuningCfg),
+    mLardTagCfg(lardTagCfg),
+    mCpfStore(nullptr),
+    mNvmDataBuf(nullptr)
+{
+    CLEAR(mNvmData);
+}
+
+AiqInitData::~AiqInitData()
+{
+    delete mCpfStore;
+    for (auto aiqd : mAiqdDataMap) {
+        delete aiqd.second;
+    }
+}
+
+status_t AiqInitData::fillStaticMetadataFromCMC(CameraMetadata* metadata) {
+    LOG2("@%s", __func__);
+    CheckError(!metadata, BAD_VALUE, "metadata is nullptr");
+
+    status_t res = OK;
+    // Lens
+    res = fillLensStaticMetadata(metadata);
+    return res;
+}
+
+status_t AiqInitData::fillLensStaticMetadata(CameraMetadata* metadata) {
+    LOG2("@%s", __func__);
+    status_t res = OK;
+
+    ia_cmc_t* cmc = nullptr;
+    // For static metadata, when it return app, we use TUNING_MODE_VIDEO's cmc by default.
+    getCpfAndCmc(nullptr, nullptr, nullptr, nullptr, TUNING_MODE_VIDEO, &cmc);
+    CheckError(cmc == nullptr, UNKNOWN_ERROR, "@%s, mCmc.getCmc fails", __FUNCTION__);
+
+    if (cmc->cmc_parsed_optics.cmc_optomechanics != nullptr) {
+        uint16_t camera_features =
+                              cmc->cmc_parsed_optics.cmc_optomechanics->camera_actuator_features;
+        // Lens: aperture
+        if (!(camera_features & cmc_camera_feature_variable_apertures)
+            && cmc->cmc_parsed_optics.cmc_optomechanics->num_apertures == 1
+            && cmc->cmc_parsed_optics.lut_apertures != nullptr) {
+            // Fixed aperture, the fn should be divided 100
+            // because the value is multiplied 100 in cmc
+            float fn = static_cast<float>(cmc->cmc_parsed_optics.lut_apertures[0] / 100);
+            res |= metadata->update(CAMERA_LENS_INFO_AVAILABLE_APERTURES, &fn, 1);
+            LOG2("lens available apertures :%.2f", fn);
+        }
+
+        // Lens: FilterDensities
+        if (camera_features & cmc_camera_feature_nd_filter) {
+            float nd_gain =
+                          static_cast<float>(cmc->cmc_parsed_optics.cmc_optomechanics->nd_gain);
+            res |= metadata->update(CAMERA_LENS_INFO_AVAILABLE_FILTER_DENSITIES, &nd_gain, 1);
+            LOG2("Lens available filter densities :%.2f", nd_gain);
+         }
+
+        /**
+         * check the type of focus actuator
+         * 0 means no actuator, in this case we signal that this is a fixed
+         * focus sensor by setting min_focus_distance to 0.0
+         * (see documentation for this tag)
+         *
+         */
+        if (cmc->cmc_parsed_optics.cmc_optomechanics->actuator != 0) {
+            float min_focus_distance = 0.0;
+            // the unit from CMC is cm, convert to diopters (1/m)
+            if (cmc->cmc_parsed_optics.cmc_optomechanics->min_focus_distance != 0) {
+                min_focus_distance = 100 /
+                static_cast<float>(cmc->cmc_parsed_optics.cmc_optomechanics->min_focus_distance);
+            }
+            res |= metadata->update(CAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE,
+                                    &min_focus_distance, 1);
+            LOG2("Lens min focus distance :%.2f", min_focus_distance);
+        }
+
+        float hyperfocal_distance_diopter = 1000 / AiqUtils::calculateHyperfocalDistance(*cmc);
+        res |= metadata->update(CAMERA_LENS_INFO_HYPERFOCAL_DISTANCE,
+                                &hyperfocal_distance_diopter, 1);
+        LOG2("lens hyperfocal distance :%.2f", hyperfocal_distance_diopter);
+    }
+    return res;
+}
+
+int AiqInitData::getCpfAndCmc(ia_binary_data* ispData,
+                              ia_binary_data* aiqData,
+                              ia_binary_data* otherData,
+                              uintptr_t* cmcHandle,
+                              TuningMode mode,
+                              ia_cmc_t** cmcData)
+{
+    if (!mCpfStore) {
+        mCpfStore = new CpfStore(mSensorName, mCamCfgDir, mTuningCfg, mLardTagCfg);
+    }
+    return mCpfStore->getCpfAndCmc(ispData, aiqData, otherData, cmcHandle, mode, cmcData);
+}
+
+status_t AiqInitData::loadNvm()
+{
+    LOG1("@%s", __func__);
+
+    if (mNvmDir.length() == 0) {
+        LOG1("NVM dirctory from config is null");
+        return UNKNOWN_ERROR;
+    }
+
+    string nvmDataPath(NVM_DATA_PATH);
+    if (nvmDataPath.back() != '/')
+        nvmDataPath.append("/");
+
+    nvmDataPath.append(mNvmDir);
+    if (nvmDataPath.back() != '/')
+        nvmDataPath.append("/");
+
+    nvmDataPath.append("eeprom");
+    LOG2("NVM data for %s is located in %s", mSensorName.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)), mMaxNvmSize);
+    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;
+}
+
+ia_binary_data* AiqInitData::getNvm()
+{
+    if (!mNvmData.data || mNvmData.size == 0) {
+        loadNvm();
+    }
+
+    return mNvmData.data ? &mNvmData : nullptr;
+}
+
+ia_binary_data* AiqInitData::getAiqd(TuningMode mode) {
+    if (mAiqdDataMap.find(mode) == mAiqdDataMap.end()) {
+        mAiqdDataMap[mode] = new AiqdData(mode, mSensorName);
+    }
+    AiqdData* aiqd = mAiqdDataMap[mode];
+    CheckError(!aiqd, nullptr, "@%s, aiqd is nullptr", __func__);
+
+    return aiqd->getAiqd();
+}
+
+void AiqInitData::saveAiqd(TuningMode mode, const ia_binary_data& data) {
+    if (mAiqdDataMap.find(mode) == mAiqdDataMap.end()) {
+        mAiqdDataMap[mode] = new AiqdData(mode, mSensorName);
+    }
+
+    AiqdData* aiqd = mAiqdDataMap[mode];
+    CheckError(!aiqd, VOID_VALUE, "@%s, aiqd is nullptr", __func__);
+
+    aiqd->saveAiqd(data);
+}
+
+}
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..531f679a90b5
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/AiqInitData.h
@@ -0,0 +1,229 @@
+/*
+ * 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 <memory>
+#include <string>
+#include <vector>
+
+#include "iutils/Errors.h"
+#include "iutils/Utils.h"
+#include "CameraMetadata.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* getAiqd();
+    void saveAiqd(const ia_binary_data& data);
+
+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] ia_binary_data: CPF data loaded from the AIQB file
+     * \param[in] LardTagConfig: lard tag cfg
+     *
+     * \return OK if init successfully; otherwise non-0 value is returned.
+     */
+    int init(const ia_binary_data& cpfData, const LardTagConfig* lardTagCfg);
+
+    /**
+      * \brief deinit CMC handler.
+    */
+    void deinit();
+
+private:
+    DISALLOW_COPY_AND_ASSIGN(CpfConf);
+
+    void initLardInputParam(const ia_lard& iaLard,
+                            const LardTagConfig* lardTagCfg,
+                            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(const std::string& sensorName,
+             const std::string& camCfgDir,
+             const std::vector<TuningConfig>& tuningCfg,
+             const std::vector<LardTagConfig>& lardTagCfg);
+    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 getCpfAndCmc(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(const std::string& camCfgDir, std::string* cpfPathName);
+    int loadConf(const std::string& camCfgDir, const 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(const std::string& sensorName,
+                const std::string& camCfgDir,
+                const std::vector<TuningConfig>& tuningCfg,
+                const std::vector<LardTagConfig>& lardTagCfg,
+                const std::string& nvmDir,
+                int maxNvmSize);
+    ~AiqInitData();
+
+    status_t fillStaticMetadataFromCMC(CameraMetadata* metadata);
+
+    // cpf and cmc
+    int getCpfAndCmc(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);
+
+    // aiqd
+    ia_binary_data* getAiqd(TuningMode mode);
+    void saveAiqd(TuningMode mode, const ia_binary_data& data);
+
+    // nvm
+    ia_binary_data* getNvm();
+
+ private:
+    status_t loadNvm();
+    status_t fillLensStaticMetadata(CameraMetadata* metadata);
+
+ private:
+    std::string mSensorName;
+    std::string mCamCfgDir;
+    std::string mNvmDir;
+    int mMaxNvmSize;
+    std::vector<TuningConfig> mTuningCfg;
+    std::vector<LardTagConfig> mLardTagCfg;
+    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..bbdd3767ef6e
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/CameraParser.cpp
@@ -0,0 +1,1926 @@
+/*
+ * 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, "enableLtm") == 0) {
+        pCurrentCam->mLtmEnabled = 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, "psysBundleWithAic") == 0) {
+        pCurrentCam->mPsysBundleWithAic = 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;
+    }  else if (strcmp(name, "gpuTnrEnabled") == 0) {
+        pCurrentCam->mGpuTnrEnabled = 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, stream_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, stream_array_t>(mcId, stream_array_t()));
+    }
+
+    stream_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, stream_array_t& configs)
+{
+    HAL_TRACE_CALL(1);
+
+    int mcId = -1;
+    char* endPtr = nullptr;
+    char* separatorPtr = nullptr;
+    int parseStep = 0;
+    stream_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++;
+
+        // Get the next segement for necessary element
+        // Get the next segement for optional element if it exist
+        if (parseStep <= NUM_ELEMENTS_NECESSARY
+            || (!lastElement && (*src == '('))) {
+
+            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;
+        }
+
+        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) {
+        stream_array_t configsArray;
+        parseStreamConfig(atts[1], configsArray);
+        const int STREAM_MEMBER_NUM = sizeof(stream_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(stream_t),
+                     &configsArray[i], sizeof(stream_t));
+        }
+        mMetadata.update(INTEL_INFO_AVAILABLE_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, "control.maxRegions") == 0)            ? CAMERA_CONTROL_MAX_REGIONS
+          : (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, "shading.availableModes") == 0)        ? CAMERA_SHADING_AVAILABLE_MODES
+          : (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, "scaler.availableStreamConfigurations") == 0)  ? CAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS
+          : (strcmp(name, "scaler.availableMinFrameDurations") == 0)     ? CAMERA_SCALER_AVAILABLE_MIN_FRAME_DURATIONS
+          : (strcmp(name, "scaler.availableStallDurations") == 0)        ? CAMERA_SCALER_AVAILABLE_STALL_DURATIONS
+          : (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);
+
+        stream_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;
+            stream_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..f101dd02f637
--- /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, stream_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, stream_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..09a9b688d497
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.cpp
@@ -0,0 +1,1331 @@
+/*
+ * 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 "ParameterHelper.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
+
+    CameraParser CameraParser(mc, &mStaticCfg);
+    PolicyParser PolicyParser(&mStaticCfg);
+
+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
+        MakerNote::getInstance(i);
+    }
+
+    for (size_t i = 0; i < mStaticCfg.mCameras.size(); i++) {
+        AiqInitData* aiqInitData =
+            new AiqInitData(mStaticCfg.mCameras[i].sensorName,
+                            getCameraCfgPath(),
+                            mStaticCfg.mCameras[i].mSupportedTuningConfig,
+                            mStaticCfg.mCameras[i].mLardTagsConfig,
+                            mStaticCfg.mCameras[i].mNvmDirectory,
+                            mStaticCfg.mCameras[i].mMaxNvmDataSize);
+        CameraMetadata metadata;
+        aiqInitData->fillStaticMetadataFromCMC(&metadata);
+        ParameterHelper::merge(metadata, &mStaticCfg.mCameras[i].mCapability);
+        mAiqInitData.push_back(aiqInitData);
+    }
+}
+
+PlatformData::~PlatformData() {
+    LOG1("@%s", __func__);
+
+    releaseGraphConfigNodes();
+    MediaControl::releaseInstance();
+
+    for (size_t i = 0; i < mAiqInitData.size(); i++) {
+        delete mAiqInitData[i];
+    }
+
+    for (int i = 0; i < MAX_CAMERA_NUMBER; i++) {
+        MakerNote::releaseMakerNote(i);
+    }
+
+    mAiqInitData.clear();
+
+#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::psysBundleWithAic(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mPsysBundleWithAic;
+}
+
+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;
+
+    stream_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::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;
+}
+
+ia_binary_data* PlatformData::getAiqd(int cameraId, TuningMode mode)
+{
+    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), nullptr,
+               "@%s, bad cameraId:%d", __func__, cameraId);
+
+    AiqInitData* aiqInitData = getInstance()->mAiqInitData[cameraId];
+    return aiqInitData->getAiqd(mode);
+}
+
+void PlatformData::saveAiqd(int cameraId, TuningMode tuningMode, const ia_binary_data& data)
+{
+    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), VOID_VALUE,
+               "@%s, bad cameraId:%d", __func__, cameraId);
+
+    AiqInitData* aiqInitData = getInstance()->mAiqInitData[cameraId];
+    aiqInitData->saveAiqd(tuningMode, data);
+}
+
+// load cpf when tuning file (.aiqb) is available
+int PlatformData::getCpfAndCmc(int cameraId,
+                               ia_binary_data* ispData,
+                               ia_binary_data* aiqData,
+                               ia_binary_data* otherData,
+                               uintptr_t* cmcHandle,
+                               TuningMode mode,
+                               ia_cmc_t** cmcData)
+{
+    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()) ||
+               cameraId >= MAX_CAMERA_NUMBER, BAD_VALUE, "@%s, bad cameraId:%d",
+               __func__, cameraId);
+    CheckError(getInstance()->mStaticCfg.mCameras[cameraId].mSupportedTuningConfig.empty(),
+               INVALID_OPERATION, "@%s, the tuning config in xml does not exist", __func__);
+
+    AiqInitData* aiqInitData = getInstance()->mAiqInitData[cameraId];
+    return aiqInitData->getCpfAndCmc(ispData, aiqData, otherData, cmcHandle, mode, cmcData);
+}
+
+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];
+}
+
+ia_binary_data *PlatformData::getNvm(int cameraId)
+{
+    CheckError(cameraId >= static_cast<int>(getInstance()->mAiqInitData.size()), nullptr,
+               "@%s, bad cameraId:%d", __func__, cameraId);
+
+    return getInstance()->mAiqInitData[cameraId]->getNvm();
+}
+
+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::saveMakernoteData(int cameraId, camera_makernote_mode_t makernoteMode,
+                                    int64_t sequence)
+{
+    return MakerNote::getInstance(cameraId)->saveMakernoteData(makernoteMode, sequence);
+}
+
+ia_mkn *PlatformData::getMknHandle(int cameraId)
+{
+    return MakerNote::getInstance(cameraId)->getMknHandle();
+}
+
+void PlatformData::updateMakernoteTimeStamp(int cameraId, int64_t sequence, uint64_t timestamp)
+{
+    MakerNote::getInstance(cameraId)->updateTimestamp(sequence, timestamp);
+}
+
+void  PlatformData::acquireMakernoteData(int cameraId, uint64_t timestamp, Parameters *param)
+{
+    MakerNote::getInstance(cameraId)->acquireMakernoteData(timestamp, param);
+}
+
+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);
+        }
+    }
+}
+
+bool PlatformData::isGpuTnrEnabled(int cameraId)
+{
+    return getInstance()->mStaticCfg.mCameras[cameraId].mGpuTnrEnabled;
+}
+} // 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..88417f320cbc
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/PlatformData.h
@@ -0,0 +1,1152 @@
+/*
+ * 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"
+
+#include "MakerNote.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),
+                mPsysBundleWithAic(false),
+                mSwProcessingAlignWithIsp(false),
+                mMaxNvmDataSize(0),
+                mGpuTnrEnabled(false)
+            {
+            }
+
+            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, stream_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 mPsysBundleWithAic;
+            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;
+            bool mGpuTnrEnabled;
+        };
+
+        std::vector<CameraInfo> mCameras;
+        std::vector<PolicyConfig> mPolicyConfig;
+        CommonConfig mCommonConfig;
+    };
+private:
+    StaticCfg mStaticCfg;
+
+    std::vector<AiqInitData*> mAiqInitData;
+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 - 1]
+     * \return char*: the sensor name string.
+     */
+    static const char* getSensorName(int cameraId);
+
+    /**
+     * get the sensor description
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return const char*: the sensor descrition string.
+     */
+    static const char* getSensorDescription(int cameraId);
+
+    /**
+     * get the Lens name
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return char*: the lens name string.
+     */
+    static const char* getLensName(int cameraId);
+
+    /**
+     * get the Lens HW type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return int: the Lens HW type
+     */
+    static int getLensHwType(int cameraId);
+
+    /**
+     * get the DVS type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return int: the DVS type
+     */
+    static int getDVSType(int cameraId);
+
+    /**
+     * get the ISYS compression flag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return if ISYS compression is enabled
+     */
+    static bool getISYSCompression(int cameraId);
+
+    /**
+     * get the PSA compression flag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return if PSA compression is enabled
+     */
+    static bool getPSACompression(int cameraId);
+
+    /**
+     * get the OFS compression flag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return if OFS compression is enabled
+     */
+    static bool getOFSCompression(int cameraId);
+
+    /**
+     * get the max coarse integration time margin
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \return if pre-register buffers or not.
+     */
+    static bool isNeedToPreRegisterBuffer(int cameraId);
+
+    /**
+     * Get auto switch type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \return if Frame Sync is enabled or not.
+     */
+    static bool isEnableFrameSyncCheck(int cameraId);
+
+    /**
+     * Get exposure number
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \return if LTM is enabled or not.
+     */
+    static bool isLtmEnabled(int cameraId);
+
+    /**
+     * Get sensor exposure type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return the value of sensor exposure type
+     */
+    static int getSensorExposureType(int cameraId);
+
+    /**
+     * Get sensor gain type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \return if it is needed
+     */
+    static bool isPsysContinueStats(int cameraId);
+
+    /**
+     * Get preferred buffer queue size
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \return the value of delay frame
+     */
+    static unsigned int getPipeSwitchDelayFrame(int cameraId);
+
+    /**
+     * Get Ltm Gain lag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \return if face detection runs synchronously or not.
+     */
+    static bool isFaceEngineSyncRunning(int cameraId);
+
+    /**
+     * get dvs supported status
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \return if psys align with sof is enabled or not.
+     */
+    static bool psysAlignWithSof(int cameraId);
+
+    /**
+     * Check running psys bundle with aic is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return if running psys bundle with aic is enabled or not.
+     */
+    static bool psysBundleWithAic(int cameraId);
+
+    /**
+     * Check software processing align with isp is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \return the value of max digital gain
+     */
+    static int getMaxSensorDigitalGain(int cameraId);
+
+    /**
+     * Get sensor digital gain type
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return the sensor digital gain type
+     */
+    static SensorDgType sensorDigitalGainType(int cameraId);
+
+    /**
+     * Get sensor's exposure lag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return the value of exposure lag
+     */
+    static int getExposureLag(int cameraId);
+
+    /**
+     * Get sensor's gain lag
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \return the format for the isys output
+     */
+    static int getISysFormat(int cameraId);
+
+    /**
+     * Set ISYS output format
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \param format: the isys output format
+     */
+    static void selectISysFormat(int cameraId, int format);
+
+    /**
+     * If ISYS supported format.
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     */
+    static bool isISysSupportedFormat(int cameraId, int format);
+
+    /**
+     * if the resolution is supported by Isys
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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);
+
+    /*
+     * Get stream id by the given configMode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \return the max requests number in flight
+     */
+    static int getMaxRequestsInflight(int cameraId);
+
+    /**
+     * get yuv color range mode
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return the correponding camera_yuv_color_range_mode_t.
+     */
+    static camera_yuv_color_range_mode_t getYuvColorRangeMode(int cameraId);
+
+    /**
+     * Get aiqd
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \param tuningMode: mode
+     * \return ia_binary_data
+     */
+    static ia_binary_data* getAiqd(int cameraId, TuningMode mode);
+
+    /**
+     * Save aiqd
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \param tuningMode: mode
+     * \param ia_binary_data: data
+     */
+    static void saveAiqd(int cameraId, TuningMode tuningMode, const ia_binary_data& data);
+
+    /**
+     * Get cpf and cmc
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \param ispData: isp data in cpf
+     * \param aiqData:  aiq data in cpf
+     * \param otherData: other data in cpf
+     * \param cmcHandle: cmc handle
+     * \param mode: tuning mode
+     * \param cmcData: cmd data
+     * \return OK if it is successful.
+     */
+    static int getCpfAndCmc(int cameraId,
+                            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);
+
+    /**
+     * If dynamic graph config enabled
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \return true if AIQD is enabled or not
+     */
+    static bool isAiqdEnabled(int cameraId);
+
+    /**
+     * if image from tpg
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \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 - 1]
+     * \return true if mTestPatternMap is defined, otherwise return false.
+     */
+    static bool isTestPatternSupported(int cameraId);
+
+    /**
+     * get sensor test pattern
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 nvm
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return ia_binary_data
+     */
+    static ia_binary_data* getNvm(int cameraId);
+
+    /**
+    * Get sensor active array size
+    *
+    * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+    * \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);
+
+    /**
+     * \brief Save Makernote by ia_mkn_trg mode
+     *
+     * \param[in] cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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.
+     */
+    static int saveMakernoteData(int cameraId, camera_makernote_mode_t makernoteMode,
+                                 int64_t sequence);
+
+    /**
+     * \brief Get ia_mkn (Makernote) handle.
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     */
+    static ia_mkn *getMknHandle(int cameraId);
+
+    /**
+     * \brief Update Makernote timestamp.
+     *
+     * \param[in] cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \param[in] sequence: the sequence in frame buffer;
+     * \param[in] timestamp: the frame timestamp corresponding sequence
+     *
+     */
+    static void updateMakernoteTimeStamp(int cameraId, int64_t sequence, uint64_t timestamp);
+
+    /**
+     * \brief acquire Makernote data.
+     *
+     * \param[in] cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \param[in] sequence: acquire MakerNote per timestamp
+     * \param[out] param: Makernote data will be saved in Parameters as metadata.
+     *
+     */
+    static void acquireMakernoteData(int cameraId, uint64_t timestamp, Parameters *param);
+
+    /*
+     * Get the scaler info
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \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 - 1]
+     * \param scalerInfo related IGraphType::ScalerInfo
+     */
+    static void setScalerInfo(int cameraId, std::vector<IGraphType::ScalerInfo> scalerInfo);
+
+     /**
+     * Check gpu tnr is enabled or not
+     *
+     * \param cameraId: [0, MAX_CAMERA_NUMBER - 1]
+     * \return true if tnr is enabled.
+     */
+     static bool isGpuTnrEnabled(int cameraId);
+};
+} /* 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..1fb4ed262100
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.cpp
@@ -0,0 +1,199 @@
+/*
+ * 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 "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() :
+        mCameraId(-1) {
+    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,
+                                          ia_isp_bxt_resolution_info_t *resolution) {
+    LOG1("@%s", __func__);
+    CheckError(!kernelId || !resolution, UNKNOWN_ERROR, "kernelId or resolution is nullptr");
+
+    if ((mGraphData.gdcReso.input_width == 0) || (mGraphData.gdcReso.input_height == 0) ||
+        (mGraphData.gdcReso.output_width == 0) || (mGraphData.gdcReso.output_height == 0)) {
+        LOG2("%s, Failed to get gdc InReso: w: %d, h: %d; OutReso: w: %d, h: %d; ", __func__,
+             mGraphData.gdcReso.input_width, mGraphData.gdcReso.input_height,
+             mGraphData.gdcReso.output_width, mGraphData.gdcReso.output_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__);
+
+    CheckError(mCameraId == -1, UNKNOWN_ERROR, "%s: mCameraId is -1", __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..03c306f5683d
--- /dev/null
+++ b/camera/hal/intel/ipu6/src/platformdata/gc/GraphConfig.h
@@ -0,0 +1,88 @@
+/*
+ * 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 <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,
+                                         ia_isp_bxt_resolution_info_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..d4192a04cb95
--- /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;
+    ia_isp_bxt_resolution_info_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,
+                                         ia_isp_bxt_resolution_info_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.17.1

