diff --git a/drivers/cam_isp/cam_isp_context.c b/drivers/cam_isp/cam_isp_context.c index c0923387f1..9b7967bfd5 100644 --- a/drivers/cam_isp/cam_isp_context.c +++ b/drivers/cam_isp/cam_isp_context.c @@ -1056,6 +1056,7 @@ static char *__cam_isp_ife_sfe_resource_handle_id_to_type( case CAM_ISP_SFE_OUT_BAYER_RS_STATS_0: return "SFE_RS_STATS_0"; case CAM_ISP_SFE_OUT_BAYER_RS_STATS_1: return "SFE_RS_STATS_1"; case CAM_ISP_SFE_OUT_BAYER_RS_STATS_2: return "SFE_RS_STATS_2"; + case CAM_ISP_SFE_OUT_HDR_STATS: return "HDR_STATS"; /* SFE input ports */ case CAM_ISP_SFE_IN_RD_0: return "SFE_RD_0"; case CAM_ISP_SFE_IN_RD_1: return "SFE_RD_1"; diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.c b/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.c index a1f0ad221a..237f018a4c 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.c +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.c @@ -241,6 +241,7 @@ static bool cam_sfe_bus_can_be_secure(uint32_t out_type) case CAM_SFE_BUS_SFE_OUT_BAYER_RS_0: case CAM_SFE_BUS_SFE_OUT_BAYER_RS_1: case CAM_SFE_BUS_SFE_OUT_BAYER_RS_2: + case CAM_SFE_BUS_SFE_OUT_HDR_STATS: default: return false; } @@ -284,6 +285,8 @@ static enum cam_sfe_bus_sfe_out_type return CAM_SFE_BUS_SFE_OUT_BAYER_RS_1; case CAM_ISP_SFE_OUT_BAYER_RS_STATS_2: return CAM_SFE_BUS_SFE_OUT_BAYER_RS_2; + case CAM_ISP_SFE_OUT_HDR_STATS: + return CAM_SFE_BUS_SFE_OUT_HDR_STATS; default: return CAM_SFE_BUS_SFE_OUT_MAX; } @@ -345,6 +348,9 @@ static int cam_sfe_bus_get_comp_sfe_out_res_id_list( if (comp_mask & (BIT(CAM_SFE_BUS_SFE_OUT_BAYER_RS_2))) out_list[count++] = CAM_ISP_SFE_OUT_BAYER_RS_STATS_2; + if (comp_mask & (BIT(CAM_SFE_BUS_SFE_OUT_HDR_STATS))) + out_list[count++] = CAM_ISP_SFE_OUT_HDR_STATS; + *num_out = count; return 0; } @@ -789,7 +795,6 @@ static int cam_sfe_bus_acquire_wm( rsrc_data->height = 0; rsrc_data->stride = 1; rsrc_data->en_cfg = (0x1 << 16) | 0x1; - } else if (sfe_out_res_id == CAM_SFE_BUS_SFE_OUT_LCR) { switch (rsrc_data->format) { case CAM_FORMAT_PLAIN16_10: @@ -807,6 +812,21 @@ static int cam_sfe_bus_acquire_wm( rsrc_data->format, sfe_out_res_id); return -EINVAL; } + } else if (sfe_out_res_id == CAM_SFE_BUS_SFE_OUT_HDR_STATS) { + rsrc_data->en_cfg = 0x1; + rsrc_data->stride = rsrc_data->width; + switch (rsrc_data->format) { + case CAM_FORMAT_PLAIN16_10: + case CAM_FORMAT_PLAIN16_12: + case CAM_FORMAT_PLAIN16_14: + case CAM_FORMAT_PLAIN16_16: + /* LSB aligned */ + rsrc_data->pack_fmt |= + (1 << bus_priv->common_data.pack_align_shift); + break; + default: + break; + } } else { CAM_ERR(CAM_SFE, "Invalid out_type:%d requested", sfe_out_res_id); diff --git a/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.h b/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.h index 3f20c06db4..ad0213de58 100644 --- a/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.h +++ b/drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.h @@ -10,9 +10,9 @@ #include "cam_sfe_bus.h" -#define CAM_SFE_BUS_WR_MAX_CLIENTS 16 -#define CAM_SFE_BUS_WR_MAX_SUB_GRPS 6 -#define CAM_SFE_BUS_CONS_ERR_MAX 32 +#define CAM_SFE_BUS_WR_MAX_CLIENTS 17 +#define CAM_SFE_BUS_WR_MAX_SUB_GRPS 6 +#define CAM_SFE_BUS_CONS_ERR_MAX 32 enum cam_sfe_bus_wr_src_grp { CAM_SFE_BUS_WR_SRC_GRP_0, @@ -35,6 +35,7 @@ enum cam_sfe_bus_wr_comp_grp_type { CAM_SFE_BUS_WR_COMP_GRP_7, CAM_SFE_BUS_WR_COMP_GRP_8, CAM_SFE_BUS_WR_COMP_GRP_9, + CAM_SFE_BUS_WR_COMP_GRP_10, CAM_SFE_BUS_WR_COMP_GRP_MAX, }; @@ -56,6 +57,7 @@ enum cam_sfe_bus_sfe_out_type { CAM_SFE_BUS_SFE_OUT_BAYER_RS_1, CAM_SFE_BUS_SFE_OUT_BAYER_RS_2, CAM_SFE_BUS_SFE_OUT_IR, + CAM_SFE_BUS_SFE_OUT_HDR_STATS, CAM_SFE_BUS_SFE_OUT_MAX, }; diff --git a/include/uapi/camera/media/cam_isp_sfe.h b/include/uapi/camera/media/cam_isp_sfe.h index 5b47b8cafe..f06bd0aabc 100644 --- a/include/uapi/camera/media/cam_isp_sfe.h +++ b/include/uapi/camera/media/cam_isp_sfe.h @@ -27,6 +27,7 @@ #define CAM_ISP_SFE_OUT_BAYER_RS_STATS_0 (CAM_ISP_SFE_OUT_RES_BASE + 14) #define CAM_ISP_SFE_OUT_BAYER_RS_STATS_1 (CAM_ISP_SFE_OUT_RES_BASE + 15) #define CAM_ISP_SFE_OUT_BAYER_RS_STATS_2 (CAM_ISP_SFE_OUT_RES_BASE + 16) +#define CAM_ISP_SFE_OUT_HDR_STATS (CAM_ISP_SFE_OUT_RES_BASE + 17) /* This Macro is deprecated and shall not be used */ #define CAM_ISP_SFE_OUT_RES_MAX (CAM_ISP_SFE_OUT_RES_BASE + 17)