diff --git a/drivers/cam_isp/cam_isp_context.c b/drivers/cam_isp/cam_isp_context.c index 02dd10ab45..969a92c5ee 100644 --- a/drivers/cam_isp/cam_isp_context.c +++ b/drivers/cam_isp/cam_isp_context.c @@ -580,10 +580,10 @@ static const char *__cam_isp_resource_handle_id_to_type( return "LTM_STATS"; case CAM_ISP_IFE_OUT_RES_STATS_GTM_BHIST: return "STATS_GTM_BHIST"; - case CAM_ISP_IFE_LITE_OUT_RES_STATS_BE: - return "STATS_BE"; - case CAM_ISP_IFE_LITE_OUT_RES_GAMMA: - return "GAMMA"; + case CAM_ISP_IFE_LITE_OUT_RES_STATS_BG: + return "STATS_BG"; + case CAM_ISP_IFE_LITE_OUT_RES_PREPROCESS_RAW: + return "PREPROCESS_RAW"; default: return "CAM_ISP_Invalid_Resource_Type"; } 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 ff7dfe16f4..f89d9a6cd5 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 @@ -2177,6 +2177,34 @@ err: return rc; } +static bool cam_ife_mgr_check_can_use_lite( + struct cam_csid_hw_reserve_resource_args *csid_acquire, + struct cam_ife_hw_mgr_ctx *ife_ctx) +{ + bool can_use_lite = false; + + if (ife_ctx->is_rdi_only_context || + csid_acquire->in_port->can_use_lite) { + can_use_lite = true; + goto end; + } + + switch (csid_acquire->res_id) { + + case CAM_ISP_IFE_OUT_RES_RDI_0: + case CAM_ISP_IFE_OUT_RES_RDI_1: + case CAM_ISP_IFE_OUT_RES_RDI_2: + case CAM_ISP_IFE_OUT_RES_RDI_3: + can_use_lite = true; + break; + default: + can_use_lite = false; + goto end; + } +end: + return can_use_lite; +} + static int cam_ife_hw_mgr_acquire_res_ife_bus_rd( struct cam_ife_hw_mgr_ctx *ife_ctx, struct cam_isp_in_port_generic_info *in_port) @@ -2731,6 +2759,8 @@ static int cam_ife_hw_mgr_acquire_csid_hw( bool is_start_lower_idx = false; struct cam_isp_hw_mgr_res *csid_res_iterator; struct cam_isp_out_port_generic_info *out_port = NULL; + struct cam_ife_csid_hw_caps *csid_caps = NULL; + bool can_use_lite = false; if (!ife_ctx || !csid_acquire) { CAM_ERR(CAM_ISP, @@ -2759,6 +2789,8 @@ static int cam_ife_hw_mgr_acquire_csid_hw( if (in_port->num_out_res) out_port = &(in_port->data[0]); ife_ctx->is_dual = (bool)in_port->usage_type; + can_use_lite = cam_ife_mgr_check_can_use_lite( + csid_acquire, ife_ctx); /* Try acquiring CSID from previously acquired HW */ list_for_each_entry(csid_res_iterator, &ife_ctx->res_list_ife_csid, @@ -2778,6 +2810,15 @@ static int cam_ife_hw_mgr_acquire_csid_hw( continue; hw_intf = csid_res_iterator->hw_res[i]->hw_intf; + csid_caps = + &ife_hw_mgr->csid_hw_caps[hw_intf->hw_idx]; + + if (csid_caps->is_lite && !can_use_lite) { + CAM_DBG(CAM_ISP, "CSID[%u] cannot use lite", + hw_intf->hw_idx); + continue; + } + rc = hw_intf->hw_ops.reserve(hw_intf->hw_priv, csid_acquire, sizeof(*csid_acquire)); if (rc) { @@ -2794,27 +2835,46 @@ static int cam_ife_hw_mgr_acquire_csid_hw( } } - if (is_start_lower_idx) { - for (i = 0; i < CAM_IFE_CSID_HW_NUM_MAX; i++) { - if (!ife_hw_mgr->csid_devices[i]) - continue; - - hw_intf = ife_hw_mgr->csid_devices[i]; - rc = hw_intf->hw_ops.reserve(hw_intf->hw_priv, - csid_acquire, - sizeof(struct - cam_csid_hw_reserve_resource_args)); - if (!rc) - return rc; - } - return rc; - } + if (is_start_lower_idx) + goto start_acquire_lower_idx; for (i = CAM_IFE_CSID_HW_NUM_MAX - 1; i >= 0; i--) { + if (!ife_hw_mgr->csid_devices[i]) + continue; + hw_intf = ife_hw_mgr->csid_devices[i]; + + if (ife_hw_mgr->csid_hw_caps[hw_intf->hw_idx].is_lite && + !can_use_lite) { + CAM_DBG(CAM_ISP, "CSID[%u] cannot use lite", + hw_intf->hw_idx); + continue; + } + + rc = hw_intf->hw_ops.reserve(hw_intf->hw_priv, + csid_acquire, + sizeof(struct + cam_csid_hw_reserve_resource_args)); + if (!rc) + return rc; + } + + return rc; + +start_acquire_lower_idx: + + for (i = 0; i < CAM_IFE_CSID_HW_NUM_MAX; i++) { if (!ife_hw_mgr->csid_devices[i]) continue; hw_intf = ife_hw_mgr->csid_devices[i]; + + if (ife_hw_mgr->csid_hw_caps[hw_intf->hw_idx].is_lite && + !can_use_lite) { + CAM_DBG(CAM_ISP, "CSID[%u] cannot use lite", + hw_intf->hw_idx); + continue; + } + rc = hw_intf->hw_ops.reserve(hw_intf->hw_priv, csid_acquire, sizeof(struct @@ -4214,6 +4274,8 @@ static int cam_ife_mgr_acquire_get_unified_structure_v2( CAM_ISP_PARAM_FETCH_SECURITY_MODE); in_port->dynamic_sensor_switch_en = (in->feature_flag & CAM_ISP_DYNAMIC_SENOR_SWITCH_EN); + in_port->can_use_lite = in->feature_flag & + CAM_ISP_CAN_USE_LITE_MODE; in_port->data = kcalloc(in->num_out_res, sizeof(struct cam_isp_out_port_generic_info), 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 96f61b04ce..c2bef716b5 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 @@ -134,6 +134,7 @@ struct cam_isp_in_port_generic_info { uint32_t sfe_ife_enable; uint32_t secure_mode; uint32_t dynamic_sensor_switch_en; + uint32_t can_use_lite; struct cam_isp_out_port_generic_info *data; }; diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe_lite68x.h b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe_lite68x.h index 84cf74b391..b20a133690 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe_lite68x.h +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe_lite68x.h @@ -379,7 +379,7 @@ static struct cam_vfe_bus_ver3_hw_info vfe680x_bus_hw_info = { }, { .vfe_out_type = - CAM_VFE_BUS_VER3_VFE_OUT_GAMMA, + CAM_VFE_BUS_VER3_VFE_OUT_PREPROCESS_RAW, .max_width = 1920, .max_height = 1080, .source_group = CAM_VFE_BUS_VER3_SRC_GRP_0, @@ -389,7 +389,7 @@ static struct cam_vfe_bus_ver3_hw_info vfe680x_bus_hw_info = { }, }, { - .vfe_out_type = CAM_VFE_BUS_VER3_VFE_OUT_STATS_BE, + .vfe_out_type = CAM_VFE_BUS_VER3_VFE_OUT_STATS_BG, .max_width = -1, .max_height = -1, .source_group = CAM_VFE_BUS_VER3_SRC_GRP_0, diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.c b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.c index dd92dd72b9..6b90248238 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.c +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.c @@ -659,11 +659,11 @@ static enum cam_vfe_bus_ver3_vfe_out_type case CAM_ISP_IFE_OUT_RES_STATS_GTM_BHIST: vfe_out_type = CAM_VFE_BUS_VER3_VFE_OUT_STATS_GTM_BHIST; break; - case CAM_ISP_IFE_LITE_OUT_RES_STATS_BE: - vfe_out_type = CAM_VFE_BUS_VER3_VFE_OUT_STATS_BE; + case CAM_ISP_IFE_LITE_OUT_RES_STATS_BG: + vfe_out_type = CAM_VFE_BUS_VER3_VFE_OUT_STATS_BG; break; - case CAM_ISP_IFE_LITE_OUT_RES_GAMMA: - vfe_out_type = CAM_VFE_BUS_VER3_VFE_OUT_GAMMA; + case CAM_ISP_IFE_LITE_OUT_RES_PREPROCESS_RAW: + vfe_out_type = CAM_VFE_BUS_VER3_VFE_OUT_PREPROCESS_RAW; break; default: CAM_WARN(CAM_ISP, "Invalid isp res id: %d , assigning max", @@ -769,11 +769,11 @@ static int cam_vfe_bus_ver3_get_comp_vfe_out_res_id_list( if (comp_mask & (1 << CAM_VFE_BUS_VER3_VFE_OUT_STATS_GTM_BHIST)) out_list[count++] = CAM_ISP_IFE_OUT_RES_STATS_GTM_BHIST; - if (comp_mask & (1 << CAM_VFE_BUS_VER3_VFE_OUT_STATS_BE)) - out_list[count++] = CAM_ISP_IFE_LITE_OUT_RES_STATS_BE; + if (comp_mask & (1 << CAM_VFE_BUS_VER3_VFE_OUT_STATS_BG)) + out_list[count++] = CAM_ISP_IFE_LITE_OUT_RES_STATS_BG; - if (comp_mask & (1 << CAM_VFE_BUS_VER3_VFE_OUT_GAMMA)) - out_list[count++] = CAM_ISP_IFE_LITE_OUT_RES_GAMMA; + if (comp_mask & (1 << CAM_VFE_BUS_VER3_VFE_OUT_PREPROCESS_RAW)) + out_list[count++] = CAM_ISP_IFE_LITE_OUT_RES_PREPROCESS_RAW; *num_out = count; return 0; @@ -1295,7 +1295,7 @@ static int cam_vfe_bus_ver3_acquire_wm( rsrc_data->height = 0; rsrc_data->stride = 1; rsrc_data->en_cfg = (0x1 << 16) | 0x1; - } else if (vfe_out_res_id == CAM_VFE_BUS_VER3_VFE_OUT_STATS_BE) { + } else if (vfe_out_res_id == CAM_VFE_BUS_VER3_VFE_OUT_PREPROCESS_RAW) { switch (rsrc_data->format) { case CAM_FORMAT_MIPI_RAW_8: case CAM_FORMAT_MIPI_RAW_10: @@ -1315,7 +1315,7 @@ static int cam_vfe_bus_ver3_acquire_wm( return -EINVAL; } - } else if (vfe_out_res_id == CAM_VFE_BUS_VER3_VFE_OUT_GAMMA) { + } else if (vfe_out_res_id == CAM_VFE_BUS_VER3_VFE_OUT_STATS_BG) { switch (rsrc_data->format) { case CAM_FORMAT_PLAIN64: rsrc_data->width = 0; diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.h b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.h index 50fd2e4244..1f34464d55 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.h +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.h @@ -82,8 +82,8 @@ enum cam_vfe_bus_ver3_vfe_out_type { CAM_VFE_BUS_VER3_VFE_OUT_STATS_AEC_BE, CAM_VFE_BUS_VER3_VFE_OUT_LTM_STATS, CAM_VFE_BUS_VER3_VFE_OUT_STATS_GTM_BHIST, - CAM_VFE_BUS_VER3_VFE_OUT_STATS_BE, - CAM_VFE_BUS_VER3_VFE_OUT_GAMMA, + CAM_VFE_BUS_VER3_VFE_OUT_STATS_BG, + CAM_VFE_BUS_VER3_VFE_OUT_PREPROCESS_RAW, CAM_VFE_BUS_VER3_VFE_OUT_MAX, }; diff --git a/include/uapi/camera/media/cam_isp.h b/include/uapi/camera/media/cam_isp.h index 2dab771f53..1c23c0f59d 100644 --- a/include/uapi/camera/media/cam_isp.h +++ b/include/uapi/camera/media/cam_isp.h @@ -167,6 +167,7 @@ /* Feature Flag indicators */ #define CAM_ISP_PARAM_FETCH_SECURITY_MODE BIT(0) +#define CAM_ISP_CAN_USE_LITE_MODE BIT(1) #define CAM_ISP_DYNAMIC_SENOR_SWITCH_EN BIT(2) /* ISP core cfg flag params */ diff --git a/include/uapi/camera/media/cam_isp_ife.h b/include/uapi/camera/media/cam_isp_ife.h index 92a0f3e913..5658bb6370 100644 --- a/include/uapi/camera/media/cam_isp_ife.h +++ b/include/uapi/camera/media/cam_isp_ife.h @@ -9,39 +9,39 @@ /* IFE output port resource type (global unique)*/ #define CAM_ISP_IFE_OUT_RES_BASE 0x3000 -#define CAM_ISP_IFE_OUT_RES_FULL (CAM_ISP_IFE_OUT_RES_BASE + 0) -#define CAM_ISP_IFE_OUT_RES_DS4 (CAM_ISP_IFE_OUT_RES_BASE + 1) -#define CAM_ISP_IFE_OUT_RES_DS16 (CAM_ISP_IFE_OUT_RES_BASE + 2) -#define CAM_ISP_IFE_OUT_RES_RAW_DUMP (CAM_ISP_IFE_OUT_RES_BASE + 3) -#define CAM_ISP_IFE_OUT_RES_FD (CAM_ISP_IFE_OUT_RES_BASE + 4) -#define CAM_ISP_IFE_OUT_RES_PDAF (CAM_ISP_IFE_OUT_RES_BASE + 5) -#define CAM_ISP_IFE_OUT_RES_RDI_0 (CAM_ISP_IFE_OUT_RES_BASE + 6) -#define CAM_ISP_IFE_OUT_RES_RDI_1 (CAM_ISP_IFE_OUT_RES_BASE + 7) -#define CAM_ISP_IFE_OUT_RES_RDI_2 (CAM_ISP_IFE_OUT_RES_BASE + 8) -#define CAM_ISP_IFE_OUT_RES_RDI_3 (CAM_ISP_IFE_OUT_RES_BASE + 9) -#define CAM_ISP_IFE_OUT_RES_STATS_HDR_BE (CAM_ISP_IFE_OUT_RES_BASE + 10) -#define CAM_ISP_IFE_OUT_RES_STATS_HDR_BHIST (CAM_ISP_IFE_OUT_RES_BASE + 11) -#define CAM_ISP_IFE_OUT_RES_STATS_TL_BG (CAM_ISP_IFE_OUT_RES_BASE + 12) -#define CAM_ISP_IFE_OUT_RES_STATS_BF (CAM_ISP_IFE_OUT_RES_BASE + 13) -#define CAM_ISP_IFE_OUT_RES_STATS_AWB_BG (CAM_ISP_IFE_OUT_RES_BASE + 14) -#define CAM_ISP_IFE_OUT_RES_STATS_BHIST (CAM_ISP_IFE_OUT_RES_BASE + 15) -#define CAM_ISP_IFE_OUT_RES_STATS_RS (CAM_ISP_IFE_OUT_RES_BASE + 16) -#define CAM_ISP_IFE_OUT_RES_STATS_CS (CAM_ISP_IFE_OUT_RES_BASE + 17) -#define CAM_ISP_IFE_OUT_RES_STATS_IHIST (CAM_ISP_IFE_OUT_RES_BASE + 18) -#define CAM_ISP_IFE_OUT_RES_FULL_DISP (CAM_ISP_IFE_OUT_RES_BASE + 19) -#define CAM_ISP_IFE_OUT_RES_DS4_DISP (CAM_ISP_IFE_OUT_RES_BASE + 20) -#define CAM_ISP_IFE_OUT_RES_DS16_DISP (CAM_ISP_IFE_OUT_RES_BASE + 21) -#define CAM_ISP_IFE_OUT_RES_2PD (CAM_ISP_IFE_OUT_RES_BASE + 22) -#define CAM_ISP_IFE_OUT_RES_RDI_RD (CAM_ISP_IFE_OUT_RES_BASE + 23) -#define CAM_ISP_IFE_OUT_RES_LCR (CAM_ISP_IFE_OUT_RES_BASE + 24) -#define CAM_ISP_IFE_OUT_RES_SPARSE_PD (CAM_ISP_IFE_OUT_RES_BASE + 25) -#define CAM_ISP_IFE_OUT_RES_2PD_STATS (CAM_ISP_IFE_OUT_RES_BASE + 26) -#define CAM_ISP_IFE_OUT_RES_AWB_BFW (CAM_ISP_IFE_OUT_RES_BASE + 27) -#define CAM_ISP_IFE_OUT_RES_STATS_AEC_BE (CAM_ISP_IFE_OUT_RES_BASE + 28) -#define CAM_ISP_IFE_OUT_RES_LTM_STATS (CAM_ISP_IFE_OUT_RES_BASE + 29) -#define CAM_ISP_IFE_OUT_RES_STATS_GTM_BHIST (CAM_ISP_IFE_OUT_RES_BASE + 30) -#define CAM_ISP_IFE_LITE_OUT_RES_STATS_BE (CAM_ISP_IFE_OUT_RES_BASE + 31) -#define CAM_ISP_IFE_LITE_OUT_RES_GAMMA (CAM_ISP_IFE_OUT_RES_BASE + 32) +#define CAM_ISP_IFE_OUT_RES_FULL (CAM_ISP_IFE_OUT_RES_BASE + 0) +#define CAM_ISP_IFE_OUT_RES_DS4 (CAM_ISP_IFE_OUT_RES_BASE + 1) +#define CAM_ISP_IFE_OUT_RES_DS16 (CAM_ISP_IFE_OUT_RES_BASE + 2) +#define CAM_ISP_IFE_OUT_RES_RAW_DUMP (CAM_ISP_IFE_OUT_RES_BASE + 3) +#define CAM_ISP_IFE_OUT_RES_FD (CAM_ISP_IFE_OUT_RES_BASE + 4) +#define CAM_ISP_IFE_OUT_RES_PDAF (CAM_ISP_IFE_OUT_RES_BASE + 5) +#define CAM_ISP_IFE_OUT_RES_RDI_0 (CAM_ISP_IFE_OUT_RES_BASE + 6) +#define CAM_ISP_IFE_OUT_RES_RDI_1 (CAM_ISP_IFE_OUT_RES_BASE + 7) +#define CAM_ISP_IFE_OUT_RES_RDI_2 (CAM_ISP_IFE_OUT_RES_BASE + 8) +#define CAM_ISP_IFE_OUT_RES_RDI_3 (CAM_ISP_IFE_OUT_RES_BASE + 9) +#define CAM_ISP_IFE_OUT_RES_STATS_HDR_BE (CAM_ISP_IFE_OUT_RES_BASE + 10) +#define CAM_ISP_IFE_OUT_RES_STATS_HDR_BHIST (CAM_ISP_IFE_OUT_RES_BASE + 11) +#define CAM_ISP_IFE_OUT_RES_STATS_TL_BG (CAM_ISP_IFE_OUT_RES_BASE + 12) +#define CAM_ISP_IFE_OUT_RES_STATS_BF (CAM_ISP_IFE_OUT_RES_BASE + 13) +#define CAM_ISP_IFE_OUT_RES_STATS_AWB_BG (CAM_ISP_IFE_OUT_RES_BASE + 14) +#define CAM_ISP_IFE_OUT_RES_STATS_BHIST (CAM_ISP_IFE_OUT_RES_BASE + 15) +#define CAM_ISP_IFE_OUT_RES_STATS_RS (CAM_ISP_IFE_OUT_RES_BASE + 16) +#define CAM_ISP_IFE_OUT_RES_STATS_CS (CAM_ISP_IFE_OUT_RES_BASE + 17) +#define CAM_ISP_IFE_OUT_RES_STATS_IHIST (CAM_ISP_IFE_OUT_RES_BASE + 18) +#define CAM_ISP_IFE_OUT_RES_FULL_DISP (CAM_ISP_IFE_OUT_RES_BASE + 19) +#define CAM_ISP_IFE_OUT_RES_DS4_DISP (CAM_ISP_IFE_OUT_RES_BASE + 20) +#define CAM_ISP_IFE_OUT_RES_DS16_DISP (CAM_ISP_IFE_OUT_RES_BASE + 21) +#define CAM_ISP_IFE_OUT_RES_2PD (CAM_ISP_IFE_OUT_RES_BASE + 22) +#define CAM_ISP_IFE_OUT_RES_RDI_RD (CAM_ISP_IFE_OUT_RES_BASE + 23) +#define CAM_ISP_IFE_OUT_RES_LCR (CAM_ISP_IFE_OUT_RES_BASE + 24) +#define CAM_ISP_IFE_OUT_RES_SPARSE_PD (CAM_ISP_IFE_OUT_RES_BASE + 25) +#define CAM_ISP_IFE_OUT_RES_2PD_STATS (CAM_ISP_IFE_OUT_RES_BASE + 26) +#define CAM_ISP_IFE_OUT_RES_AWB_BFW (CAM_ISP_IFE_OUT_RES_BASE + 27) +#define CAM_ISP_IFE_OUT_RES_STATS_AEC_BE (CAM_ISP_IFE_OUT_RES_BASE + 28) +#define CAM_ISP_IFE_OUT_RES_LTM_STATS (CAM_ISP_IFE_OUT_RES_BASE + 29) +#define CAM_ISP_IFE_OUT_RES_STATS_GTM_BHIST (CAM_ISP_IFE_OUT_RES_BASE + 30) +#define CAM_ISP_IFE_LITE_OUT_RES_STATS_BG (CAM_ISP_IFE_OUT_RES_BASE + 31) +#define CAM_ISP_IFE_LITE_OUT_RES_PREPROCESS_RAW (CAM_ISP_IFE_OUT_RES_BASE + 32) /* IFE input port resource type (global unique) */ #define CAM_ISP_IFE_IN_RES_BASE 0x4000