Selaa lähdekoodia

msm: camera: isp: Keep the data in MSB while unpacking at CSID

BUS, SFE pipeline(xCFA), PDAF/RDI-LCR pipeline expects the
incoming valid data to be in MSB. So, if RDI data is unpacked
to PLAIN_16 at CSID out, keep the valid data in MSB.
For final out formats PLAIN16_10/12/14/16 formats, unpack
data at CSID and keep in MSB and use wm pack with LSB write,
as LCR/PDAF can be enabled with these final out formats and
expects data in MSB.

CRs-Fixed: 3118104
Change-Id: Idb64d809ea006192eb29bb9bb57c5c12a6e8b136
Signed-off-by: Pavan Kumar Chilamkurthi <[email protected]>
Pavan Kumar Chilamkurthi 3 vuotta sitten
vanhempi
sitoutus
e93d8d7197

+ 3 - 9
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid780.h

@@ -649,9 +649,7 @@ static struct cam_ife_csid_ver2_path_reg_info
 		.resume_frame_boundary            = 1,
 		.overflow_ctrl_en                 = 1,
 		.capabilities                     = CAM_IFE_CSID_CAP_INPUT_LCR |
-							CAM_IFE_CSID_CAP_MIPI10_UNPACK |
-							CAM_IFE_CSID_CAP_MIPI12_UNPACK |
-							CAM_IFE_CSID_CAP_MIPI14_UNPACK |
+							CAM_IFE_CSID_CAP_RDI_UNPACK_MSB |
 							CAM_IFE_CSID_CAP_LINE_SMOOTHING_IN_RDI |
 							CAM_IFE_CSID_CAP_SOF_RETIME_DIS,
 		.overflow_ctrl_mode_val           = 0x8,
@@ -752,9 +750,7 @@ static struct cam_ife_csid_ver2_path_reg_info
 		.resume_frame_boundary            = 1,
 		.overflow_ctrl_en                 = 1,
 		.capabilities                     = CAM_IFE_CSID_CAP_INPUT_LCR |
-							CAM_IFE_CSID_CAP_MIPI10_UNPACK |
-							CAM_IFE_CSID_CAP_MIPI12_UNPACK |
-							CAM_IFE_CSID_CAP_MIPI14_UNPACK |
+							CAM_IFE_CSID_CAP_RDI_UNPACK_MSB |
 							CAM_IFE_CSID_CAP_LINE_SMOOTHING_IN_RDI |
 							CAM_IFE_CSID_CAP_SOF_RETIME_DIS,
 		.overflow_ctrl_mode_val           = 0x8,
@@ -854,9 +850,7 @@ static struct cam_ife_csid_ver2_path_reg_info
 		.resume_frame_boundary            = 1,
 		.overflow_ctrl_en                 = 1,
 		.capabilities                     = CAM_IFE_CSID_CAP_INPUT_LCR |
-							CAM_IFE_CSID_CAP_MIPI10_UNPACK |
-							CAM_IFE_CSID_CAP_MIPI12_UNPACK |
-							CAM_IFE_CSID_CAP_MIPI14_UNPACK |
+							CAM_IFE_CSID_CAP_RDI_UNPACK_MSB |
 							CAM_IFE_CSID_CAP_LINE_SMOOTHING_IN_RDI |
 							CAM_IFE_CSID_CAP_SOF_RETIME_DIS,
 		.overflow_ctrl_mode_val           = 0x8,

+ 2 - 6
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_common.h

@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 #ifndef _CAM_IFE_CSID_COMMON_H_
@@ -34,12 +35,7 @@
 #define CAM_IFE_CSID_LOG_BUF_LEN                          512
 
 #define CAM_IFE_CSID_CAP_INPUT_LCR                        0x1
