diff --git a/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c b/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c index 764009323d..10b407619c 100644 --- a/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c +++ b/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c @@ -3452,8 +3452,11 @@ static int cam_ife_hw_mgr_preprocess_port( for (i = 0; i < in_port->num_out_res; i++) { out_port = &in_port->data[i]; - if (cam_ife_hw_mgr_is_rdi_res(out_port->res_type) || - cam_ife_hw_mgr_is_sfe_rdi_res(out_port->res_type)) + if (cam_ife_hw_mgr_is_rdi_res(out_port->res_type)) { + in_port->rdi_count++; + in_port->lite_path_count++; + } + else if (cam_ife_hw_mgr_is_sfe_rdi_res(out_port->res_type)) in_port->rdi_count++; else if (out_port->res_type == CAM_ISP_IFE_OUT_RES_2PD) in_port->ppp_count++; @@ -3463,6 +3466,17 @@ static int cam_ife_hw_mgr_preprocess_port( CAM_DBG(CAM_ISP, "out_res_type %d", out_port->res_type); in_port->ipp_count++; + if (in_port->can_use_lite) { + switch(out_port->res_type) { + case CAM_ISP_IFE_LITE_OUT_RES_PREPROCESS_RAW: + case CAM_ISP_IFE_LITE_OUT_RES_STATS_BG: + in_port->lite_path_count++; + break; + default: + CAM_WARN(CAM_ISP, "Output port 0x%x cannot use lite", + out_port->res_type); + } + } } } @@ -4395,6 +4409,7 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args) uint32_t total_pix_port = 0; uint32_t total_rdi_port = 0; uint32_t total_pd_port = 0; + uint32_t total_lite_port = 0; struct cam_isp_acquire_hw_info *acquire_hw_info = NULL; uint32_t input_size = 0; @@ -4461,6 +4476,7 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args) in_port[i].lcr_count; total_rdi_port += in_port[i].rdi_count; total_pd_port += in_port[i].ppp_count; + total_lite_port += in_port[i].lite_path_count; } /* Check whether context has only RDI resource */ @@ -4469,6 +4485,11 @@ static int cam_ife_mgr_acquire_hw(void *hw_mgr_priv, void *acquire_hw_args) CAM_DBG(CAM_ISP, "RDI only context"); } + /* Check if all output ports are of lite */ + if (total_lite_port == total_pix_port + total_rdi_port) { + ife_ctx->is_lite_context = 1; + } + /* acquire HW resources */ for (i = 0; i < acquire_hw_info->num_inputs; i++) { CAM_DBG(CAM_ISP, "in_res_type %x", in_port[i].res_type); @@ -9597,7 +9618,7 @@ static int cam_ife_mgr_cmd(void *hw_mgr_priv, void *cmd_args) else if (ctx->is_fe_enabled && !ctx->is_offline && ctx->ctx_type != CAM_IFE_CTX_TYPE_SFE) isp_hw_cmd_args->u.ctx_type = CAM_ISP_CTX_FS2; - else if (ctx->is_rdi_only_context) + else if (ctx->is_rdi_only_context || ctx->is_lite_context) isp_hw_cmd_args->u.ctx_type = CAM_ISP_CTX_RDI; else isp_hw_cmd_args->u.ctx_type = CAM_ISP_CTX_PIX; diff --git a/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.h b/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.h index 34267c357a..46a950ceb4 100644 --- a/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.h +++ b/drivers/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.h @@ -143,6 +143,8 @@ struct cam_sfe_scratch_buf_cfg { * registers * @last_cdm_done_req: Last cdm done request * @is_rdi_only_context flag to specify the context has only rdi resource + * @is_lite_context flag to specify the context has only uses lite + * resources * @config_done_complete indicator for configuration complete * @reg_dump_buf_desc: cmd buffer descriptors for reg dump * @num_reg_dump_buf: Count of descriptors in reg_dump_buf_desc @@ -204,6 +206,7 @@ struct cam_ife_hw_mgr_ctx { atomic_t cdm_done; uint64_t last_cdm_done_req; uint32_t is_rdi_only_context; + uint32_t is_lite_context; struct completion config_done_complete; uint32_t hw_version; struct cam_cmd_buf_desc reg_dump_buf_desc[ diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h b/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h index a823e6c01b..314a6c6f95 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/include/cam_ife_csid_hw_intf.h @@ -130,6 +130,7 @@ struct cam_isp_in_port_generic_info { uint32_t udi_count; uint32_t lcr_count; uint32_t ife_rd_count; + uint32_t lite_path_count; uint32_t sfe_in_path_type; uint32_t sfe_ife_enable; uint32_t secure_mode;