-#define CAM_IFE_CSID_CAP_MIPI8_UNPACK                     0x2
-#define CAM_IFE_CSID_CAP_MIPI10_UNPACK                    0x4
-#define CAM_IFE_CSID_CAP_MIPI12_UNPACK                    0x8
-#define CAM_IFE_CSID_CAP_MIPI14_UNPACK                    0x10
-#define CAM_IFE_CSID_CAP_MIPI16_UNPACK                    0x20
-#define CAM_IFE_CSID_CAP_MIPI20_UNPACK                    0x40
+#define CAM_IFE_CSID_CAP_RDI_UNPACK_MSB                   0x2
 #define CAM_IFE_CSID_CAP_LINE_SMOOTHING_IN_RDI            0x80
 #define CAM_IFE_CSID_CAP_SOF_RETIME_DIS                   0x100
 

+ 18 - 14
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_hw_ver2.c

@@ -2209,23 +2209,20 @@ static bool cam_ife_csid_hw_ver2_need_unpack_mipi(
 	bool  need_unpack = false;
 
 	switch(format) {
-	case CAM_FORMAT_MIPI_RAW_8:
-		need_unpack = (bool)(path_reg->capabilities & CAM_IFE_CSID_CAP_MIPI8_UNPACK);
-		break;
 	case CAM_FORMAT_MIPI_RAW_10:
-		need_unpack = (bool)(path_reg->capabilities & CAM_IFE_CSID_CAP_MIPI10_UNPACK);
-		break;
 	case CAM_FORMAT_MIPI_RAW_12:
-		need_unpack = (bool)(path_reg->capabilities & CAM_IFE_CSID_CAP_MIPI12_UNPACK);
-		break;
 	case CAM_FORMAT_MIPI_RAW_14:
-		need_unpack = (bool)(path_reg->capabilities & CAM_IFE_CSID_CAP_MIPI14_UNPACK);
-		break;
-	case CAM_FORMAT_MIPI_RAW_16:
-		need_unpack = (bool)(path_reg->capabilities & CAM_IFE_CSID_CAP_MIPI16_UNPACK);
-		break;
-	case CAM_FORMAT_MIPI_RAW_20:
-		need_unpack = (bool)(path_reg->capabilities & CAM_IFE_CSID_CAP_MIPI20_UNPACK);
+	case CAM_FORMAT_PLAIN16_10:
+	case CAM_FORMAT_PLAIN16_12:
+	case CAM_FORMAT_PLAIN16_14:
+	 /*
+	  * CAM_FORMAT_PLAIN16_16 : can be removed? double check why default_out_format has it.
+	  * default_out_format is used in xCFA usecases without real RDI0 out buffer.
+	  * We still need to set need_unpack here so that we unpack incoming data (say MIPI10)
+	  * into MSB. If default_out_format can be set to 16_10/16_12/16_14 - then we can remove
+	  */
+	case CAM_FORMAT_PLAIN16_16:
+		need_unpack = (bool)(path_reg->capabilities & CAM_IFE_CSID_CAP_RDI_UNPACK_MSB);
 		break;
 	default:
 		need_unpack = false;
@@ -2333,6 +2330,8 @@ static int cam_ife_csid_hw_ver2_config_path_data(
 		 */
 		reserve->use_wm_pack = cam_ife_csid_hw_ver2_need_unpack_mipi(csid_hw,
 			reserve, path_reg, path_cfg->out_format);
+		path_cfg->use_wm_pack = reserve->use_wm_pack;
+
 		rc = cam_ife_csid_get_format_rdi(
 			path_cfg->in_format[CAM_IFE_CSID_MULTI_VC_DT_GRP_0],
 			path_cfg->out_format,
@@ -2919,6 +2918,11 @@ static int cam_ife_csid_ver2_init_config_rdi_path(
 	cfg1 |= (path_cfg->path_format[CAM_IFE_CSID_MULTI_VC_DT_GRP_0].plain_fmt <<
 			path_reg->plain_fmt_shift_val);
 
+	/* Keep the data in MSB, IFE/SFE  pipeline, BUS expects data in MSB */
+	if (path_cfg->use_wm_pack &&
+		path_cfg->path_format[CAM_IFE_CSID_MULTI_VC_DT_GRP_0].plain_fmt)
+		cfg1 |= (1 << path_reg->plain_alignment_shift_val);
+
 	if (csid_hw->debug_info.debug_val &
 		CAM_IFE_CSID_DEBUG_ENABLE_HBI_VBI_INFO)
 		cfg1 |= 1 << path_reg->format_measure_en_shift_val;

+ 1 - 0
drivers/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_hw_ver2.h

@@ -209,6 +209,7 @@ struct cam_ife_csid_ver2_path_cfg {
 	bool                                 skip_discard_frame_cfg;
 	bool                                 sfe_shdr;
 	bool                                 lcr_en;
+	bool                                 use_wm_pack;
 };
 
 struct cam_ife_csid_ver2_top_reg_info {

+ 27 - 0
drivers/cam_isp/isp_hw_mgr/isp_hw/sfe_hw/sfe_bus/cam_sfe_bus_wr.c

@@ -657,6 +657,33 @@ static int cam_sfe_bus_config_rdi_wm(
 			CAM_WARN(CAM_SFE, "No index mode support for SFE WM: %u",
 				rsrc_data->index);
 		}
+
+		if (rsrc_data->use_wm_pack) {
+			switch (rsrc_data->format) {
+			case CAM_FORMAT_PLAIN16_10:
+				rsrc_data->pack_fmt = PACKER_FMT_PLAIN_16_10BPP;
+				break;
+			case CAM_FORMAT_PLAIN16_12:
+				rsrc_data->pack_fmt = PACKER_FMT_PLAIN_16_12BPP;
+				break;
+			case CAM_FORMAT_PLAIN16_14:
+				rsrc_data->pack_fmt = PACKER_FMT_PLAIN_16_14BPP;
+				break;
+			case CAM_FORMAT_PLAIN16_16:
+				rsrc_data->pack_fmt = PACKER_FMT_PLAIN_16_16BPP;
+				break;
+			default:
+				CAM_ERR(CAM_SFE, "Not possible");
+				break;
+			}
+
+			/* LSB aligned */
+			rsrc_data->pack_fmt |=
+				(1 << rsrc_data->common_data->pack_align_shift);
+
+			if (rsrc_data->wm_mode == CAM_SFE_WM_LINE_BASED_MODE)
+				rsrc_data->width = ALIGNUP((rsrc_data->acquired_width), 16);
+		}
 		break;
 	case CAM_FORMAT_PLAIN64:
 		if (rsrc_data->wm_mode == CAM_SFE_WM_LINE_BASED_MODE) {

+ 27 - 0
drivers/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe_bus/cam_vfe_bus_ver3.c

@@ -1,6 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
  * Copyright (c) 2019-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  */
 
 
@@ -994,6 +995,32 @@ static int cam_vfe_bus_ver3_config_rdi_wm(
 		rsrc_data->width =
 			ALIGNUP(rsrc_data->width * 2, 16) / 16;
 		rsrc_data->en_cfg = 0x1;
+
+		if (rsrc_data->use_wm_pack) {
+			switch (rsrc_data->format) {
+			case CAM_FORMAT_PLAIN16_10:
+				rsrc_data->pack_fmt = PACKER_FMT_VER3_PLAIN_16_10BPP;
+				break;
+			case CAM_FORMAT_PLAIN16_12:
+				rsrc_data->pack_fmt = PACKER_FMT_VER3_PLAIN_16_12BPP;
+				break;
+			case CAM_FORMAT_PLAIN16_14:
+				rsrc_data->pack_fmt = PACKER_FMT_VER3_PLAIN_16_14BPP;
+				break;
+			case CAM_FORMAT_PLAIN16_16:
+				rsrc_data->pack_fmt = PACKER_FMT_VER3_PLAIN_16_16BPP;
+				break;
+			default:
+				CAM_ERR(CAM_SFE, "Not possible");
+				break;
+			}
+
+			/* LSB aligned */
+			rsrc_data->pack_fmt |= (1 << rsrc_data->common_data->pack_align_shift);
+
+			if (rsrc_data->default_line_based)
+				rsrc_data->width = ALIGNUP((rsrc_data->acquired_width), 16);
+		}
 		break;
 	case CAM_FORMAT_PLAIN64:
 		rsrc_data->width =