Merge "soc: qcom: PIL: handle sw_init_done errors from spss"
diff --git a/Documentation/devicetree/bindings/input/qpnp-power-on.txt b/Documentation/devicetree/bindings/input/qpnp-power-on.txt
index 6789c62..7367934 100644
--- a/Documentation/devicetree/bindings/input/qpnp-power-on.txt
+++ b/Documentation/devicetree/bindings/input/qpnp-power-on.txt
@@ -39,6 +39,12 @@
 				can be used to reset the system. This property
 				can only be used by one device on the system. It
 				is an error to include it more than once.
+- qcom,modem-reset:		Boolean which specifies that this PON peripheral
+				can be used to reset the attached modem chip.
+				This property can only be used by one PON device
+				on the system. qcom,modem-reset and
+				qcom,system-reset cannot be specified for the
+				same PON device.
 - qcom,s3-debounce:		The debounce delay for stage 3 reset trigger in
 				secs. The values range from 0 to 128.
 - qcom,s3-src:			The source for stage 3 reset. It can be one of
@@ -62,7 +68,7 @@
 				for system reset through qcom,system-reset
 				property.
 				This should not be defined along with the
-				qcom,system-reset property.
+				qcom,system-reset or qcom,modem-reset property.
 - qcom,store-hard-reset-reason:	Boolean property which if set will store the
 				hardware reset reason to SOFT_RB_SPARE register
 				of the core PMIC PON peripheral.
diff --git a/arch/arm64/boot/dts/qcom/kona.dtsi b/arch/arm64/boot/dts/qcom/kona.dtsi
index cc869c6..c7a0d2c 100644
--- a/arch/arm64/boot/dts/qcom/kona.dtsi
+++ b/arch/arm64/boot/dts/qcom/kona.dtsi
@@ -1602,6 +1602,29 @@
 		};
 	};
 
+	spss_utils: qcom,spss_utils {
+		compatible = "qcom,spss-utils";
+		/* spss fuses physical address */
+		qcom,spss-fuse1-addr = <0x007841c4>;
+		qcom,spss-fuse1-bit = <27>;
+		qcom,spss-fuse2-addr = <0x007841c4>;
+		qcom,spss-fuse2-bit = <26>;
+		qcom,spss-dev-firmware-name  = "spss1d";  /* 8 chars max */
+		qcom,spss-test-firmware-name = "spss1t";  /* 8 chars max */
+		qcom,spss-prod-firmware-name = "spss1p";  /* 8 chars max */
+		qcom,spss-debug-reg-addr = <0x01886020>;
+		qcom,spss-emul-type-reg-addr = <0x01fc8004>;
+		status = "ok";
+	};
+
+	qcom,spcom {
+		compatible = "qcom,spcom";
+
+		/* predefined channels, remote side is server */
+		qcom,spcom-ch-names = "sp_kernel", "sp_ssr";
+		status = "ok";
+	};
+
 	qcom,msm_gsi {
 		compatible = "qcom,msm_gsi";
 	};
@@ -2018,6 +2041,7 @@
 		qcom,pil-generic-irq-handler;
 		status = "ok";
 
+		qcom,signal-aop;
 		qcom,complete-ramdump;
 
 		qcom,pas-id = <14>;
@@ -2026,6 +2050,7 @@
 		memory-region = <&pil_spss_mem>;
 		qcom,spss-scsr-bits = <24 25>;
 
+		mboxes = <&qmp_aop 0>;
 		mbox-names = "spss-pil";
 	};
 
diff --git a/arch/arm64/boot/dts/qcom/lito-pinctrl.dtsi b/arch/arm64/boot/dts/qcom/lito-pinctrl.dtsi
index 68659b4..53d10bc 100644
--- a/arch/arm64/boot/dts/qcom/lito-pinctrl.dtsi
+++ b/arch/arm64/boot/dts/qcom/lito-pinctrl.dtsi
@@ -12,5 +12,51 @@
 		#gpio-cells = <2>;
 		interrupt-controller;
 		#interrupt-cells = <2>;
+
+		ufs_dev_reset_assert: ufs_dev_reset_assert {
+			config {
+				pins = "ufs_reset";
+				bias-pull-down;		/* default: pull down */
+				/*
+				 * UFS_RESET driver strengths are having
+				 * different values/steps compared to typical
+				 * GPIO drive strengths.
+				 *
+				 * Following table clarifies:
+				 *
+				 * HDRV value | UFS_RESET | Typical GPIO
+				 *   (dec)    |   (mA)    |    (mA)
+				 *     0      |   0.8     |    2
+				 *     1      |   1.55    |    4
+				 *     2      |   2.35    |    6
+				 *     3      |   3.1     |    8
+				 *     4      |   3.9     |    10
+				 *     5      |   4.65    |    12
+				 *     6      |   5.4     |    14
+				 *     7      |   6.15    |    16
+				 *
+				 * POR value for UFS_RESET HDRV is 3 which means
+				 * 3.1mA and we want to use that. Hence just
+				 * specify 8mA to "drive-strength" binding and
+				 * that should result into writing 3 to HDRV
+				 * field.
+				 */
+				drive-strength = <8>;	/* default: 3.1 mA */
+				output-low; /* active low reset */
+			};
+		};
+
+		ufs_dev_reset_deassert: ufs_dev_reset_deassert {
+			config {
+				pins = "ufs_reset";
+				bias-pull-down;		/* default: pull down */
+				/*
+				 * default: 3.1 mA
+				 * check comments under ufs_dev_reset_assert
+				 */
+				drive-strength = <8>;
+				output-high; /* active low reset */
+			};
+		};
 	};
 };
diff --git a/arch/arm64/boot/dts/qcom/lito-rumi.dtsi b/arch/arm64/boot/dts/qcom/lito-rumi.dtsi
index 0f22d4d..3473b2e 100644
--- a/arch/arm64/boot/dts/qcom/lito-rumi.dtsi
+++ b/arch/arm64/boot/dts/qcom/lito-rumi.dtsi
@@ -16,3 +16,34 @@
 &wdog {
 	status = "disabled";
 };
+
+&ufsphy_mem {
+	compatible = "qcom,ufs-phy-qrbtc-sdm845";
+
+	vdda-phy-supply = <&pm8150_l5>;
+	vdda-pll-supply = <&pm8150_l6>;
+	vdda-phy-max-microamp = <90200>;
+	vdda-pll-max-microamp = <19000>;
+
+	status = "ok";
+};
+
+&ufshc_mem {
+	limit-tx-hs-gear = <1>;
+	limit-rx-hs-gear = <1>;
+
+	vdd-hba-supply = <&ufs_phy_gdsc>;
+	vdd-hba-fixed-regulator;
+	vcc-supply = <&pm8150a_l7>;
+	vccq2-supply = <&pm8150_s4>;
+	vcc-max-microamp = <800000>;
+	vccq2-max-microamp = <800000>;
+
+	qcom,vddp-ref-clk-supply = <&pm8150_l6>;
+	qcom,vddp-ref-clk-max-microamp = <100>;
+
+	qcom,disable-lpm;
+	rpm-level = <0>;
+	spm-level = <0>;
+	status = "ok";
+};
diff --git a/arch/arm64/boot/dts/qcom/lito.dtsi b/arch/arm64/boot/dts/qcom/lito.dtsi
index 093a71d..88e4ff2 100644
--- a/arch/arm64/boot/dts/qcom/lito.dtsi
+++ b/arch/arm64/boot/dts/qcom/lito.dtsi
@@ -23,6 +23,10 @@
 	qcom,msm-id = <400 0x10000>;
 	interrupt-parent = <&intc>;
 
+	aliases {
+		ufshc1 = &ufshc_mem; /* Embedded UFS slot */
+	};
+
 	cpus {
 		#address-cells = <2>;
 		#size-cells = <0>;
@@ -841,6 +845,131 @@
 		#reset-cells = <1>;
 	};
 
+	ufsphy_mem: ufsphy_mem@1d87000 {
+		reg = <0x1d87000 0xe00>; /* PHY regs */
+		reg-names = "phy_mem";
+		#phy-cells = <0>;
+
+		lanes-per-direction = <2>;
+
+		clock-names = "ref_clk_src",
+			"ref_clk",
+			"ref_aux_clk";
+		clocks = <&rpmhcc RPMH_CXO_CLK>,
+			<&gcc GCC_UFS_1X_CLKREF_CLK>,
+			<&gcc GCC_UFS_PHY_PHY_AUX_CLK>;
+
+		status = "disabled";
+	};
+
+	ufshc_mem: ufshc@1d84000 {
+		compatible = "qcom,ufshc";
+		reg = <0x1d84000 0x3000>;
+		interrupts = <GIC_SPI 265 IRQ_TYPE_LEVEL_HIGH>;
+		phys = <&ufsphy_mem>;
+		phy-names = "ufsphy";
+
+		lanes-per-direction = <2>;
+		dev-ref-clk-freq = <0>; /* 19.2 MHz */
+
+		clock-names =
+			"core_clk",
+			"bus_aggr_clk",
+			"iface_clk",
+			"core_clk_unipro",
+			"core_clk_ice",
+			"ref_clk",
+			"tx_lane0_sync_clk",
+			"rx_lane0_sync_clk",
+			"rx_lane1_sync_clk";
+		clocks =
+			<&gcc GCC_UFS_PHY_AXI_CLK>,
+			<&gcc GCC_AGGRE_UFS_PHY_AXI_CLK>,
+			<&gcc GCC_UFS_PHY_AHB_CLK>,
+			<&gcc GCC_UFS_PHY_UNIPRO_CORE_CLK>,
+			<&gcc GCC_UFS_PHY_ICE_CORE_CLK>,
+			<&rpmhcc RPMH_CXO_CLK>,
+			<&gcc GCC_UFS_PHY_TX_SYMBOL_0_CLK>,
+			<&gcc GCC_UFS_PHY_RX_SYMBOL_0_CLK>,
+			<&gcc GCC_UFS_PHY_RX_SYMBOL_1_CLK>;
+		freq-table-hz =
+			<37500000 300000000>,
+			<0 0>,
+			<0 0>,
+			<37500000 150000000>,
+			<75000000 300000000>,
+			<0 0>,
+			<0 0>,
+			<0 0>,
+			<0 0>;
+
+		qcom,msm-bus,name = "ufshc_mem";
+		qcom,msm-bus,num-cases = <22>;
+		qcom,msm-bus,num-paths = <2>;
+		qcom,msm-bus,vectors-KBps =
+		/*
+		 * During HS G3 UFS runs at nominal voltage corner, vote
+		 * higher bandwidth to push other buses in the data path
+		 * to run at nominal to achieve max throughput.
+		 * 4GBps pushes BIMC to run at nominal.
+		 * 200MBps pushes CNOC to run at nominal.
+		 * Vote for half of this bandwidth for HS G3 1-lane.
+		 * For max bandwidth, vote high enough to push the buses
+		 * to run in turbo voltage corner.
+		 */
+		<123 512 0 0>, <1 757 0 0>,          /* No vote */
+		<123 512 922 0>, <1 757 1000 0>,     /* PWM G1 */
+		<123 512 1844 0>, <1 757 1000 0>,    /* PWM G2 */
+		<123 512 3688 0>, <1 757 1000 0>,    /* PWM G3 */
+		<123 512 7376 0>, <1 757 1000 0>,    /* PWM G4 */
+		<123 512 1844 0>, <1 757 1000 0>,    /* PWM G1 L2 */
+		<123 512 3688 0>, <1 757 1000 0>,    /* PWM G2 L2 */
+		<123 512 7376 0>, <1 757 1000 0>,    /* PWM G3 L2 */
+		<123 512 14752 0>, <1 757 1000 0>,   /* PWM G4 L2 */
+		<123 512 127796 0>, <1 757 1000 0>,  /* HS G1 RA */
+		<123 512 255591 0>, <1 757 1000 0>,  /* HS G2 RA */
+		<123 512 2097152 0>, <1 757 102400 0>,  /* HS G3 RA */
+		<123 512 255591 0>, <1 757 1000 0>,  /* HS G1 RA L2 */
+		<123 512 511181 0>, <1 757 1000 0>,  /* HS G2 RA L2 */
+		<123 512 4194304 0>, <1 757 204800 0>, /* HS G3 RA L2 */
+		<123 512 149422 0>, <1 757 1000 0>,  /* HS G1 RB */
+		<123 512 298189 0>, <1 757 1000 0>,  /* HS G2 RB */
+		<123 512 2097152 0>, <1 757 102400 0>,  /* HS G3 RB */
+		<123 512 298189 0>, <1 757 1000 0>,  /* HS G1 RB L2 */
+		<123 512 596378 0>, <1 757 1000 0>,  /* HS G2 RB L2 */
+		/* As UFS working in HS G3 RB L2 mode, aggregated
+		 * bandwidth (AB) should take care of providing
+		 * optimum throughput requested. However, as tested,
+		 * in order to scale up CNOC clock, instantaneous
+		 * bindwidth (IB) needs to be given a proper value too.
+		 */
+		<123 512 4194304 0>, <1 757 204800 409600>, /* HS G3 RB L2 */
+		<123 512 7643136 0>, <1 757 307200 0>; /* Max. bandwidth */
+
+		qcom,bus-vector-names = "MIN",
+		"PWM_G1_L1", "PWM_G2_L1", "PWM_G3_L1", "PWM_G4_L1",
+		"PWM_G1_L2", "PWM_G2_L2", "PWM_G3_L2", "PWM_G4_L2",
+		"HS_RA_G1_L1", "HS_RA_G2_L1", "HS_RA_G3_L1",
+		"HS_RA_G1_L2", "HS_RA_G2_L2", "HS_RA_G3_L2",
+		"HS_RB_G1_L1", "HS_RB_G2_L1", "HS_RB_G3_L1",
+		"HS_RB_G1_L2", "HS_RB_G2_L2", "HS_RB_G3_L2",
+		"MAX";
+
+		/* PM QoS */
+		qcom,pm-qos-cpu-groups = <0x3f 0xc0>;
+		qcom,pm-qos-cpu-group-latency-us = <67 67>;
+		qcom,pm-qos-default-cpu = <0>;
+
+		pinctrl-names = "dev-reset-assert", "dev-reset-deassert";
+		pinctrl-0 = <&ufs_dev_reset_assert>;
+		pinctrl-1 = <&ufs_dev_reset_deassert>;
+
+		resets = <&gcc GCC_UFS_PHY_BCR>;
+		reset-names = "core_reset";
+
+		status = "disabled";
+	};
+
 	npucc: qcom,npucc {
 		compatible = "qcom,dummycc";
 		clock-output-names = "npucc_clocks";
diff --git a/arch/arm64/configs/vendor/kona-perf_defconfig b/arch/arm64/configs/vendor/kona-perf_defconfig
index 6e97341..c8904b2 100644
--- a/arch/arm64/configs/vendor/kona-perf_defconfig
+++ b/arch/arm64/configs/vendor/kona-perf_defconfig
@@ -359,6 +359,7 @@
 CONFIG_SND=y
 CONFIG_SND_DYNAMIC_MINORS=y
 CONFIG_SND_USB_AUDIO=y
+CONFIG_SND_USB_AUDIO_QMI=y
 CONFIG_SND_SOC=y
 CONFIG_UHID=y
 CONFIG_HID_APPLE=y
diff --git a/arch/arm64/configs/vendor/kona_defconfig b/arch/arm64/configs/vendor/kona_defconfig
index f9756dc..7dfefb5 100644
--- a/arch/arm64/configs/vendor/kona_defconfig
+++ b/arch/arm64/configs/vendor/kona_defconfig
@@ -371,6 +371,7 @@
 CONFIG_SND=y
 CONFIG_SND_DYNAMIC_MINORS=y
 CONFIG_SND_USB_AUDIO=y
+CONFIG_SND_USB_AUDIO_QMI=y
 CONFIG_SND_SOC=y
 CONFIG_UHID=y
 CONFIG_HID_APPLE=y
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_catalog.c b/drivers/gpu/drm/msm/sde/sde_hw_catalog.c
index 30a703e..625a1bb 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_catalog.c
+++ b/drivers/gpu/drm/msm/sde/sde_hw_catalog.c
@@ -1137,6 +1137,12 @@ static void _sde_sspp_setup_vig(struct sde_mdss_cfg *sde_cfg,
 			sde_cfg->true_inline_dwnscale_nrt;
 		sblk->in_rot_maxheight =
 			MAX_PRE_ROT_HEIGHT_INLINE_ROT_DEFAULT;
+		sblk->in_rot_prefill_fudge_lines =
+			sde_cfg->true_inline_prefill_fudge_lines;
+		sblk->in_rot_prefill_lines_nv12 =
+			sde_cfg->true_inline_prefill_lines_nv12;
+		sblk->in_rot_prefill_lines =
+			sde_cfg->true_inline_prefill_lines;
 	}
 
 	if (sde_cfg->sc_cfg.has_sys_cache) {
@@ -3807,6 +3813,9 @@ static int _sde_hardware_pre_caps(struct sde_mdss_cfg *sde_cfg, uint32_t hw_rev)
 			MAX_DOWNSCALE_RATIO_INLINE_ROT_RT_DEFAULT;
 		sde_cfg->true_inline_dwnscale_nrt =
 			MAX_DOWNSCALE_RATIO_INLINE_ROT_NRT_DEFAULT;
+		sde_cfg->true_inline_prefill_fudge_lines = 2;
+		sde_cfg->true_inline_prefill_lines_nv12 = 32;
+		sde_cfg->true_inline_prefill_lines = 48;
 		sde_cfg->uidle_cfg.uidle_rev = SDE_UIDLE_VERSION_1_0_0;
 	} else {
 		SDE_ERROR("unsupported chipset id:%X\n", hw_rev);
diff --git a/drivers/gpu/drm/msm/sde/sde_hw_catalog.h b/drivers/gpu/drm/msm/sde/sde_hw_catalog.h
index 458e9d8..35ad54d 100644
--- a/drivers/gpu/drm/msm/sde/sde_hw_catalog.h
+++ b/drivers/gpu/drm/msm/sde/sde_hw_catalog.h
@@ -591,6 +591,9 @@ struct sde_qos_lut_tbl {
  * @in_rot_maxdwnscale_rt: max downscale ratio for inline rotation rt clients
  * @in_rot_maxdwnscale_nrt: max downscale ratio for inline rotation nrt clients
  * @in_rot_maxheight: max pre rotated height for inline rotation
+ * @in_rot_prefill_fudge_lines: prefill fudge lines for inline rotation
+ * @in_rot_prefill_lines_mv12: prefill lines for nv12 format inline rotation
+ * @in_rot_prefill_lines: prefill lines for inline rotation
  * @llcc_scid: scid for the system cache
  * @llcc_slice size: slice size of the system cache
  */
@@ -625,6 +628,9 @@ struct sde_sspp_sub_blks {
 	u32 in_rot_maxdwnscale_rt;
 	u32 in_rot_maxdwnscale_nrt;
 	u32 in_rot_maxheight;
+	u32 in_rot_prefill_fudge_lines;
+	u32 in_rot_prefill_lines_nv12;
+	u32 in_rot_prefill_lines;
 	int llcc_scid;
 	size_t llcc_slice_size;
 };
@@ -1155,6 +1161,9 @@ struct sde_perf_cfg {
  * @true_inline_rot_rev	inline rotator feature revision
  * @true_inline_dwnscale_rt    true inline rotator downscale ratio for rt
  * @true_inline_dwnscale_nrt    true inline rotator downscale ratio for nrt
+ * @true_inline_prefill_fudge_lines    true inline rotator prefill fudge lines
+ * @true_inline_prefill_lines_nv12    true inline prefill lines for nv12 format
+ * @true_inline_prefill_lines    true inline prefill lines
  * @macrotile_mode     UBWC parameter for macro tile channel distribution
  * @pipe_order_type    indicate if it is required to specify pipe order
  * @delay_prg_fetch_start indicates if throttling the fetch start is required
@@ -1208,6 +1217,9 @@ struct sde_mdss_cfg {
 	u32 true_inline_rot_rev;
 	u32 true_inline_dwnscale_rt;
 	u32 true_inline_dwnscale_nrt;
+	u32 true_inline_prefill_fudge_lines;
+	u32 true_inline_prefill_lines_nv12;
+	u32 true_inline_prefill_lines;
 	u32 macrotile_mode;
 	u32 pipe_order_type;
 	bool delay_prg_fetch_start;
diff --git a/drivers/gpu/drm/msm/sde/sde_plane.c b/drivers/gpu/drm/msm/sde/sde_plane.c
index f66e21f..9de9529 100644
--- a/drivers/gpu/drm/msm/sde/sde_plane.c
+++ b/drivers/gpu/drm/msm/sde/sde_plane.c
@@ -3532,6 +3532,12 @@ static void _sde_plane_install_properties(struct drm_plane *plane,
 			psde->pipe_sblk->in_rot_maxdwnscale_nrt);
 		sde_kms_info_add_keyint(info, "true_inline_max_height",
 			psde->pipe_sblk->in_rot_maxheight);
+		sde_kms_info_add_keyint(info, "true_inline_prefill_fudge_lines",
+			psde->pipe_sblk->in_rot_prefill_fudge_lines);
+		sde_kms_info_add_keyint(info, "true_inline_prefill_lines_nv12",
+			psde->pipe_sblk->in_rot_prefill_lines_nv12);
+		sde_kms_info_add_keyint(info, "true_inline_prefill_lines",
+			psde->pipe_sblk->in_rot_prefill_lines);
 
 		inline_rot_fmt_list = psde->pipe_sblk->in_rot_format_list;
 
diff --git a/drivers/input/misc/qpnp-power-on.c b/drivers/input/misc/qpnp-power-on.c
index 4220b60a..577d57b 100644
--- a/drivers/input/misc/qpnp-power-on.c
+++ b/drivers/input/misc/qpnp-power-on.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/debugfs.h>
@@ -79,6 +79,9 @@
 #define QPNP_PON_PS_HOLD_RST_CTL2(pon)		((pon)->base + 0x5B)
 #define QPNP_PON_WD_RST_S2_CTL(pon)		((pon)->base + 0x56)
 #define QPNP_PON_WD_RST_S2_CTL2(pon)		((pon)->base + 0x57)
+#define QPNP_PON_SW_RST_S2_CTL(pon)		((pon)->base + 0x62)
+#define QPNP_PON_SW_RST_S2_CTL2(pon)		((pon)->base + 0x63)
+#define QPNP_PON_SW_RST_GO(pon)			((pon)->base + 0x64)
 #define QPNP_PON_S3_SRC(pon)			((pon)->base + 0x74)
 #define QPNP_PON_S3_DBC_CTL(pon)		((pon)->base + 0x75)
 #define QPNP_PON_SMPL_CTL(pon)			((pon)->base + 0x7F)
@@ -88,6 +91,7 @@
 #define QPNP_PON_SEC_ACCESS(pon)		((pon)->base + 0xD0)
 
 #define QPNP_PON_SEC_UNLOCK			0xA5
+#define QPNP_PON_SW_RST_GO_VAL			0xA5
 
 #define QPNP_PON_WARM_RESET_TFT			BIT(4)
 
@@ -229,6 +233,7 @@ module_param_named(
 );
 
 static struct qpnp_pon *sys_reset_dev;
+static struct qpnp_pon *modem_reset_dev;
 static DEFINE_SPINLOCK(spon_list_slock);
 static LIST_HEAD(spon_dev_list);
 
@@ -310,6 +315,17 @@ qpnp_pon_masked_write(struct qpnp_pon *pon, u16 addr, u8 mask, u8 val)
 	return rc;
 }
 
+static int qpnp_pon_write(struct qpnp_pon *pon, u16 addr, u8 val)
+{
+	int rc;
+
+	rc = regmap_write(pon->regmap, addr, val);
+	if (rc)
+		dev_err(pon->dev, "Register write failed, addr=0x%04X, rc=%d\n",
+			addr, rc);
+	return rc;
+}
+
 static int qpnp_pon_read(struct qpnp_pon *pon, u16 addr, unsigned int *val)
 {
 	int rc;
@@ -685,6 +701,53 @@ int qpnp_pon_system_pwr_off(enum pon_power_off_type type)
 }
 EXPORT_SYMBOL(qpnp_pon_system_pwr_off);
 
+/**
+ * qpnp_pon_modem_pwr_off() - shutdown or reset the modem PMIC
+ * @type: Determines the type of power off to perform - shutdown, reset, etc
+ *
+ * This function causes the immediate shutdown or reset of the primary PMIC
+ * for an attached modem chip.
+ *
+ * Return: 0 for success or < 0 for errors
+ */
+int qpnp_pon_modem_pwr_off(enum pon_power_off_type type)
+{
+	struct qpnp_pon *pon = modem_reset_dev;
+	int rc;
+
+	if (!modem_reset_dev)
+		return -ENODEV;
+
+	rc = qpnp_pon_write(pon, QPNP_PON_SW_RST_S2_CTL2(pon), 0);
+	if (rc)
+		return rc;
+
+	/* Wait for at least 10 sleep clock cycles. */
+	udelay(500);
+
+	rc = qpnp_pon_write(pon, QPNP_PON_SW_RST_S2_CTL(pon), type);
+	if (rc)
+		return rc;
+
+	rc = qpnp_pon_write(pon, QPNP_PON_SW_RST_S2_CTL2(pon),
+				QPNP_PON_RESET_EN);
+	if (rc)
+		return rc;
+
+	/* Wait for at least 10 sleep clock cycles. */
+	udelay(500);
+
+	rc = qpnp_pon_write(pon, QPNP_PON_SW_RST_GO(pon),
+				QPNP_PON_SW_RST_GO_VAL);
+	if (rc)
+		return rc;
+
+	dev_dbg(pon->dev, "modem sw power off type = 0x%02X\n", type);
+
+	return 0;
+}
+EXPORT_SYMBOL(qpnp_pon_modem_pwr_off);
+
 static int _qpnp_pon_is_warm_reset(struct qpnp_pon *pon)
 {
 	if (!pon)
@@ -2190,7 +2253,7 @@ static int qpnp_pon_probe(struct platform_device *pdev)
 	struct qpnp_pon *pon;
 	unsigned long flags;
 	u32 base, delay;
-	bool sys_reset;
+	bool sys_reset, modem_reset;
 	int rc;
 
 	pon = devm_kzalloc(dev, sizeof(*pon), GFP_KERNEL);
@@ -2217,6 +2280,15 @@ static int qpnp_pon_probe(struct platform_device *pdev)
 		return -EINVAL;
 	}
 
+	modem_reset = of_property_read_bool(dev->of_node, "qcom,modem-reset");
+	if (modem_reset && modem_reset_dev) {
+		dev_err(dev, "qcom,modem-reset property must only be specified for one PMIC PON device in the system\n");
+		return -EINVAL;
+	} else if (modem_reset && sys_reset) {
+		dev_err(dev, "qcom,modem-reset and qcom,system-reset properties cannot be supported together for one PMIC PON device\n");
+		return -EINVAL;
+	}
+
 	/* Get the total number of pon configurations and regulators */
 	for_each_available_child_of_node(dev->of_node, node) {
 		if (of_find_property(node, "regulator-name", NULL)) {
@@ -2276,6 +2348,9 @@ static int qpnp_pon_probe(struct platform_device *pdev)
 		if (sys_reset) {
 			dev_err(dev, "qcom,system-reset property shouldn't be used along with qcom,secondary-pon-reset property\n");
 			return -EINVAL;
+		} else if (modem_reset) {
+			dev_err(dev, "qcom,modem-reset property shouldn't be used along with qcom,secondary-pon-reset property\n");
+			return -EINVAL;
 		}
 		spin_lock_irqsave(&spon_list_slock, flags);
 		list_add(&pon->list, &spon_dev_list);
@@ -2297,6 +2372,8 @@ static int qpnp_pon_probe(struct platform_device *pdev)
 
 	if (sys_reset)
 		sys_reset_dev = pon;
+	if (modem_reset)
+		modem_reset_dev = pon;
 
 	qpnp_pon_debugfs_init(pon);
 
diff --git a/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_virtual_core.c b/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_virtual_core.c
index 07c3113..edeafcd 100644
--- a/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_virtual_core.c
+++ b/drivers/media/platform/msm/camera/cam_cdm/cam_cdm_virtual_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/delay.h>
@@ -111,6 +111,14 @@ int cam_virtual_cdm_submit_bl(struct cam_hw_info *cdm_hw,
 
 		if ((!rc) && (vaddr_ptr) && (len) &&
 			(len >= cdm_cmd->cmd[i].offset)) {
+
+
+			if ((len - cdm_cmd->cmd[i].offset) <=
+				cdm_cmd->cmd[i].len) {
+				CAM_ERR(CAM_CDM, "Not enough buffer");
+				rc = -EINVAL;
+				break;
+			}
 			CAM_DBG(CAM_CDM,
 				"hdl=%x vaddr=%pK offset=%d cmdlen=%d:%zu",
 				cdm_cmd->cmd[i].bl_addr.mem_handle,
diff --git a/drivers/media/platform/msm/camera/cam_core/cam_context.c b/drivers/media/platform/msm/camera/cam_core/cam_context.c
index e972908..85908a3b 100644
--- a/drivers/media/platform/msm/camera/cam_core/cam_context.c
+++ b/drivers/media/platform/msm/camera/cam_core/cam_context.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/slab.h>
@@ -165,6 +165,7 @@ int cam_context_handle_crm_apply_req(struct cam_context *ctx,
 		return -EINVAL;
 	}
 
+	mutex_lock(&ctx->ctx_mutex);
 	if (ctx->state_machine[ctx->state].crm_ops.apply_req) {
 		rc = ctx->state_machine[ctx->state].crm_ops.apply_req(ctx,
 			apply);
@@ -173,6 +174,7 @@ int cam_context_handle_crm_apply_req(struct cam_context *ctx,
 			ctx->dev_hdl, ctx->state);
 		rc = -EPROTO;
 	}
+	mutex_unlock(&ctx->ctx_mutex);
 
 	return rc;
 }
diff --git a/drivers/media/platform/msm/camera/cam_core/cam_context_utils.c b/drivers/media/platform/msm/camera/cam_core/cam_context_utils.c
index 7ba23a5..2a83f0e 100644
--- a/drivers/media/platform/msm/camera/cam_core/cam_context_utils.c
+++ b/drivers/media/platform/msm/camera/cam_core/cam_context_utils.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/debugfs.h>
@@ -268,6 +268,7 @@ int32_t cam_context_prepare_dev_to_hw(struct cam_context *ctx,
 	uintptr_t packet_addr;
 	struct cam_packet *packet;
 	size_t len = 0;
+	size_t remain_len = 0;
 	int32_t i = 0, j = 0;
 
 	if (!ctx || !cmd) {
@@ -313,11 +314,26 @@ int32_t cam_context_prepare_dev_to_hw(struct cam_context *ctx,
 		goto free_req;
 	}
 
+	if ((len < sizeof(struct cam_packet)) ||
+		(cmd->offset >= (len - sizeof(struct cam_packet)))) {
+		CAM_ERR(CAM_CTXT, "Not enough buf");
+		return -EINVAL;
+
+	}
+	remain_len = len;
+	if ((len < sizeof(struct cam_packet)) ||
+		((size_t)cmd->offset >= len - sizeof(struct cam_packet))) {
+		CAM_ERR(CAM_CTXT, "invalid buff length: %zu or offset", len);
+		rc = -EINVAL;
+		goto free_cpu_buf;
+	}
+
+	remain_len -= (size_t)cmd->offset;
 	packet = (struct cam_packet *) ((uint8_t *)packet_addr +
 		(uint32_t)cmd->offset);
 
 	if (packet->header.request_id <= ctx->last_flush_req) {
-		CAM_DBG(CAM_CORE,
+		CAM_ERR(CAM_CORE,
 			"request %lld has been flushed, reject packet",
 			packet->header.request_id);
 		rc = -EINVAL;
@@ -330,6 +346,7 @@ int32_t cam_context_prepare_dev_to_hw(struct cam_context *ctx,
 	/* preprocess the configuration */
 	memset(&cfg, 0, sizeof(cfg));
 	cfg.packet = packet;
+	cfg.remain_len = remain_len;
 	cfg.ctxt_to_hw_map = ctx->ctxt_to_hw_map;
 	cfg.max_hw_update_entries = CAM_CTX_CFG_MAX;
 	cfg.num_hw_update_entries = req->num_hw_update_entries;
diff --git a/drivers/media/platform/msm/camera/cam_core/cam_hw_mgr_intf.h b/drivers/media/platform/msm/camera/cam_core/cam_hw_mgr_intf.h
index 82c1786..7f679d5 100644
--- a/drivers/media/platform/msm/camera/cam_core/cam_hw_mgr_intf.h
+++ b/drivers/media/platform/msm/camera/cam_core/cam_hw_mgr_intf.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #ifndef _CAM_HW_MGR_INTF_H_
@@ -146,6 +146,7 @@ struct cam_hw_mgr_dump_pf_data {
  * struct cam_hw_prepare_update_args - Payload for prepare command
  *
  * @packet:                CSL packet from user mode driver
+ * @remain_len             Remaining length of CPU buffer after config offset
  * @ctxt_to_hw_map:        HW context from the acquire
  * @max_hw_update_entries: Maximum hardware update entries supported
  * @hw_update_entries:     Actual hardware update configuration (returned)
@@ -162,6 +163,7 @@ struct cam_hw_mgr_dump_pf_data {
  */
 struct cam_hw_prepare_update_args {
 	struct cam_packet              *packet;
+	size_t                          remain_len;
 	void                           *ctxt_to_hw_map;
 	uint32_t                        max_hw_update_entries;
 	struct cam_hw_update_entry     *hw_update_entries;
diff --git a/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/cam_fd_hw_mgr.c b/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/cam_fd_hw_mgr.c
index da190f9b..2509a16 100644
--- a/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/cam_fd_hw_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_fd/fd_hw_mgr/cam_fd_hw_mgr.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -23,7 +23,8 @@
 
 static struct cam_fd_hw_mgr g_fd_hw_mgr;
 
-static int cam_fd_mgr_util_packet_validate(struct cam_packet *packet)
+static int cam_fd_mgr_util_packet_validate(struct cam_packet *packet,
+	size_t remain_len)
 {
 	struct cam_cmd_buf_desc *cmd_desc = NULL;
 	int i, rc;
@@ -43,7 +44,7 @@ static int cam_fd_mgr_util_packet_validate(struct cam_packet *packet)
 		packet->patch_offset, packet->num_patches,
 		packet->kmd_cmd_buf_offset, packet->kmd_cmd_buf_index);
 
-	if (cam_packet_util_validate_packet(packet)) {
+	if (cam_packet_util_validate_packet(packet, remain_len)) {
 		CAM_ERR(CAM_FD, "invalid packet:%d %d %d %d %d",
 			packet->kmd_cmd_buf_index,
 			packet->num_cmd_buf, packet->cmd_buf_offset,
@@ -155,8 +156,10 @@ static int cam_fd_mgr_util_put_frame_req(
 
 	mutex_lock(&g_fd_hw_mgr.frame_req_mutex);
 	req_ptr = *frame_req;
-	if (req_ptr)
+	if (req_ptr) {
+		list_del_init(&req_ptr->list);
 		list_add_tail(&req_ptr->list, src_list);
+	}
 	*frame_req = NULL;
 	mutex_unlock(&g_fd_hw_mgr.frame_req_mutex);
 
@@ -602,7 +605,14 @@ static int cam_fd_mgr_util_prepare_io_buf_info(int32_t iommu_hdl,
 						rc);
 					goto rel_cpu_buf;
 				}
-
+				if (io_cfg[i].offsets[plane] >= size) {
+					CAM_ERR(CAM_FD,
+						"Invalid cpu buf %d %d %d",
+						io_cfg[i].direction,
+						io_cfg[i].resource_type, plane);
+					rc = -EINVAL;
+					goto rel_cpu_buf;
+				}
 				cpu_addr[plane] += io_cfg[i].offsets[plane];
 			}
 
@@ -1458,6 +1468,16 @@ static int cam_fd_mgr_hw_flush_ctx(void *hw_mgr_priv,
 	for (i = 0; i < flush_args->num_req_pending; i++) {
 		flush_req = (struct cam_fd_mgr_frame_request *)
 			flush_args->flush_req_pending[i];
+		CAM_DBG(CAM_FD, "flush pending req %llu",
+			flush_req->request_id);
+		cam_fd_mgr_util_put_frame_req(&hw_mgr->frame_free_list,
+			&flush_req);
+	}
+
+	for (i = 0; i < flush_args->num_req_active; i++) {
+		flush_req = (struct cam_fd_mgr_frame_request *)
+			flush_args->flush_req_active[i];
+		CAM_DBG(CAM_FD, "flush active req %llu", flush_req->request_id);
 		cam_fd_mgr_util_put_frame_req(&hw_mgr->frame_free_list,
 			&flush_req);
 	}
@@ -1573,7 +1593,8 @@ static int cam_fd_mgr_hw_prepare_update(void *hw_mgr_priv,
 		goto error;
 	}
 
-	rc = cam_fd_mgr_util_packet_validate(prepare->packet);
+	rc = cam_fd_mgr_util_packet_validate(prepare->packet,
+		prepare->remain_len);
 	if (rc) {
 		CAM_ERR(CAM_FD, "Error in packet validation %d", rc);
 		goto error;
diff --git a/drivers/media/platform/msm/camera/cam_icp/icp_hw/bps_hw/bps_core.c b/drivers/media/platform/msm/camera/cam_icp/icp_hw/bps_hw/bps_core.c
index 8b788f2..cbb76ae 100644
--- a/drivers/media/platform/msm/camera/cam_icp/icp_hw/bps_hw/bps_core.c
+++ b/drivers/media/platform/msm/camera/cam_icp/icp_hw/bps_hw/bps_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/of.h>
@@ -219,6 +219,13 @@ static int cam_bps_cmd_reset(struct cam_hw_soc_info *soc_info,
 	bool reset_bps_top_fail = false;
 
 	CAM_DBG(CAM_ICP, "CAM_ICP_BPS_CMD_RESET");
+
+	if (!core_info->clk_enable || !core_info->cpas_start) {
+		CAM_ERR(CAM_ICP, "BPS reset failed. clk_en %d cpas_start %d",
+				core_info->clk_enable, core_info->cpas_start);
+		return -EINVAL;
+	}
+
 	/* Reset BPS CDM core*/
 	cam_io_w_mb((uint32_t)0xF,
 		soc_info->reg_map[0].mem_base + BPS_CDM_RST_CMD);
diff --git a/drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c b/drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c
index 7de943c..882e2b0 100644
--- a/drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_icp/icp_hw/icp_hw_mgr/cam_icp_hw_mgr.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/uaccess.h>
@@ -3772,6 +3772,9 @@ static int cam_icp_mgr_prepare_hw_update(void *hw_mgr_priv,
 
 	packet = prepare_args->packet;
 
+	if (cam_packet_util_validate_packet(packet, prepare_args->remain_len))
+		return -EINVAL;
+
 	rc = cam_icp_mgr_pkt_validation(packet);
 	if (rc) {
 		mutex_unlock(&ctx_data->ctx_mutex);
diff --git a/drivers/media/platform/msm/camera/cam_icp/icp_hw/ipe_hw/ipe_core.c b/drivers/media/platform/msm/camera/cam_icp/icp_hw/ipe_hw/ipe_core.c
index c023665..731a5dc 100644
--- a/drivers/media/platform/msm/camera/cam_icp/icp_hw/ipe_hw/ipe_core.c
+++ b/drivers/media/platform/msm/camera/cam_icp/icp_hw/ipe_hw/ipe_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/of.h>
@@ -215,6 +215,12 @@ static int cam_ipe_cmd_reset(struct cam_hw_soc_info *soc_info,
 	bool reset_ipe_top_fail = false;
 
 	CAM_DBG(CAM_ICP, "CAM_ICP_IPE_CMD_RESET");
+	if (!core_info->clk_enable || !core_info->cpas_start) {
+		CAM_ERR(CAM_HFI, "IPE reset failed. clk_en %d cpas_start %d",
+				core_info->clk_enable, core_info->cpas_start);
+		return -EINVAL;
+	}
+
 	/* IPE CDM core reset*/
 	cam_io_w_mb((uint32_t)0xF,
 		soc_info->reg_map[0].mem_base + IPE_CDM_RST_CMD);
diff --git a/drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c b/drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c
index 13529f6..f514850 100644
--- a/drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c
+++ b/drivers/media/platform/msm/camera/cam_isp/cam_isp_context.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/debugfs.h>
@@ -122,6 +122,8 @@ static void cam_isp_ctx_dump_req(struct cam_isp_ctx_req *req_isp)
 	size_t len = 0;
 	uint32_t *buf_addr;
 	uint32_t *buf_start, *buf_end;
+	size_t   remain_len = 0;
+	bool     need_put = false;
 
 	for (i = 0; i < req_isp->num_cfg; i++) {
 		rc = cam_packet_util_get_cmd_mem_addr(
@@ -131,20 +133,31 @@ static void cam_isp_ctx_dump_req(struct cam_isp_ctx_req *req_isp)
 				"Failed to get_cmd_mem_addr, rc=%d",
 				rc);
 		} else {
-			buf_start = (uint32_t *)((uint8_t *) buf_addr +
-				req_isp->cfg[i].offset);
-			buf_end = (uint32_t *)((uint8_t *) buf_start +
-				req_isp->cfg[i].len - 1);
-			if (len < (buf_end - buf_start + 1)) {
-				CAM_ERR(CAM_ISP,
-					"Invalid len %lld buf_start-end=%d",
-					len, (buf_end - buf_start + 1));
+			if (req_isp->cfg[i].offset >= len) {
+				CAM_ERR(CAM_ISP, "Invalid offset");
+				need_put = true;
+				goto put;
+			}
+			remain_len = len - req_isp->cfg[i].offset;
+
+			if (req_isp->cfg[i].len > remain_len) {
+				CAM_ERR(CAM_ISP, "Invalid offset");
+				need_put = true;
+			}
+put:
+			if (need_put) {
 				if (cam_mem_put_cpu_buf(req_isp->cfg[i].handle))
 					CAM_WARN(CAM_ISP,
 						"Failed to put cpu buf: 0x%x",
 						req_isp->cfg[i].handle);
+				need_put = false;
 				continue;
 			}
+
+			buf_start = (uint32_t *)((uint8_t *) buf_addr +
+				req_isp->cfg[i].offset);
+			buf_end = (uint32_t *)((uint8_t *) buf_start +
+				req_isp->cfg[i].len - 1);
 			cam_cdm_util_dump_cmd_buf(buf_start, buf_end);
 			if (cam_mem_put_cpu_buf(req_isp->cfg[i].handle))
 				CAM_WARN(CAM_ISP, "Failed to put cpu buf: 0x%x",
@@ -417,10 +430,11 @@ static int __cam_isp_ctx_handle_buf_done_in_activated_state(
 
 		if (!req_isp->bubble_detected) {
 			CAM_DBG(CAM_ISP,
-				"Sync with success: req %lld res 0x%x fd 0x%x",
+				"Sync with success: req %lld res 0x%x fd 0x%x, ctx %u",
 				req->request_id,
 				req_isp->fence_map_out[j].resource_handle,
-				req_isp->fence_map_out[j].sync_id);
+				req_isp->fence_map_out[j].sync_id,
+				ctx->ctx_id);
 
 			rc = cam_sync_signal(req_isp->fence_map_out[j].sync_id,
 				CAM_SYNC_STATE_SIGNALED_SUCCESS);
@@ -428,11 +442,12 @@ static int __cam_isp_ctx_handle_buf_done_in_activated_state(
 				CAM_DBG(CAM_ISP, "Sync failed with rc = %d",
 					 rc);
 		} else if (!req_isp->bubble_report) {
-			CAM_DBG(CAM_ISP,
-				"Sync with failure: req %lld res 0x%x fd 0x%x",
+			CAM_ERR(CAM_ISP,
+				"Sync with failure: req %lld res 0x%x fd 0x%x, ctx %u",
 				req->request_id,
 				req_isp->fence_map_out[j].resource_handle,
-				req_isp->fence_map_out[j].sync_id);
+				req_isp->fence_map_out[j].sync_id,
+				ctx->ctx_id);
 
 			rc = cam_sync_signal(req_isp->fence_map_out[j].sync_id,
 				CAM_SYNC_STATE_SIGNALED_ERROR);
@@ -453,9 +468,9 @@ static int __cam_isp_ctx_handle_buf_done_in_activated_state(
 			continue;
 		}
 
-		CAM_DBG(CAM_ISP, "req %lld, reset sync id 0x%x",
+		CAM_DBG(CAM_ISP, "req %lld, reset sync id 0x%x ctx %u",
 			req->request_id,
-			req_isp->fence_map_out[j].sync_id);
+			req_isp->fence_map_out[j].sync_id, ctx->ctx_id);
 		if (!rc) {
 			req_isp->num_acked++;
 			req_isp->fence_map_out[j].sync_id = -1;
@@ -465,9 +480,9 @@ static int __cam_isp_ctx_handle_buf_done_in_activated_state(
 	if (req_isp->num_acked > req_isp->num_fence_map_out) {
 		/* Should not happen */
 		CAM_ERR(CAM_ISP,
-			"WARNING: req_id %lld num_acked %d > map_out %d",
+			"WARNING: req_id %lld num_acked %d > map_out %d, ctx %u",
 			req->request_id, req_isp->num_acked,
-			req_isp->num_fence_map_out);
+			req_isp->num_fence_map_out, ctx->ctx_id);
 		WARN_ON(req_isp->num_acked > req_isp->num_fence_map_out);
 	}
 
@@ -484,15 +499,15 @@ static int __cam_isp_ctx_handle_buf_done_in_activated_state(
 		atomic_set(&ctx_isp->process_bubble, 0);
 
 		CAM_DBG(CAM_REQ,
-			"Move active request %lld to pending list(cnt = %d) [bubble recovery]",
-			 req->request_id, ctx_isp->active_req_cnt);
+			"Move active request %lld to pending list(cnt = %d) [bubble recovery], ctx %u",
+			 req->request_id, ctx_isp->active_req_cnt, ctx->ctx_id);
 	} else {
 		list_del_init(&req->list);
 		list_add_tail(&req->list, &ctx->free_req_list);
 
 		CAM_DBG(CAM_REQ,
-			"Move active request %lld to free list(cnt = %d) [all fences done]",
-			 req->request_id, ctx_isp->active_req_cnt);
+			"Move active request %lld to free list(cnt = %d) [all fences done], ctx %u",
+			 req->request_id, ctx_isp->active_req_cnt, ctx->ctx_id);
 	}
 
 end:
@@ -591,14 +606,15 @@ static int __cam_isp_ctx_reg_upd_in_activated_state(
 	if (req_isp->num_fence_map_out != 0) {
 		list_add_tail(&req->list, &ctx->active_req_list);
 		ctx_isp->active_req_cnt++;
-		CAM_DBG(CAM_REQ, "move request %lld to active list(cnt = %d)",
-			 req->request_id, ctx_isp->active_req_cnt);
+		CAM_DBG(CAM_REQ,
+			"move request %lld to active list(cnt = %d), ctx %u",
+			req->request_id, ctx_isp->active_req_cnt, ctx->ctx_id);
 	} else {
 		/* no io config, so the request is completed. */
 		list_add_tail(&req->list, &ctx->free_req_list);
 		CAM_DBG(CAM_ISP,
-			"move active request %lld to free list(cnt = %d)",
-			 req->request_id, ctx_isp->active_req_cnt);
+			"move active request %lld to free list(cnt = %d), ctx %u",
+			req->request_id, ctx_isp->active_req_cnt, ctx->ctx_id);
 	}
 
 	/*
@@ -637,8 +653,8 @@ static int __cam_isp_ctx_notify_sof_in_activated_state(
 			notify.trigger = CAM_TRIGGER_POINT_SOF;
 
 			ctx->ctx_crm_intf->notify_trigger(&notify);
-			CAM_DBG(CAM_ISP, "Notify CRM  SOF frame %lld",
-				ctx_isp->frame_id);
+			CAM_DBG(CAM_ISP, "Notify CRM  SOF frame %lld ctx %u",
+				ctx_isp->frame_id, ctx->ctx_id);
 		}
 
 		list_for_each_entry(req, &ctx->active_req_list, list) {
@@ -655,7 +671,9 @@ static int __cam_isp_ctx_notify_sof_in_activated_state(
 		__cam_isp_ctx_send_sof_timestamp(ctx_isp, request_id,
 			CAM_REQ_MGR_SOF_EVENT_SUCCESS);
 	} else {
-		CAM_ERR_RATE_LIMIT(CAM_ISP, "Can not notify SOF to CRM");
+		CAM_ERR_RATE_LIMIT(CAM_ISP,
+			"Can not notify SOF to CRM for ctx %u",
+			ctx->ctx_id);
 		rc = -EFAULT;
 	}
 
@@ -680,10 +698,11 @@ static int __cam_isp_ctx_notify_eof_in_activated_state(
 		notify.trigger = CAM_TRIGGER_POINT_EOF;
 
 		ctx->ctx_crm_intf->notify_trigger(&notify);
-		CAM_DBG(CAM_ISP, "Notify CRM EOF frame %lld\n",
-			ctx_isp->frame_id);
+		CAM_DBG(CAM_ISP, "Notify CRM EOF frame %lld ctx %u",
+			ctx_isp->frame_id, ctx->ctx_id);
 	} else {
-		CAM_ERR(CAM_ISP, "Can not notify EOF to CRM");
+		CAM_ERR(CAM_ISP, "Can not notify EOF to CRM for ctx %u",
+			ctx->ctx_id);
 		rc = -EFAULT;
 	}
 
@@ -718,8 +737,8 @@ static int __cam_isp_ctx_sof_in_activated_state(
 	ctx_isp->boot_timestamp = sof_event_data->boot_time;
 	__cam_isp_ctx_update_state_monitor_array(ctx_isp,
 		CAM_ISP_STATE_CHANGE_TRIGGER_SOF, req->request_id);
-	CAM_DBG(CAM_ISP, "frame id: %lld time stamp:0x%llx",
-		ctx_isp->frame_id, ctx_isp->sof_timestamp_val);
+	CAM_DBG(CAM_ISP, "frame id: %lld time stamp:0x%llx, ctx %u",
+		ctx_isp->frame_id, ctx_isp->sof_timestamp_val, ctx->ctx_id);
 
 	return rc;
 }
@@ -800,8 +819,8 @@ static int __cam_isp_ctx_epoch_in_applied(struct cam_isp_context *ctx_isp,
 		notify.error = CRM_KMD_ERR_BUBBLE;
 		ctx->ctx_crm_intf->notify_err(&notify);
 		atomic_set(&ctx_isp->process_bubble, 1);
-		CAM_DBG(CAM_ISP, "Notify CRM about Bubble frame %lld",
-			ctx_isp->frame_id);
+		CAM_DBG(CAM_ISP, "Notify CRM about Bubble frame %lld, ctx %u",
+			ctx_isp->frame_id, ctx->ctx_id);
 	} else {
 		req_isp->bubble_report = 0;
 	}
@@ -810,8 +829,8 @@ static int __cam_isp_ctx_epoch_in_applied(struct cam_isp_context *ctx_isp,
 	 * Always move the request to active list. Let buf done
 	 * function handles the rest.
 	 */
-	CAM_DBG(CAM_REQ, "move request %lld to active list(cnt = %d)",
-		req->request_id, ctx_isp->active_req_cnt);
+	CAM_DBG(CAM_REQ, "move request %lld to active list(cnt = %d), ctx %u",
+		req->request_id, ctx_isp->active_req_cnt, ctx->ctx_id);
 	ctx_isp->active_req_cnt++;
 	list_del_init(&req->list);
 	list_add_tail(&req->list, &ctx->active_req_list);
@@ -949,8 +968,8 @@ static int __cam_isp_ctx_epoch_in_bubble_applied(
 		notify.error = CRM_KMD_ERR_BUBBLE;
 		ctx->ctx_crm_intf->notify_err(&notify);
 		CAM_DBG(CAM_REQ,
-			"Notify CRM about Bubble req_id %llu frame %lld",
-			req->request_id, ctx_isp->frame_id);
+			"Notify CRM about Bubble req_id %llu frame %lld, ctx %u",
+			req->request_id, ctx_isp->frame_id, ctx->ctx_id);
 	} else {
 		req_isp->bubble_report = 0;
 	}
@@ -959,7 +978,7 @@ static int __cam_isp_ctx_epoch_in_bubble_applied(
 	 * Always move the request to active list. Let buf done
 	 * function handles the rest.
 	 */
-	CAM_DBG(CAM_ISP, "move request %lld to active list(cnt = %d)",
+	CAM_DBG(CAM_ISP, "move request %lld to active list(cnt = %d) ctx %u",
 		req->request_id, ctx_isp->active_req_cnt);
 	ctx_isp->active_req_cnt++;
 	list_del_init(&req->list);
@@ -1065,9 +1084,11 @@ static int __cam_isp_ctx_handle_error(struct cam_isp_context *ctx_isp,
 			for (i = 0; i < req_isp->num_fence_map_out; i++) {
 				fence_map_out =
 					&req_isp->fence_map_out[i];
-				CAM_ERR(CAM_ISP, "req %llu, Sync fd %x",
+				CAM_ERR(CAM_ISP,
+					"req %llu, Sync fd 0x%x ctx %u",
 					req->request_id,
-					req_isp->fence_map_out[i].sync_id);
+					req_isp->fence_map_out[i].sync_id,
+					ctx->ctx_id);
 				if (req_isp->fence_map_out[i].sync_id != -1) {
 					rc = cam_sync_signal(
 						fence_map_out->sync_id,
@@ -1094,9 +1115,11 @@ static int __cam_isp_ctx_handle_error(struct cam_isp_context *ctx_isp,
 			for (i = 0; i < req_isp->num_fence_map_out; i++) {
 				fence_map_out =
 					&req_isp->fence_map_out[i];
-				CAM_ERR(CAM_ISP, "req %llu, Sync fd %x",
+				CAM_ERR(CAM_ISP,
+					"req %llu, Sync fd 0x%x ctx %u",
 					req->request_id,
-					req_isp->fence_map_out[i].sync_id);
+					req_isp->fence_map_out[i].sync_id,
+					ctx->ctx_id);
 				if (req_isp->fence_map_out[i].sync_id != -1) {
 					rc = cam_sync_signal(
 						fence_map_out->sync_id,
@@ -1183,8 +1206,8 @@ static int __cam_isp_ctx_handle_error(struct cam_isp_context *ctx_isp,
 			notify.error = CRM_KMD_ERR_FATAL;
 		}
 
-		CAM_WARN(CAM_ISP, "Notify CRM: req %lld, frame %lld\n",
-			error_request_id, ctx_isp->frame_id);
+		CAM_WARN(CAM_ISP, "Notify CRM: req %lld, frame %lld ctx %u",
+			error_request_id, ctx_isp->frame_id, ctx->ctx_id);
 
 		ctx->ctx_crm_intf->notify_err(&notify);
 
@@ -1207,12 +1230,15 @@ static int __cam_isp_ctx_handle_error(struct cam_isp_context *ctx_isp,
 					V4L_EVENT_CAM_REQ_MGR_ERROR,
 					V4L_EVENT_CAM_REQ_MGR_EVENT))
 				CAM_ERR(CAM_ISP,
-					"Error in notifying the error time for req id:%lld",
-						ctx_isp->last_applied_req_id);
+					"Error in notifying the error time for req id:%lld ctx %u",
+						ctx_isp->last_applied_req_id,
+						ctx->ctx_id);
 		}
 		ctx_isp->substate_activated = CAM_ISP_CTX_ACTIVATED_HW_ERROR;
 	} else {
-		CAM_ERR_RATE_LIMIT(CAM_ISP, "Can not notify ERRROR to CRM");
+		CAM_ERR_RATE_LIMIT(CAM_ISP,
+			"Can not notify ERRROR to CRM for ctx %u",
+			ctx->ctx_id);
 		rc = -EFAULT;
 	}
 
@@ -1649,15 +1675,16 @@ static int __cam_isp_ctx_apply_req_in_activated_state(
 		goto end;
 	}
 
-	CAM_DBG(CAM_REQ, "Apply request %lld in substate %d", req->request_id,
-		ctx_isp->substate_activated);
+	CAM_DBG(CAM_REQ, "Apply request %lld in substate %d ctx %u",
+		req->request_id, ctx_isp->substate_activated, ctx->ctx_id);
 	req_isp = (struct cam_isp_ctx_req *) req->req_priv;
 
 	if (ctx_isp->active_req_cnt >=  2) {
 		CAM_ERR_RATE_LIMIT(CAM_ISP,
-			"Reject apply request (id %lld) due to congestion(cnt = %d)",
+			"Reject apply request (id %lld) due to congestion(cnt = %d) ctx %u",
 			req->request_id,
-			ctx_isp->active_req_cnt);
+			ctx_isp->active_req_cnt,
+			ctx->ctx_id);
 
 		spin_lock_bh(&ctx->lock);
 		if (!list_empty(&ctx->active_req_list))
@@ -2536,6 +2563,7 @@ static int __cam_isp_ctx_config_dev_in_top_state(
 	uintptr_t                         packet_addr;
 	struct cam_packet                *packet;
 	size_t                            len = 0;
+	size_t                            remain_len = 0;
 	struct cam_hw_prepare_update_args cfg;
 	struct cam_req_mgr_add_request    add_req;
 	struct cam_isp_context           *ctx_isp =
@@ -2569,6 +2597,15 @@ static int __cam_isp_ctx_config_dev_in_top_state(
 		goto free_req;
 	}
 
+	remain_len = len;
+	if ((len < sizeof(struct cam_packet)) ||
+		((size_t)cmd->offset >= len - sizeof(struct cam_packet))) {
+		CAM_ERR(CAM_ISP, "invalid buff length: %zu or offset", len);
+		rc = -EINVAL;
+		goto free_cpu_buf;
+	}
+
+	remain_len -= (size_t)cmd->offset;
 	packet = (struct cam_packet *)(packet_addr + (uint32_t)cmd->offset);
 	CAM_DBG(CAM_ISP, "pack_handle %llx", cmd->packet_handle);
 	CAM_DBG(CAM_ISP, "packet address is 0x%zx", packet_addr);
@@ -2591,6 +2628,7 @@ static int __cam_isp_ctx_config_dev_in_top_state(
 	/* preprocess the configuration */
 	memset(&cfg, 0, sizeof(cfg));
 	cfg.packet = packet;
+	cfg.remain_len = remain_len;
 	cfg.ctxt_to_hw_map = ctx_isp->hw_ctx;
 	cfg.max_hw_update_entries = CAM_ISP_CTX_CFG_MAX;
 	cfg.hw_update_entries = req_isp->cfg;
diff --git a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
index 1539fe5..e66cd9b 100644
--- a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/cam_ife_hw_mgr.c
@@ -2353,8 +2353,9 @@ static int cam_ife_mgr_config_hw(void *hw_mgr_priv,
 			}
 	}
 
-	CAM_DBG(CAM_ISP, "Enter ctx id:%d req_id:%lld num_hw_upd_entries %d",
-		ctx->ctx_index, cfg->request_id, cfg->num_hw_update_entries);
+	CAM_DBG(CAM_ISP,
+		"Enter ctx id:%d num_hw_upd_entries %d request id: %llu",
+		ctx->ctx_index, cfg->num_hw_update_entries, cfg->request_id);
 
 	if (cfg->num_hw_update_entries > 0) {
 		cdm_cmd = ctx->cdm_cmd;
@@ -2401,7 +2402,7 @@ static int cam_ife_mgr_config_hw(void *hw_mgr_priv,
 	} else {
 		CAM_ERR(CAM_ISP, "No commands to config");
 	}
-	CAM_DBG(CAM_ISP, "Exit");
+	CAM_DBG(CAM_ISP, "Exit: Config Done: %llu",  cfg->request_id);
 
 	return rc;
 }
@@ -2581,23 +2582,6 @@ static int cam_ife_mgr_stop_hw(void *hw_mgr_priv, void *stop_hw_args)
 
 	CAM_DBG(CAM_ISP, "Halting CSIDs");
 
-	CAM_DBG(CAM_ISP, "Going to stop IFE Mux");
-
-	/* IFE mux in resources */
-	list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) {
-		cam_ife_hw_mgr_stop_hw_res(hw_mgr_res);
-	}
-
-	/* IFE bus rd resources */
-	list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_in_rd, list) {
-		cam_ife_hw_mgr_stop_hw_res(hw_mgr_res);
-	}
-
-	CAM_DBG(CAM_ISP, "Going to stop IFE Out");
-
-	/* IFE out resources */
-	for (i = 0; i < CAM_IFE_HW_OUT_RES_MAX; i++)
-		cam_ife_hw_mgr_stop_hw_res(&ctx->res_list_ife_out[i]);
 	/* get master base index first */
 	for (i = 0; i < ctx->num_base; i++) {
 		if (ctx->base[i].split_id == CAM_ISP_HW_SPLIT_LEFT) {
@@ -2606,15 +2590,6 @@ static int cam_ife_mgr_stop_hw(void *hw_mgr_priv, void *stop_hw_args)
 		}
 	}
 
-	CAM_DBG(CAM_ISP, "Going to stop IFE Mux");
-
-	/* IFE mux in resources */
-	list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) {
-		cam_ife_hw_mgr_stop_hw_res(hw_mgr_res);
-	}
-
-	cam_tasklet_stop(ctx->common.tasklet_info);
-
 	/*
 	 * If Context does not have PIX resources and has only RDI resource
 	 * then take the first base index.
@@ -2654,6 +2629,26 @@ static int cam_ife_mgr_stop_hw(void *hw_mgr_priv, void *stop_hw_args)
 			ctx->base[i].idx, csid_halt_type);
 	}
 
+	CAM_DBG(CAM_ISP, "Going to stop IFE Out");
+
+	/* IFE out resources */
+	for (i = 0; i < CAM_IFE_HW_OUT_RES_MAX; i++)
+		cam_ife_hw_mgr_stop_hw_res(&ctx->res_list_ife_out[i]);
+
+	/* IFE bus rd resources */
+	list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_in_rd, list) {
+		cam_ife_hw_mgr_stop_hw_res(hw_mgr_res);
+	}
+
+	CAM_DBG(CAM_ISP, "Going to stop IFE Mux");
+
+	/* IFE mux in resources */
+	list_for_each_entry(hw_mgr_res, &ctx->res_list_ife_src, list) {
+		cam_ife_hw_mgr_stop_hw_res(hw_mgr_res);
+	}
+
+	cam_tasklet_stop(ctx->common.tasklet_info);
+
 	cam_ife_mgr_pause_hw(ctx);
 
 	if (stop_isp->stop_only)
@@ -2975,7 +2970,6 @@ static int cam_ife_mgr_start_hw(void *hw_mgr_priv, void *start_hw_args)
 
 deinit_hw:
 	cam_ife_hw_mgr_deinit_hw(ctx);
-	ctx->init_done = false;
 
 tasklet_stop:
 	cam_tasklet_stop(ctx->common.tasklet_info);
@@ -3629,7 +3623,8 @@ static int cam_ife_mgr_prepare_hw_update(void *hw_mgr_priv,
 	ctx = (struct cam_ife_hw_mgr_ctx *) prepare->ctxt_to_hw_map;
 	hw_mgr = (struct cam_ife_hw_mgr *)hw_mgr_priv;
 
-	rc = cam_packet_util_validate_packet(prepare->packet);
+	rc = cam_packet_util_validate_packet(prepare->packet,
+		prepare->remain_len);
 	if (rc)
 		return rc;
 
@@ -3820,7 +3815,8 @@ static void cam_ife_mgr_print_io_bufs(struct cam_packet *packet,
 			if (!io_cfg[i].mem_handle[j])
 				break;
 
-			if (GET_FD_FROM_HANDLE(io_cfg[i].mem_handle[j]) ==
+			if (pf_buf_info &&
+				GET_FD_FROM_HANDLE(io_cfg[i].mem_handle[j]) ==
 				GET_FD_FROM_HANDLE(pf_buf_info)) {
 				CAM_INFO(CAM_ISP,
 					"Found PF at port: 0x%x mem 0x%x fd: 0x%x",
diff --git a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/hw_utils/cam_isp_packet_parser.c b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/hw_utils/cam_isp_packet_parser.c
index 0cb1a45..741ffa9 100644
--- a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/hw_utils/cam_isp_packet_parser.c
+++ b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/hw_utils/cam_isp_packet_parser.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <uapi/media/cam_defs.h>
@@ -98,7 +98,7 @@ static int cam_isp_update_dual_config(
 	struct cam_isp_hw_dual_isp_update_args      dual_isp_update_args;
 	uint32_t                                    outport_id;
 	uint32_t                                    ports_plane_idx;
-	size_t                                      len = 0;
+	size_t                                      len = 0, remain_len = 0;
 	uint32_t                                   *cpu_addr;
 	uint32_t                                    i, j;
 
@@ -110,9 +110,22 @@ static int cam_isp_update_dual_config(
 	if (rc)
 		return rc;
 
+	if ((len < sizeof(struct cam_isp_dual_config)) ||
+		(cmd_desc->offset >=
+		(len - sizeof(struct cam_isp_dual_config)))) {
+		CAM_ERR(CAM_UTIL, "not enough buffer provided");
+		return -EINVAL;
+	}
+	remain_len = len - cmd_desc->offset;
 	cpu_addr += (cmd_desc->offset / 4);
 	dual_config = (struct cam_isp_dual_config *)cpu_addr;
 
+	if ((dual_config->num_ports *
+		sizeof(struct cam_isp_dual_stripe_config)) >
+		(remain_len - offsetof(struct cam_isp_dual_config, stripes))) {
+		CAM_ERR(CAM_UTIL, "not enough buffer for all the dual configs");
+		return -EINVAL;
+	}
 	for (i = 0; i < dual_config->num_ports; i++) {
 
 		if (i >= CAM_ISP_IFE_OUT_RES_MAX) {
diff --git a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c
index 165cf79..c7f5600 100644
--- a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c
+++ b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/ife_csid_hw/cam_ife_csid_core.c
@@ -1801,6 +1801,7 @@ static int cam_ife_csid_disable_pxl_path(
 	enum cam_ife_csid_halt_cmd       stop_cmd)
 {
 	int rc = 0;
+	uint32_t val = 0;
 	const struct cam_ife_csid_reg_offset       *csid_reg;
 	struct cam_hw_soc_info                     *soc_info;
 	struct cam_ife_csid_path_cfg               *path_data;
@@ -1861,6 +1862,17 @@ static int cam_ife_csid_disable_pxl_path(
 	cam_io_w_mb(0, soc_info->reg_map[0].mem_base +
 		pxl_reg->csid_pxl_irq_mask_addr);
 
+	if (path_data->sync_mode == CAM_ISP_HW_SYNC_MASTER ||
+		path_data->sync_mode == CAM_ISP_HW_SYNC_NONE) {
+		/* configure Halt */
+		val = cam_io_r_mb(soc_info->reg_map[0].mem_base +
+		pxl_reg->csid_pxl_ctrl_addr);
+		val &= ~0x3;
+		val |= stop_cmd;
+		cam_io_w_mb(val, soc_info->reg_map[0].mem_base +
+			pxl_reg->csid_pxl_ctrl_addr);
+	}
+
 	return rc;
 }
 
@@ -2112,7 +2124,7 @@ static int cam_ife_csid_disable_rdi_path(
 	enum cam_ife_csid_halt_cmd                stop_cmd)
 {
 	int rc = 0;
-	uint32_t id;
+	uint32_t id, val = 0;
 	const struct cam_ife_csid_reg_offset       *csid_reg;
 	struct cam_hw_soc_info                     *soc_info;
 
@@ -2157,6 +2169,62 @@ static int cam_ife_csid_disable_rdi_path(
 	cam_io_w_mb(0, soc_info->reg_map[0].mem_base +
 		csid_reg->rdi_reg[id]->csid_rdi_irq_mask_addr);
 
+	/* Halt the RDI path */
+	val = cam_io_r_mb(soc_info->reg_map[0].mem_base +
+		csid_reg->rdi_reg[id]->csid_rdi_ctrl_addr);
+	val &= ~0x3;
+	val |= stop_cmd;
+	cam_io_w_mb(val, soc_info->reg_map[0].mem_base +
+		csid_reg->rdi_reg[id]->csid_rdi_ctrl_addr);
+
+	return rc;
+}
+
+static int cam_ife_csid_poll_stop_status(
+	struct cam_ife_csid_hw          *csid_hw,
+	uint32_t                         res_mask)
+{
+	int rc = 0;
+	uint32_t csid_status_addr = 0, val = 0, res_id = 0;
+	const struct cam_ife_csid_reg_offset       *csid_reg;
+	struct cam_hw_soc_info                     *soc_info;
+
+	csid_reg = csid_hw->csid_info->csid_reg;
+	soc_info = &csid_hw->hw_info->soc_info;
+
+	for (; res_id < CAM_IFE_PIX_PATH_RES_MAX; res_id++, res_mask >>= 1) {
+		if ((res_mask & 0x1) == 0)
+			continue;
+		val = 0;
+
+		if (res_id == CAM_IFE_PIX_PATH_RES_IPP) {
+			csid_status_addr =
+			csid_reg->ipp_reg->csid_pxl_status_addr;
+		} else if (res_id == CAM_IFE_PIX_PATH_RES_PPP) {
+			csid_status_addr =
+				csid_reg->ppp_reg->csid_pxl_status_addr;
+		} else {
+			csid_status_addr =
+				csid_reg->rdi_reg[res_id]->csid_rdi_status_addr;
+		}
+
+		CAM_DBG(CAM_ISP, "start polling CSID:%d res_id:%d",
+			csid_hw->hw_intf->hw_idx, res_id);
+
+		rc = readl_poll_timeout(soc_info->reg_map[0].mem_base +
+			csid_status_addr, val, (val & 0x1) == 0x1,
+				CAM_IFE_CSID_TIMEOUT_SLEEP_US,
+				CAM_IFE_CSID_TIMEOUT_ALL_US);
+		if (rc < 0) {
+			CAM_ERR(CAM_ISP, "CSID:%d res:%d halt failed rc %d",
+				csid_hw->hw_intf->hw_idx, res_id, rc);
+			rc = -ETIMEDOUT;
+			break;
+		}
+		CAM_DBG(CAM_ISP, "End polling CSID:%d res_id:%d",
+			csid_hw->hw_intf->hw_idx, res_id);
+	}
+
 	return rc;
 }
 
@@ -2734,6 +2802,7 @@ static int cam_ife_csid_stop(void *hw_priv,
 	struct cam_isp_resource_node         *res;
 	struct cam_csid_hw_stop_args         *csid_stop;
 	uint32_t  i;
+	uint32_t res_mask = 0;
 
 	if (!hw_priv || !stop_args ||
 		(arg_size != sizeof(struct cam_csid_hw_stop_args))) {
@@ -2765,6 +2834,7 @@ static int cam_ife_csid_stop(void *hw_priv,
 				rc = cam_ife_csid_tpg_stop(csid_hw, res);
 			break;
 		case CAM_ISP_RESOURCE_PIX_PATH:
+			res_mask |= (1 << res->res_id);
 			if (res->res_id == CAM_IFE_PIX_PATH_RES_IPP ||
 				res->res_id == CAM_IFE_PIX_PATH_RES_PPP)
 				rc = cam_ife_csid_disable_pxl_path(csid_hw,
@@ -2782,6 +2852,9 @@ static int cam_ife_csid_stop(void *hw_priv,
 		}
 	}
 
+	if (res_mask)
+		rc = cam_ife_csid_poll_stop_status(csid_hw, res_mask);
+
 	for (i = 0; i < csid_stop->num_res; i++) {
 		res = csid_stop->node_res[i];
 		res->res_state = CAM_ISP_RESOURCE_STATE_INIT_HW;
diff --git a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe175.h b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe175.h
index 75e61f1..82ffa44 100644
--- a/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe175.h
+++ b/drivers/media/platform/msm/camera/cam_isp/isp_hw_mgr/isp_hw/vfe_hw/vfe17x/cam_vfe175.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
  */
 
 #ifndef _CAM_VFE175_H_
@@ -289,6 +289,8 @@ static struct cam_vfe_bus_ver2_hw_info vfe175_bus_hw_info = {
 		.addr_sync_cfg                = 0x0000207C,
 		.addr_sync_frame_hdr          = 0x00002080,
 		.addr_sync_no_sync            = 0x00002084,
+		.debug_status_cfg             = 0x0000226C,
+		.debug_status_0               = 0x00002270,
 	},
 	.num_client = 24,
 	.bus_client_reg = {
diff --git a/drivers/media/platform/msm/camera/cam_jpeg/jpeg_hw/cam_jpeg_hw_mgr.c b/drivers/media/platform/msm/camera/cam_jpeg/jpeg_hw/cam_jpeg_hw_mgr.c
index ba78b14..113ba1b 100644
--- a/drivers/media/platform/msm/camera/cam_jpeg/jpeg_hw/cam_jpeg_hw_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_jpeg/jpeg_hw/cam_jpeg_hw_mgr.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/uaccess.h>
@@ -272,6 +272,12 @@ static int cam_jpeg_insert_cdm_change_base(
 			"unable to get src buf info for cmd buf: %d", rc);
 		return rc;
 	}
+
+	if (config_args->hw_update_entries[CAM_JPEG_CHBASE].offset >=
+		ch_base_len) {
+		CAM_ERR(CAM_JPEG, "Not enough buf");
+		return -EINVAL;
+	}
 	CAM_DBG(CAM_JPEG, "iova %pK len %zu offset %d",
 		(void *)iova_addr, ch_base_len,
 		config_args->hw_update_entries[CAM_JPEG_CHBASE].offset);
@@ -719,7 +725,7 @@ static int cam_jpeg_mgr_prepare_hw_update(void *hw_mgr_priv,
 		return -EINVAL;
 	}
 
-	rc = cam_packet_util_validate_packet(packet);
+	rc = cam_packet_util_validate_packet(packet, prepare_args->remain_len);
 	if (rc) {
 		CAM_ERR(CAM_JPEG, "invalid packet %d", rc);
 		return rc;
diff --git a/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/cam_lrme_hw_mgr.c b/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/cam_lrme_hw_mgr.c
index 0ef7b77..d649ef1 100644
--- a/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/cam_lrme_hw_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_lrme/lrme_hw_mgr/cam_lrme_hw_mgr.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -76,7 +76,8 @@ static int cam_lrme_mgr_util_get_device(struct cam_lrme_hw_mgr *hw_mgr,
 	return 0;
 }
 
-static int cam_lrme_mgr_util_packet_validate(struct cam_packet *packet)
+static int cam_lrme_mgr_util_packet_validate(struct cam_packet *packet,
+	size_t remain_len)
 {
 	struct cam_cmd_buf_desc *cmd_desc = NULL;
 	int i, rc;
@@ -98,7 +99,7 @@ static int cam_lrme_mgr_util_packet_validate(struct cam_packet *packet)
 		packet->patch_offset, packet->num_patches,
 		packet->kmd_cmd_buf_offset, packet->kmd_cmd_buf_index);
 
-	if (cam_packet_util_validate_packet(packet)) {
+	if (cam_packet_util_validate_packet(packet, remain_len)) {
 		CAM_ERR(CAM_LRME, "invalid packet:%d %d %d %d %d",
 			packet->kmd_cmd_buf_index,
 			packet->num_cmd_buf, packet->cmd_buf_offset,
@@ -179,6 +180,12 @@ static int cam_lrme_mgr_util_prepare_io_buffer(int32_t iommu_hdl,
 				return -ENOMEM;
 			}
 
+			if ((size_t)io_cfg[i].offsets[plane] >= size) {
+				CAM_ERR(CAM_LRME, "Invalid plane offset: %zu",
+					(size_t)io_cfg[i].offsets[plane]);
+				return -EINVAL;
+			}
+
 			io_addr[plane] += io_cfg[i].offsets[plane];
 
 			CAM_DBG(CAM_LRME, "IO Address[%d][%d] : %llu",
@@ -834,7 +841,7 @@ static int cam_lrme_mgr_hw_prepare_update(void *hw_mgr_priv,
 		goto error;
 	}
 
-	rc = cam_lrme_mgr_util_packet_validate(args->packet);
+	rc = cam_lrme_mgr_util_packet_validate(args->packet, args->remain_len);
 	if (rc) {
 		CAM_ERR(CAM_LRME, "Error in packet validation %d", rc);
 		goto error;
diff --git a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.c b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.c
index 36ceae6..382e364 100644
--- a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.c
+++ b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -18,6 +18,7 @@
 #include "cam_debug_util.h"
 
 static struct cam_mem_table tbl;
+static atomic_t cam_mem_mgr_state = ATOMIC_INIT(CAM_MEM_MGR_UNINITIALIZED);
 
 static int cam_mem_util_get_dma_dir(uint32_t flags)
 {
@@ -139,6 +140,8 @@ int cam_mem_mgr_init(void)
 	}
 	mutex_init(&tbl.m_lock);
 
+	atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_INITIALIZED);
+
 	return 0;
 }
 
@@ -179,6 +182,11 @@ int cam_mem_get_io_buf(int32_t buf_handle, int32_t mmu_handle,
 
 	*len_ptr = 0;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	idx = CAM_MEM_MGR_GET_HDL_IDX(buf_handle);
 	if (idx >= CAM_MEM_BUFQ_MAX || idx <= 0)
 		return -EINVAL;
@@ -224,6 +232,11 @@ int cam_mem_get_cpu_buf(int32_t buf_handle, uintptr_t *vaddr_ptr, size_t *len)
 	int idx;
 	struct dma_buf *dmabuf = NULL;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!buf_handle || !vaddr_ptr || !len)
 		return -EINVAL;
 
@@ -268,6 +281,11 @@ int cam_mem_put_cpu_buf(int32_t buf_handle)
 	int idx;
 	struct dma_buf *dmabuf = NULL;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!buf_handle)
 		return -EINVAL;
 
@@ -309,6 +327,11 @@ int cam_mem_mgr_cache_ops(struct cam_mem_cache_ops_cmd *cmd)
 	uint32_t cache_dir;
 	unsigned long dmabuf_flag = 0;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!cmd)
 		return -EINVAL;
 
@@ -598,6 +621,11 @@ int cam_mem_mgr_alloc_and_map(struct cam_mem_mgr_alloc_cmd *cmd)
 	uintptr_t kvaddr = 0;
 	size_t klen;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!cmd) {
 		CAM_ERR(CAM_MEM, " Invalid argument");
 		return -EINVAL;
@@ -715,6 +743,11 @@ int cam_mem_mgr_map(struct cam_mem_mgr_map_cmd *cmd)
 	dma_addr_t hw_vaddr = 0;
 	size_t len = 0;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!cmd || (cmd->fd < 0)) {
 		CAM_ERR(CAM_MEM, "Invalid argument");
 		return -EINVAL;
@@ -922,6 +955,7 @@ static int cam_mem_mgr_cleanup_table(void)
 
 void cam_mem_mgr_deinit(void)
 {
+	atomic_set(&cam_mem_mgr_state, CAM_MEM_MGR_UNINITIALIZED);
 	cam_mem_mgr_cleanup_table();
 	mutex_lock(&tbl.m_lock);
 	bitmap_zero(tbl.bitmap, tbl.bits);
@@ -1018,6 +1052,11 @@ int cam_mem_mgr_release(struct cam_mem_mgr_release_cmd *cmd)
 	int idx;
 	int rc;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!cmd) {
 		CAM_ERR(CAM_MEM, "Invalid argument");
 		return -EINVAL;
@@ -1066,6 +1105,11 @@ int cam_mem_mgr_request_mem(struct cam_mem_mgr_request_desc *inp,
 
 	enum cam_smmu_region_id region = CAM_SMMU_REGION_SHARED;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!inp || !out) {
 		CAM_ERR(CAM_MEM, "Invalid params");
 		return -EINVAL;
@@ -1186,6 +1230,11 @@ int cam_mem_mgr_release_mem(struct cam_mem_mgr_memory_desc *inp)
 	int32_t idx;
 	int rc;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!inp) {
 		CAM_ERR(CAM_MEM, "Invalid argument");
 		return -EINVAL;
@@ -1234,6 +1283,11 @@ int cam_mem_mgr_reserve_memory_region(struct cam_mem_mgr_request_desc *inp,
 	int32_t smmu_hdl = 0;
 	int32_t num_hdl = 0;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!inp || !out) {
 		CAM_ERR(CAM_MEM, "Invalid param(s)");
 		return -EINVAL;
@@ -1323,6 +1377,11 @@ int cam_mem_mgr_free_memory_region(struct cam_mem_mgr_memory_desc *inp)
 	int rc;
 	int32_t smmu_hdl;
 
+	if (!atomic_read(&cam_mem_mgr_state)) {
+		CAM_ERR(CAM_MEM, "failed. mem_mgr not initialized");
+		return -EINVAL;
+	}
+
 	if (!inp) {
 		CAM_ERR(CAM_MEM, "Invalid argument");
 		return -EINVAL;
diff --git a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h
index 5767d44..6ce30db 100644
--- a/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h
+++ b/drivers/media/platform/msm/camera/cam_req_mgr/cam_mem_mgr.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  */
 
 #ifndef _CAM_MEM_MGR_H_
@@ -13,6 +13,12 @@
 
 #define CAM_MEM_BUFQ_MAX 1024
 
+/* Enum for possible mem mgr states */
+enum cam_mem_mgr_state {
+	CAM_MEM_MGR_UNINITIALIZED,
+	CAM_MEM_MGR_INITIALIZED,
+};
+
 /*Enum for possible SMMU operations */
 enum cam_smmu_mapping_client {
 	CAM_SMMU_MAPPING_USER,
diff --git a/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.c b/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.c
index bbceef6..22dd601 100644
--- a/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.c
+++ b/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -39,6 +39,8 @@ void cam_req_mgr_core_link_reset(struct cam_req_mgr_core_link *link)
 	link->sync_link_sof_skip = false;
 	link->open_req_cnt = 0;
 	link->last_flush_id = 0;
+	link->initial_sync_req = -1;
+	link->in_msync_mode = false;
 }
 
 void cam_req_mgr_handle_core_shutdown(void)
@@ -634,6 +636,7 @@ static int __cam_req_mgr_check_sync_for_mslave(
 	struct cam_req_mgr_slot *slot)
 {
 	struct cam_req_mgr_core_link *sync_link = NULL;
+	struct cam_req_mgr_slot      *sync_slot = NULL;
 	int sync_slot_idx = 0, prev_idx, next_idx, rd_idx, rc = 0;
 	int64_t req_id = 0, sync_req_id = 0;
 
@@ -646,8 +649,10 @@ static int __cam_req_mgr_check_sync_for_mslave(
 	req_id = slot->req_id;
 
 	CAM_DBG(CAM_CRM,
-		"link_hdl %x req %lld frame_skip_flag %d ",
-		link->link_hdl, req_id, link->sync_link_sof_skip);
+		"link_hdl %x req %lld frame_skip_flag %d open_req_cnt:%d initial_sync_req [%lld,%lld] is_master:%d",
+		link->link_hdl, req_id, link->sync_link_sof_skip,
+		link->open_req_cnt, link->initial_sync_req,
+		sync_link->initial_sync_req, link->is_master);
 
 	if (sync_link->sync_link_sof_skip) {
 		CAM_DBG(CAM_CRM,
@@ -679,6 +684,7 @@ static int __cam_req_mgr_check_sync_for_mslave(
 			CAM_DBG(CAM_CRM,
 				"Req: %lld [master] not ready on link: %x, rc=%d",
 				req_id, link->link_hdl, rc);
+			link->sync_link_sof_skip = true;
 			return rc;
 		}
 
@@ -689,7 +695,8 @@ static int __cam_req_mgr_check_sync_for_mslave(
 
 		rd_idx = sync_link->req.in_q->rd_idx;
 		sync_req_id = link->req.in_q->slot[prev_idx].req_id;
-		if (sync_req_id != -1) {
+		if ((sync_link->initial_sync_req != -1) &&
+			(sync_link->initial_sync_req <= sync_req_id)) {
 			sync_slot_idx = __cam_req_mgr_find_slot_for_req(
 				sync_link->req.in_q, sync_req_id);
 
@@ -697,6 +704,7 @@ static int __cam_req_mgr_check_sync_for_mslave(
 				CAM_DBG(CAM_CRM,
 					"Prev Req: %lld [master] not found on link: %x [slave]",
 					sync_req_id, sync_link->link_hdl);
+				link->sync_link_sof_skip = true;
 				return -EINVAL;
 			}
 
@@ -720,6 +728,7 @@ static int __cam_req_mgr_check_sync_for_mslave(
 				CAM_DBG(CAM_CRM,
 					"Req: %lld not ready on [slave] link: %x, rc=%d",
 					sync_req_id, sync_link->link_hdl, rc);
+				link->sync_link_sof_skip = true;
 				return rc;
 			}
 		}
@@ -727,23 +736,6 @@ static int __cam_req_mgr_check_sync_for_mslave(
 		if (link->initial_skip)
 			link->initial_skip = false;
 
-		sync_slot_idx = __cam_req_mgr_find_slot_for_req(
-			sync_link->req.in_q, req_id);
-		if (sync_slot_idx == -1) {
-			CAM_DBG(CAM_CRM,
-				"Req: %lld not found on link: %x [master]",
-				req_id, sync_link->link_hdl);
-			return -EINVAL;
-		}
-
-		if (sync_link->req.in_q->slot[sync_slot_idx].status !=
-			CRM_SLOT_STATUS_REQ_APPLIED) {
-			CAM_DBG(CAM_CRM,
-				"Req: %lld [master] not applied yet: %x",
-				req_id, sync_link->link_hdl);
-			return -EAGAIN;
-		}
-
 		rc = __cam_req_mgr_inject_delay(link->req.l_tbl, slot->idx);
 		if (rc) {
 			CAM_DBG(CAM_CRM,
@@ -753,6 +745,15 @@ static int __cam_req_mgr_check_sync_for_mslave(
 			return rc;
 		}
 
+		rc = __cam_req_mgr_check_link_is_ready(link, slot->idx, true);
+		if (rc) {
+			CAM_DBG(CAM_CRM,
+				"Req: %lld [slave] not ready on link: %x, rc=%d",
+				req_id, link->link_hdl, rc);
+			link->sync_link_sof_skip = true;
+			return rc;
+		}
+
 		next_idx = link->req.in_q->rd_idx;
 		rd_idx = sync_link->req.in_q->rd_idx;
 		__cam_req_mgr_inc_idx(&next_idx,
@@ -760,34 +761,41 @@ static int __cam_req_mgr_check_sync_for_mslave(
 			link->req.in_q->num_slots);
 
 		sync_req_id = link->req.in_q->slot[next_idx].req_id;
-		sync_slot_idx = __cam_req_mgr_find_slot_for_req(
-					sync_link->req.in_q, sync_req_id);
-		if (sync_slot_idx == -1) {
-			CAM_DBG(CAM_CRM,
-				"Next Req: %lld [slave] not found on link: %x [master]",
-				sync_req_id, sync_link->link_hdl);
-			return -EINVAL;
-		}
 
-		if ((sync_link->req.in_q->slot[sync_slot_idx].status !=
-			CRM_SLOT_STATUS_REQ_APPLIED) &&
-			((sync_slot_idx - rd_idx) >= 1) &&
-			(sync_link->req.in_q->slot[rd_idx].status !=
-			CRM_SLOT_STATUS_REQ_APPLIED)) {
-			CAM_DBG(CAM_CRM,
-				"Next Req: %lld [slave] not next on link: %x [master]",
-				sync_req_id, sync_link->link_hdl);
-			return -EINVAL;
-		}
+		if ((sync_link->initial_sync_req != -1) &&
+			(sync_link->initial_sync_req <= sync_req_id)) {
+			sync_slot_idx = __cam_req_mgr_find_slot_for_req(
+				sync_link->req.in_q, sync_req_id);
+			if (sync_slot_idx == -1) {
+				CAM_DBG(CAM_CRM,
+					"Next Req: %lld [slave] not found on link: %x [master]",
+					sync_req_id, sync_link->link_hdl);
+				link->sync_link_sof_skip = true;
+				return -EINVAL;
+			}
 
-		rc = __cam_req_mgr_check_link_is_ready(sync_link,
-			sync_slot_idx, true);
-		if (rc && (sync_link->req.in_q->slot[sync_slot_idx].status !=
-			CRM_SLOT_STATUS_REQ_APPLIED)) {
-			CAM_DBG(CAM_CRM,
-				"Next Req: %lld [slave] not ready on [master] link: %x, rc=%d",
-				sync_req_id, sync_link->link_hdl, rc);
-			return rc;
+			if ((sync_link->req.in_q->slot[sync_slot_idx].status !=
+				CRM_SLOT_STATUS_REQ_APPLIED) &&
+				((sync_slot_idx - rd_idx) >= 1) &&
+				(sync_link->req.in_q->slot[rd_idx].status !=
+				CRM_SLOT_STATUS_REQ_APPLIED)) {
+				CAM_DBG(CAM_CRM,
+					"Next Req: %lld [slave] not next on link: %x [master]",
+					sync_req_id, sync_link->link_hdl);
+				return -EINVAL;
+			}
+
+			sync_slot = &sync_link->req.in_q->slot[sync_slot_idx];
+			rc = __cam_req_mgr_check_link_is_ready(sync_link,
+				sync_slot_idx, true);
+			if (rc && (sync_slot->status !=
+				CRM_SLOT_STATUS_REQ_APPLIED)) {
+				CAM_DBG(CAM_CRM,
+					"Next Req: %lld [slave] not ready on [master] link: %x, rc=%d",
+					sync_req_id, sync_link->link_hdl, rc);
+				link->sync_link_sof_skip = true;
+				return rc;
+			}
 		}
 	}
 
@@ -972,13 +980,31 @@ static int __cam_req_mgr_process_req(struct cam_req_mgr_core_link *link,
 
 		if ((slot->sync_mode == CAM_REQ_MGR_SYNC_MODE_SYNC) &&
 			(link->sync_link)) {
-			if (link->is_master || link->sync_link->is_master)
+			if (link->is_master || link->sync_link->is_master) {
+				if (!link->in_msync_mode) {
+					CAM_DBG(CAM_CRM,
+						"Settings master-slave sync mode for link 0x%x",
+						link->link_hdl);
+					link->in_msync_mode = true;
+				}
+
 				rc =  __cam_req_mgr_check_sync_for_mslave(
 					link, slot);
-			else
+			} else {
 				rc = __cam_req_mgr_check_sync_req_is_ready(
 					link, slot);
+			}
 		} else {
+			if (link->in_msync_mode) {
+				CAM_DBG(CAM_CRM,
+					"Settings master-slave non sync mode for link 0x%x",
+					link->link_hdl);
+				link->in_msync_mode = false;
+				link->initial_sync_req = -1;
+				if (link->sync_link)
+					link->sync_link->initial_sync_req = -1;
+			}
+
 			rc = __cam_req_mgr_inject_delay(link->req.l_tbl,
 				slot->idx);
 			if (!rc)
@@ -1703,9 +1729,11 @@ int cam_req_mgr_process_sched_req(void *priv, void *data)
 	sched_req  = (struct cam_req_mgr_sched_request *)&task_data->u;
 	in_q = link->req.in_q;
 
-	CAM_DBG(CAM_CRM, "link_hdl %x req_id %lld at slot %d sync_mode %d",
+	CAM_DBG(CAM_CRM,
+		"link_hdl %x req_id %lld at slot %d sync_mode %d is_master:%d",
 		sched_req->link_hdl, sched_req->req_id,
-		in_q->wr_idx, sched_req->sync_mode);
+		in_q->wr_idx, sched_req->sync_mode,
+		link->is_master);
 
 	mutex_lock(&link->req.lock);
 	slot = &in_q->slot[in_q->wr_idx];
@@ -1721,6 +1749,14 @@ int cam_req_mgr_process_sched_req(void *priv, void *data)
 	slot->recover = sched_req->bubble_enable;
 	link->open_req_cnt++;
 	__cam_req_mgr_inc_idx(&in_q->wr_idx, 1, in_q->num_slots);
+
+	if (slot->sync_mode == CAM_REQ_MGR_SYNC_MODE_SYNC) {
+		if (link->initial_sync_req == -1)
+			link->initial_sync_req = slot->req_id;
+	} else {
+		link->initial_sync_req = -1;
+	}
+
 	mutex_unlock(&link->req.lock);
 
 end:
@@ -2528,16 +2564,17 @@ int cam_req_mgr_link(struct cam_req_mgr_link_info *link_info)
 		return -EINVAL;
 	}
 
+	mutex_lock(&g_crm_core_dev->crm_lock);
+
 	/* session hdl's priv data is cam session struct */
 	cam_session = (struct cam_req_mgr_core_session *)
 		cam_get_device_priv(link_info->session_hdl);
 	if (!cam_session) {
 		CAM_DBG(CAM_CRM, "NULL pointer");
+		mutex_unlock(&g_crm_core_dev->crm_lock);
 		return -EINVAL;
 	}
 
-	mutex_lock(&g_crm_core_dev->crm_lock);
-
 	/* Allocate link struct and map it with session's request queue */
 	link = __cam_req_mgr_reserve_link(cam_session);
 	if (!link) {
@@ -2822,6 +2859,11 @@ int cam_req_mgr_sync_config(
 	link1->initial_skip = false;
 	link2->initial_skip = false;
 
+	link1->in_msync_mode = false;
+	link2->in_msync_mode = false;
+	link1->initial_sync_req = -1;
+	link2->initial_sync_req = -1;
+
 	if (sync_info->sync_mode == CAM_REQ_MGR_SYNC_MODE_SYNC) {
 		link1->sync_link = link2;
 		link2->sync_link = link1;
diff --git a/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.h b/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.h
index e7e3200..8f07b3b 100644
--- a/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.h
+++ b/drivers/media/platform/msm/camera/cam_req_mgr/cam_req_mgr_core.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
  */
 #ifndef _CAM_REQ_MGR_CORE_H_
 #define _CAM_REQ_MGR_CORE_H_
@@ -307,7 +307,9 @@ struct cam_req_mgr_connected_device {
  *                         is assigned as master
  * @initial_skip         : Flag to determine if slave has started streaming in
  *                         master-slave sync
- *
+ * @in_msync_mode        : Flag to determine if a link is in master-slave mode
+ * @initial_sync_req     : The initial req which is required to sync with the
+ *                         other link
  */
 struct cam_req_mgr_core_link {
 	int32_t                              link_hdl;
@@ -332,6 +334,8 @@ struct cam_req_mgr_core_link {
 	atomic_t                             is_used;
 	bool                                 is_master;
 	bool                                 initial_skip;
+	bool                                 in_msync_mode;
+	int64_t                              initial_sync_req;
 };
 
 /**
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c
index b56af08..bcfb2f5 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_actuator/cam_actuator_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -10,6 +10,7 @@
 #include "cam_trace.h"
 #include "cam_res_mgr_api.h"
 #include "cam_common_util.h"
+#include "cam_packet_util.h"
 
 int32_t cam_actuator_construct_default_power_setting(
 	struct cam_sensor_power_ctrl_t *power_info)
@@ -205,12 +206,12 @@ static int32_t cam_actuator_i2c_modes_util(
 }
 
 int32_t cam_actuator_slaveInfo_pkt_parser(struct cam_actuator_ctrl_t *a_ctrl,
-	uint32_t *cmd_buf)
+	uint32_t *cmd_buf, size_t len)
 {
 	int32_t rc = 0;
 	struct cam_cmd_i2c_info *i2c_info;
 
-	if (!a_ctrl || !cmd_buf) {
+	if (!a_ctrl || !cmd_buf || (len < sizeof(struct cam_cmd_i2c_info))) {
 		CAM_ERR(CAM_ACTUATOR, "Invalid Args");
 		return -EINVAL;
 	}
@@ -404,6 +405,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
 	int32_t  i = 0;
 	uint32_t total_cmd_buf_in_bytes = 0;
 	size_t   len_of_buff = 0;
+	size_t   remain_len = 0;
 	uint32_t *offset = NULL;
 	uint32_t *cmd_buf = NULL;
 	uintptr_t generic_ptr;
@@ -441,18 +443,29 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
 		return rc;
 	}
 
-	if (config.offset > len_of_buff) {
+	remain_len = len_of_buff;
+	if ((sizeof(struct cam_packet) > len_of_buff) ||
+		((size_t)config.offset >= len_of_buff -
+		sizeof(struct cam_packet))) {
 		CAM_ERR(CAM_ACTUATOR,
-			"offset is out of bounds: offset: %lld len: %zu",
-			config.offset, len_of_buff);
+			"Inval cam_packet strut size: %zu, len_of_buff: %zu",
+			 sizeof(struct cam_packet), len_of_buff);
 		rc = -EINVAL;
 		goto rel_pkt_buf;
 	}
 
+	remain_len -= (size_t)config.offset;
 	csl_packet = (struct cam_packet *)
 			(generic_pkt_ptr + (uint32_t)config.offset);
-	CAM_DBG(CAM_ACTUATOR, "Pkt opcode: %d",
-			csl_packet->header.op_code);
+
+	if (cam_packet_util_validate_packet(csl_packet,
+		remain_len)) {
+		CAM_ERR(CAM_ACTUATOR, "Invalid packet params");
+		rc = -EINVAL;
+		goto rel_pkt_buf;
+	}
+
+	CAM_DBG(CAM_ACTUATOR, "Pkt opcode: %d",	csl_packet->header.op_code);
 
 	if ((csl_packet->header.op_code & 0xFFFFFF) !=
 		CAM_ACTUATOR_PACKET_OPCODE_INIT &&
@@ -461,7 +474,8 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
 		CAM_DBG(CAM_ACTUATOR,
 			"reject request %lld, last request to flush %lld",
 			csl_packet->header.request_id, a_ctrl->last_flush_req);
-		return -EINVAL;
+		rc = -EINVAL;
+		goto rel_pkt_buf;
 	}
 
 	if (csl_packet->header.request_id > a_ctrl->last_flush_req)
@@ -489,6 +503,15 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
 				CAM_ERR(CAM_ACTUATOR, "invalid cmd buf");
 				goto rel_cmd_buf;
 			}
+			if ((len_of_buff < sizeof(struct common_header)) ||
+				(cmd_desc[i].offset > (len_of_buff -
+				sizeof(struct common_header)))) {
+				CAM_ERR(CAM_ACTUATOR,
+					"Invalid length for sensor cmd");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+			remain_len = len_of_buff - cmd_desc[i].offset;
 			cmd_buf += cmd_desc[i].offset / sizeof(uint32_t);
 			cmm_hdr = (struct common_header *)cmd_buf;
 
@@ -497,7 +520,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
 				CAM_DBG(CAM_ACTUATOR,
 					"Received slave info buffer");
 				rc = cam_actuator_slaveInfo_pkt_parser(
-					a_ctrl, cmd_buf);
+					a_ctrl, cmd_buf, remain_len);
 				if (rc < 0) {
 					CAM_ERR(CAM_ACTUATOR,
 					"Failed to parse slave info: %d", rc);
@@ -511,7 +534,7 @@ int32_t cam_actuator_i2c_pkt_parse(struct cam_actuator_ctrl_t *a_ctrl,
 				rc = cam_sensor_update_power_settings(
 					cmd_buf,
 					total_cmd_buf_in_bytes,
-					power_info);
+					power_info, remain_len);
 				if (rc) {
 					CAM_ERR(CAM_ACTUATOR,
 					"Failed:parse power settings: %d",
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c
index edd8b85..456afa3 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_csiphy/cam_csiphy_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -8,6 +8,8 @@
 #include "cam_csiphy_dev.h"
 #include "cam_csiphy_soc.h"
 #include "cam_common_util.h"
+#include "cam_packet_util.h"
+
 
 #include <soc/qcom/scm.h>
 #include <cam_mem_mgr.h>
@@ -157,6 +159,7 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
 	uint32_t                *cmd_buf = NULL;
 	struct cam_csiphy_info  *cam_cmd_csiphy_info = NULL;
 	size_t                  len;
+	size_t                  remain_len;
 
 	if (!cfg_dev || !csiphy_dev) {
 		CAM_ERR(CAM_CSIPHY, "Invalid Args");
@@ -170,17 +173,27 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
 		return rc;
 	}
 
-	if (cfg_dev->offset > len) {
+	remain_len = len;
+	if ((sizeof(struct cam_packet) > len) ||
+		((size_t)cfg_dev->offset >= len - sizeof(struct cam_packet))) {
 		CAM_ERR(CAM_CSIPHY,
-			"offset is out of bounds: offset: %lld len: %zu",
-			cfg_dev->offset, len);
+			"Inval cam_packet strut size: %zu, len_of_buff: %zu",
+			 sizeof(struct cam_packet), len);
 		rc = -EINVAL;
 		goto rel_pkt_buf;
 	}
 
+	remain_len -= (size_t)cfg_dev->offset;
 	csl_packet = (struct cam_packet *)
 		(generic_pkt_ptr + (uint32_t)cfg_dev->offset);
 
+	if (cam_packet_util_validate_packet(csl_packet,
+		remain_len)) {
+		CAM_ERR(CAM_CSIPHY, "Invalid packet params");
+		rc = -EINVAL;
+		goto rel_pkt_buf;
+	}
+
 	cmd_desc = (struct cam_cmd_buf_desc *)
 		((uint32_t *)&csl_packet->payload +
 		csl_packet->cmd_buf_offset / 4);
@@ -193,6 +206,14 @@ int32_t cam_cmd_buf_parser(struct csiphy_device *csiphy_dev,
 		goto rel_pkt_buf;
 	}
 
+	if ((len < sizeof(struct cam_csiphy_info)) ||
+		(cmd_desc->offset > (len - sizeof(struct cam_csiphy_info)))) {
+		CAM_ERR(CAM_CSIPHY,
+			"Not enough buffer provided for cam_cisphy_info");
+		rc = -EINVAL;
+		goto rel_pkt_buf;
+	}
+
 	cmd_buf = (uint32_t *)generic_ptr;
 	cmd_buf += cmd_desc->offset / 4;
 	cam_cmd_csiphy_info = (struct cam_csiphy_info *)cmd_buf;
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c
index 66de7f6..8f6b6e2 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_eeprom/cam_eeprom_core.c
@@ -11,6 +11,7 @@
 #include "cam_eeprom_soc.h"
 #include "cam_debug_util.h"
 #include "cam_common_util.h"
+#include "cam_packet_util.h"
 
 #define MAX_READ_SIZE  0x7FFFF
 
@@ -408,7 +409,7 @@ static int32_t cam_eeprom_update_slaveInfo(struct cam_eeprom_ctrl_t *e_ctrl,
 static int32_t cam_eeprom_parse_memory_map(
 	struct cam_eeprom_memory_block_t *data,
 	void *cmd_buf, int cmd_length, uint32_t *cmd_length_bytes,
-	int *num_map)
+	int *num_map, size_t remain_buf_len)
 {
 	int32_t                            rc = 0;
 	int32_t                            cnt = 0;
@@ -422,8 +423,21 @@ static int32_t cam_eeprom_parse_memory_map(
 	struct cam_cmd_i2c_continuous_rd  *i2c_cont_rd = NULL;
 	struct cam_cmd_conditional_wait   *i2c_poll = NULL;
 	struct cam_cmd_unconditional_wait *i2c_uncond_wait = NULL;
+	size_t                             validate_size = 0;
 
 	generic_op_code = cmm_hdr->fifth_byte;
+
+	if (cmm_hdr->cmd_type == CAMERA_SENSOR_CMD_TYPE_I2C_RNDM_WR)
+		validate_size = sizeof(struct cam_cmd_i2c_random_wr);
+	else if (cmm_hdr->cmd_type == CAMERA_SENSOR_CMD_TYPE_I2C_CONT_RD)
+		validate_size = sizeof(struct cam_cmd_i2c_continuous_rd);
+	else if (cmm_hdr->cmd_type == CAMERA_SENSOR_CMD_TYPE_WAIT)
+		validate_size = sizeof(struct cam_cmd_unconditional_wait);
+
+	if (remain_buf_len < validate_size) {
+		CAM_ERR(CAM_EEPROM, "not enough buffer");
+		return -EINVAL;
+	}
 	switch (cmm_hdr->cmd_type) {
 	case CAMERA_SENSOR_CMD_TYPE_I2C_RNDM_WR:
 		i2c_random_wr = (struct cam_cmd_i2c_random_wr *)cmd_buf;
@@ -883,6 +897,7 @@ static int32_t cam_eeprom_init_pkt_parser(struct cam_eeprom_ctrl_t *e_ctrl,
 	uint32_t                       *cmd_buf = NULL;
 	uintptr_t                        generic_pkt_addr;
 	size_t                          pkt_len = 0;
+	size_t                          remain_len = 0;
 	uint32_t                        total_cmd_buf_in_bytes = 0;
 	uint32_t                        processed_cmd_buf_in_bytes = 0;
 	struct common_header           *cmm_hdr = NULL;
@@ -926,13 +941,40 @@ static int32_t cam_eeprom_init_pkt_parser(struct cam_eeprom_ctrl_t *e_ctrl,
 			rc = -EINVAL;
 			goto rel_cmd_buf;
 		}
+
+		if ((pkt_len < sizeof(struct common_header)) ||
+			(cmd_desc[i].offset > (pkt_len -
+			sizeof(struct common_header)))) {
+			CAM_ERR(CAM_EEPROM, "Not enough buffer");
+			rc = -EINVAL;
+			goto rel_cmd_buf;
+		}
+		remain_len = pkt_len - cmd_desc[i].offset;
 		cmd_buf += cmd_desc[i].offset / sizeof(uint32_t);
+
+		if (total_cmd_buf_in_bytes > remain_len) {
+			CAM_ERR(CAM_EEPROM, "Not enough buffer for command");
+			rc = -EINVAL;
+			goto rel_cmd_buf;
+		}
 		/* Loop through multiple cmd formats in one cmd buffer */
 		while (processed_cmd_buf_in_bytes < total_cmd_buf_in_bytes) {
+			if ((remain_len - processed_cmd_buf_in_bytes) <
+				sizeof(struct common_header)) {
+				CAM_ERR(CAM_EEPROM, "Not enough buf");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
 			cmm_hdr = (struct common_header *)cmd_buf;
 			switch (cmm_hdr->cmd_type) {
 			case CAMERA_SENSOR_CMD_TYPE_I2C_INFO:
 				i2c_info = (struct cam_cmd_i2c_info *)cmd_buf;
+				if ((remain_len - processed_cmd_buf_in_bytes) <
+					sizeof(struct cam_cmd_i2c_info)) {
+					CAM_ERR(CAM_EEPROM, "Not enough buf");
+					rc = -EINVAL;
+					goto rel_cmd_buf;
+				}
 				/* Configure the following map slave address */
 				map[num_map + 1].saddr = i2c_info->slave_addr;
 				rc = cam_eeprom_update_slaveInfo(e_ctrl,
@@ -948,7 +990,9 @@ static int32_t cam_eeprom_init_pkt_parser(struct cam_eeprom_ctrl_t *e_ctrl,
 			case CAMERA_SENSOR_CMD_TYPE_PWR_DOWN:
 				cmd_length_in_bytes = total_cmd_buf_in_bytes;
 				rc = cam_sensor_update_power_settings(cmd_buf,
-					cmd_length_in_bytes, power_info);
+					cmd_length_in_bytes, power_info,
+					(remain_len -
+					processed_cmd_buf_in_bytes));
 				processed_cmd_buf_in_bytes +=
 					cmd_length_in_bytes;
 				cmd_buf += cmd_length_in_bytes/
@@ -965,7 +1009,9 @@ static int32_t cam_eeprom_init_pkt_parser(struct cam_eeprom_ctrl_t *e_ctrl,
 				rc = cam_eeprom_parse_memory_map(
 					&e_ctrl->cal_data, cmd_buf,
 					total_cmd_buf_in_bytes,
-					&cmd_length_in_bytes, &num_map);
+					&cmd_length_in_bytes, &num_map,
+					(remain_len -
+					processed_cmd_buf_in_bytes));
 				processed_cmd_buf_in_bytes +=
 					cmd_length_in_bytes;
 				cmd_buf += cmd_length_in_bytes/sizeof(uint32_t);
@@ -1007,6 +1053,7 @@ static int32_t cam_eeprom_get_cal_data(struct cam_eeprom_ctrl_t *e_ctrl,
 	uintptr_t              buf_addr;
 	size_t                buf_size;
 	uint8_t               *read_buffer;
+	size_t                remain_len = 0;
 
 	io_cfg = (struct cam_buf_io_cfg *) ((uint8_t *)
 		&csl_packet->payload +
@@ -1025,7 +1072,13 @@ static int32_t cam_eeprom_get_cal_data(struct cam_eeprom_ctrl_t *e_ctrl,
 					rc);
 				return rc;
 			}
+			if (buf_size <= io_cfg->offsets[0]) {
+				CAM_ERR(CAM_EEPROM, "Not enough buffer");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
 
+			remain_len = buf_size - io_cfg->offsets[0];
 			CAM_DBG(CAM_EEPROM, "buf_addr : %pK, buf_size : %zu\n",
 				(void *)buf_addr, buf_size);
 
@@ -1038,7 +1091,7 @@ static int32_t cam_eeprom_get_cal_data(struct cam_eeprom_ctrl_t *e_ctrl,
 			}
 			read_buffer += io_cfg->offsets[0];
 
-			if (buf_size < e_ctrl->cal_data.num_data) {
+			if (remain_len < e_ctrl->cal_data.num_data) {
 				CAM_ERR(CAM_EEPROM,
 					"failed to copy, Invalid size");
 				rc = -EINVAL;
@@ -1137,6 +1190,7 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
 	struct cam_config_dev_cmd       dev_config;
 	uintptr_t                        generic_pkt_addr;
 	size_t                          pkt_len;
+	size_t                          remain_len = 0;
 	struct cam_packet              *csl_packet = NULL;
 	struct cam_eeprom_soc_private  *soc_private =
 		(struct cam_eeprom_soc_private *)e_ctrl->soc_info.soc_private;
@@ -1156,16 +1210,28 @@ static int32_t cam_eeprom_pkt_parse(struct cam_eeprom_ctrl_t *e_ctrl, void *arg)
 		return rc;
 	}
 
-	if (dev_config.offset > pkt_len) {
+	remain_len = pkt_len;
+	if ((sizeof(struct cam_packet) > pkt_len) ||
+		((size_t)dev_config.offset >= pkt_len -
+		sizeof(struct cam_packet))) {
 		CAM_ERR(CAM_EEPROM,
-			"Offset is out of bound: off: %lld, %zu",
-			dev_config.offset, pkt_len);
+			"Inval cam_packet strut size: %zu, len_of_buff: %zu",
+			 sizeof(struct cam_packet), pkt_len);
 		rc = -EINVAL;
 		goto release_buf;
 	}
 
+	remain_len -= (size_t)dev_config.offset;
 	csl_packet = (struct cam_packet *)
 		(generic_pkt_addr + (uint32_t)dev_config.offset);
+
+	if (cam_packet_util_validate_packet(csl_packet,
+		remain_len)) {
+		CAM_ERR(CAM_EEPROM, "Invalid packet params");
+		rc = -EINVAL;
+		goto release_buf;
+	}
+
 	switch (csl_packet->header.op_code & 0xFFFFFF) {
 	case CAM_EEPROM_PACKET_OPCODE_INIT:
 		if (e_ctrl->userspace_probe == false) {
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
index e7156bc..eeea59a 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_flash/cam_flash_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -9,6 +9,7 @@
 #include "cam_flash_core.h"
 #include "cam_res_mgr_api.h"
 #include "cam_common_util.h"
+#include "cam_packet_util.h"
 
 static int cam_flash_prepare(struct cam_flash_ctrl *flash_ctrl,
 	bool regulator_enable)
@@ -616,11 +617,15 @@ static int cam_flash_pmic_delete_req(struct cam_flash_ctrl *fctrl,
 }
 
 static int32_t cam_flash_slaveInfo_pkt_parser(struct cam_flash_ctrl *fctrl,
-	uint32_t *cmd_buf)
+	uint32_t *cmd_buf, size_t len)
 {
 	int32_t rc = 0;
 	struct cam_cmd_i2c_info *i2c_info = (struct cam_cmd_i2c_info *)cmd_buf;
 
+	if (len < sizeof(struct cam_cmd_i2c_info)) {
+		CAM_ERR(CAM_FLASH, "Not enough buffer");
+		return -EINVAL;
+	}
 	if (fctrl->io_master_info.master_type == CCI_MASTER) {
 		fctrl->io_master_info.cci_client->cci_i2c_master =
 			fctrl->cci_i2c_master;
@@ -895,6 +900,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 	uint32_t *offset = NULL;
 	uint32_t frm_offset = 0;
 	size_t len_of_buffer;
+	size_t remain_len;
 	struct cam_flash_init *flash_init = NULL;
 	struct common_header  *cmn_hdr = NULL;
 	struct cam_control *ioctl_ctrl = NULL;
@@ -922,20 +928,29 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 	rc = cam_mem_get_cpu_buf(config.packet_handle,
 		&generic_ptr, &len_of_buffer);
 	if (rc) {
-		CAM_ERR(CAM_FLASH, "Failed in getting the buffer : %d", rc);
+		CAM_ERR(CAM_FLASH, "Failed in getting the packet : %d", rc);
 		return rc;
 	}
-
-	if (config.offset > len_of_buffer) {
+	remain_len = len_of_buffer;
+	if ((sizeof(struct cam_packet) > len_of_buffer) ||
+		((size_t)config.offset >= len_of_buffer -
+		sizeof(struct cam_packet))) {
 		CAM_ERR(CAM_FLASH,
-			"offset is out of bounds: offset: %lld len: %zu",
-			config.offset, len_of_buffer);
+			"Inval cam_packet strut size: %zu, len_of_buff: %zu",
+			 sizeof(struct cam_packet), len_of_buffer);
 		return -EINVAL;
 	}
 
+	remain_len -= (size_t)config.offset;
 	/* Add offset to the flash csl header */
 	csl_packet = (struct cam_packet *)(generic_ptr + config.offset);
 
+	if (cam_packet_util_validate_packet(csl_packet,
+		remain_len)) {
+		CAM_ERR(CAM_FLASH, "Invalid packet params");
+		return -EINVAL;
+	}
+
 	if ((csl_packet->header.op_code & 0xFFFFFF) !=
 		CAM_FLASH_PACKET_OPCODE_INIT &&
 		csl_packet->header.request_id <= fctrl->last_flush_req
@@ -973,6 +988,15 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 				CAM_ERR(CAM_FLASH, "invalid cmd buf");
 				return -EINVAL;
 			}
+
+			if ((len_of_buffer < sizeof(struct common_header)) ||
+				(cmd_desc[i].offset >
+				(len_of_buffer -
+				sizeof(struct common_header)))) {
+				CAM_ERR(CAM_FLASH, "invalid cmd buf length");
+				return -EINVAL;
+			}
+			remain_len = len_of_buffer - cmd_desc[i].offset;
 			cmd_buf += cmd_desc[i].offset / sizeof(uint32_t);
 			cmn_hdr = (struct common_header *)cmd_buf;
 
@@ -983,6 +1007,12 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 				total_cmd_buf_in_bytes);
 			switch (cmn_hdr->cmd_type) {
 			case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_INFO:
+				if (len_of_buffer <
+					sizeof(struct cam_flash_init)) {
+					CAM_ERR(CAM_FLASH, "Not enough buffer");
+					return -EINVAL;
+				}
+
 				flash_init = (struct cam_flash_init *)cmd_buf;
 				fctrl->flash_type = flash_init->flash_type;
 				cmd_length_in_bytes =
@@ -994,7 +1024,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 				break;
 			case CAMERA_SENSOR_CMD_TYPE_I2C_INFO:
 				rc = cam_flash_slaveInfo_pkt_parser(
-					fctrl, cmd_buf);
+					fctrl, cmd_buf, remain_len);
 				if (rc < 0) {
 					CAM_ERR(CAM_FLASH,
 					"Failed parsing slave info: rc: %d",
@@ -1017,7 +1047,7 @@ int cam_flash_i2c_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 				rc = cam_sensor_update_power_settings(
 					cmd_buf,
 					total_cmd_buf_in_bytes,
-					&fctrl->power_info);
+					&fctrl->power_info, remain_len);
 				processed_cmd_buf_in_bytes +=
 					cmd_length_in_bytes;
 				cmd_buf += cmd_length_in_bytes/
@@ -1215,6 +1245,7 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 	uint32_t *offset = NULL;
 	uint32_t frm_offset = 0;
 	size_t len_of_buffer;
+	size_t remain_len;
 	struct cam_control *ioctl_ctrl = NULL;
 	struct cam_packet *csl_packet = NULL;
 	struct cam_cmd_buf_desc *cmd_desc = NULL;
@@ -1250,21 +1281,31 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 	rc = cam_mem_get_cpu_buf(config.packet_handle,
 		&generic_ptr, &len_of_buffer);
 	if (rc) {
-		CAM_ERR(CAM_FLASH, "Failed in getting the buffer : %d", rc);
+		CAM_ERR(CAM_FLASH, "Failed in getting the packet: %d", rc);
 		return rc;
 	}
 
-	if (config.offset > len_of_buffer) {
+	remain_len = len_of_buffer;
+	if ((sizeof(struct cam_packet) > len_of_buffer) ||
+		((size_t)config.offset >= len_of_buffer -
+		sizeof(struct cam_packet))) {
 		CAM_ERR(CAM_FLASH,
-			"offset is out of bounds: offset: %lld len: %zu",
-			config.offset, len_of_buffer);
+			"Inval cam_packet strut size: %zu, len_of_buff: %zu",
+			 sizeof(struct cam_packet), len_of_buffer);
 		rc = -EINVAL;
 		goto rel_pkt_buf;
 	}
 
+	remain_len -= (size_t)config.offset;
 	/* Add offset to the flash csl header */
-	csl_packet =
-		(struct cam_packet *)(generic_ptr + (uint32_t)config.offset);
+	csl_packet = (struct cam_packet *)(generic_ptr + config.offset);
+
+	if (cam_packet_util_validate_packet(csl_packet,
+		remain_len)) {
+		CAM_ERR(CAM_FLASH, "Invalid packet params");
+		rc = -EINVAL;
+		goto rel_pkt_buf;
+	}
 
 	if ((csl_packet->header.op_code & 0xFFFFFF) !=
 		CAM_FLASH_PACKET_OPCODE_INIT &&
@@ -1292,7 +1333,14 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 			CAM_ERR(CAM_FLASH, "Fail in get buffer: %d", rc);
 			goto rel_pkt_buf;
 		}
-
+		if ((len_of_buffer < sizeof(struct cam_flash_init)) ||
+			(cmd_desc->offset >
+			(len_of_buffer - sizeof(struct cam_flash_init)))) {
+			CAM_ERR(CAM_FLASH, "Not enough buffer");
+			rc = -EINVAL;
+			goto rel_pkt_buf;
+		}
+		remain_len = len_of_buffer - cmd_desc->offset;
 		cmd_buf = (uint32_t *)((uint8_t *)cmd_buf_ptr +
 			cmd_desc->offset);
 		cam_flash_info = (struct cam_flash_init *)cmd_buf;
@@ -1322,8 +1370,26 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 		case CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_FIRE: {
 			CAM_DBG(CAM_FLASH, "INIT_FIRE Operation");
 
+			if (remain_len < sizeof(struct cam_flash_set_on_off)) {
+				CAM_ERR(CAM_FLASH, "Not enough buffer");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+
 			flash_operation_info =
 				(struct cam_flash_set_on_off *) cmd_buf;
+			if (!flash_operation_info) {
+				CAM_ERR(CAM_FLASH,
+					"flash_operation_info Null");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+			if (flash_operation_info->count >
+				CAM_FLASH_MAX_LED_TRIGGERS) {
+				CAM_ERR(CAM_FLASH, "led count out of limit");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
 			fctrl->nrt_info.cmn_attr.count =
 				flash_operation_info->count;
 			fctrl->nrt_info.cmn_attr.request_id = 0;
@@ -1382,13 +1448,21 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 			goto rel_pkt_buf;
 		}
 
+		if ((len_of_buffer < sizeof(struct common_header)) ||
+			(cmd_desc->offset >
+			(len_of_buffer - sizeof(struct common_header)))) {
+			CAM_ERR(CAM_FLASH, "not enough buffer");
+			rc = -EINVAL;
+			goto rel_pkt_buf;
+		}
+		remain_len = len_of_buffer - cmd_desc->offset;
+
 		cmd_buf = (uint32_t *)((uint8_t *)cmd_buf_ptr +
 			cmd_desc->offset);
 		if (!cmd_buf) {
 			rc = -EINVAL;
 			goto rel_cmd_buf;
 		}
-
 		cmn_hdr = (struct common_header *)cmd_buf;
 
 		switch (cmn_hdr->cmd_type) {
@@ -1403,6 +1477,11 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 				flash_data->cmn_attr.is_settings_valid = false;
 				goto rel_cmd_buf;
 			}
+			if (remain_len < sizeof(struct cam_flash_set_on_off)) {
+				CAM_ERR(CAM_FLASH, "Not enough buffer");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
 
 			flash_operation_info =
 				(struct cam_flash_set_on_off *) cmd_buf;
@@ -1412,6 +1491,12 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 				rc = -EINVAL;
 				goto rel_cmd_buf;
 			}
+			if (flash_operation_info->count >
+				CAM_FLASH_MAX_LED_TRIGGERS) {
+				CAM_ERR(CAM_FLASH, "led count out of limit");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
 
 			flash_data->opcode = flash_operation_info->opcode;
 			flash_data->cmn_attr.count =
@@ -1446,6 +1531,15 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 			CAM_ERR(CAM_FLASH, "Fail in get buffer: %d", rc);
 			goto rel_pkt_buf;
 		}
+
+		if ((len_of_buffer < sizeof(struct common_header)) ||
+			(cmd_desc->offset >
+			(len_of_buffer - sizeof(struct common_header)))) {
+			CAM_ERR(CAM_FLASH, "Not enough buffer");
+			rc = -EINVAL;
+			goto rel_pkt_buf;
+		}
+		remain_len = len_of_buffer - cmd_desc->offset;
 		cmd_buf = (uint32_t *)((uint8_t *)cmd_buf_ptr +
 			cmd_desc->offset);
 		cmn_hdr = (struct common_header *)cmd_buf;
@@ -1453,8 +1547,26 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 		switch (cmn_hdr->cmd_type) {
 		case CAMERA_SENSOR_FLASH_CMD_TYPE_WIDGET: {
 			CAM_DBG(CAM_FLASH, "Widget Flash Operation");
+			if (remain_len < sizeof(struct cam_flash_set_on_off)) {
+				CAM_ERR(CAM_FLASH, "Not enough buffer");
+				rc = -EINVAL;
+				goto rel_pkt_buf;
+			}
 			flash_operation_info =
 				(struct cam_flash_set_on_off *) cmd_buf;
+			if (!flash_operation_info) {
+				CAM_ERR(CAM_FLASH,
+					"flash_operation_info Null");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+			if (flash_operation_info->count >
+				CAM_FLASH_MAX_LED_TRIGGERS) {
+				CAM_ERR(CAM_FLASH, "led count out of limit");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+
 			fctrl->nrt_info.cmn_attr.count =
 				flash_operation_info->count;
 			fctrl->nrt_info.cmn_attr.request_id = 0;
@@ -1476,6 +1588,11 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 		case CAMERA_SENSOR_FLASH_CMD_TYPE_QUERYCURR: {
 			int query_curr_ma = 0;
 
+			if (remain_len < sizeof(struct cam_flash_query_curr)) {
+				CAM_ERR(CAM_FLASH, "Not enough buffer");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
 			flash_query_info =
 				(struct cam_flash_query_curr *)cmd_buf;
 
@@ -1502,7 +1619,25 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg)
 		}
 		case CAMERA_SENSOR_FLASH_CMD_TYPE_RER: {
 			rc = 0;
+			if (remain_len < sizeof(struct cam_flash_set_rer)) {
+				CAM_ERR(CAM_FLASH, "Not enough buffer");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
 			flash_rer_info = (struct cam_flash_set_rer *)cmd_buf;
+			if (!flash_rer_info) {
+				CAM_ERR(CAM_FLASH,
+					"flash_rer_info Null");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+			if (flash_rer_info->count >
+				CAM_FLASH_MAX_LED_TRIGGERS) {
+				CAM_ERR(CAM_FLASH, "led count out of limit");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+
 			fctrl->nrt_info.cmn_attr.cmd_type =
 				CAMERA_SENSOR_FLASH_CMD_TYPE_RER;
 			fctrl->nrt_info.opcode = flash_rer_info->opcode;
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c
index 469f761..e7eca3e 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/module.h>
@@ -12,6 +12,7 @@
 #include "cam_debug_util.h"
 #include "cam_res_mgr_api.h"
 #include "cam_common_util.h"
+#include "cam_packet_util.h"
 
 int32_t cam_ois_construct_default_power_setting(
 	struct cam_sensor_power_ctrl_t *power_info)
@@ -247,12 +248,12 @@ static int cam_ois_apply_settings(struct cam_ois_ctrl_t *o_ctrl,
 }
 
 static int cam_ois_slaveInfo_pkt_parser(struct cam_ois_ctrl_t *o_ctrl,
-	uint32_t *cmd_buf)
+	uint32_t *cmd_buf, size_t len)
 {
 	int32_t rc = 0;
 	struct cam_cmd_ois_info *ois_info;
 
-	if (!o_ctrl || !cmd_buf) {
+	if (!o_ctrl || !cmd_buf || len < sizeof(struct cam_cmd_ois_info)) {
 		CAM_ERR(CAM_OIS, "Invalid Args");
 		return -EINVAL;
 	}
@@ -265,7 +266,8 @@ static int cam_ois_slaveInfo_pkt_parser(struct cam_ois_ctrl_t *o_ctrl,
 			ois_info->slave_addr >> 1;
 		o_ctrl->ois_fw_flag = ois_info->ois_fw_flag;
 		o_ctrl->is_ois_calib = ois_info->is_ois_calib;
-		memcpy(o_ctrl->ois_name, ois_info->ois_name, 32);
+		memcpy(o_ctrl->ois_name, ois_info->ois_name, OIS_NAME_LEN);
+		o_ctrl->ois_name[OIS_NAME_LEN - 1] = '\0';
 		o_ctrl->io_master_info.cci_client->retries = 3;
 		o_ctrl->io_master_info.cci_client->id_map = 0;
 		memcpy(&(o_ctrl->opcode), &(ois_info->opcode),
@@ -424,6 +426,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
 	struct cam_cmd_buf_desc        *cmd_desc = NULL;
 	uintptr_t                       generic_pkt_addr;
 	size_t                          pkt_len;
+	size_t                          remain_len = 0;
 	struct cam_packet              *csl_packet = NULL;
 	size_t                          len_of_buff = 0;
 	uint32_t                       *offset = NULL, *cmd_buf;
@@ -444,16 +447,29 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
 		return rc;
 	}
 
-	if (dev_config.offset > pkt_len) {
+	remain_len = pkt_len;
+	if ((sizeof(struct cam_packet) > pkt_len) ||
+		((size_t)dev_config.offset >= pkt_len -
+		sizeof(struct cam_packet))) {
 		CAM_ERR(CAM_OIS,
-			"offset is out of bound: off: %lld len: %zu",
-			dev_config.offset, pkt_len);
+			"Inval cam_packet strut size: %zu, len_of_buff: %zu",
+			 sizeof(struct cam_packet), pkt_len);
 		rc = -EINVAL;
 		goto rel_pkt;
 	}
 
+	remain_len -= (size_t)dev_config.offset;
 	csl_packet = (struct cam_packet *)
 		(generic_pkt_addr + (uint32_t)dev_config.offset);
+
+	if (cam_packet_util_validate_packet(csl_packet,
+		remain_len)) {
+		CAM_ERR(CAM_OIS, "Invalid packet params");
+		rc = -EINVAL;
+		goto rel_pkt;
+	}
+
+
 	switch (csl_packet->header.op_code & 0xFFFFFF) {
 	case CAM_OIS_PACKET_OPCODE_INIT:
 		offset = (uint32_t *)&csl_packet->payload;
@@ -479,13 +495,23 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
 				rc = -EINVAL;
 				goto rel_cmd_buf;
 			}
+
+			if ((len_of_buff < sizeof(struct common_header)) ||
+				(cmd_desc[i].offset > (len_of_buff -
+				sizeof(struct common_header)))) {
+				CAM_ERR(CAM_OIS,
+					"Invalid length for sensor cmd");
+				rc = -EINVAL;
+				goto rel_cmd_buf;
+			}
+			remain_len = len_of_buff - cmd_desc[i].offset;
 			cmd_buf += cmd_desc[i].offset / sizeof(uint32_t);
 			cmm_hdr = (struct common_header *)cmd_buf;
 
 			switch (cmm_hdr->cmd_type) {
 			case CAMERA_SENSOR_CMD_TYPE_I2C_INFO:
 				rc = cam_ois_slaveInfo_pkt_parser(
-					o_ctrl, cmd_buf);
+					o_ctrl, cmd_buf, remain_len);
 				if (rc < 0) {
 					CAM_ERR(CAM_OIS,
 					"Failed in parsing slave info");
@@ -499,7 +525,7 @@ static int cam_ois_pkt_parse(struct cam_ois_ctrl_t *o_ctrl, void *arg)
 				rc = cam_sensor_update_power_settings(
 					cmd_buf,
 					total_cmd_buf_in_bytes,
-					power_info);
+					power_info, remain_len);
 				if (rc) {
 					CAM_ERR(CAM_OIS,
 					"Failed: parse power settings");
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.h
index 49d018b..6331044 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_ois/cam_ois_core.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 #ifndef _CAM_OIS_CORE_H_
 #define _CAM_OIS_CORE_H_
@@ -9,6 +9,8 @@
 #include <linux/dma-contiguous.h>
 #include "cam_ois_dev.h"
 
+#define OIS_NAME_LEN 32
+
 /**
  * @power_info: power setting info to control the power
  *
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
index a709f79..60c76c7 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor/cam_sensor_core.c
@@ -10,6 +10,8 @@
 #include "cam_soc_util.h"
 #include "cam_trace.h"
 #include "cam_common_util.h"
+#include "cam_packet_util.h"
+
 
 static void cam_sensor_update_req_mgr(
 	struct cam_sensor_ctrl_t *s_ctrl,
@@ -87,6 +89,7 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
 	struct cam_cmd_buf_desc *cmd_desc = NULL;
 	struct i2c_settings_array *i2c_reg_settings = NULL;
 	size_t len_of_buff = 0;
+	size_t remain_len = 0;
 	uint32_t *offset = NULL;
 	struct cam_config_dev_cmd config;
 	struct i2c_data_settings *i2c_data = NULL;
@@ -108,20 +111,33 @@ static int32_t cam_sensor_i2c_pkt_parse(struct cam_sensor_ctrl_t *s_ctrl,
 		&generic_ptr,
 		&len_of_buff);
 	if (rc < 0) {
-		CAM_ERR(CAM_SENSOR, "Failed in getting the buffer: %d", rc);
+		CAM_ERR(CAM_SENSOR, "Failed in getting the packet: %d", rc);
 		return rc;
 	}
 
-	csl_packet = (struct cam_packet *)(generic_ptr +
-		(uint32_t)config.offset);
-	if (config.offset > len_of_buff) {
+	remain_len = len_of_buff;
+	if ((sizeof(struct cam_packet) > len_of_buff) ||
+		((size_t)config.offset >= len_of_buff -
+		sizeof(struct cam_packet))) {
 		CAM_ERR(CAM_SENSOR,
-			"offset is out of bounds: off: %lld len: %zu",
-			 config.offset, len_of_buff);
+			"Inval cam_packet strut size: %zu, len_of_buff: %zu",
+			 sizeof(struct cam_packet), len_of_buff);
 		rc = -EINVAL;
 		goto rel_pkt_buf;
 	}
 
+	remain_len -= (size_t)config.offset;
+	csl_packet = (struct cam_packet *)(generic_ptr +
+		(uint32_t)config.offset);
+
+	if (cam_packet_util_validate_packet(csl_packet,
+		remain_len)) {
+		CAM_ERR(CAM_SENSOR, "Invalid packet params");
+		rc = -EINVAL;
+		goto rel_pkt_buf;
+
+	}
+
 	if ((csl_packet->header.op_code & 0xFFFFFF) !=
 		CAM_SENSOR_PACKET_OPCODE_SENSOR_INITIAL_CONFIG &&
 		csl_packet->header.request_id <= s_ctrl->last_flush_req
@@ -360,7 +376,7 @@ int32_t cam_sensor_update_slave_info(struct cam_cmd_probe *probe_info,
 
 int32_t cam_handle_cmd_buffers_for_probe(void *cmd_buf,
 	struct cam_sensor_ctrl_t *s_ctrl,
-	int32_t cmd_buf_num, int cmd_buf_length)
+	int32_t cmd_buf_num, uint32_t cmd_buf_length, size_t remain_len)
 {
 	int32_t rc = 0;
 
@@ -369,6 +385,13 @@ int32_t cam_handle_cmd_buffers_for_probe(void *cmd_buf,
 		struct cam_cmd_i2c_info *i2c_info = NULL;
 		struct cam_cmd_probe *probe_info;
 
+		if (remain_len <
+			(sizeof(struct cam_cmd_i2c_info) +
+			sizeof(struct cam_cmd_probe))) {
+			CAM_ERR(CAM_SENSOR,
+				"not enough buffer for cam_cmd_i2c_info");
+			return -EINVAL;
+		}
 		i2c_info = (struct cam_cmd_i2c_info *)cmd_buf;
 		rc = cam_sensor_update_i2c_info(i2c_info, s_ctrl);
 		if (rc < 0) {
@@ -387,7 +410,8 @@ int32_t cam_handle_cmd_buffers_for_probe(void *cmd_buf,
 		break;
 	case 1: {
 		rc = cam_sensor_update_power_settings(cmd_buf,
-			cmd_buf_length, &s_ctrl->sensordata->power_info);
+			cmd_buf_length, &s_ctrl->sensordata->power_info,
+			remain_len);
 		if (rc < 0) {
 			CAM_ERR(CAM_SENSOR,
 				"Failed in updating power settings");
@@ -408,10 +432,11 @@ int32_t cam_handle_mem_ptr(uint64_t handle, struct cam_sensor_ctrl_t *s_ctrl)
 	uint32_t *cmd_buf;
 	void *ptr;
 	size_t len;
-	struct cam_packet *pkt;
-	struct cam_cmd_buf_desc *cmd_desc;
+	struct cam_packet *pkt = NULL;
+	struct cam_cmd_buf_desc *cmd_desc = NULL;
 	uintptr_t cmd_buf1 = 0;
 	uintptr_t packet = 0;
+	size_t    remain_len = 0;
 
 	rc = cam_mem_get_cpu_buf(handle,
 		&packet, &len);
@@ -419,7 +444,21 @@ int32_t cam_handle_mem_ptr(uint64_t handle, struct cam_sensor_ctrl_t *s_ctrl)
 		CAM_ERR(CAM_SENSOR, "Failed to get the command Buffer");
 		return -EINVAL;
 	}
+
 	pkt = (struct cam_packet *)packet;
+	if (pkt == NULL) {
+		CAM_ERR(CAM_SENSOR, "packet pos is invalid");
+		rc = -EINVAL;
+		goto rel_pkt_buf;
+	}
+
+	if ((len < sizeof(struct cam_packet)) ||
+		(pkt->cmd_buf_offset >= (len - sizeof(struct cam_packet)))) {
+		CAM_ERR(CAM_SENSOR, "Not enough buf provided");
+		rc = -EINVAL;
+		goto rel_pkt_buf;
+	}
+
 	cmd_desc = (struct cam_cmd_buf_desc *)
 		((uint32_t *)&pkt->payload + pkt->cmd_buf_offset/4);
 	if (cmd_desc == NULL) {
@@ -444,12 +483,25 @@ int32_t cam_handle_mem_ptr(uint64_t handle, struct cam_sensor_ctrl_t *s_ctrl)
 				"Failed to parse the command Buffer Header");
 			goto rel_pkt_buf;
 		}
+		if (cmd_desc[i].offset >= len) {
+			CAM_ERR(CAM_SENSOR,
+				"offset past length of buffer");
+			rc = -EINVAL;
+			goto rel_pkt_buf;
+		}
+		remain_len = len - cmd_desc[i].offset;
+		if (cmd_desc[i].length > remain_len) {
+			CAM_ERR(CAM_SENSOR,
+				"Not enough buffer provided for cmd");
+			rc = -EINVAL;
+			goto rel_pkt_buf;
+		}
 		cmd_buf = (uint32_t *)cmd_buf1;
 		cmd_buf += cmd_desc[i].offset/4;
 		ptr = (void *) cmd_buf;
 
 		rc = cam_handle_cmd_buffers_for_probe(ptr, s_ctrl,
-			i, cmd_desc[i].length);
+			i, cmd_desc[i].length, remain_len);
 		if (rc < 0) {
 			CAM_ERR(CAM_SENSOR,
 				"Failed to parse the command Buffer Header");
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c
index 379bb63..8d2370d 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.c
@@ -290,6 +290,8 @@ int cam_sensor_i2c_command_parser(
 	size_t                    len_of_buff = 0;
 	uintptr_t                  generic_ptr;
 	uint16_t                  cmd_length_in_bytes = 0;
+	size_t                    remain_len = 0;
+	size_t                    tot_size = 0;
 
 	for (i = 0; i < num_cmd_buffers; i++) {
 		uint32_t                  *cmd_buf = NULL;
@@ -317,10 +319,29 @@ int cam_sensor_i2c_command_parser(
 				cmd_desc[i].mem_handle, rc, len_of_buff);
 			return rc;
 		}
+
+		remain_len = len_of_buff;
+		if ((len_of_buff < sizeof(struct common_header)) ||
+			(cmd_desc[i].offset >
+			(len_of_buff - sizeof(struct common_header)))) {
+			CAM_ERR(CAM_SENSOR, "buffer provided too small");
+			return -EINVAL;
+		}
 		cmd_buf = (uint32_t *)generic_ptr;
 		cmd_buf += cmd_desc[i].offset / sizeof(uint32_t);
 
+		if (remain_len < cmd_desc[i].length) {
+			CAM_ERR(CAM_SENSOR, "buffer provided too small");
+			return -EINVAL;
+		}
+
 		while (byte_cnt < cmd_desc[i].length) {
+			if ((remain_len - byte_cnt) <
+				sizeof(struct common_header)) {
+				CAM_ERR(CAM_SENSOR, "Not enough buffer");
+				rc = -EINVAL;
+				goto rel_buf;
+			}
 			cmm_hdr = (struct common_header *)cmd_buf;
 			generic_op_code = cmm_hdr->fifth_byte;
 			switch (cmm_hdr->cmd_type) {
@@ -330,6 +351,24 @@ int cam_sensor_i2c_command_parser(
 					*cam_cmd_i2c_random_wr =
 					(struct cam_cmd_i2c_random_wr *)cmd_buf;
 
+				if ((remain_len - byte_cnt) <
+					sizeof(struct cam_cmd_i2c_random_wr)) {
+					CAM_ERR(CAM_SENSOR,
+						"Not enough buffer provided");
+					rc = -EINVAL;
+					goto rel_buf;
+				}
+				tot_size = sizeof(struct i2c_rdwr_header) +
+					(sizeof(struct i2c_random_wr_payload) *
+					cam_cmd_i2c_random_wr->header.count);
+
+				if (tot_size > (remain_len - byte_cnt)) {
+					CAM_ERR(CAM_SENSOR,
+						"Not enough buffer provided");
+					rc = -EINVAL;
+					goto rel_buf;
+				}
+
 				rc = cam_sensor_handle_random_write(
 					cam_cmd_i2c_random_wr,
 					i2c_reg_settings,
@@ -337,6 +376,7 @@ int cam_sensor_i2c_command_parser(
 				if (rc < 0) {
 					CAM_ERR(CAM_SENSOR,
 					"Failed in random write %d", rc);
+					rc = -EINVAL;
 					goto rel_buf;
 				}
 
@@ -352,6 +392,26 @@ int cam_sensor_i2c_command_parser(
 				(struct cam_cmd_i2c_continuous_wr *)
 				cmd_buf;
 
+				if ((remain_len - byte_cnt) <
+				sizeof(struct cam_cmd_i2c_continuous_wr)) {
+					CAM_ERR(CAM_SENSOR,
+						"Not enough buffer provided");
+					rc = -EINVAL;
+					goto rel_buf;
+				}
+
+				tot_size = sizeof(struct i2c_rdwr_header) +
+				sizeof(cam_cmd_i2c_continuous_wr->reg_addr) +
+				(sizeof(struct cam_cmd_read) *
+				cam_cmd_i2c_continuous_wr->header.count);
+
+				if (tot_size > (remain_len - byte_cnt)) {
+					CAM_ERR(CAM_SENSOR,
+						"Not enough buffer provided");
+					rc = -EINVAL;
+					goto rel_buf;
+				}
+
 				rc = cam_sensor_handle_continuous_write(
 					cam_cmd_i2c_continuous_wr,
 					i2c_reg_settings,
@@ -368,11 +428,17 @@ int cam_sensor_i2c_command_parser(
 				break;
 			}
 			case CAMERA_SENSOR_CMD_TYPE_WAIT: {
+				if ((remain_len - byte_cnt) <
+				sizeof(struct cam_cmd_unconditional_wait)) {
+					CAM_ERR(CAM_SENSOR,
+						"Not enough buffer space");
+					rc = -EINVAL;
+					goto rel_buf;
+				}
 				if (generic_op_code ==
 					CAMERA_SENSOR_WAIT_OP_HW_UCND ||
 					generic_op_code ==
 						CAMERA_SENSOR_WAIT_OP_SW_UCND) {
-
 					rc = cam_sensor_handle_delay(
 						&cmd_buf, generic_op_code,
 						i2c_reg_settings, j, &byte_cnt,
@@ -405,12 +471,19 @@ int cam_sensor_i2c_command_parser(
 				break;
 			}
 			case CAMERA_SENSOR_CMD_TYPE_I2C_INFO: {
+				if (remain_len - byte_cnt <
+				    sizeof(struct cam_cmd_i2c_info)) {
+					CAM_ERR(CAM_SENSOR,
+						"Not enough buffer space");
+					rc = -EINVAL;
+					goto rel_buf;
+				}
 				rc = cam_sensor_handle_slave_info(
 					io_master, cmd_buf);
 				if (rc) {
 					CAM_ERR(CAM_SENSOR,
-						"Handle slave info failed with rc: %d",
-						rc);
+					"Handle slave info failed with rc: %d",
+					rc);
 					goto rel_buf;
 				}
 				cmd_length_in_bytes =
@@ -753,8 +826,32 @@ int cam_sensor_util_request_gpio_table(
 	return rc;
 }
 
+
+static int32_t cam_sensor_validate(void *ptr, size_t remain_buf)
+{
+	struct common_header *cmm_hdr = (struct common_header *)ptr;
+	size_t validate_size = 0;
+
+	if (remain_buf < sizeof(struct common_header))
+		return -EINVAL;
+
+	if (cmm_hdr->cmd_type == CAMERA_SENSOR_CMD_TYPE_PWR_UP ||
+		cmm_hdr->cmd_type == CAMERA_SENSOR_CMD_TYPE_PWR_DOWN)
+		validate_size = sizeof(struct cam_cmd_power);
+	else if (cmm_hdr->cmd_type == CAMERA_SENSOR_CMD_TYPE_WAIT)
+		validate_size = sizeof(struct cam_cmd_unconditional_wait);
+
+	if (remain_buf < validate_size) {
+		CAM_ERR(CAM_SENSOR, "Invalid cmd_buf len %zu min %zu",
+			remain_buf, validate_size);
+		return -EINVAL;
+	}
+	return 0;
+}
+
 int32_t cam_sensor_update_power_settings(void *cmd_buf,
-	int cmd_length, struct cam_sensor_power_ctrl_t *power_info)
+	uint32_t cmd_length, struct cam_sensor_power_ctrl_t *power_info,
+	size_t cmd_buf_len)
 {
 	int32_t rc = 0, tot_size = 0, last_cmd_type = 0;
 	int32_t i = 0, pwr_up = 0, pwr_down = 0;
@@ -763,7 +860,8 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
 	struct cam_cmd_power *pwr_cmd = (struct cam_cmd_power *)cmd_buf;
 	struct common_header *cmm_hdr = (struct common_header *)cmd_buf;
 
-	if (!pwr_cmd || !cmd_length) {
+	if (!pwr_cmd || !cmd_length || cmd_buf_len < (size_t)cmd_length ||
+		cam_sensor_validate(cmd_buf, cmd_buf_len)) {
 		CAM_ERR(CAM_SENSOR, "Invalid Args: pwr_cmd %pK, cmd_length: %d",
 			pwr_cmd, cmd_length);
 		return -EINVAL;
@@ -788,6 +886,10 @@ int32_t cam_sensor_update_power_settings(void *cmd_buf,
 	}
 
 	while (tot_size < cmd_length) {
+		if (cam_sensor_validate(ptr, (cmd_length - tot_size))) {
+			rc = -EINVAL;
+			goto free_power_settings;
+		}
 		if (cmm_hdr->cmd_type ==
 			CAMERA_SENSOR_CMD_TYPE_PWR_UP) {
 			struct cam_cmd_power *pwr_cmd =
diff --git a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h
index 3f051a1..524521c 100644
--- a/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h
+++ b/drivers/media/platform/msm/camera/cam_sensor_module/cam_sensor_utils/cam_sensor_util.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #ifndef _CAM_SENSOR_UTIL_H_
@@ -53,7 +53,8 @@ int msm_camera_fill_vreg_params(struct cam_hw_soc_info *soc_info,
 	uint16_t power_setting_size);
 
 int32_t cam_sensor_update_power_settings(void *cmd_buf,
-	int cmd_length, struct cam_sensor_power_ctrl_t *power_info);
+	uint32_t cmd_length, struct cam_sensor_power_ctrl_t *power_info,
+	size_t cmd_buf_len);
 
 int cam_sensor_bob_pwm_mode_switch(struct cam_hw_soc_info *soc_info,
 	int bob_reg_idx, bool flag);
diff --git a/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.c b/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.c
index 6e8eb68..643657b 100644
--- a/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.c
+++ b/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.c
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0-only
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #include <linux/types.h>
@@ -43,23 +43,44 @@ int cam_packet_util_validate_cmd_desc(struct cam_cmd_buf_desc *cmd_desc)
 	return 0;
 }
 
-int cam_packet_util_validate_packet(struct cam_packet *packet)
+int cam_packet_util_validate_packet(struct cam_packet *packet,
+	size_t remain_len)
 {
+	size_t sum_cmd_desc = 0;
+	size_t sum_io_cfgs = 0;
+	size_t sum_patch_desc = 0;
+	size_t pkt_wo_payload = 0;
+
 	if (!packet)
 		return -EINVAL;
 
+	if ((size_t)packet->header.size > remain_len) {
+		CAM_ERR(CAM_UTIL,
+			"Invalid packet size: %zu, CPU buf length: %zu",
+			(size_t)packet->header.size, remain_len);
+		return -EINVAL;
+	}
+
+
 	CAM_DBG(CAM_UTIL, "num cmd buf:%d num of io config:%d kmd buf index:%d",
 		packet->num_cmd_buf, packet->num_io_configs,
 		packet->kmd_cmd_buf_index);
 
-	if ((packet->kmd_cmd_buf_index >= packet->num_cmd_buf) ||
-		(!packet->header.size) ||
-		(packet->cmd_buf_offset > packet->header.size) ||
-		(packet->io_configs_offset > packet->header.size))  {
-		CAM_ERR(CAM_UTIL, "invalid packet:%d %d %d %d %d",
-			packet->kmd_cmd_buf_index,
-			packet->num_cmd_buf, packet->cmd_buf_offset,
-			packet->io_configs_offset, packet->header.size);
+	sum_cmd_desc = packet->num_cmd_buf * sizeof(struct cam_cmd_buf_desc);
+	sum_io_cfgs = packet->num_io_configs * sizeof(struct cam_buf_io_cfg);
+	sum_patch_desc = packet->num_patches * sizeof(struct cam_patch_desc);
+	pkt_wo_payload = offsetof(struct cam_packet, payload);
+
+	if ((!packet->header.size) ||
+		((pkt_wo_payload + (size_t)packet->cmd_buf_offset +
+		sum_cmd_desc) > (size_t)packet->header.size) ||
+		((pkt_wo_payload + (size_t)packet->io_configs_offset +
+		sum_io_cfgs) > (size_t)packet->header.size) ||
+		((pkt_wo_payload + (size_t)packet->patch_offset +
+		sum_patch_desc) > (size_t)packet->header.size)) {
+		CAM_ERR(CAM_UTIL, "params not within mem len:%zu %zu %zu %zu",
+			(size_t)packet->header.size, sum_cmd_desc,
+			sum_io_cfgs, sum_patch_desc);
 		return -EINVAL;
 	}
 
@@ -71,6 +92,7 @@ int cam_packet_util_get_kmd_buffer(struct cam_packet *packet,
 {
 	int                      rc = 0;
 	size_t                   len = 0;
+	size_t                   remain_len = 0;
 	struct cam_cmd_buf_desc *cmd_desc;
 	uint32_t                *cpu_addr;
 
@@ -79,6 +101,13 @@ int cam_packet_util_get_kmd_buffer(struct cam_packet *packet,
 		return -EINVAL;
 	}
 
+	if ((packet->kmd_cmd_buf_index < 0) ||
+		(packet->kmd_cmd_buf_index > packet->num_cmd_buf)) {
+		CAM_ERR(CAM_UTIL, "Invalid kmd buf index: %d",
+			packet->kmd_cmd_buf_index);
+		return -EINVAL;
+	}
+
 	/* Take first command descriptor and add offset to it for kmd*/
 	cmd_desc = (struct cam_cmd_buf_desc *) ((uint8_t *)
 		&packet->payload + packet->cmd_buf_offset);
@@ -93,13 +122,23 @@ int cam_packet_util_get_kmd_buffer(struct cam_packet *packet,
 	if (rc)
 		return rc;
 
-	if (len < cmd_desc->size) {
+	remain_len = len;
+	if (((size_t)cmd_desc->offset >= len) ||
+		((size_t)cmd_desc->size >= (len - (size_t)cmd_desc->offset))) {
 		CAM_ERR(CAM_UTIL, "invalid memory len:%zd and cmd desc size:%d",
 			len, cmd_desc->size);
 		rc = -EINVAL;
 		goto rel_kmd_buf;
 	}
 
+	remain_len -= (size_t)cmd_desc->offset;
+	if ((size_t)packet->kmd_cmd_buf_offset >= remain_len) {
+		CAM_ERR(CAM_UTIL, "Invalid kmd cmd buf offset: %zu",
+			(size_t)packet->kmd_cmd_buf_offset);
+		rc = -EINVAL;
+		goto rel_kmd_buf;
+	}
+
 	cpu_addr += (cmd_desc->offset / 4) + (packet->kmd_cmd_buf_offset / 4);
 	CAM_DBG(CAM_UTIL, "total size %d, cmd size: %d, KMD buffer size: %d",
 		cmd_desc->size, cmd_desc->length,
@@ -169,6 +208,20 @@ int cam_packet_util_process_patches(struct cam_packet *packet,
 			patch_desc[i].dst_buf_hdl, patch_desc[i].dst_offset,
 			patch_desc[i].src_buf_hdl, patch_desc[i].src_offset);
 
+		if ((size_t)patch_desc[i].src_offset >= src_buf_size) {
+			CAM_ERR(CAM_UTIL,
+				"Invalid src buf patch offset");
+			return -EINVAL;
+		}
+
+		if ((dst_buf_len < sizeof(void *)) ||
+			((dst_buf_len - sizeof(void *)) <
+			(size_t)patch_desc[i].dst_offset)) {
+			CAM_ERR(CAM_UTIL,
+				"Invalid dst buf patch offset");
+			return -EINVAL;
+		}
+
 		dst_cpu_addr = (uint32_t *)((uint8_t *)dst_cpu_addr +
 			patch_desc[i].dst_offset);
 		temp += patch_desc[i].src_offset;
@@ -194,6 +247,7 @@ int cam_packet_util_process_generic_cmd_buffer(
 	int       rc;
 	uintptr_t  cpu_addr = 0;
 	size_t    buf_size;
+	size_t    remain_len = 0;
 	uint32_t *blob_ptr;
 	uint32_t  blob_type, blob_size, blob_block_size, len_read;
 
@@ -216,6 +270,21 @@ int cam_packet_util_process_generic_cmd_buffer(
 		return rc;
 	}
 
+	remain_len = buf_size;
+	if ((buf_size < sizeof(uint32_t)) ||
+		((size_t)cmd_buf->offset > (buf_size - sizeof(uint32_t)))) {
+		CAM_ERR(CAM_UTIL, "Invalid offset for cmd buf: %zu",
+			(size_t)cmd_buf->offset);
+		goto rel_cmd_buf;
+	}
+	remain_len -= (size_t)cmd_buf->offset;
+
+	if (remain_len < (size_t)cmd_buf->length) {
+		CAM_ERR(CAM_UTIL, "Invalid length for cmd buf: %zu",
+			(size_t)cmd_buf->length);
+		goto rel_cmd_buf;
+	}
+
 	blob_ptr = (uint32_t *)(((uint8_t *)cpu_addr) +
 		cmd_buf->offset);
 
diff --git a/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.h b/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.h
index cef1fb9..f211eb8 100644
--- a/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.h
+++ b/drivers/media/platform/msm/camera/cam_utils/cam_packet_util.h
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  */
 
 #ifndef _CAM_PACKET_UTIL_H_
@@ -52,10 +52,13 @@ int cam_packet_util_get_cmd_mem_addr(int handle, uint32_t **buf_addr,
  *
  * @packet:                Packet to be validated
  *
+ * @remain_len:            CPU buff length after config offset
+ *
  * @return:                0 for success
  *                         -EINVAL for Fail
  */
-int cam_packet_util_validate_packet(struct cam_packet *packet);
+int cam_packet_util_validate_packet(struct cam_packet *packet,
+	size_t remain_len);
 
 /**
  * cam_packet_util_validate_cmd_desc()
diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c
index 911fd36..c577196 100644
--- a/drivers/media/platform/msm/vidc/msm_venc.c
+++ b/drivers/media/platform/msm/vidc/msm_venc.c
@@ -919,15 +919,15 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = {
 		.step = 1,
 	},
 	{
-		.id = V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT,
+		.id = V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD,
 		.name = "NAL Format",
 		.type = V4L2_CTRL_TYPE_MENU,
-		.minimum = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES,
-		.maximum = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH,
-		.default_value = V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES,
+		.minimum = V4L2_MPEG_VIDEO_HEVC_SIZE_0,
+		.maximum = V4L2_MPEG_VIDEO_HEVC_SIZE_4,
+		.default_value = V4L2_MPEG_VIDEO_HEVC_SIZE_0,
 		.menu_skip_mask = ~(
-		(1 << V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES) |
-		(1 << V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH)
+		(1 << V4L2_MPEG_VIDEO_HEVC_SIZE_0) |
+		(1 << V4L2_MPEG_VIDEO_HEVC_SIZE_4)
 		),
 		.qmenu = mpeg_video_stream_format,
 	},
@@ -1767,7 +1767,7 @@ int msm_venc_s_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl)
 	case V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX:
 	case V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM:
 	case V4L2_CID_MPEG_VIDC_VIDEO_VUI_TIMING_INFO:
-	case V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT:
+	case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
 	case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH:
 	case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT:
 	case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_DIMENSIONS:
@@ -3112,6 +3112,7 @@ int msm_venc_set_vui_timing_info(struct msm_vidc_inst *inst)
 
 	return rc;
 }
+
 int msm_venc_set_nal_stream_format(struct msm_vidc_inst *inst)
 {
 	int rc = 0;
@@ -3129,7 +3130,8 @@ int msm_venc_set_nal_stream_format(struct msm_vidc_inst *inst)
 		inst->fmts[CAPTURE_PORT].fourcc != V4L2_PIX_FMT_HEVC)
 		return 0;
 
-	ctrl = msm_venc_get_ctrl(inst, V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT);
+	ctrl = msm_venc_get_ctrl(inst,
+			V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD);
 	if (!ctrl) {
 		dprintk(VIDC_ERR,
 			"%s: get nal stream format failed\n", __func__);
@@ -3137,11 +3139,11 @@ int msm_venc_set_nal_stream_format(struct msm_vidc_inst *inst)
 	}
 	stream_format.nal_stream_format_select = BIT(ctrl->val);
 	switch (ctrl->val) {
-	case V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_STARTCODES:
+	case V4L2_MPEG_VIDEO_HEVC_SIZE_0:
 		stream_format.nal_stream_format_select =
 			HFI_NAL_FORMAT_STARTCODES;
 		break;
-	case V4L2_MPEG_VIDC_VIDEO_NAL_FORMAT_FOUR_BYTE_LENGTH:
+	case V4L2_MPEG_VIDEO_HEVC_SIZE_4:
 		stream_format.nal_stream_format_select =
 			HFI_NAL_FORMAT_FOUR_BYTE_LENGTH;
 		break;
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index a9c23a6..af56c94 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -1617,7 +1617,7 @@ static int try_get_ctrl_for_instance(struct msm_vidc_inst *inst,
 		dprintk(VIDC_DBG, "g_min: %x : hal_buffer %d min buffers %d\n",
 			hash32_ptr(inst->session), HAL_BUFFER_INPUT, ctrl->val);
 		break;
-	case V4L2_CID_MPEG_VIDC_VIDEO_STREAM_FORMAT:
+	case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
 		ctrl->val =
 		inst->capability.nal_stream_format.nal_stream_format_supported;
 		break;
diff --git a/include/dt-bindings/phy/qcom,kona-qmp-usb3.h b/include/dt-bindings/phy/qcom,kona-qmp-usb3.h
new file mode 100644
index 0000000..9ae25ec
--- /dev/null
+++ b/include/dt-bindings/phy/qcom,kona-qmp-usb3.h
@@ -0,0 +1,1315 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ */
+
+#ifndef _DT_BINDINGS_PHY_QCOM_KONA_QMP_USB_H
+#define _DT_BINDINGS_PHY_QCOM_KONA_QMP_USB_H
+
+/* USB3-DP Combo PHY register offsets */
+#define USB3_DP_COM_PHY_MODE_CTRL				0x0000
+#define USB3_DP_COM_SW_RESET					0x0004
+#define USB3_DP_COM_POWER_DOWN_CTRL				0x0008
+#define USB3_DP_COM_SWI_CTRL					0x000C
+#define USB3_DP_COM_TYPEC_CTRL					0x0010
+#define USB3_DP_COM_TYPEC_PWRDN_CTRL				0x0014
+#define USB3_DP_COM_DP_BIST_CFG_0				0x0018
+#define USB3_DP_COM_RESET_OVRD_CTRL				0x001C
+#define USB3_DP_COM_DBG_CLK_MUX_CTRL				0x0020
+#define USB3_DP_COM_TYPEC_STATUS				0x0024
+#define USB3_DP_COM_PLACEHOLDER_STATUS				0x0028
+#define USB3_DP_COM_REVISION_ID0				0x002C
+#define USB3_DP_COM_REVISION_ID1				0x0030
+#define USB3_DP_COM_REVISION_ID2				0x0034
+#define USB3_DP_COM_REVISION_ID3				0x0038
+#define USB3_DP_QSERDES_COM_ATB_SEL1				0x1000
+#define USB3_DP_QSERDES_COM_ATB_SEL2				0x1004
+#define USB3_DP_QSERDES_COM_FREQ_UPDATE				0x1008
+#define USB3_DP_QSERDES_COM_BG_TIMER				0x100C
+#define USB3_DP_QSERDES_COM_SSC_EN_CENTER			0x1010
+#define USB3_DP_QSERDES_COM_SSC_ADJ_PER1			0x1014
+#define USB3_DP_QSERDES_COM_SSC_ADJ_PER2			0x1018
+#define USB3_DP_QSERDES_COM_SSC_PER1				0x101C
+#define USB3_DP_QSERDES_COM_SSC_PER2				0x1020
+#define USB3_DP_QSERDES_COM_SSC_STEP_SIZE1_MODE0		0x1024
+#define USB3_DP_QSERDES_COM_SSC_STEP_SIZE2_MODE0		0x1028
+#define USB3_DP_QSERDES_COM_SSC_STEP_SIZE3_MODE0		0x102C
+#define USB3_DP_QSERDES_COM_SSC_STEP_SIZE1_MODE1		0x1030
+#define USB3_DP_QSERDES_COM_SSC_STEP_SIZE2_MODE1		0x1034
+#define USB3_DP_QSERDES_COM_SSC_STEP_SIZE3_MODE1		0x1038
+#define USB3_DP_QSERDES_COM_POST_DIV				0x103C
+#define USB3_DP_QSERDES_COM_POST_DIV_MUX			0x1040
+#define USB3_DP_QSERDES_COM_BIAS_EN_CLKBUFLR_EN			0x1044
+#define USB3_DP_QSERDES_COM_CLK_ENABLE1				0x1048
+#define USB3_DP_QSERDES_COM_SYS_CLK_CTRL			0x104C
+#define USB3_DP_QSERDES_COM_SYSCLK_BUF_ENABLE			0x1050
+#define USB3_DP_QSERDES_COM_PLL_EN				0x1054
+#define USB3_DP_QSERDES_COM_PLL_IVCO				0x1058
+#define USB3_DP_QSERDES_COM_CMN_IETRIM				0x105C
+#define USB3_DP_QSERDES_COM_CMN_IPTRIM				0x1060
+#define USB3_DP_QSERDES_COM_EP_CLOCK_DETECT_CTRL		0x1064
+#define USB3_DP_QSERDES_COM_SYSCLK_DET_COMP_STATUS		0x1068
+#define USB3_DP_QSERDES_COM_CLK_EP_DIV_MODE0			0x106C
+#define USB3_DP_QSERDES_COM_CLK_EP_DIV_MODE1			0x1070
+#define USB3_DP_QSERDES_COM_CP_CTRL_MODE0			0x1074
+#define USB3_DP_QSERDES_COM_CP_CTRL_MODE1			0x1078
+#define USB3_DP_QSERDES_COM_PLL_RCTRL_MODE0			0x107C
+#define USB3_DP_QSERDES_COM_PLL_RCTRL_MODE1			0x1080
+#define USB3_DP_QSERDES_COM_PLL_CCTRL_MODE0			0x1084
+#define USB3_DP_QSERDES_COM_PLL_CCTRL_MODE1			0x1088
+#define USB3_DP_QSERDES_COM_PLL_CNTRL				0x108C
+#define USB3_DP_QSERDES_COM_BIAS_EN_CTRL_BY_PSM			0x1090
+#define USB3_DP_QSERDES_COM_SYSCLK_EN_SEL			0x1094
+#define USB3_DP_QSERDES_COM_CML_SYSCLK_SEL			0x1098
+#define USB3_DP_QSERDES_COM_RESETSM_CNTRL			0x109C
+#define USB3_DP_QSERDES_COM_RESETSM_CNTRL2			0x10A0
+#define USB3_DP_QSERDES_COM_LOCK_CMP_EN				0x10A4
+#define USB3_DP_QSERDES_COM_LOCK_CMP_CFG			0x10A8
+#define USB3_DP_QSERDES_COM_LOCK_CMP1_MODE0			0x10AC
+#define USB3_DP_QSERDES_COM_LOCK_CMP2_MODE0			0x10B0
+#define USB3_DP_QSERDES_COM_LOCK_CMP1_MODE1			0x10B4
+#define USB3_DP_QSERDES_COM_LOCK_CMP2_MODE1			0x10B8
+#define USB3_DP_QSERDES_COM_DEC_START_MODE0			0x10BC
+#define USB3_DP_QSERDES_COM_DEC_START_MSB_MODE0			0x10C0
+#define USB3_DP_QSERDES_COM_DEC_START_MODE1			0x10C4
+#define USB3_DP_QSERDES_COM_DEC_START_MSB_MODE1			0x10C8
+#define USB3_DP_QSERDES_COM_DIV_FRAC_START1_MODE0		0x10CC
+#define USB3_DP_QSERDES_COM_DIV_FRAC_START2_MODE0		0x10D0
+#define USB3_DP_QSERDES_COM_DIV_FRAC_START3_MODE0		0x10D4
+#define USB3_DP_QSERDES_COM_DIV_FRAC_START1_MODE1		0x10D8
+#define USB3_DP_QSERDES_COM_DIV_FRAC_START2_MODE1		0x10DC
+#define USB3_DP_QSERDES_COM_DIV_FRAC_START3_MODE1		0x10E0
+#define USB3_DP_QSERDES_COM_INTEGLOOP_INITVAL			0x10E4
+#define USB3_DP_QSERDES_COM_INTEGLOOP_EN			0x10E8
+#define USB3_DP_QSERDES_COM_INTEGLOOP_GAIN0_MODE0		0x10EC
+#define USB3_DP_QSERDES_COM_INTEGLOOP_GAIN1_MODE0		0x10F0
+#define USB3_DP_QSERDES_COM_INTEGLOOP_GAIN0_MODE1		0x10F4
+#define USB3_DP_QSERDES_COM_INTEGLOOP_GAIN1_MODE1		0x10F8
+#define USB3_DP_QSERDES_COM_INTEGLOOP_P_PATH_GAIN0		0x10FC
+#define USB3_DP_QSERDES_COM_INTEGLOOP_P_PATH_GAIN1		0x1100
+#define USB3_DP_QSERDES_COM_VCOCAL_DEADMAN_CTRL			0x1104
+#define USB3_DP_QSERDES_COM_VCO_TUNE_CTRL			0x1108
+#define USB3_DP_QSERDES_COM_VCO_TUNE_MAP			0x110C
+#define USB3_DP_QSERDES_COM_VCO_TUNE1_MODE0			0x1110
+#define USB3_DP_QSERDES_COM_VCO_TUNE2_MODE0			0x1114
+#define USB3_DP_QSERDES_COM_VCO_TUNE1_MODE1			0x1118
+#define USB3_DP_QSERDES_COM_VCO_TUNE2_MODE1			0x111C
+#define USB3_DP_QSERDES_COM_VCO_TUNE_INITVAL1			0x1120
+#define USB3_DP_QSERDES_COM_VCO_TUNE_INITVAL2			0x1124
+#define USB3_DP_QSERDES_COM_VCO_TUNE_MINVAL1			0x1128
+#define USB3_DP_QSERDES_COM_VCO_TUNE_MINVAL2			0x112C
+#define USB3_DP_QSERDES_COM_VCO_TUNE_MAXVAL1			0x1130
+#define USB3_DP_QSERDES_COM_VCO_TUNE_MAXVAL2			0x1134
+#define USB3_DP_QSERDES_COM_VCO_TUNE_TIMER1			0x1138
+#define USB3_DP_QSERDES_COM_VCO_TUNE_TIMER2			0x113C
+#define USB3_DP_QSERDES_COM_CMN_STATUS				0x1140
+#define USB3_DP_QSERDES_COM_RESET_SM_STATUS			0x1144
+#define USB3_DP_QSERDES_COM_RESTRIM_CODE_STATUS			0x1148
+#define USB3_DP_QSERDES_COM_PLLCAL_CODE1_STATUS			0x114C
+#define USB3_DP_QSERDES_COM_PLLCAL_CODE2_STATUS			0x1150
+#define USB3_DP_QSERDES_COM_CLK_SELECT				0x1154
+#define USB3_DP_QSERDES_COM_HSCLK_SEL				0x1158
+#define USB3_DP_QSERDES_COM_HSCLK_HS_SWITCH_SEL			0x115C
+#define USB3_DP_QSERDES_COM_INTEGLOOP_BINCODE_STATUS		0x1160
+#define USB3_DP_QSERDES_COM_PLL_ANALOG				0x1164
+#define USB3_DP_QSERDES_COM_CORECLK_DIV_MODE0			0x1168
+#define USB3_DP_QSERDES_COM_CORECLK_DIV_MODE1			0x116C
+#define USB3_DP_QSERDES_COM_SW_RESET				0x1170
+#define USB3_DP_QSERDES_COM_CORE_CLK_EN				0x1174
+#define USB3_DP_QSERDES_COM_C_READY_STATUS			0x1178
+#define USB3_DP_QSERDES_COM_CMN_CONFIG				0x117C
+#define USB3_DP_QSERDES_COM_CMN_RATE_OVERRIDE			0x1180
+#define USB3_DP_QSERDES_COM_SVS_MODE_CLK_SEL			0x1184
+#define USB3_DP_QSERDES_COM_DEBUG_BUS0				0x1188
+#define USB3_DP_QSERDES_COM_DEBUG_BUS1				0x118C
+#define USB3_DP_QSERDES_COM_DEBUG_BUS2				0x1190
+#define USB3_DP_QSERDES_COM_DEBUG_BUS3				0x1194
+#define USB3_DP_QSERDES_COM_DEBUG_BUS_SEL			0x1198
+#define USB3_DP_QSERDES_COM_CMN_MISC1				0x119C
+#define USB3_DP_QSERDES_COM_CMN_MISC2				0x11A0
+#define USB3_DP_QSERDES_COM_CMN_MODE				0x11A4
+#define USB3_DP_QSERDES_COM_VCO_DC_LEVEL_CTRL			0x11A8
+#define USB3_DP_QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0		0x11AC
+#define USB3_DP_QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0		0x11B0
+#define USB3_DP_QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE1		0x11B4
+#define USB3_DP_QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE1		0x11B8
+#define USB3_DP_QSERDES_COM_BIN_VCOCAL_HSCLK_SEL		0x11BC
+#define USB3_DP_QSERDES_TXA_BIST_MODE_LANENO			0x1200
+#define USB3_DP_QSERDES_TXA_BIST_INVERT				0x1204
+#define USB3_DP_QSERDES_TXA_CLKBUF_ENABLE			0x1208
+#define USB3_DP_QSERDES_TXA_TX_EMP_POST1_LVL			0x120C
+#define USB3_DP_QSERDES_TXA_TX_IDLE_LVL_LARGE_AMP		0x1210
+#define USB3_DP_QSERDES_TXA_TX_DRV_LVL				0x1214
+#define USB3_DP_QSERDES_TXA_TX_DRV_LVL_OFFSET			0x1218
+#define USB3_DP_QSERDES_TXA_RESET_TSYNC_EN			0x121C
+#define USB3_DP_QSERDES_TXA_PRE_STALL_LDO_BOOST_EN		0x1220
+#define USB3_DP_QSERDES_TXA_TX_BAND				0x1224
+#define USB3_DP_QSERDES_TXA_SLEW_CNTL				0x1228
+#define USB3_DP_QSERDES_TXA_INTERFACE_SELECT			0x122C
+#define USB3_DP_QSERDES_TXA_LPB_EN				0x1230
+#define USB3_DP_QSERDES_TXA_RES_CODE_LANE_TX			0x1234
+#define USB3_DP_QSERDES_TXA_RES_CODE_LANE_RX			0x1238
+#define USB3_DP_QSERDES_TXA_RES_CODE_LANE_OFFSET_TX		0x123C
+#define USB3_DP_QSERDES_TXA_RES_CODE_LANE_OFFSET_RX		0x1240
+#define USB3_DP_QSERDES_TXA_PERL_LENGTH1			0x1244
+#define USB3_DP_QSERDES_TXA_PERL_LENGTH2			0x1248
+#define USB3_DP_QSERDES_TXA_SERDES_BYP_EN_OUT			0x124C
+#define USB3_DP_QSERDES_TXA_DEBUG_BUS_SEL			0x1250
+#define USB3_DP_QSERDES_TXA_TRANSCEIVER_BIAS_EN			0x1254
+#define USB3_DP_QSERDES_TXA_HIGHZ_DRVR_EN			0x1258
+#define USB3_DP_QSERDES_TXA_TX_POL_INV				0x125C
+#define USB3_DP_QSERDES_TXA_PARRATE_REC_DETECT_IDLE_EN		0x1260
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN1			0x1264
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN2			0x1268
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN3			0x126C
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN4			0x1270
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN5			0x1274
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN6			0x1278
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN7			0x127C
+#define USB3_DP_QSERDES_TXA_BIST_PATTERN8			0x1280
+#define USB3_DP_QSERDES_TXA_LANE_MODE_1				0x1284
+#define USB3_DP_QSERDES_TXA_LANE_MODE_2				0x1288
+#define USB3_DP_QSERDES_TXA_LANE_MODE_3				0x128C
+#define USB3_DP_QSERDES_TXA_ATB_SEL1				0x1290
+#define USB3_DP_QSERDES_TXA_ATB_SEL2				0x1294
+#define USB3_DP_QSERDES_TXA_RCV_DETECT_LVL			0x1298
+#define USB3_DP_QSERDES_TXA_RCV_DETECT_LVL_2			0x129C
+#define USB3_DP_QSERDES_TXA_PRBS_SEED1				0x12A0
+#define USB3_DP_QSERDES_TXA_PRBS_SEED2				0x12A4
+#define USB3_DP_QSERDES_TXA_PRBS_SEED3				0x12A8
+#define USB3_DP_QSERDES_TXA_PRBS_SEED4				0x12AC
+#define USB3_DP_QSERDES_TXA_RESET_GEN				0x12B0
+#define USB3_DP_QSERDES_TXA_RESET_GEN_MUXES			0x12B4
+#define USB3_DP_QSERDES_TXA_TRAN_DRVR_EMP_EN			0x12B8
+#define USB3_DP_QSERDES_TXA_TX_INTERFACE_MODE			0x12BC
+#define USB3_DP_QSERDES_TXA_PWM_CTRL				0x12C0
+#define USB3_DP_QSERDES_TXA_PWM_ENCODED_OR_DATA			0x12C4
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_1_DIVIDER_BAND2		0x12C8
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_2_DIVIDER_BAND2		0x12CC
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_3_DIVIDER_BAND2		0x12D0
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_4_DIVIDER_BAND2		0x12D4
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_1_DIVIDER_BAND0_1		0x12D8
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_2_DIVIDER_BAND0_1		0x12DC
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_3_DIVIDER_BAND0_1		0x12E0
+#define USB3_DP_QSERDES_TXA_PWM_GEAR_4_DIVIDER_BAND0_1		0x12E4
+#define USB3_DP_QSERDES_TXA_VMODE_CTRL1				0x12E8
+#define USB3_DP_QSERDES_TXA_ALOG_OBSV_BUS_CTRL_1		0x12EC
+#define USB3_DP_QSERDES_TXA_BIST_STATUS				0x12F0
+#define USB3_DP_QSERDES_TXA_BIST_ERROR_COUNT1			0x12F4
+#define USB3_DP_QSERDES_TXA_BIST_ERROR_COUNT2			0x12F8
+#define USB3_DP_QSERDES_TXA_ALOG_OBSV_BUS_STATUS_1		0x12FC
+#define USB3_DP_QSERDES_TXA_LANE_DIG_CONFIG			0x1300
+#define USB3_DP_QSERDES_TXA_PI_QEC_CTRL				0x1304
+#define USB3_DP_QSERDES_TXA_PRE_EMPH				0x1308
+#define USB3_DP_QSERDES_TXA_SW_RESET				0x130C
+#define USB3_DP_QSERDES_TXA_DCC_OFFSET				0x1310
+#define USB3_DP_QSERDES_TXA_DIG_BKUP_CTRL			0x1314
+#define USB3_DP_QSERDES_TXA_DEBUG_BUS0				0x1318
+#define USB3_DP_QSERDES_TXA_DEBUG_BUS1				0x131C
+#define USB3_DP_QSERDES_TXA_DEBUG_BUS2				0x1320
+#define USB3_DP_QSERDES_TXA_DEBUG_BUS3				0x1324
+#define USB3_DP_QSERDES_TXA_READ_EQCODE				0x1328
+#define USB3_DP_QSERDES_TXA_READ_OFFSETCODE			0x132C
+#define USB3_DP_QSERDES_TXA_IA_ERROR_COUNTER_LOW		0x1330
+#define USB3_DP_QSERDES_TXA_IA_ERROR_COUNTER_HIGH		0x1334
+#define USB3_DP_QSERDES_TXA_VGA_READ_CODE			0x1338
+#define USB3_DP_QSERDES_TXA_VTH_READ_CODE			0x133C
+#define USB3_DP_QSERDES_TXA_DFE_TAP1_READ_CODE			0x1340
+#define USB3_DP_QSERDES_TXA_DFE_TAP2_READ_CODE			0x1344
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_I			0x1348
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_IBAR			0x134C
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_Q			0x1350
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_QBAR			0x1354
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_A			0x1358
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_ABAR			0x135C
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_SM_ON			0x1360
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_CAL_DONE		0x1364
+#define USB3_DP_QSERDES_TXA_IDAC_STATUS_SIGNERROR		0x1368
+#define USB3_DP_QSERDES_TXA_DCC_CAL_STATUS			0x136C
+#define USB3_DP_QSERDES_RXA_UCDR_FO_GAIN_HALF			0x1400
+#define USB3_DP_QSERDES_RXA_UCDR_FO_GAIN_QUARTER		0x1404
+#define USB3_DP_QSERDES_RXA_UCDR_FO_GAIN			0x1408
+#define USB3_DP_QSERDES_RXA_UCDR_SO_GAIN_HALF			0x140C
+#define USB3_DP_QSERDES_RXA_UCDR_SO_GAIN_QUARTER		0x1410
+#define USB3_DP_QSERDES_RXA_UCDR_SO_GAIN			0x1414
+#define USB3_DP_QSERDES_RXA_UCDR_SVS_FO_GAIN_HALF		0x1418
+#define USB3_DP_QSERDES_RXA_UCDR_SVS_FO_GAIN_QUARTER		0x141C
+#define USB3_DP_QSERDES_RXA_UCDR_SVS_FO_GAIN			0x1420
+#define USB3_DP_QSERDES_RXA_UCDR_SVS_SO_GAIN_HALF		0x1424
+#define USB3_DP_QSERDES_RXA_UCDR_SVS_SO_GAIN_QUARTER		0x1428
+#define USB3_DP_QSERDES_RXA_UCDR_SVS_SO_GAIN			0x142C
+#define USB3_DP_QSERDES_RXA_UCDR_FASTLOCK_FO_GAIN		0x1430
+#define USB3_DP_QSERDES_RXA_UCDR_SO_SATURATION_AND_ENABLE	0x1434
+#define USB3_DP_QSERDES_RXA_UCDR_FO_TO_SO_DELAY			0x1438
+#define USB3_DP_QSERDES_RXA_UCDR_FASTLOCK_COUNT_LOW		0x143C
+#define USB3_DP_QSERDES_RXA_UCDR_FASTLOCK_COUNT_HIGH		0x1440
+#define USB3_DP_QSERDES_RXA_UCDR_PI_CONTROLS			0x1444
+#define USB3_DP_QSERDES_RXA_UCDR_PI_CTRL2			0x1448
+#define USB3_DP_QSERDES_RXA_UCDR_SB2_THRESH1			0x144C
+#define USB3_DP_QSERDES_RXA_UCDR_SB2_THRESH2			0x1450
+#define USB3_DP_QSERDES_RXA_UCDR_SB2_GAIN1			0x1454
+#define USB3_DP_QSERDES_RXA_UCDR_SB2_GAIN2			0x1458
+#define USB3_DP_QSERDES_RXA_AUX_CONTROL				0x145C
+#define USB3_DP_QSERDES_RXA_AUX_DATA_TCOARSE_TFINE		0x1460
+#define USB3_DP_QSERDES_RXA_RCLK_AUXDATA_SEL			0x1464
+#define USB3_DP_QSERDES_RXA_AC_JTAG_ENABLE			0x1468
+#define USB3_DP_QSERDES_RXA_AC_JTAG_INITP			0x146C
+#define USB3_DP_QSERDES_RXA_AC_JTAG_INITN			0x1470
+#define USB3_DP_QSERDES_RXA_AC_JTAG_LVL				0x1474
+#define USB3_DP_QSERDES_RXA_AC_JTAG_MODE			0x1478
+#define USB3_DP_QSERDES_RXA_AC_JTAG_RESET			0x147C
+#define USB3_DP_QSERDES_RXA_RX_TERM_BW				0x1480
+#define USB3_DP_QSERDES_RXA_RX_RCVR_IQ_EN			0x1484
+#define USB3_DP_QSERDES_RXA_RX_IDAC_I_DC_OFFSETS		0x1488
+#define USB3_DP_QSERDES_RXA_RX_IDAC_IBAR_DC_OFFSETS		0x148C
+#define USB3_DP_QSERDES_RXA_RX_IDAC_Q_DC_OFFSETS		0x1490
+#define USB3_DP_QSERDES_RXA_RX_IDAC_QBAR_DC_OFFSETS		0x1494
+#define USB3_DP_QSERDES_RXA_RX_IDAC_A_DC_OFFSETS		0x1498
+#define USB3_DP_QSERDES_RXA_RX_IDAC_ABAR_DC_OFFSETS		0x149C
+#define USB3_DP_QSERDES_RXA_RX_IDAC_EN				0x14A0
+#define USB3_DP_QSERDES_RXA_RX_IDAC_ENABLES			0x14A4
+#define USB3_DP_QSERDES_RXA_RX_IDAC_SIGN			0x14A8
+#define USB3_DP_QSERDES_RXA_RX_HIGHZ_HIGHRATE			0x14AC
+#define USB3_DP_QSERDES_RXA_RX_TERM_AC_BYPASS_DC_COUPLE_OFFSET	0x14B0
+#define USB3_DP_QSERDES_RXA_DFE_1				0x14B4
+#define USB3_DP_QSERDES_RXA_DFE_2				0x14B8
+#define USB3_DP_QSERDES_RXA_DFE_3				0x14BC
+#define USB3_DP_QSERDES_RXA_DFE_4				0x14C0
+#define USB3_DP_QSERDES_RXA_TX_ADAPT_PRE_THRESH1		0x14C4
+#define USB3_DP_QSERDES_RXA_TX_ADAPT_PRE_THRESH2		0x14C8
+#define USB3_DP_QSERDES_RXA_TX_ADAPT_POST_THRESH		0x14CC
+#define USB3_DP_QSERDES_RXA_TX_ADAPT_MAIN_THRESH		0x14D0
+#define USB3_DP_QSERDES_RXA_VGA_CAL_CNTRL1			0x14D4
+#define USB3_DP_QSERDES_RXA_VGA_CAL_CNTRL2			0x14D8
+#define USB3_DP_QSERDES_RXA_GM_CAL				0x14DC
+#define USB3_DP_QSERDES_RXA_RX_VGA_GAIN2_LSB			0x14E0
+#define USB3_DP_QSERDES_RXA_RX_VGA_GAIN2_MSB			0x14E4
+#define USB3_DP_QSERDES_RXA_RX_EQU_ADAPTOR_CNTRL1		0x14E8
+#define USB3_DP_QSERDES_RXA_RX_EQU_ADAPTOR_CNTRL2		0x14EC
+#define USB3_DP_QSERDES_RXA_RX_EQU_ADAPTOR_CNTRL3		0x14F0
+#define USB3_DP_QSERDES_RXA_RX_EQU_ADAPTOR_CNTRL4		0x14F4
+#define USB3_DP_QSERDES_RXA_RX_IDAC_TSETTLE_LOW			0x14F8
+#define USB3_DP_QSERDES_RXA_RX_IDAC_TSETTLE_HIGH		0x14FC
+#define USB3_DP_QSERDES_RXA_RX_IDAC_MEASURE_TIME		0x1500
+#define USB3_DP_QSERDES_RXA_RX_IDAC_ACCUMULATOR			0x1504
+#define USB3_DP_QSERDES_RXA_RX_EQ_OFFSET_LSB			0x1508
+#define USB3_DP_QSERDES_RXA_RX_EQ_OFFSET_MSB			0x150C
+#define USB3_DP_QSERDES_RXA_RX_EQ_OFFSET_ADAPTOR_CNTRL1		0x1510
+#define USB3_DP_QSERDES_RXA_RX_OFFSET_ADAPTOR_CNTRL2		0x1514
+#define USB3_DP_QSERDES_RXA_SIGDET_ENABLES			0x1518
+#define USB3_DP_QSERDES_RXA_SIGDET_CNTRL			0x151C
+#define USB3_DP_QSERDES_RXA_SIGDET_LVL				0x1520
+#define USB3_DP_QSERDES_RXA_SIGDET_DEGLITCH_CNTRL		0x1524
+#define USB3_DP_QSERDES_RXA_RX_BAND				0x1528
+#define USB3_DP_QSERDES_RXA_CDR_FREEZE_UP_DN			0x152C
+#define USB3_DP_QSERDES_RXA_CDR_RESET_OVERRIDE			0x1530
+#define USB3_DP_QSERDES_RXA_RX_INTERFACE_MODE			0x1534
+#define USB3_DP_QSERDES_RXA_JITTER_GEN_MODE			0x1538
+#define USB3_DP_QSERDES_RXA_SJ_AMP1				0x153C
+#define USB3_DP_QSERDES_RXA_SJ_AMP2				0x1540
+#define USB3_DP_QSERDES_RXA_SJ_PER1				0x1544
+#define USB3_DP_QSERDES_RXA_SJ_PER2				0x1548
+#define USB3_DP_QSERDES_RXA_PPM_OFFSET1				0x154C
+#define USB3_DP_QSERDES_RXA_PPM_OFFSET2				0x1550
+#define USB3_DP_QSERDES_RXA_SIGN_PPM_PERIOD1			0x1554
+#define USB3_DP_QSERDES_RXA_SIGN_PPM_PERIOD2			0x1558
+#define USB3_DP_QSERDES_RXA_RX_PWM_ENABLE_AND_DATA		0x155C
+#define USB3_DP_QSERDES_RXA_RX_PWM_GEAR1_TIMEOUT_COUNT		0x1560
+#define USB3_DP_QSERDES_RXA_RX_PWM_GEAR2_TIMEOUT_COUNT		0x1564
+#define USB3_DP_QSERDES_RXA_RX_PWM_GEAR3_TIMEOUT_COUNT		0x1568
+#define USB3_DP_QSERDES_RXA_RX_PWM_GEAR4_TIMEOUT_COUNT		0x156C
+#define USB3_DP_QSERDES_RXA_RX_MODE_00_LOW			0x1570
+#define USB3_DP_QSERDES_RXA_RX_MODE_00_HIGH			0x1574
+#define USB3_DP_QSERDES_RXA_RX_MODE_00_HIGH2			0x1578
+#define USB3_DP_QSERDES_RXA_RX_MODE_00_HIGH3			0x157C
+#define USB3_DP_QSERDES_RXA_RX_MODE_00_HIGH4			0x1580
+#define USB3_DP_QSERDES_RXA_RX_MODE_01_LOW			0x1584
+#define USB3_DP_QSERDES_RXA_RX_MODE_01_HIGH			0x1588
+#define USB3_DP_QSERDES_RXA_RX_MODE_01_HIGH2			0x158C
+#define USB3_DP_QSERDES_RXA_RX_MODE_01_HIGH3			0x1590
+#define USB3_DP_QSERDES_RXA_RX_MODE_01_HIGH4			0x1594
+#define USB3_DP_QSERDES_RXA_RX_MODE_10_LOW			0x1598
+#define USB3_DP_QSERDES_RXA_RX_MODE_10_HIGH			0x159C
+#define USB3_DP_QSERDES_RXA_RX_MODE_10_HIGH2			0x15A0
+#define USB3_DP_QSERDES_RXA_RX_MODE_10_HIGH3			0x15A4
+#define USB3_DP_QSERDES_RXA_RX_MODE_10_HIGH4			0x15A8
+#define USB3_DP_QSERDES_RXA_PHPRE_CTRL				0x15AC
+#define USB3_DP_QSERDES_RXA_PHPRE_INITVAL			0x15B0
+#define USB3_DP_QSERDES_RXA_DFE_EN_TIMER			0x15B4
+#define USB3_DP_QSERDES_RXA_DFE_CTLE_POST_CAL_OFFSET		0x15B8
+#define USB3_DP_QSERDES_RXA_DCC_CTRL1				0x15BC
+#define USB3_DP_QSERDES_RXA_DCC_CTRL2				0x15C0
+#define USB3_DP_QSERDES_RXA_VTH_CODE				0x15C4
+#define USB3_DP_QSERDES_RXA_VTH_MIN_THRESH			0x15C8
+#define USB3_DP_QSERDES_RXA_VTH_MAX_THRESH			0x15CC
+#define USB3_DP_QSERDES_RXA_ALOG_OBSV_BUS_CTRL_1		0x15D0
+#define USB3_DP_QSERDES_RXA_PI_CTRL1				0x15D4
+#define USB3_DP_QSERDES_RXA_PI_CTRL2				0x15D8
+#define USB3_DP_QSERDES_RXA_PI_QUAD				0x15DC
+#define USB3_DP_QSERDES_RXA_IDATA1				0x15E0
+#define USB3_DP_QSERDES_RXA_IDATA2				0x15E4
+#define USB3_DP_QSERDES_RXA_AUX_DATA1				0x15E8
+#define USB3_DP_QSERDES_RXA_AUX_DATA2				0x15EC
+#define USB3_DP_QSERDES_RXA_AC_JTAG_OUTP			0x15F0
+#define USB3_DP_QSERDES_RXA_AC_JTAG_OUTN			0x15F4
+#define USB3_DP_QSERDES_RXA_RX_SIGDET				0x15F8
+#define USB3_DP_QSERDES_RXA_ALOG_OBSV_BUS_STATUS_1		0x15FC
+#define USB3_DP_QSERDES_TXB_BIST_MODE_LANENO			0x1600
+#define USB3_DP_QSERDES_TXB_BIST_INVERT				0x1604
+#define USB3_DP_QSERDES_TXB_CLKBUF_ENABLE			0x1608
+#define USB3_DP_QSERDES_TXB_TX_EMP_POST1_LVL			0x160C
+#define USB3_DP_QSERDES_TXB_TX_IDLE_LVL_LARGE_AMP		0x1610
+#define USB3_DP_QSERDES_TXB_TX_DRV_LVL				0x1614
+#define USB3_DP_QSERDES_TXB_TX_DRV_LVL_OFFSET			0x1618
+#define USB3_DP_QSERDES_TXB_RESET_TSYNC_EN			0x161C
+#define USB3_DP_QSERDES_TXB_PRE_STALL_LDO_BOOST_EN		0x1620
+#define USB3_DP_QSERDES_TXB_TX_BAND				0x1624
+#define USB3_DP_QSERDES_TXB_SLEW_CNTL				0x1628
+#define USB3_DP_QSERDES_TXB_INTERFACE_SELECT			0x162C
+#define USB3_DP_QSERDES_TXB_LPB_EN				0x1630
+#define USB3_DP_QSERDES_TXB_RES_CODE_LANE_TX			0x1634
+#define USB3_DP_QSERDES_TXB_RES_CODE_LANE_RX			0x1638
+#define USB3_DP_QSERDES_TXB_RES_CODE_LANE_OFFSET_TX		0x163C
+#define USB3_DP_QSERDES_TXB_RES_CODE_LANE_OFFSET_RX		0x1640
+#define USB3_DP_QSERDES_TXB_PERL_LENGTH1			0x1644
+#define USB3_DP_QSERDES_TXB_PERL_LENGTH2			0x1648
+#define USB3_DP_QSERDES_TXB_SERDES_BYP_EN_OUT			0x164C
+#define USB3_DP_QSERDES_TXB_DEBUG_BUS_SEL			0x1650
+#define USB3_DP_QSERDES_TXB_TRANSCEIVER_BIAS_EN			0x1654
+#define USB3_DP_QSERDES_TXB_HIGHZ_DRVR_EN			0x1658
+#define USB3_DP_QSERDES_TXB_TX_POL_INV				0x165C
+#define USB3_DP_QSERDES_TXB_PARRATE_REC_DETECT_IDLE_EN		0x1660
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN1			0x1664
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN2			0x1668
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN3			0x166C
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN4			0x1670
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN5			0x1674
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN6			0x1678
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN7			0x167C
+#define USB3_DP_QSERDES_TXB_BIST_PATTERN8			0x1680
+#define USB3_DP_QSERDES_TXB_LANE_MODE_1				0x1684
+#define USB3_DP_QSERDES_TXB_LANE_MODE_2				0x1688
+#define USB3_DP_QSERDES_TXB_LANE_MODE_3				0x168C
+#define USB3_DP_QSERDES_TXB_ATB_SEL1				0x1690
+#define USB3_DP_QSERDES_TXB_ATB_SEL2				0x1694
+#define USB3_DP_QSERDES_TXB_RCV_DETECT_LVL			0x1698
+#define USB3_DP_QSERDES_TXB_RCV_DETECT_LVL_2			0x169C
+#define USB3_DP_QSERDES_TXB_PRBS_SEED1				0x16A0
+#define USB3_DP_QSERDES_TXB_PRBS_SEED2				0x16A4
+#define USB3_DP_QSERDES_TXB_PRBS_SEED3				0x16A8
+#define USB3_DP_QSERDES_TXB_PRBS_SEED4				0x16AC
+#define USB3_DP_QSERDES_TXB_RESET_GEN				0x16B0
+#define USB3_DP_QSERDES_TXB_RESET_GEN_MUXES			0x16B4
+#define USB3_DP_QSERDES_TXB_TRAN_DRVR_EMP_EN			0x16B8
+#define USB3_DP_QSERDES_TXB_TX_INTERFACE_MODE			0x16BC
+#define USB3_DP_QSERDES_TXB_PWM_CTRL				0x16C0
+#define USB3_DP_QSERDES_TXB_PWM_ENCODED_OR_DATA			0x16C4
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_1_DIVIDER_BAND2		0x16C8
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_2_DIVIDER_BAND2		0x16CC
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_3_DIVIDER_BAND2		0x16D0
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_4_DIVIDER_BAND2		0x16D4
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_1_DIVIDER_BAND0_1		0x16D8
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_2_DIVIDER_BAND0_1		0x16DC
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_3_DIVIDER_BAND0_1		0x16E0
+#define USB3_DP_QSERDES_TXB_PWM_GEAR_4_DIVIDER_BAND0_1		0x16E4
+#define USB3_DP_QSERDES_TXB_VMODE_CTRL1				0x16E8
+#define USB3_DP_QSERDES_TXB_ALOG_OBSV_BUS_CTRL_1		0x16EC
+#define USB3_DP_QSERDES_TXB_BIST_STATUS				0x16F0
+#define USB3_DP_QSERDES_TXB_BIST_ERROR_COUNT1			0x16F4
+#define USB3_DP_QSERDES_TXB_BIST_ERROR_COUNT2			0x16F8
+#define USB3_DP_QSERDES_TXB_ALOG_OBSV_BUS_STATUS_1		0x16FC
+#define USB3_DP_QSERDES_TXB_LANE_DIG_CONFIG			0x1700
+#define USB3_DP_QSERDES_TXB_PI_QEC_CTRL				0x1704
+#define USB3_DP_QSERDES_TXB_PRE_EMPH				0x1708
+#define USB3_DP_QSERDES_TXB_SW_RESET				0x170C
+#define USB3_DP_QSERDES_TXB_DCC_OFFSET				0x1710
+#define USB3_DP_QSERDES_TXB_DIG_BKUP_CTRL			0x1714
+#define USB3_DP_QSERDES_TXB_DEBUG_BUS0				0x1718
+#define USB3_DP_QSERDES_TXB_DEBUG_BUS1				0x171C
+#define USB3_DP_QSERDES_TXB_DEBUG_BUS2				0x1720
+#define USB3_DP_QSERDES_TXB_DEBUG_BUS3				0x1724
+#define USB3_DP_QSERDES_TXB_READ_EQCODE				0x1728
+#define USB3_DP_QSERDES_TXB_READ_OFFSETCODE			0x172C
+#define USB3_DP_QSERDES_TXB_IA_ERROR_COUNTER_LOW		0x1730
+#define USB3_DP_QSERDES_TXB_IA_ERROR_COUNTER_HIGH		0x1734
+#define USB3_DP_QSERDES_TXB_VGA_READ_CODE			0x1738
+#define USB3_DP_QSERDES_TXB_VTH_READ_CODE			0x173C
+#define USB3_DP_QSERDES_TXB_DFE_TAP1_READ_CODE			0x1740
+#define USB3_DP_QSERDES_TXB_DFE_TAP2_READ_CODE			0x1744
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_I			0x1748
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_IBAR			0x174C
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_Q			0x1750
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_QBAR			0x1754
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_A			0x1758
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_ABAR			0x175C
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_SM_ON			0x1760
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_CAL_DONE		0x1764
+#define USB3_DP_QSERDES_TXB_IDAC_STATUS_SIGNERROR		0x1768
+#define USB3_DP_QSERDES_TXB_DCC_CAL_STATUS			0x176C
+#define USB3_DP_QSERDES_RXB_UCDR_FO_GAIN_HALF			0x1800
+#define USB3_DP_QSERDES_RXB_UCDR_FO_GAIN_QUARTER		0x1804
+#define USB3_DP_QSERDES_RXB_UCDR_FO_GAIN			0x1808
+#define USB3_DP_QSERDES_RXB_UCDR_SO_GAIN_HALF			0x180C
+#define USB3_DP_QSERDES_RXB_UCDR_SO_GAIN_QUARTER		0x1810
+#define USB3_DP_QSERDES_RXB_UCDR_SO_GAIN			0x1814
+#define USB3_DP_QSERDES_RXB_UCDR_SVS_FO_GAIN_HALF		0x1818
+#define USB3_DP_QSERDES_RXB_UCDR_SVS_FO_GAIN_QUARTER		0x181C
+#define USB3_DP_QSERDES_RXB_UCDR_SVS_FO_GAIN			0x1820
+#define USB3_DP_QSERDES_RXB_UCDR_SVS_SO_GAIN_HALF		0x1824
+#define USB3_DP_QSERDES_RXB_UCDR_SVS_SO_GAIN_QUARTER		0x1828
+#define USB3_DP_QSERDES_RXB_UCDR_SVS_SO_GAIN			0x182C
+#define USB3_DP_QSERDES_RXB_UCDR_FASTLOCK_FO_GAIN		0x1830
+#define USB3_DP_QSERDES_RXB_UCDR_SO_SATURATION_AND_ENABLE	0x1834
+#define USB3_DP_QSERDES_RXB_UCDR_FO_TO_SO_DELAY			0x1838
+#define USB3_DP_QSERDES_RXB_UCDR_FASTLOCK_COUNT_LOW		0x183C
+#define USB3_DP_QSERDES_RXB_UCDR_FASTLOCK_COUNT_HIGH		0x1840
+#define USB3_DP_QSERDES_RXB_UCDR_PI_CONTROLS			0x1844
+#define USB3_DP_QSERDES_RXB_UCDR_PI_CTRL2			0x1848
+#define USB3_DP_QSERDES_RXB_UCDR_SB2_THRESH1			0x184C
+#define USB3_DP_QSERDES_RXB_UCDR_SB2_THRESH2			0x1850
+#define USB3_DP_QSERDES_RXB_UCDR_SB2_GAIN1			0x1854
+#define USB3_DP_QSERDES_RXB_UCDR_SB2_GAIN2			0x1858
+#define USB3_DP_QSERDES_RXB_AUX_CONTROL				0x185C
+#define USB3_DP_QSERDES_RXB_AUX_DATA_TCOARSE_TFINE		0x1860
+#define USB3_DP_QSERDES_RXB_RCLK_AUXDATA_SEL			0x1864
+#define USB3_DP_QSERDES_RXB_AC_JTAG_ENABLE			0x1868
+#define USB3_DP_QSERDES_RXB_AC_JTAG_INITP			0x186C
+#define USB3_DP_QSERDES_RXB_AC_JTAG_INITN			0x1870
+#define USB3_DP_QSERDES_RXB_AC_JTAG_LVL				0x1874
+#define USB3_DP_QSERDES_RXB_AC_JTAG_MODE			0x1878
+#define USB3_DP_QSERDES_RXB_AC_JTAG_RESET			0x187C
+#define USB3_DP_QSERDES_RXB_RX_TERM_BW				0x1880
+#define USB3_DP_QSERDES_RXB_RX_RCVR_IQ_EN			0x1884
+#define USB3_DP_QSERDES_RXB_RX_IDAC_I_DC_OFFSETS		0x1888
+#define USB3_DP_QSERDES_RXB_RX_IDAC_IBAR_DC_OFFSETS		0x188C
+#define USB3_DP_QSERDES_RXB_RX_IDAC_Q_DC_OFFSETS		0x1890
+#define USB3_DP_QSERDES_RXB_RX_IDAC_QBAR_DC_OFFSETS		0x1894
+#define USB3_DP_QSERDES_RXB_RX_IDAC_A_DC_OFFSETS		0x1898
+#define USB3_DP_QSERDES_RXB_RX_IDAC_ABAR_DC_OFFSETS		0x189C
+#define USB3_DP_QSERDES_RXB_RX_IDAC_EN				0x18A0
+#define USB3_DP_QSERDES_RXB_RX_IDAC_ENABLES			0x18A4
+#define USB3_DP_QSERDES_RXB_RX_IDAC_SIGN			0x18A8
+#define USB3_DP_QSERDES_RXB_RX_HIGHZ_HIGHRATE			0x18AC
+#define USB3_DP_QSERDES_RXB_RX_TERM_AC_BYPASS_DC_COUPLE_OFFSET	0x18B0
+#define USB3_DP_QSERDES_RXB_DFE_1				0x18B4
+#define USB3_DP_QSERDES_RXB_DFE_2				0x18B8
+#define USB3_DP_QSERDES_RXB_DFE_3				0x18BC
+#define USB3_DP_QSERDES_RXB_DFE_4				0x18C0
+#define USB3_DP_QSERDES_RXB_TX_ADAPT_PRE_THRESH1		0x18C4
+#define USB3_DP_QSERDES_RXB_TX_ADAPT_PRE_THRESH2		0x18C8
+#define USB3_DP_QSERDES_RXB_TX_ADAPT_POST_THRESH		0x18CC
+#define USB3_DP_QSERDES_RXB_TX_ADAPT_MAIN_THRESH		0x18D0
+#define USB3_DP_QSERDES_RXB_VGA_CAL_CNTRL1			0x18D4
+#define USB3_DP_QSERDES_RXB_VGA_CAL_CNTRL2			0x18D8
+#define USB3_DP_QSERDES_RXB_GM_CAL				0x18DC
+#define USB3_DP_QSERDES_RXB_RX_VGA_GAIN2_LSB			0x18E0
+#define USB3_DP_QSERDES_RXB_RX_VGA_GAIN2_MSB			0x18E4
+#define USB3_DP_QSERDES_RXB_RX_EQU_ADAPTOR_CNTRL1		0x18E8
+#define USB3_DP_QSERDES_RXB_RX_EQU_ADAPTOR_CNTRL2		0x18EC
+#define USB3_DP_QSERDES_RXB_RX_EQU_ADAPTOR_CNTRL3		0x18F0
+#define USB3_DP_QSERDES_RXB_RX_EQU_ADAPTOR_CNTRL4		0x18F4
+#define USB3_DP_QSERDES_RXB_RX_IDAC_TSETTLE_LOW			0x18F8
+#define USB3_DP_QSERDES_RXB_RX_IDAC_TSETTLE_HIGH		0x18FC
+#define USB3_DP_QSERDES_RXB_RX_IDAC_MEASURE_TIME		0x1900
+#define USB3_DP_QSERDES_RXB_RX_IDAC_ACCUMULATOR			0x1904
+#define USB3_DP_QSERDES_RXB_RX_EQ_OFFSET_LSB			0x1908
+#define USB3_DP_QSERDES_RXB_RX_EQ_OFFSET_MSB			0x190C
+#define USB3_DP_QSERDES_RXB_RX_EQ_OFFSET_ADAPTOR_CNTRL1		0x1910
+#define USB3_DP_QSERDES_RXB_RX_OFFSET_ADAPTOR_CNTRL2		0x1914
+#define USB3_DP_QSERDES_RXB_SIGDET_ENABLES			0x1918
+#define USB3_DP_QSERDES_RXB_SIGDET_CNTRL			0x191C
+#define USB3_DP_QSERDES_RXB_SIGDET_LVL				0x1920
+#define USB3_DP_QSERDES_RXB_SIGDET_DEGLITCH_CNTRL		0x1924
+#define USB3_DP_QSERDES_RXB_RX_BAND				0x1928
+#define USB3_DP_QSERDES_RXB_CDR_FREEZE_UP_DN			0x192C
+#define USB3_DP_QSERDES_RXB_CDR_RESET_OVERRIDE			0x1930
+#define USB3_DP_QSERDES_RXB_RX_INTERFACE_MODE			0x1934
+#define USB3_DP_QSERDES_RXB_JITTER_GEN_MODE			0x1938
+#define USB3_DP_QSERDES_RXB_SJ_AMP1				0x193C
+#define USB3_DP_QSERDES_RXB_SJ_AMP2				0x1940
+#define USB3_DP_QSERDES_RXB_SJ_PER1				0x1944
+#define USB3_DP_QSERDES_RXB_SJ_PER2				0x1948
+#define USB3_DP_QSERDES_RXB_PPM_OFFSET1				0x194C
+#define USB3_DP_QSERDES_RXB_PPM_OFFSET2				0x1950
+#define USB3_DP_QSERDES_RXB_SIGN_PPM_PERIOD1			0x1954
+#define USB3_DP_QSERDES_RXB_SIGN_PPM_PERIOD2			0x1958
+#define USB3_DP_QSERDES_RXB_RX_PWM_ENABLE_AND_DATA		0x195C
+#define USB3_DP_QSERDES_RXB_RX_PWM_GEAR1_TIMEOUT_COUNT		0x1960
+#define USB3_DP_QSERDES_RXB_RX_PWM_GEAR2_TIMEOUT_COUNT		0x1964
+#define USB3_DP_QSERDES_RXB_RX_PWM_GEAR3_TIMEOUT_COUNT		0x1968
+#define USB3_DP_QSERDES_RXB_RX_PWM_GEAR4_TIMEOUT_COUNT		0x196C
+#define USB3_DP_QSERDES_RXB_RX_MODE_00_LOW			0x1970
+#define USB3_DP_QSERDES_RXB_RX_MODE_00_HIGH			0x1974
+#define USB3_DP_QSERDES_RXB_RX_MODE_00_HIGH2			0x1978
+#define USB3_DP_QSERDES_RXB_RX_MODE_00_HIGH3			0x197C
+#define USB3_DP_QSERDES_RXB_RX_MODE_00_HIGH4			0x1980
+#define USB3_DP_QSERDES_RXB_RX_MODE_01_LOW			0x1984
+#define USB3_DP_QSERDES_RXB_RX_MODE_01_HIGH			0x1988
+#define USB3_DP_QSERDES_RXB_RX_MODE_01_HIGH2			0x198C
+#define USB3_DP_QSERDES_RXB_RX_MODE_01_HIGH3			0x1990
+#define USB3_DP_QSERDES_RXB_RX_MODE_01_HIGH4			0x1994
+#define USB3_DP_QSERDES_RXB_RX_MODE_10_LOW			0x1998
+#define USB3_DP_QSERDES_RXB_RX_MODE_10_HIGH			0x199C
+#define USB3_DP_QSERDES_RXB_RX_MODE_10_HIGH2			0x19A0
+#define USB3_DP_QSERDES_RXB_RX_MODE_10_HIGH3			0x19A4
+#define USB3_DP_QSERDES_RXB_RX_MODE_10_HIGH4			0x19A8
+#define USB3_DP_QSERDES_RXB_PHPRE_CTRL				0x19AC
+#define USB3_DP_QSERDES_RXB_PHPRE_INITVAL			0x19B0
+#define USB3_DP_QSERDES_RXB_DFE_EN_TIMER			0x19B4
+#define USB3_DP_QSERDES_RXB_DFE_CTLE_POST_CAL_OFFSET		0x19B8
+#define USB3_DP_QSERDES_RXB_DCC_CTRL1				0x19BC
+#define USB3_DP_QSERDES_RXB_DCC_CTRL2				0x19C0
+#define USB3_DP_QSERDES_RXB_VTH_CODE				0x19C4
+#define USB3_DP_QSERDES_RXB_VTH_MIN_THRESH			0x19C8
+#define USB3_DP_QSERDES_RXB_VTH_MAX_THRESH			0x19CC
+#define USB3_DP_QSERDES_RXB_ALOG_OBSV_BUS_CTRL_1		0x19D0
+#define USB3_DP_QSERDES_RXB_PI_CTRL1				0x19D4
+#define USB3_DP_QSERDES_RXB_PI_CTRL2				0x19D8
+#define USB3_DP_QSERDES_RXB_PI_QUAD				0x19DC
+#define USB3_DP_QSERDES_RXB_IDATA1				0x19E0
+#define USB3_DP_QSERDES_RXB_IDATA2				0x19E4
+#define USB3_DP_QSERDES_RXB_AUX_DATA1				0x19E8
+#define USB3_DP_QSERDES_RXB_AUX_DATA2				0x19EC
+#define USB3_DP_QSERDES_RXB_AC_JTAG_OUTP			0x19F0
+#define USB3_DP_QSERDES_RXB_AC_JTAG_OUTN			0x19F4
+#define USB3_DP_QSERDES_RXB_RX_SIGDET				0x19F8
+#define USB3_DP_QSERDES_RXB_ALOG_OBSV_BUS_STATUS_1		0x19FC
+#define USB3_DP_PCS_MISC_TYPEC_CTRL				0x1A00
+#define USB3_DP_PCS_MISC_TYPEC_PWRDN_CTRL			0x1A04
+#define USB3_DP_PCS_MISC_PCS_MISC_CONFIG1			0x1A08
+#define USB3_DP_PCS_MISC_CLAMP_ENABLE				0x1A0C
+#define USB3_DP_PCS_MISC_TYPEC_STATUS				0x1A10
+#define USB3_DP_PCS_MISC_PLACEHOLDER_STATUS			0x1A14
+#define USB3_DP_PCS_LN_PCS_STATUS1				0x1B00
+#define USB3_DP_PCS_LN_PCS_STATUS2				0x1B04
+#define USB3_DP_PCS_LN_PCS_STATUS2_CLEAR			0x1B08
+#define USB3_DP_PCS_LN_PCS_STATUS3				0x1B0C
+#define USB3_DP_PCS_LN_BIST_CHK_ERR_CNT_L_STATUS		0x1B10
+#define USB3_DP_PCS_LN_BIST_CHK_ERR_CNT_H_STATUS		0x1B14
+#define USB3_DP_PCS_LN_BIST_CHK_STATUS				0x1B18
+#define USB3_DP_PCS_LN_INSIG_SW_CTRL1				0x1B1C
+#define USB3_DP_PCS_LN_INSIG_MX_CTRL1				0x1B20
+#define USB3_DP_PCS_LN_OUTSIG_SW_CTRL1				0x1B24
+#define USB3_DP_PCS_LN_OUTSIG_MX_CTRL1				0x1B28
+#define USB3_DP_PCS_LN_TEST_CONTROL				0x1B2C
+#define USB3_DP_PCS_LN_BIST_CTRL				0x1B30
+#define USB3_DP_PCS_LN_PRBS_SEED0				0x1B34
+#define USB3_DP_PCS_LN_PRBS_SEED1				0x1B38
+#define USB3_DP_PCS_LN_FIXED_PAT_CTRL				0x1B3C
+#define USB3_DP_PCS_SW_RESET					0x1C00
+#define USB3_DP_PCS_REVISION_ID0				0x1C04
+#define USB3_DP_PCS_REVISION_ID1				0x1C08
+#define USB3_DP_PCS_REVISION_ID2				0x1C0C
+#define USB3_DP_PCS_REVISION_ID3				0x1C10
+#define USB3_DP_PCS_PCS_STATUS1					0x1C14
+#define USB3_DP_PCS_PCS_STATUS2					0x1C18
+#define USB3_DP_PCS_PCS_STATUS3					0x1C1C
+#define USB3_DP_PCS_PCS_STATUS4					0x1C20
+#define USB3_DP_PCS_PCS_STATUS5					0x1C24
+#define USB3_DP_PCS_PCS_STATUS6					0x1C28
+#define USB3_DP_PCS_PCS_STATUS7					0x1C2C
+#define USB3_DP_PCS_DEBUG_BUS_0_STATUS				0x1C30
+#define USB3_DP_PCS_DEBUG_BUS_1_STATUS				0x1C34
+#define USB3_DP_PCS_DEBUG_BUS_2_STATUS				0x1C38
+#define USB3_DP_PCS_DEBUG_BUS_3_STATUS				0x1C3C
+#define USB3_DP_PCS_POWER_DOWN_CONTROL				0x1C40
+#define USB3_DP_PCS_START_CONTROL				0x1C44
+#define USB3_DP_PCS_INSIG_SW_CTRL1				0x1C48
+#define USB3_DP_PCS_INSIG_SW_CTRL2				0x1C4C
+#define USB3_DP_PCS_INSIG_SW_CTRL3				0x1C50
+#define USB3_DP_PCS_INSIG_SW_CTRL4				0x1C54
+#define USB3_DP_PCS_INSIG_SW_CTRL5				0x1C58
+#define USB3_DP_PCS_INSIG_SW_CTRL6				0x1C5C
+#define USB3_DP_PCS_INSIG_SW_CTRL7				0x1C60
+#define USB3_DP_PCS_INSIG_SW_CTRL8				0x1C64
+#define USB3_DP_PCS_INSIG_MX_CTRL1				0x1C68
+#define USB3_DP_PCS_INSIG_MX_CTRL2				0x1C6C
+#define USB3_DP_PCS_INSIG_MX_CTRL3				0x1C70
+#define USB3_DP_PCS_INSIG_MX_CTRL4				0x1C74
+#define USB3_DP_PCS_INSIG_MX_CTRL5				0x1C78
+#define USB3_DP_PCS_INSIG_MX_CTRL7				0x1C7C
+#define USB3_DP_PCS_INSIG_MX_CTRL8				0x1C80
+#define USB3_DP_PCS_OUTSIG_SW_CTRL1				0x1C84
+#define USB3_DP_PCS_OUTSIG_MX_CTRL1				0x1C88
+#define USB3_DP_PCS_CLAMP_ENABLE				0x1C8C
+#define USB3_DP_PCS_POWER_STATE_CONFIG1				0x1C90
+#define USB3_DP_PCS_POWER_STATE_CONFIG2				0x1C94
+#define USB3_DP_PCS_FLL_CNTRL1					0x1C98
+#define USB3_DP_PCS_FLL_CNTRL2					0x1C9C
+#define USB3_DP_PCS_FLL_CNT_VAL_L				0x1CA0
+#define USB3_DP_PCS_FLL_CNT_VAL_H_TOL				0x1CA4
+#define USB3_DP_PCS_FLL_MAN_CODE				0x1CA8
+#define USB3_DP_PCS_TEST_CONTROL1				0x1CAC
+#define USB3_DP_PCS_TEST_CONTROL2				0x1CB0
+#define USB3_DP_PCS_TEST_CONTROL3				0x1CB4
+#define USB3_DP_PCS_TEST_CONTROL4				0x1CB8
+#define USB3_DP_PCS_TEST_CONTROL5				0x1CBC
+#define USB3_DP_PCS_TEST_CONTROL6				0x1CC0
+#define USB3_DP_PCS_LOCK_DETECT_CONFIG1				0x1CC4
+#define USB3_DP_PCS_LOCK_DETECT_CONFIG2				0x1CC8
+#define USB3_DP_PCS_LOCK_DETECT_CONFIG3				0x1CCC
+#define USB3_DP_PCS_LOCK_DETECT_CONFIG4				0x1CD0
+#define USB3_DP_PCS_LOCK_DETECT_CONFIG5				0x1CD4
+#define USB3_DP_PCS_LOCK_DETECT_CONFIG6				0x1CD8
+#define USB3_DP_PCS_REFGEN_REQ_CONFIG1				0x1CDC
+#define USB3_DP_PCS_REFGEN_REQ_CONFIG2				0x1CE0
+#define USB3_DP_PCS_REFGEN_REQ_CONFIG3				0x1CE4
+#define USB3_DP_PCS_BIST_CTRL					0x1CE8
+#define USB3_DP_PCS_PRBS_POLY0					0x1CEC
+#define USB3_DP_PCS_PRBS_POLY1					0x1CF0
+#define USB3_DP_PCS_FIXED_PAT0					0x1CF4
+#define USB3_DP_PCS_FIXED_PAT1					0x1CF8
+#define USB3_DP_PCS_FIXED_PAT2					0x1CFC
+#define USB3_DP_PCS_FIXED_PAT3					0x1D00
+#define USB3_DP_PCS_FIXED_PAT4					0x1D04
+#define USB3_DP_PCS_FIXED_PAT5					0x1D08
+#define USB3_DP_PCS_FIXED_PAT6					0x1D0C
+#define USB3_DP_PCS_FIXED_PAT7					0x1D10
+#define USB3_DP_PCS_FIXED_PAT8					0x1D14
+#define USB3_DP_PCS_FIXED_PAT9					0x1D18
+#define USB3_DP_PCS_FIXED_PAT10					0x1D1C
+#define USB3_DP_PCS_FIXED_PAT11					0x1D20
+#define USB3_DP_PCS_FIXED_PAT12					0x1D24
+#define USB3_DP_PCS_FIXED_PAT13					0x1D28
+#define USB3_DP_PCS_FIXED_PAT14					0x1D2C
+#define USB3_DP_PCS_FIXED_PAT15					0x1D30
+#define USB3_DP_PCS_TXMGN_CONFIG				0x1D34
+#define USB3_DP_PCS_G12S1_TXMGN_V0				0x1D38
+#define USB3_DP_PCS_G12S1_TXMGN_V1				0x1D3C
+#define USB3_DP_PCS_G12S1_TXMGN_V2				0x1D40
+#define USB3_DP_PCS_G12S1_TXMGN_V3				0x1D44
+#define USB3_DP_PCS_G12S1_TXMGN_V4				0x1D48
+#define USB3_DP_PCS_G12S1_TXMGN_V0_RS				0x1D4C
+#define USB3_DP_PCS_G12S1_TXMGN_V1_RS				0x1D50
+#define USB3_DP_PCS_G12S1_TXMGN_V2_RS				0x1D54
+#define USB3_DP_PCS_G12S1_TXMGN_V3_RS				0x1D58
+#define USB3_DP_PCS_G12S1_TXMGN_V4_RS				0x1D5C
+#define USB3_DP_PCS_G3S2_TXMGN_MAIN				0x1D60
+#define USB3_DP_PCS_G3S2_TXMGN_MAIN_RS				0x1D64
+#define USB3_DP_PCS_G12S1_TXDEEMPH_M6DB				0x1D68
+#define USB3_DP_PCS_G12S1_TXDEEMPH_M3P5DB			0x1D6C
+#define USB3_DP_PCS_G3S2_PRE_GAIN				0x1D70
+#define USB3_DP_PCS_G3S2_POST_GAIN				0x1D74
+#define USB3_DP_PCS_G3S2_PRE_POST_OFFSET			0x1D78
+#define USB3_DP_PCS_G3S2_PRE_GAIN_RS				0x1D7C
+#define USB3_DP_PCS_G3S2_POST_GAIN_RS				0x1D80
+#define USB3_DP_PCS_G3S2_PRE_POST_OFFSET_RS			0x1D84
+#define USB3_DP_PCS_RX_SIGDET_LVL				0x1D88
+#define USB3_DP_PCS_RX_SIGDET_DTCT_CNTRL			0x1D8C
+#define USB3_DP_PCS_RCVR_DTCT_DLY_P1U2_L			0x1D90
+#define USB3_DP_PCS_RCVR_DTCT_DLY_P1U2_H			0x1D94
+#define USB3_DP_PCS_RATE_SLEW_CNTRL1				0x1D98
+#define USB3_DP_PCS_RATE_SLEW_CNTRL2				0x1D9C
+#define USB3_DP_PCS_PWRUP_RESET_DLY_TIME_AUXCLK			0x1DA0
+#define USB3_DP_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_L		0x1DA4
+#define USB3_DP_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_H		0x1DA8
+#define USB3_DP_PCS_TSYNC_RSYNC_TIME				0x1DAC
+#define USB3_DP_PCS_CDR_RESET_TIME				0x1DB0
+#define USB3_DP_PCS_TSYNC_DLY_TIME				0x1DB4
+#define USB3_DP_PCS_ELECIDLE_DLY_SEL				0x1DB8
+#define USB3_DP_PCS_CMN_ACK_OUT_SEL				0x1DBC
+#define USB3_DP_PCS_ALIGN_DETECT_CONFIG1			0x1DC0
+#define USB3_DP_PCS_ALIGN_DETECT_CONFIG2			0x1DC4
+#define USB3_DP_PCS_ALIGN_DETECT_CONFIG3			0x1DC8
+#define USB3_DP_PCS_ALIGN_DETECT_CONFIG4			0x1DCC
+#define USB3_DP_PCS_PCS_TX_RX_CONFIG				0x1DD0
+#define USB3_DP_PCS_RX_IDLE_DTCT_CNTRL				0x1DD4
+#define USB3_DP_PCS_RX_DCC_CAL_CONFIG				0x1DD8
+#define USB3_DP_PCS_EQ_CONFIG1					0x1DDC
+#define USB3_DP_PCS_EQ_CONFIG2					0x1DE0
+#define USB3_DP_PCS_EQ_CONFIG3					0x1DE4
+#define USB3_DP_PCS_EQ_CONFIG4					0x1DE8
+#define USB3_DP_PCS_EQ_CONFIG5					0x1DEC
+#define USB3_DP_PCS_USB3_POWER_STATE_CONFIG1			0x1F00
+#define USB3_DP_PCS_USB3_AUTONOMOUS_MODE_STATUS			0x1F04
+#define USB3_DP_PCS_USB3_AUTONOMOUS_MODE_CTRL			0x1F08
+#define USB3_DP_PCS_USB3_AUTONOMOUS_MODE_CTRL2			0x1F0C
+#define USB3_DP_PCS_USB3_LFPS_RXTERM_IRQ_SOURCE_STATUS		0x1F10
+#define USB3_DP_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR			0x1F14
+#define USB3_DP_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL		0x1F18
+#define USB3_DP_PCS_USB3_LFPS_TX_ECSTART			0x1F1C
+#define USB3_DP_PCS_USB3_LFPS_PER_TIMER_VAL			0x1F20
+#define USB3_DP_PCS_USB3_LFPS_TX_END_CNT_U3_START		0x1F24
+#define USB3_DP_PCS_USB3_RXEQTRAINING_LOCK_TIME			0x1F28
+#define USB3_DP_PCS_USB3_RXEQTRAINING_WAIT_TIME			0x1F2C
+#define USB3_DP_PCS_USB3_RXEQTRAINING_CTLE_TIME			0x1F30
+#define USB3_DP_PCS_USB3_RXEQTRAINING_WAIT_TIME_S2		0x1F34
+#define USB3_DP_PCS_USB3_RXEQTRAINING_DFE_TIME_S2		0x1F38
+#define USB3_DP_PCS_USB3_RCVR_DTCT_DLY_U3_L			0x1F3C
+#define USB3_DP_PCS_USB3_RCVR_DTCT_DLY_U3_H			0x1F40
+#define USB3_DP_PCS_USB3_ARCVR_DTCT_EN_PERIOD			0x1F44
+#define USB3_DP_PCS_USB3_ARCVR_DTCT_CM_DLY			0x1F48
+#define USB3_DP_PCS_USB3_TXONESZEROS_RUN_LENGTH			0x1F4C
+#define USB3_DP_PCS_USB3_ALFPS_DEGLITCH_VAL			0x1F50
+#define USB3_DP_PCS_USB3_SIGDET_STARTUP_TIMER_VAL		0x1F54
+#define USB3_DP_PCS_USB3_TEST_CONTROL				0x1F58
+
+/* USB3 Uni PHY register offsets */
+#define USB3_UNI_QSERDES_COM_ATB_SEL1				0x0000
+#define USB3_UNI_QSERDES_COM_ATB_SEL2				0x0004
+#define USB3_UNI_QSERDES_COM_FREQ_UPDATE			0x0008
+#define USB3_UNI_QSERDES_COM_BG_TIMER				0x000C
+#define USB3_UNI_QSERDES_COM_SSC_EN_CENTER			0x0010
+#define USB3_UNI_QSERDES_COM_SSC_ADJ_PER1			0x0014
+#define USB3_UNI_QSERDES_COM_SSC_ADJ_PER2			0x0018
+#define USB3_UNI_QSERDES_COM_SSC_PER1				0x001C
+#define USB3_UNI_QSERDES_COM_SSC_PER2				0x0020
+#define USB3_UNI_QSERDES_COM_SSC_STEP_SIZE1_MODE0		0x0024
+#define USB3_UNI_QSERDES_COM_SSC_STEP_SIZE2_MODE0		0x0028
+#define USB3_UNI_QSERDES_COM_SSC_STEP_SIZE3_MODE0		0x002C
+#define USB3_UNI_QSERDES_COM_SSC_STEP_SIZE1_MODE1		0x0030
+#define USB3_UNI_QSERDES_COM_SSC_STEP_SIZE2_MODE1		0x0034
+#define USB3_UNI_QSERDES_COM_SSC_STEP_SIZE3_MODE1		0x0038
+#define USB3_UNI_QSERDES_COM_POST_DIV				0x003C
+#define USB3_UNI_QSERDES_COM_POST_DIV_MUX			0x0040
+#define USB3_UNI_QSERDES_COM_BIAS_EN_CLKBUFLR_EN		0x0044
+#define USB3_UNI_QSERDES_COM_CLK_ENABLE1			0x0048
+#define USB3_UNI_QSERDES_COM_SYS_CLK_CTRL			0x004C
+#define USB3_UNI_QSERDES_COM_SYSCLK_BUF_ENABLE			0x0050
+#define USB3_UNI_QSERDES_COM_PLL_EN				0x0054
+#define USB3_UNI_QSERDES_COM_PLL_IVCO				0x0058
+#define USB3_UNI_QSERDES_COM_CMN_IETRIM				0x005C
+#define USB3_UNI_QSERDES_COM_CMN_IPTRIM				0x0060
+#define USB3_UNI_QSERDES_COM_EP_CLOCK_DETECT_CTRL		0x0064
+#define USB3_UNI_QSERDES_COM_SYSCLK_DET_COMP_STATUS		0x0068
+#define USB3_UNI_QSERDES_COM_CLK_EP_DIV_MODE0			0x006C
+#define USB3_UNI_QSERDES_COM_CLK_EP_DIV_MODE1			0x0070
+#define USB3_UNI_QSERDES_COM_CP_CTRL_MODE0			0x0074
+#define USB3_UNI_QSERDES_COM_CP_CTRL_MODE1			0x0078
+#define USB3_UNI_QSERDES_COM_PLL_RCTRL_MODE0			0x007C
+#define USB3_UNI_QSERDES_COM_PLL_RCTRL_MODE1			0x0080
+#define USB3_UNI_QSERDES_COM_PLL_CCTRL_MODE0			0x0084
+#define USB3_UNI_QSERDES_COM_PLL_CCTRL_MODE1			0x0088
+#define USB3_UNI_QSERDES_COM_PLL_CNTRL				0x008C
+#define USB3_UNI_QSERDES_COM_BIAS_EN_CTRL_BY_PSM		0x0090
+#define USB3_UNI_QSERDES_COM_SYSCLK_EN_SEL			0x0094
+#define USB3_UNI_QSERDES_COM_CML_SYSCLK_SEL			0x0098
+#define USB3_UNI_QSERDES_COM_RESETSM_CNTRL			0x009C
+#define USB3_UNI_QSERDES_COM_RESETSM_CNTRL2			0x00A0
+#define USB3_UNI_QSERDES_COM_LOCK_CMP_EN			0x00A4
+#define USB3_UNI_QSERDES_COM_LOCK_CMP_CFG			0x00A8
+#define USB3_UNI_QSERDES_COM_LOCK_CMP1_MODE0			0x00AC
+#define USB3_UNI_QSERDES_COM_LOCK_CMP2_MODE0			0x00B0
+#define USB3_UNI_QSERDES_COM_LOCK_CMP1_MODE1			0x00B4
+#define USB3_UNI_QSERDES_COM_LOCK_CMP2_MODE1			0x00B8
+#define USB3_UNI_QSERDES_COM_DEC_START_MODE0			0x00BC
+#define USB3_UNI_QSERDES_COM_DEC_START_MSB_MODE0		0x00C0
+#define USB3_UNI_QSERDES_COM_DEC_START_MODE1			0x00C4
+#define USB3_UNI_QSERDES_COM_DEC_START_MSB_MODE1		0x00C8
+#define USB3_UNI_QSERDES_COM_DIV_FRAC_START1_MODE0		0x00CC
+#define USB3_UNI_QSERDES_COM_DIV_FRAC_START2_MODE0		0x00D0
+#define USB3_UNI_QSERDES_COM_DIV_FRAC_START3_MODE0		0x00D4
+#define USB3_UNI_QSERDES_COM_DIV_FRAC_START1_MODE1		0x00D8
+#define USB3_UNI_QSERDES_COM_DIV_FRAC_START2_MODE1		0x00DC
+#define USB3_UNI_QSERDES_COM_DIV_FRAC_START3_MODE1		0x00E0
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_INITVAL			0x00E4
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_EN			0x00E8
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_GAIN0_MODE0		0x00EC
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_GAIN1_MODE0		0x00F0
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_GAIN0_MODE1		0x00F4
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_GAIN1_MODE1		0x00F8
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_P_PATH_GAIN0		0x00FC
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_P_PATH_GAIN1		0x0100
+#define USB3_UNI_QSERDES_COM_VCOCAL_DEADMAN_CTRL		0x0104
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_CTRL			0x0108
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_MAP			0x010C
+#define USB3_UNI_QSERDES_COM_VCO_TUNE1_MODE0			0x0110
+#define USB3_UNI_QSERDES_COM_VCO_TUNE2_MODE0			0x0114
+#define USB3_UNI_QSERDES_COM_VCO_TUNE1_MODE1			0x0118
+#define USB3_UNI_QSERDES_COM_VCO_TUNE2_MODE1			0x011C
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_INITVAL1			0x0120
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_INITVAL2			0x0124
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_MINVAL1			0x0128
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_MINVAL2			0x012C
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_MAXVAL1			0x0130
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_MAXVAL2			0x0134
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_TIMER1			0x0138
+#define USB3_UNI_QSERDES_COM_VCO_TUNE_TIMER2			0x013C
+#define USB3_UNI_QSERDES_COM_CMN_STATUS				0x0140
+#define USB3_UNI_QSERDES_COM_RESET_SM_STATUS			0x0144
+#define USB3_UNI_QSERDES_COM_RESTRIM_CODE_STATUS		0x0148
+#define USB3_UNI_QSERDES_COM_PLLCAL_CODE1_STATUS		0x014C
+#define USB3_UNI_QSERDES_COM_PLLCAL_CODE2_STATUS		0x0150
+#define USB3_UNI_QSERDES_COM_CLK_SELECT				0x0154
+#define USB3_UNI_QSERDES_COM_HSCLK_SEL				0x0158
+#define USB3_UNI_QSERDES_COM_HSCLK_HS_SWITCH_SEL		0x015C
+#define USB3_UNI_QSERDES_COM_INTEGLOOP_BINCODE_STATUS		0x0160
+#define USB3_UNI_QSERDES_COM_PLL_ANALOG				0x0164
+#define USB3_UNI_QSERDES_COM_CORECLK_DIV_MODE0			0x0168
+#define USB3_UNI_QSERDES_COM_CORECLK_DIV_MODE1			0x016C
+#define USB3_UNI_QSERDES_COM_SW_RESET				0x0170
+#define USB3_UNI_QSERDES_COM_CORE_CLK_EN			0x0174
+#define USB3_UNI_QSERDES_COM_C_READY_STATUS			0x0178
+#define USB3_UNI_QSERDES_COM_CMN_CONFIG				0x017C
+#define USB3_UNI_QSERDES_COM_CMN_RATE_OVERRIDE			0x0180
+#define USB3_UNI_QSERDES_COM_SVS_MODE_CLK_SEL			0x0184
+#define USB3_UNI_QSERDES_COM_DEBUG_BUS0				0x0188
+#define USB3_UNI_QSERDES_COM_DEBUG_BUS1				0x018C
+#define USB3_UNI_QSERDES_COM_DEBUG_BUS2				0x0190
+#define USB3_UNI_QSERDES_COM_DEBUG_BUS3				0x0194
+#define USB3_UNI_QSERDES_COM_DEBUG_BUS_SEL			0x0198
+#define USB3_UNI_QSERDES_COM_CMN_MISC1				0x019C
+#define USB3_UNI_QSERDES_COM_CMN_MISC2				0x01A0
+#define USB3_UNI_QSERDES_COM_CMN_MODE				0x01A4
+#define USB3_UNI_QSERDES_COM_VCO_DC_LEVEL_CTRL			0x01A8
+#define USB3_UNI_QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE0		0x01AC
+#define USB3_UNI_QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE0		0x01B0
+#define USB3_UNI_QSERDES_COM_BIN_VCOCAL_CMP_CODE1_MODE1		0x01B4
+#define USB3_UNI_QSERDES_COM_BIN_VCOCAL_CMP_CODE2_MODE1		0x01B8
+#define USB3_UNI_QSERDES_COM_BIN_VCOCAL_HSCLK_SEL		0x01BC
+#define USB3_UNI_QSERDES_TX_BIST_MODE_LANENO			0x0200
+#define USB3_UNI_QSERDES_TX_BIST_INVERT				0x0204
+#define USB3_UNI_QSERDES_TX_CLKBUF_ENABLE			0x0208
+#define USB3_UNI_QSERDES_TX_TX_EMP_POST1_LVL			0x020C
+#define USB3_UNI_QSERDES_TX_TX_IDLE_LVL_LARGE_AMP		0x0210
+#define USB3_UNI_QSERDES_TX_TX_DRV_LVL				0x0214
+#define USB3_UNI_QSERDES_TX_TX_DRV_LVL_OFFSET			0x0218
+#define USB3_UNI_QSERDES_TX_RESET_TSYNC_EN			0x021C
+#define USB3_UNI_QSERDES_TX_PRE_STALL_LDO_BOOST_EN		0x0220
+#define USB3_UNI_QSERDES_TX_TX_BAND				0x0224
+#define USB3_UNI_QSERDES_TX_SLEW_CNTL				0x0228
+#define USB3_UNI_QSERDES_TX_INTERFACE_SELECT			0x022C
+#define USB3_UNI_QSERDES_TX_LPB_EN				0x0230
+#define USB3_UNI_QSERDES_TX_RES_CODE_LANE_TX			0x0234
+#define USB3_UNI_QSERDES_TX_RES_CODE_LANE_RX			0x0238
+#define USB3_UNI_QSERDES_TX_RES_CODE_LANE_OFFSET_TX		0x023C
+#define USB3_UNI_QSERDES_TX_RES_CODE_LANE_OFFSET_RX		0x0240
+#define USB3_UNI_QSERDES_TX_PERL_LENGTH1			0x0244
+#define USB3_UNI_QSERDES_TX_PERL_LENGTH2			0x0248
+#define USB3_UNI_QSERDES_TX_SERDES_BYP_EN_OUT			0x024C
+#define USB3_UNI_QSERDES_TX_DEBUG_BUS_SEL			0x0250
+#define USB3_UNI_QSERDES_TX_TRANSCEIVER_BIAS_EN			0x0254
+#define USB3_UNI_QSERDES_TX_HIGHZ_DRVR_EN			0x0258
+#define USB3_UNI_QSERDES_TX_TX_POL_INV				0x025C
+#define USB3_UNI_QSERDES_TX_PARRATE_REC_DETECT_IDLE_EN		0x0260
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN1			0x0264
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN2			0x0268
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN3			0x026C
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN4			0x0270
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN5			0x0274
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN6			0x0278
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN7			0x027C
+#define USB3_UNI_QSERDES_TX_BIST_PATTERN8			0x0280
+#define USB3_UNI_QSERDES_TX_LANE_MODE_1				0x0284
+#define USB3_UNI_QSERDES_TX_LANE_MODE_2				0x0288
+#define USB3_UNI_QSERDES_TX_LANE_MODE_3				0x028C
+#define USB3_UNI_QSERDES_TX_ATB_SEL1				0x0290
+#define USB3_UNI_QSERDES_TX_ATB_SEL2				0x0294
+#define USB3_UNI_QSERDES_TX_RCV_DETECT_LVL			0x0298
+#define USB3_UNI_QSERDES_TX_RCV_DETECT_LVL_2			0x029C
+#define USB3_UNI_QSERDES_TX_PRBS_SEED1				0x02A0
+#define USB3_UNI_QSERDES_TX_PRBS_SEED2				0x02A4
+#define USB3_UNI_QSERDES_TX_PRBS_SEED3				0x02A8
+#define USB3_UNI_QSERDES_TX_PRBS_SEED4				0x02AC
+#define USB3_UNI_QSERDES_TX_RESET_GEN				0x02B0
+#define USB3_UNI_QSERDES_TX_RESET_GEN_MUXES			0x02B4
+#define USB3_UNI_QSERDES_TX_TRAN_DRVR_EMP_EN			0x02B8
+#define USB3_UNI_QSERDES_TX_TX_INTERFACE_MODE			0x02BC
+#define USB3_UNI_QSERDES_TX_PWM_CTRL				0x02C0
+#define USB3_UNI_QSERDES_TX_PWM_ENCODED_OR_DATA			0x02C4
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_1_DIVIDER_BAND2		0x02C8
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_2_DIVIDER_BAND2		0x02CC
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_3_DIVIDER_BAND2		0x02D0
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_4_DIVIDER_BAND2		0x02D4
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_1_DIVIDER_BAND0_1		0x02D8
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_2_DIVIDER_BAND0_1		0x02DC
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_3_DIVIDER_BAND0_1		0x02E0
+#define USB3_UNI_QSERDES_TX_PWM_GEAR_4_DIVIDER_BAND0_1		0x02E4
+#define USB3_UNI_QSERDES_TX_VMODE_CTRL1				0x02E8
+#define USB3_UNI_QSERDES_TX_ALOG_OBSV_BUS_CTRL_1		0x02EC
+#define USB3_UNI_QSERDES_TX_BIST_STATUS				0x02F0
+#define USB3_UNI_QSERDES_TX_BIST_ERROR_COUNT1			0x02F4
+#define USB3_UNI_QSERDES_TX_BIST_ERROR_COUNT2			0x02F8
+#define USB3_UNI_QSERDES_TX_ALOG_OBSV_BUS_STATUS_1		0x02FC
+#define USB3_UNI_QSERDES_TX_LANE_DIG_CONFIG			0x0300
+#define USB3_UNI_QSERDES_TX_PI_QEC_CTRL				0x0304
+#define USB3_UNI_QSERDES_TX_PRE_EMPH				0x0308
+#define USB3_UNI_QSERDES_TX_SW_RESET				0x030C
+#define USB3_UNI_QSERDES_TX_DCC_OFFSET				0x0310
+#define USB3_UNI_QSERDES_TX_DIG_BKUP_CTRL			0x0314
+#define USB3_UNI_QSERDES_TX_DEBUG_BUS0				0x0318
+#define USB3_UNI_QSERDES_TX_DEBUG_BUS1				0x031C
+#define USB3_UNI_QSERDES_TX_DEBUG_BUS2				0x0320
+#define USB3_UNI_QSERDES_TX_DEBUG_BUS3				0x0324
+#define USB3_UNI_QSERDES_TX_READ_EQCODE				0x0328
+#define USB3_UNI_QSERDES_TX_READ_OFFSETCODE			0x032C
+#define USB3_UNI_QSERDES_TX_IA_ERROR_COUNTER_LOW		0x0330
+#define USB3_UNI_QSERDES_TX_IA_ERROR_COUNTER_HIGH		0x0334
+#define USB3_UNI_QSERDES_TX_VGA_READ_CODE			0x0338
+#define USB3_UNI_QSERDES_TX_VTH_READ_CODE			0x033C
+#define USB3_UNI_QSERDES_TX_DFE_TAP1_READ_CODE			0x0340
+#define USB3_UNI_QSERDES_TX_DFE_TAP2_READ_CODE			0x0344
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_I			0x0348
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_IBAR			0x034C
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_Q			0x0350
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_QBAR			0x0354
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_A			0x0358
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_ABAR			0x035C
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_SM_ON			0x0360
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_CAL_DONE		0x0364
+#define USB3_UNI_QSERDES_TX_IDAC_STATUS_SIGNERROR		0x0368
+#define USB3_UNI_QSERDES_TX_DCC_CAL_STATUS			0x036C
+#define USB3_UNI_QSERDES_RX_UCDR_FO_GAIN_HALF			0x0400
+#define USB3_UNI_QSERDES_RX_UCDR_FO_GAIN_QUARTER		0x0404
+#define USB3_UNI_QSERDES_RX_UCDR_FO_GAIN			0x0408
+#define USB3_UNI_QSERDES_RX_UCDR_SO_GAIN_HALF			0x040C
+#define USB3_UNI_QSERDES_RX_UCDR_SO_GAIN_QUARTER		0x0410
+#define USB3_UNI_QSERDES_RX_UCDR_SO_GAIN			0x0414
+#define USB3_UNI_QSERDES_RX_UCDR_SVS_FO_GAIN_HALF		0x0418
+#define USB3_UNI_QSERDES_RX_UCDR_SVS_FO_GAIN_QUARTER		0x041C
+#define USB3_UNI_QSERDES_RX_UCDR_SVS_FO_GAIN			0x0420
+#define USB3_UNI_QSERDES_RX_UCDR_SVS_SO_GAIN_HALF		0x0424
+#define USB3_UNI_QSERDES_RX_UCDR_SVS_SO_GAIN_QUARTER		0x0428
+#define USB3_UNI_QSERDES_RX_UCDR_SVS_SO_GAIN			0x042C
+#define USB3_UNI_QSERDES_RX_UCDR_FASTLOCK_FO_GAIN		0x0430
+#define USB3_UNI_QSERDES_RX_UCDR_SO_SATURATION_AND_ENABLE	0x0434
+#define USB3_UNI_QSERDES_RX_UCDR_FO_TO_SO_DELAY			0x0438
+#define USB3_UNI_QSERDES_RX_UCDR_FASTLOCK_COUNT_LOW		0x043C
+#define USB3_UNI_QSERDES_RX_UCDR_FASTLOCK_COUNT_HIGH		0x0440
+#define USB3_UNI_QSERDES_RX_UCDR_PI_CONTROLS			0x0444
+#define USB3_UNI_QSERDES_RX_UCDR_PI_CTRL2			0x0448
+#define USB3_UNI_QSERDES_RX_UCDR_SB2_THRESH1			0x044C
+#define USB3_UNI_QSERDES_RX_UCDR_SB2_THRESH2			0x0450
+#define USB3_UNI_QSERDES_RX_UCDR_SB2_GAIN1			0x0454
+#define USB3_UNI_QSERDES_RX_UCDR_SB2_GAIN2			0x0458
+#define USB3_UNI_QSERDES_RX_AUX_CONTROL				0x045C
+#define USB3_UNI_QSERDES_RX_AUX_DATA_TCOARSE_TFINE		0x0460
+#define USB3_UNI_QSERDES_RX_RCLK_AUXDATA_SEL			0x0464
+#define USB3_UNI_QSERDES_RX_AC_JTAG_ENABLE			0x0468
+#define USB3_UNI_QSERDES_RX_AC_JTAG_INITP			0x046C
+#define USB3_UNI_QSERDES_RX_AC_JTAG_INITN			0x0470
+#define USB3_UNI_QSERDES_RX_AC_JTAG_LVL				0x0474
+#define USB3_UNI_QSERDES_RX_AC_JTAG_MODE			0x0478
+#define USB3_UNI_QSERDES_RX_AC_JTAG_RESET			0x047C
+#define USB3_UNI_QSERDES_RX_RX_TERM_BW				0x0480
+#define USB3_UNI_QSERDES_RX_RX_RCVR_IQ_EN			0x0484
+#define USB3_UNI_QSERDES_RX_RX_IDAC_I_DC_OFFSETS		0x0488
+#define USB3_UNI_QSERDES_RX_RX_IDAC_IBAR_DC_OFFSETS		0x048C
+#define USB3_UNI_QSERDES_RX_RX_IDAC_Q_DC_OFFSETS		0x0490
+#define USB3_UNI_QSERDES_RX_RX_IDAC_QBAR_DC_OFFSETS		0x0494
+#define USB3_UNI_QSERDES_RX_RX_IDAC_A_DC_OFFSETS		0x0498
+#define USB3_UNI_QSERDES_RX_RX_IDAC_ABAR_DC_OFFSETS		0x049C
+#define USB3_UNI_QSERDES_RX_RX_IDAC_EN				0x04A0
+#define USB3_UNI_QSERDES_RX_RX_IDAC_ENABLES			0x04A4
+#define USB3_UNI_QSERDES_RX_RX_IDAC_SIGN			0x04A8
+#define USB3_UNI_QSERDES_RX_RX_HIGHZ_HIGHRATE			0x04AC
+#define USB3_UNI_QSERDES_RX_RX_TERM_AC_BYPASS_DC_COUPLE_OFFSET	0x04B0
+#define USB3_UNI_QSERDES_RX_DFE_1				0x04B4
+#define USB3_UNI_QSERDES_RX_DFE_2				0x04B8
+#define USB3_UNI_QSERDES_RX_DFE_3				0x04BC
+#define USB3_UNI_QSERDES_RX_DFE_4				0x04C0
+#define USB3_UNI_QSERDES_RX_TX_ADAPT_PRE_THRESH1		0x04C4
+#define USB3_UNI_QSERDES_RX_TX_ADAPT_PRE_THRESH2		0x04C8
+#define USB3_UNI_QSERDES_RX_TX_ADAPT_POST_THRESH		0x04CC
+#define USB3_UNI_QSERDES_RX_TX_ADAPT_MAIN_THRESH		0x04D0
+#define USB3_UNI_QSERDES_RX_VGA_CAL_CNTRL1			0x04D4
+#define USB3_UNI_QSERDES_RX_VGA_CAL_CNTRL2			0x04D8
+#define USB3_UNI_QSERDES_RX_GM_CAL				0x04DC
+#define USB3_UNI_QSERDES_RX_RX_VGA_GAIN2_LSB			0x04E0
+#define USB3_UNI_QSERDES_RX_RX_VGA_GAIN2_MSB			0x04E4
+#define USB3_UNI_QSERDES_RX_RX_EQU_ADAPTOR_CNTRL1		0x04E8
+#define USB3_UNI_QSERDES_RX_RX_EQU_ADAPTOR_CNTRL2		0x04EC
+#define USB3_UNI_QSERDES_RX_RX_EQU_ADAPTOR_CNTRL3		0x04F0
+#define USB3_UNI_QSERDES_RX_RX_EQU_ADAPTOR_CNTRL4		0x04F4
+#define USB3_UNI_QSERDES_RX_RX_IDAC_TSETTLE_LOW			0x04F8
+#define USB3_UNI_QSERDES_RX_RX_IDAC_TSETTLE_HIGH		0x04FC
+#define USB3_UNI_QSERDES_RX_RX_IDAC_MEASURE_TIME		0x0500
+#define USB3_UNI_QSERDES_RX_RX_IDAC_ACCUMULATOR			0x0504
+#define USB3_UNI_QSERDES_RX_RX_EQ_OFFSET_LSB			0x0508
+#define USB3_UNI_QSERDES_RX_RX_EQ_OFFSET_MSB			0x050C
+#define USB3_UNI_QSERDES_RX_RX_EQ_OFFSET_ADAPTOR_CNTRL1		0x0510
+#define USB3_UNI_QSERDES_RX_RX_OFFSET_ADAPTOR_CNTRL2		0x0514
+#define USB3_UNI_QSERDES_RX_SIGDET_ENABLES			0x0518
+#define USB3_UNI_QSERDES_RX_SIGDET_CNTRL			0x051C
+#define USB3_UNI_QSERDES_RX_SIGDET_LVL				0x0520
+#define USB3_UNI_QSERDES_RX_SIGDET_DEGLITCH_CNTRL		0x0524
+#define USB3_UNI_QSERDES_RX_RX_BAND				0x0528
+#define USB3_UNI_QSERDES_RX_CDR_FREEZE_UP_DN			0x052C
+#define USB3_UNI_QSERDES_RX_CDR_RESET_OVERRIDE			0x0530
+#define USB3_UNI_QSERDES_RX_RX_INTERFACE_MODE			0x0534
+#define USB3_UNI_QSERDES_RX_JITTER_GEN_MODE			0x0538
+#define USB3_UNI_QSERDES_RX_SJ_AMP1				0x053C
+#define USB3_UNI_QSERDES_RX_SJ_AMP2				0x0540
+#define USB3_UNI_QSERDES_RX_SJ_PER1				0x0544
+#define USB3_UNI_QSERDES_RX_SJ_PER2				0x0548
+#define USB3_UNI_QSERDES_RX_PPM_OFFSET1				0x054C
+#define USB3_UNI_QSERDES_RX_PPM_OFFSET2				0x0550
+#define USB3_UNI_QSERDES_RX_SIGN_PPM_PERIOD1			0x0554
+#define USB3_UNI_QSERDES_RX_SIGN_PPM_PERIOD2			0x0558
+#define USB3_UNI_QSERDES_RX_RX_PWM_ENABLE_AND_DATA		0x055C
+#define USB3_UNI_QSERDES_RX_RX_PWM_GEAR1_TIMEOUT_COUNT		0x0560
+#define USB3_UNI_QSERDES_RX_RX_PWM_GEAR2_TIMEOUT_COUNT		0x0564
+#define USB3_UNI_QSERDES_RX_RX_PWM_GEAR3_TIMEOUT_COUNT		0x0568
+#define USB3_UNI_QSERDES_RX_RX_PWM_GEAR4_TIMEOUT_COUNT		0x056C
+#define USB3_UNI_QSERDES_RX_RX_MODE_00_LOW			0x0570
+#define USB3_UNI_QSERDES_RX_RX_MODE_00_HIGH			0x0574
+#define USB3_UNI_QSERDES_RX_RX_MODE_00_HIGH2			0x0578
+#define USB3_UNI_QSERDES_RX_RX_MODE_00_HIGH3			0x057C
+#define USB3_UNI_QSERDES_RX_RX_MODE_00_HIGH4			0x0580
+#define USB3_UNI_QSERDES_RX_RX_MODE_01_LOW			0x0584
+#define USB3_UNI_QSERDES_RX_RX_MODE_01_HIGH			0x0588
+#define USB3_UNI_QSERDES_RX_RX_MODE_01_HIGH2			0x058C
+#define USB3_UNI_QSERDES_RX_RX_MODE_01_HIGH3			0x0590
+#define USB3_UNI_QSERDES_RX_RX_MODE_01_HIGH4			0x0594
+#define USB3_UNI_QSERDES_RX_RX_MODE_10_LOW			0x0598
+#define USB3_UNI_QSERDES_RX_RX_MODE_10_HIGH			0x059C
+#define USB3_UNI_QSERDES_RX_RX_MODE_10_HIGH2			0x05A0
+#define USB3_UNI_QSERDES_RX_RX_MODE_10_HIGH3			0x05A4
+#define USB3_UNI_QSERDES_RX_RX_MODE_10_HIGH4			0x05A8
+#define USB3_UNI_QSERDES_RX_PHPRE_CTRL				0x05AC
+#define USB3_UNI_QSERDES_RX_PHPRE_INITVAL			0x05B0
+#define USB3_UNI_QSERDES_RX_DFE_EN_TIMER			0x05B4
+#define USB3_UNI_QSERDES_RX_DFE_CTLE_POST_CAL_OFFSET		0x05B8
+#define USB3_UNI_QSERDES_RX_DCC_CTRL1				0x05BC
+#define USB3_UNI_QSERDES_RX_DCC_CTRL2				0x05C0
+#define USB3_UNI_QSERDES_RX_VTH_CODE				0x05C4
+#define USB3_UNI_QSERDES_RX_VTH_MIN_THRESH			0x05C8
+#define USB3_UNI_QSERDES_RX_VTH_MAX_THRESH			0x05CC
+#define USB3_UNI_QSERDES_RX_ALOG_OBSV_BUS_CTRL_1		0x05D0
+#define USB3_UNI_QSERDES_RX_PI_CTRL1				0x05D4
+#define USB3_UNI_QSERDES_RX_PI_CTRL2				0x05D8
+#define USB3_UNI_QSERDES_RX_PI_QUAD				0x05DC
+#define USB3_UNI_QSERDES_RX_IDATA1				0x05E0
+#define USB3_UNI_QSERDES_RX_IDATA2				0x05E4
+#define USB3_UNI_QSERDES_RX_AUX_DATA1				0x05E8
+#define USB3_UNI_QSERDES_RX_AUX_DATA2				0x05EC
+#define USB3_UNI_QSERDES_RX_AC_JTAG_OUTP			0x05F0
+#define USB3_UNI_QSERDES_RX_AC_JTAG_OUTN			0x05F4
+#define USB3_UNI_QSERDES_RX_RX_SIGDET				0x05F8
+#define USB3_UNI_QSERDES_RX_ALOG_OBSV_BUS_STATUS_1		0x05FC
+#define USB3_UNI_PCS_LN_PCS_STATUS1				0x0600
+#define USB3_UNI_PCS_LN_PCS_STATUS2				0x0604
+#define USB3_UNI_PCS_LN_PCS_STATUS2_CLEAR			0x0608
+#define USB3_UNI_PCS_LN_PCS_STATUS3				0x060C
+#define USB3_UNI_PCS_LN_BIST_CHK_ERR_CNT_L_STATUS		0x0610
+#define USB3_UNI_PCS_LN_BIST_CHK_ERR_CNT_H_STATUS		0x0614
+#define USB3_UNI_PCS_LN_BIST_CHK_STATUS				0x0618
+#define USB3_UNI_PCS_LN_INSIG_SW_CTRL1				0x061C
+#define USB3_UNI_PCS_LN_INSIG_MX_CTRL1				0x0620
+#define USB3_UNI_PCS_LN_OUTSIG_SW_CTRL1				0x0624
+#define USB3_UNI_PCS_LN_OUTSIG_MX_CTRL1				0x0628
+#define USB3_UNI_PCS_LN_TEST_CONTROL				0x062C
+#define USB3_UNI_PCS_LN_BIST_CTRL				0x0630
+#define USB3_UNI_PCS_LN_PRBS_SEED0				0x0634
+#define USB3_UNI_PCS_LN_PRBS_SEED1				0x0638
+#define USB3_UNI_PCS_LN_FIXED_PAT_CTRL				0x063C
+#define USB3_UNI_PCS_PCIE_LN_PRESET_OVERRIDE_PRE_POST		0x0700
+#define USB3_UNI_PCS_PCIE_LN_PRESET_OVERRIDE_PRE_POST_RS	0x0704
+#define USB3_UNI_PCS_PCIE_LN_PRESET_OVERRIDE_EN			0x0708
+#define USB3_UNI_PCS_PCIE_LN_PRESET_DSBL_L			0x070C
+#define USB3_UNI_PCS_PCIE_LN_PRESET_DSBL_H			0x0710
+#define USB3_UNI_PCS_PCIE_LN_LANE_OFF_CONFIG			0x0714
+#define USB3_UNI_PCS_PCIE_LN_RXEQ_DONE_CONFIG1			0x0718
+#define USB3_UNI_PCS_PCIE_LN_RXEQ_DONE_CONFIG2			0x071C
+#define USB3_UNI_PCS_PCIE_LN_PCIE_PCS_STATUS			0x0720
+#define USB3_UNI_PCS_SW_RESET					0x0800
+#define USB3_UNI_PCS_REVISION_ID0				0x0804
+#define USB3_UNI_PCS_REVISION_ID1				0x0808
+#define USB3_UNI_PCS_REVISION_ID2				0x080C
+#define USB3_UNI_PCS_REVISION_ID3				0x0810
+#define USB3_UNI_PCS_PCS_STATUS1				0x0814
+#define USB3_UNI_PCS_PCS_STATUS2				0x0818
+#define USB3_UNI_PCS_PCS_STATUS3				0x081C
+#define USB3_UNI_PCS_PCS_STATUS4				0x0820
+#define USB3_UNI_PCS_PCS_STATUS5				0x0824
+#define USB3_UNI_PCS_PCS_STATUS6				0x0828
+#define USB3_UNI_PCS_PCS_STATUS7				0x082C
+#define USB3_UNI_PCS_DEBUG_BUS_0_STATUS				0x0830
+#define USB3_UNI_PCS_DEBUG_BUS_1_STATUS				0x0834
+#define USB3_UNI_PCS_DEBUG_BUS_2_STATUS				0x0838
+#define USB3_UNI_PCS_DEBUG_BUS_3_STATUS				0x083C
+#define USB3_UNI_PCS_POWER_DOWN_CONTROL				0x0840
+#define USB3_UNI_PCS_START_CONTROL				0x0844
+#define USB3_UNI_PCS_INSIG_SW_CTRL1				0x0848
+#define USB3_UNI_PCS_INSIG_SW_CTRL2				0x084C
+#define USB3_UNI_PCS_INSIG_SW_CTRL3				0x0850
+#define USB3_UNI_PCS_INSIG_SW_CTRL4				0x0854
+#define USB3_UNI_PCS_INSIG_SW_CTRL5				0x0858
+#define USB3_UNI_PCS_INSIG_SW_CTRL6				0x085C
+#define USB3_UNI_PCS_INSIG_SW_CTRL7				0x0860
+#define USB3_UNI_PCS_INSIG_SW_CTRL8				0x0864
+#define USB3_UNI_PCS_INSIG_MX_CTRL1				0x0868
+#define USB3_UNI_PCS_INSIG_MX_CTRL2				0x086C
+#define USB3_UNI_PCS_INSIG_MX_CTRL3				0x0870
+#define USB3_UNI_PCS_INSIG_MX_CTRL4				0x0874
+#define USB3_UNI_PCS_INSIG_MX_CTRL5				0x0878
+#define USB3_UNI_PCS_INSIG_MX_CTRL7				0x087C
+#define USB3_UNI_PCS_INSIG_MX_CTRL8				0x0880
+#define USB3_UNI_PCS_OUTSIG_SW_CTRL1				0x0884
+#define USB3_UNI_PCS_OUTSIG_MX_CTRL1				0x0888
+#define USB3_UNI_PCS_CLAMP_ENABLE				0x088C
+#define USB3_UNI_PCS_POWER_STATE_CONFIG1			0x0890
+#define USB3_UNI_PCS_POWER_STATE_CONFIG2			0x0894
+#define USB3_UNI_PCS_FLL_CNTRL1					0x0898
+#define USB3_UNI_PCS_FLL_CNTRL2					0x089C
+#define USB3_UNI_PCS_FLL_CNT_VAL_L				0x08A0
+#define USB3_UNI_PCS_FLL_CNT_VAL_H_TOL				0x08A4
+#define USB3_UNI_PCS_FLL_MAN_CODE				0x08A8
+#define USB3_UNI_PCS_TEST_CONTROL1				0x08AC
+#define USB3_UNI_PCS_TEST_CONTROL2				0x08B0
+#define USB3_UNI_PCS_TEST_CONTROL3				0x08B4
+#define USB3_UNI_PCS_TEST_CONTROL4				0x08B8
+#define USB3_UNI_PCS_TEST_CONTROL5				0x08BC
+#define USB3_UNI_PCS_TEST_CONTROL6				0x08C0
+#define USB3_UNI_PCS_LOCK_DETECT_CONFIG1			0x08C4
+#define USB3_UNI_PCS_LOCK_DETECT_CONFIG2			0x08C8
+#define USB3_UNI_PCS_LOCK_DETECT_CONFIG3			0x08CC
+#define USB3_UNI_PCS_LOCK_DETECT_CONFIG4			0x08D0
+#define USB3_UNI_PCS_LOCK_DETECT_CONFIG5			0x08D4
+#define USB3_UNI_PCS_LOCK_DETECT_CONFIG6			0x08D8
+#define USB3_UNI_PCS_REFGEN_REQ_CONFIG1				0x08DC
+#define USB3_UNI_PCS_REFGEN_REQ_CONFIG2				0x08E0
+#define USB3_UNI_PCS_REFGEN_REQ_CONFIG3				0x08E4
+#define USB3_UNI_PCS_BIST_CTRL					0x08E8
+#define USB3_UNI_PCS_PRBS_POLY0					0x08EC
+#define USB3_UNI_PCS_PRBS_POLY1					0x08F0
+#define USB3_UNI_PCS_FIXED_PAT0					0x08F4
+#define USB3_UNI_PCS_FIXED_PAT1					0x08F8
+#define USB3_UNI_PCS_FIXED_PAT2					0x08FC
+#define USB3_UNI_PCS_FIXED_PAT3					0x0900
+#define USB3_UNI_PCS_FIXED_PAT4					0x0904
+#define USB3_UNI_PCS_FIXED_PAT5					0x0908
+#define USB3_UNI_PCS_FIXED_PAT6					0x090C
+#define USB3_UNI_PCS_FIXED_PAT7					0x0910
+#define USB3_UNI_PCS_FIXED_PAT8					0x0914
+#define USB3_UNI_PCS_FIXED_PAT9					0x0918
+#define USB3_UNI_PCS_FIXED_PAT10				0x091C
+#define USB3_UNI_PCS_FIXED_PAT11				0x0920
+#define USB3_UNI_PCS_FIXED_PAT12				0x0924
+#define USB3_UNI_PCS_FIXED_PAT13				0x0928
+#define USB3_UNI_PCS_FIXED_PAT14				0x092C
+#define USB3_UNI_PCS_FIXED_PAT15				0x0930
+#define USB3_UNI_PCS_TXMGN_CONFIG				0x0934
+#define USB3_UNI_PCS_G12S1_TXMGN_V0				0x0938
+#define USB3_UNI_PCS_G12S1_TXMGN_V1				0x093C
+#define USB3_UNI_PCS_G12S1_TXMGN_V2				0x0940
+#define USB3_UNI_PCS_G12S1_TXMGN_V3				0x0944
+#define USB3_UNI_PCS_G12S1_TXMGN_V4				0x0948
+#define USB3_UNI_PCS_G12S1_TXMGN_V0_RS				0x094C
+#define USB3_UNI_PCS_G12S1_TXMGN_V1_RS				0x0950
+#define USB3_UNI_PCS_G12S1_TXMGN_V2_RS				0x0954
+#define USB3_UNI_PCS_G12S1_TXMGN_V3_RS				0x0958
+#define USB3_UNI_PCS_G12S1_TXMGN_V4_RS				0x095C
+#define USB3_UNI_PCS_G3S2_TXMGN_MAIN				0x0960
+#define USB3_UNI_PCS_G3S2_TXMGN_MAIN_RS				0x0964
+#define USB3_UNI_PCS_G12S1_TXDEEMPH_M6DB			0x0968
+#define USB3_UNI_PCS_G12S1_TXDEEMPH_M3P5DB			0x096C
+#define USB3_UNI_PCS_G3S2_PRE_GAIN				0x0970
+#define USB3_UNI_PCS_G3S2_POST_GAIN				0x0974
+#define USB3_UNI_PCS_G3S2_PRE_POST_OFFSET			0x0978
+#define USB3_UNI_PCS_G3S2_PRE_GAIN_RS				0x097C
+#define USB3_UNI_PCS_G3S2_POST_GAIN_RS				0x0980
+#define USB3_UNI_PCS_G3S2_PRE_POST_OFFSET_RS			0x0984
+#define USB3_UNI_PCS_RX_SIGDET_LVL				0x0988
+#define USB3_UNI_PCS_RX_SIGDET_DTCT_CNTRL			0x098C
+#define USB3_UNI_PCS_RCVR_DTCT_DLY_P1U2_L			0x0990
+#define USB3_UNI_PCS_RCVR_DTCT_DLY_P1U2_H			0x0994
+#define USB3_UNI_PCS_RATE_SLEW_CNTRL1				0x0998
+#define USB3_UNI_PCS_RATE_SLEW_CNTRL2				0x099C
+#define USB3_UNI_PCS_PWRUP_RESET_DLY_TIME_AUXCLK		0x09A0
+#define USB3_UNI_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_L		0x09A4
+#define USB3_UNI_PCS_P2U3_WAKEUP_DLY_TIME_AUXCLK_H		0x09A8
+#define USB3_UNI_PCS_TSYNC_RSYNC_TIME				0x09AC
+#define USB3_UNI_PCS_CDR_RESET_TIME				0x09B0
+#define USB3_UNI_PCS_TSYNC_DLY_TIME				0x09B4
+#define USB3_UNI_PCS_ELECIDLE_DLY_SEL				0x09B8
+#define USB3_UNI_PCS_CMN_ACK_OUT_SEL				0x09BC
+#define USB3_UNI_PCS_ALIGN_DETECT_CONFIG1			0x09C0
+#define USB3_UNI_PCS_ALIGN_DETECT_CONFIG2			0x09C4
+#define USB3_UNI_PCS_ALIGN_DETECT_CONFIG3			0x09C8
+#define USB3_UNI_PCS_ALIGN_DETECT_CONFIG4			0x09CC
+#define USB3_UNI_PCS_PCS_TX_RX_CONFIG				0x09D0
+#define USB3_UNI_PCS_RX_IDLE_DTCT_CNTRL				0x09D4
+#define USB3_UNI_PCS_RX_DCC_CAL_CONFIG				0x09D8
+#define USB3_UNI_PCS_EQ_CONFIG1					0x09DC
+#define USB3_UNI_PCS_EQ_CONFIG2					0x09E0
+#define USB3_UNI_PCS_EQ_CONFIG3					0x09E4
+#define USB3_UNI_PCS_EQ_CONFIG4					0x09E8
+#define USB3_UNI_PCS_EQ_CONFIG5					0x09EC
+#define USB3_UNI_PCS_PCIE_INT_AUX_CLK_STATUS			0x0C00
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_STATUS			0x0C04
+#define USB3_UNI_PCS_PCIE_POWER_STATE_CONFIG1			0x0C08
+#define USB3_UNI_PCS_PCIE_POWER_STATE_CONFIG2			0x0C0C
+#define USB3_UNI_PCS_PCIE_POWER_STATE_CONFIG3			0x0C10
+#define USB3_UNI_PCS_PCIE_POWER_STATE_CONFIG4			0x0C14
+#define USB3_UNI_PCS_PCIE_PCS_TX_RX_CONFIG			0x0C18
+#define USB3_UNI_PCS_PCIE_ENDPOINT_REFCLK_DRIVE			0x0C1C
+#define USB3_UNI_PCS_PCIE_ENDPOINT_REFCLK_CNTRL			0x0C20
+#define USB3_UNI_PCS_PCIE_EPCLK_PRE_PLL_LOCK_DLY_AUXCLK		0x0C24
+#define USB3_UNI_PCS_PCIE_EPCLK_DLY_COUNT_VAL_L			0x0C28
+#define USB3_UNI_PCS_PCIE_EPCLK_DLY_COUNT_VAL_H			0x0C2C
+#define USB3_UNI_PCS_PCIE_RX_IDLE_DTCT_CNTRL1			0x0C30
+#define USB3_UNI_PCS_PCIE_RX_IDLE_DTCT_CNTRL2			0x0C34
+#define USB3_UNI_PCS_PCIE_SIGDET_CNTRL				0x0C38
+#define USB3_UNI_PCS_PCIE_SIGDET_LOW_2_IDLE_TIME		0x0C3C
+#define USB3_UNI_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_L		0x0C40
+#define USB3_UNI_PCS_PCIE_L1P1_WAKEUP_DLY_TIME_AUXCLK_H		0x0C44
+#define USB3_UNI_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_L		0x0C48
+#define USB3_UNI_PCS_PCIE_L1P2_WAKEUP_DLY_TIME_AUXCLK_H		0x0C4C
+#define USB3_UNI_PCS_PCIE_INT_AUX_CLK_CONFIG1			0x0C50
+#define USB3_UNI_PCS_PCIE_INT_AUX_CLK_CONFIG2			0x0C54
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_CONFIG1			0x0C58
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_CONFIG2			0x0C5C
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_CONFIG3			0x0C60
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_CONFIG4			0x0C64
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_CONFIG5			0x0C68
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_CONFIG6			0x0C6C
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_CONFIG7			0x0C70
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_MODE2_CONFIG1		0x0C74
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_MODE2_CONFIG2		0x0C78
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_MODE2_CONFIG3		0x0C7C
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_MODE2_CONFIG4		0x0C80
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_MODE2_CONFIG5		0x0C84
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_MODE2_CONFIG6		0x0C88
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_MODE2_CONFIG7		0x0C8C
+#define USB3_UNI_PCS_PCIE_OSC_DTCT_ACTIONS			0x0C90
+#define USB3_UNI_PCS_PCIE_LOCAL_FS				0x0C94
+#define USB3_UNI_PCS_PCIE_LOCAL_LF				0x0C98
+#define USB3_UNI_PCS_PCIE_LOCAL_FS_RS				0x0C9C
+#define USB3_UNI_PCS_PCIE_EQ_CONFIG1				0x0CA0
+#define USB3_UNI_PCS_PCIE_EQ_CONFIG2				0x0CA4
+#define USB3_UNI_PCS_PCIE_PRESET_P0_P1_PRE			0x0CA8
+#define USB3_UNI_PCS_PCIE_PRESET_P2_P3_PRE			0x0CAC
+#define USB3_UNI_PCS_PCIE_PRESET_P4_P5_PRE			0x0CB0
+#define USB3_UNI_PCS_PCIE_PRESET_P6_P7_PRE			0x0CB4
+#define USB3_UNI_PCS_PCIE_PRESET_P8_P9_PRE			0x0CB8
+#define USB3_UNI_PCS_PCIE_PRESET_P10_PRE			0x0CBC
+#define USB3_UNI_PCS_PCIE_PRESET_P1_P3_PRE_RS			0x0CC0
+#define USB3_UNI_PCS_PCIE_PRESET_P4_P5_PRE_RS			0x0CC4
+#define USB3_UNI_PCS_PCIE_PRESET_P6_P9_PRE_RS			0x0CC8
+#define USB3_UNI_PCS_PCIE_PRESET_P0_P1_POST			0x0CCC
+#define USB3_UNI_PCS_PCIE_PRESET_P2_P3_POST			0x0CD0
+#define USB3_UNI_PCS_PCIE_PRESET_P4_P5_POST			0x0CD4
+#define USB3_UNI_PCS_PCIE_PRESET_P6_P7_POST			0x0CD8
+#define USB3_UNI_PCS_PCIE_PRESET_P8_P9_POST			0x0CDC
+#define USB3_UNI_PCS_PCIE_PRESET_P10_POST			0x0CE0
+#define USB3_UNI_PCS_PCIE_PRESET_P1_P3_POST_RS			0x0CE4
+#define USB3_UNI_PCS_PCIE_PRESET_P4_P5_POST_RS			0x0CE8
+#define USB3_UNI_PCS_PCIE_PRESET_P6_P9_POST_RS			0x0CEC
+#define USB3_UNI_PCS_PCIE_RXEQEVAL_TIME				0x0CF0
+#define USB3_UNI_PCS_USB3_POWER_STATE_CONFIG1			0x0E00
+#define USB3_UNI_PCS_USB3_AUTONOMOUS_MODE_STATUS		0x0E04
+#define USB3_UNI_PCS_USB3_AUTONOMOUS_MODE_CTRL			0x0E08
+#define USB3_UNI_PCS_USB3_AUTONOMOUS_MODE_CTRL2			0x0E0C
+#define USB3_UNI_PCS_USB3_LFPS_RXTERM_IRQ_SOURCE_STATUS		0x0E10
+#define USB3_UNI_PCS_USB3_LFPS_RXTERM_IRQ_CLEAR			0x0E14
+#define USB3_UNI_PCS_USB3_LFPS_DET_HIGH_COUNT_VAL		0x0E18
+#define USB3_UNI_PCS_USB3_LFPS_TX_ECSTART			0x0E1C
+#define USB3_UNI_PCS_USB3_LFPS_PER_TIMER_VAL			0x0E20
+#define USB3_UNI_PCS_USB3_LFPS_TX_END_CNT_U3_START		0x0E24
+#define USB3_UNI_PCS_USB3_RXEQTRAINING_LOCK_TIME		0x0E28
+#define USB3_UNI_PCS_USB3_RXEQTRAINING_WAIT_TIME		0x0E2C
+#define USB3_UNI_PCS_USB3_RXEQTRAINING_CTLE_TIME		0x0E30
+#define USB3_UNI_PCS_USB3_RXEQTRAINING_WAIT_TIME_S2		0x0E34
+#define USB3_UNI_PCS_USB3_RXEQTRAINING_DFE_TIME_S2		0x0E38
+#define USB3_UNI_PCS_USB3_RCVR_DTCT_DLY_U3_L			0x0E3C
+#define USB3_UNI_PCS_USB3_RCVR_DTCT_DLY_U3_H			0x0E40
+#define USB3_UNI_PCS_USB3_ARCVR_DTCT_EN_PERIOD			0x0E44
+#define USB3_UNI_PCS_USB3_ARCVR_DTCT_CM_DLY			0x0E48
+#define USB3_UNI_PCS_USB3_TXONESZEROS_RUN_LENGTH		0x0E4C
+#define USB3_UNI_PCS_USB3_ALFPS_DEGLITCH_VAL			0x0E50
+#define USB3_UNI_PCS_USB3_SIGDET_STARTUP_TIMER_VAL		0x0E54
+#define USB3_UNI_PCS_USB3_TEST_CONTROL				0x0E58
+#define USB3_UNI_PCS_USB3_RXTERMINATION_DLY_SEL			0x0E5C
+
+#endif /* _DT_BINDINGS_PHY_QCOM_KONA_QMP_USB_H */
diff --git a/include/linux/input/qpnp-power-on.h b/include/linux/input/qpnp-power-on.h
index 443d513..d80ab2b 100644
--- a/include/linux/input/qpnp-power-on.h
+++ b/include/linux/input/qpnp-power-on.h
@@ -1,6 +1,6 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0-only */
 /*
- * Copyright (c) 2012-2015, 2017-2018, The Linux Foundation.
+ * Copyright (c) 2012-2015, 2017-2019, The Linux Foundation.
  * All rights reserved.
  */
 
@@ -63,33 +63,46 @@ int qpnp_pon_trigger_config(enum pon_trigger_source pon_src, bool enable);
 int qpnp_pon_wd_config(bool enable);
 int qpnp_pon_set_restart_reason(enum pon_restart_reason reason);
 bool qpnp_pon_check_hard_reset_stored(void);
+int qpnp_pon_modem_pwr_off(enum pon_power_off_type type);
 
 #else
+
 static int qpnp_pon_system_pwr_off(enum pon_power_off_type type)
 {
 	return -ENODEV;
 }
+
 static inline int qpnp_pon_is_warm_reset(void)
 {
 	return -ENODEV;
 }
+
 static inline int qpnp_pon_trigger_config(enum pon_trigger_source pon_src,
 							bool enable)
 {
 	return -ENODEV;
 }
+
 int qpnp_pon_wd_config(bool enable)
 {
 	return -ENODEV;
 }
+
 static inline int qpnp_pon_set_restart_reason(enum pon_restart_reason reason)
 {
 	return -ENODEV;
 }
+
 static inline bool qpnp_pon_check_hard_reset_stored(void)
 {
 	return false;
 }
+
+static inline int qpnp_pon_modem_pwr_off(enum pon_power_off_type type)
+{
+	return -ENODEV;
+}
+
 #endif
 
 #endif
diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h
index 43f5f0e..50ab515 100644
--- a/include/trace/events/sched.h
+++ b/include/trace/events/sched.h
@@ -261,9 +261,12 @@ TRACE_EVENT(sched_migrate_task,
  * Tracepoint for load balancing:
  */
 #ifdef CONFIG_SMP
-#if NR_CPUS > 32
-#error "Unsupported NR_CPUS for lb tracepoint."
-#endif
+#if NR_CPUS > BITS_PER_LONG
+#define trace_sched_load_balance_sg_stats(...)
+#define trace_sched_load_balance_stats(...)
+#define trace_sched_load_balance(...)
+#define trace_sched_load_balance_nohz_kick(...)
+#else
 TRACE_EVENT(sched_load_balance,
 
 	TP_PROTO(int cpu, enum cpu_idle_type idle, int balance,
@@ -436,7 +439,8 @@ TRACE_EVENT(sched_load_balance_stats,
 		__entry->lavg_load, __entry->llpt, __entry->sds_avg,
 		__entry->imbalance)
 );
-#endif
+#endif /* NR_CPUS > BITS_PER_LONG */
+#endif /* CONFIG_SMP */
 
 DECLARE_EVENT_CLASS(sched_process_template,
 
diff --git a/include/trace/events/walt.h b/include/trace/events/walt.h
index 320641e..2c10a02 100644
--- a/include/trace/events/walt.h
+++ b/include/trace/events/walt.h
@@ -545,11 +545,11 @@ DEFINE_EVENT(sched_cpu_load, sched_cpu_load_lb,
 TRACE_EVENT(sched_load_to_gov,
 
 	TP_PROTO(struct rq *rq, u64 aggr_grp_load, u32 tt_load,
-		u64 freq_aggr_thresh, u64 load, int policy,
+		int freq_aggr, u64 load, int policy,
 		int big_task_rotation,
 		unsigned int sysctl_sched_little_cluster_coloc_fmin_khz,
 		u64 coloc_boost_load),
-	TP_ARGS(rq, aggr_grp_load, tt_load, freq_aggr_thresh, load, policy,
+	TP_ARGS(rq, aggr_grp_load, tt_load, freq_aggr, load, policy,
 		big_task_rotation, sysctl_sched_little_cluster_coloc_fmin_khz,
 		coloc_boost_load),
 
@@ -558,7 +558,7 @@ TRACE_EVENT(sched_load_to_gov,
 		__field(int,    policy)
 		__field(int,	ed_task_pid)
 		__field(u64,    aggr_grp_load)
-		__field(u64,    freq_aggr_thresh)
+		__field(int,    freq_aggr)
 		__field(u64,    tt_load)
 		__field(u64,	rq_ps)
 		__field(u64,	grp_rq_ps)
@@ -577,7 +577,7 @@ TRACE_EVENT(sched_load_to_gov,
 		__entry->policy		= policy;
 		__entry->ed_task_pid	= rq->ed_task ? rq->ed_task->pid : -1;
 		__entry->aggr_grp_load	= aggr_grp_load;
-		__entry->freq_aggr_thresh = freq_aggr_thresh;
+		__entry->freq_aggr	= freq_aggr;
 		__entry->tt_load	= tt_load;
 		__entry->rq_ps		= rq->prev_runnable_sum;
 		__entry->grp_rq_ps	= rq->grp_time.prev_runnable_sum;
@@ -592,9 +592,9 @@ TRACE_EVENT(sched_load_to_gov,
 		__entry->coloc_boost_load = coloc_boost_load;
 	),
 
-	TP_printk("cpu=%d policy=%d ed_task_pid=%d aggr_grp_load=%llu freq_aggr_thresh=%llu tt_load=%llu rq_ps=%llu grp_rq_ps=%llu nt_ps=%llu grp_nt_ps=%llu pl=%llu load=%llu big_task_rotation=%d sysctl_sched_little_cluster_coloc_fmin_khz=%u coloc_boost_load=%llu",
+	TP_printk("cpu=%d policy=%d ed_task_pid=%d aggr_grp_load=%llu freq_aggr=%d tt_load=%llu rq_ps=%llu grp_rq_ps=%llu nt_ps=%llu grp_nt_ps=%llu pl=%llu load=%llu big_task_rotation=%d sysctl_sched_little_cluster_coloc_fmin_khz=%u coloc_boost_load=%llu",
 		__entry->cpu, __entry->policy, __entry->ed_task_pid,
-		__entry->aggr_grp_load, __entry->freq_aggr_thresh,
+		__entry->aggr_grp_load, __entry->freq_aggr,
 		__entry->tt_load, __entry->rq_ps, __entry->grp_rq_ps,
 		__entry->nt_ps, __entry->grp_nt_ps, __entry->pl, __entry->load,
 		__entry->big_task_rotation,
diff --git a/kernel/sched/boost.c b/kernel/sched/boost.c
index 9e9cb11..29b0b682 100644
--- a/kernel/sched/boost.c
+++ b/kernel/sched/boost.c
@@ -4,6 +4,7 @@
  */
 
 #include "sched.h"
+#include "walt.h"
 #include <linux/of.h>
 #include <linux/sched/core_ctl.h>
 #include <trace/events/sched.h>
@@ -19,7 +20,6 @@ unsigned int sysctl_sched_boost;
 static enum sched_boost_policy boost_policy;
 static enum sched_boost_policy boost_policy_dt = SCHED_BOOST_NONE;
 static DEFINE_MUTEX(boost_mutex);
-static unsigned int freq_aggr_threshold_backup;
 static int boost_refcount[MAX_NUM_BOOST_TYPE];
 
 /*
@@ -69,6 +69,7 @@ static void _sched_set_boost(int type)
 	case NO_BOOST: /* All boost clear */
 		if (boost_refcount[FULL_THROTTLE_BOOST] > 0) {
 			core_ctl_set_boost(false);
+			walt_enable_frequency_aggregation(false);
 			boost_refcount[FULL_THROTTLE_BOOST] = 0;
 		}
 		if (boost_refcount[CONSERVATIVE_BOOST] > 0) {
@@ -76,8 +77,7 @@ static void _sched_set_boost(int type)
 			boost_refcount[CONSERVATIVE_BOOST] = 0;
 		}
 		if (boost_refcount[RESTRAINED_BOOST] > 0) {
-			update_freq_aggregate_threshold(
-				freq_aggr_threshold_backup);
+			walt_enable_frequency_aggregation(false);
 			boost_refcount[RESTRAINED_BOOST] = 0;
 		}
 		break;
@@ -87,6 +87,8 @@ static void _sched_set_boost(int type)
 		if (boost_refcount[FULL_THROTTLE_BOOST] == 1) {
 			core_ctl_set_boost(true);
 			restore_cgroup_boost_settings();
+			if (!boost_refcount[RESTRAINED_BOOST])
+				walt_enable_frequency_aggregation(true);
 		}
 		break;
 
@@ -99,10 +101,9 @@ static void _sched_set_boost(int type)
 
 	case RESTRAINED_BOOST:
 	    boost_refcount[RESTRAINED_BOOST]++;
-		if (boost_refcount[RESTRAINED_BOOST] == 1) {
-			freq_aggr_threshold_backup =
-			    update_freq_aggregate_threshold(1);
-		}
+		if (boost_refcount[RESTRAINED_BOOST] == 1 &&
+		    !boost_refcount[FULL_THROTTLE_BOOST])
+			walt_enable_frequency_aggregation(true);
 		break;
 
 	case FULL_THROTTLE_BOOST_DISABLE:
@@ -112,6 +113,9 @@ static void _sched_set_boost(int type)
 				core_ctl_set_boost(false);
 				if (boost_refcount[CONSERVATIVE_BOOST] >= 1)
 					update_cgroup_boost_settings();
+				if (!boost_refcount[RESTRAINED_BOOST])
+					walt_enable_frequency_aggregation(
+								false);
 			}
 		}
 		break;
@@ -127,9 +131,9 @@ static void _sched_set_boost(int type)
 	case RESTRAINED_BOOST_DISABLE:
 		if (boost_refcount[RESTRAINED_BOOST] >= 1) {
 			boost_refcount[RESTRAINED_BOOST]--;
-			if (!boost_refcount[RESTRAINED_BOOST])
-				update_freq_aggregate_threshold(
-					freq_aggr_threshold_backup);
+			if (!boost_refcount[RESTRAINED_BOOST] &&
+			    !boost_refcount[FULL_THROTTLE_BOOST])
+				walt_enable_frequency_aggregation(false);
 		}
 		break;
 
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 86831199..45a2f8d 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -2759,7 +2759,6 @@ extern int update_preferred_cluster(struct related_thread_group *grp,
 			struct task_struct *p, u32 old_load);
 extern void set_preferred_cluster(struct related_thread_group *grp);
 extern void add_new_task_to_grp(struct task_struct *new);
-extern unsigned int update_freq_aggregate_threshold(unsigned int threshold);
 
 #define NO_BOOST 0
 #define FULL_THROTTLE_BOOST 1
diff --git a/kernel/sched/walt.c b/kernel/sched/walt.c
index 8039269..e7add54 100644
--- a/kernel/sched/walt.c
+++ b/kernel/sched/walt.c
@@ -287,7 +287,7 @@ void fixup_walt_sched_stats_common(struct rq *rq, struct task_struct *p,
  *	C1 busy time = 5 + 5 + 6 = 16ms
  *
  */
-__read_mostly int sched_freq_aggregate_threshold;
+__read_mostly bool sched_freq_aggr_en;
 
 static u64
 update_window_start(struct rq *rq, u64 wallclock, int event)
@@ -489,7 +489,6 @@ static u32  top_task_load(struct rq *rq)
 u64 freq_policy_load(struct rq *rq)
 {
 	unsigned int reporting_policy = sysctl_sched_freq_reporting_policy;
-	int freq_aggr_thresh = sched_freq_aggregate_threshold;
 	struct sched_cluster *cluster = rq->cluster;
 	u64 aggr_grp_load = cluster->aggr_grp_load;
 	u64 load, tt_load = 0;
@@ -500,7 +499,7 @@ u64 freq_policy_load(struct rq *rq)
 		goto done;
 	}
 
-	if (aggr_grp_load > freq_aggr_thresh)
+	if (sched_freq_aggr_en)
 		load = rq->prev_runnable_sum + aggr_grp_load;
 	else
 		load = rq->prev_runnable_sum + rq->grp_time.prev_runnable_sum;
@@ -523,7 +522,7 @@ u64 freq_policy_load(struct rq *rq)
 	}
 
 done:
-	trace_sched_load_to_gov(rq, aggr_grp_load, tt_load, freq_aggr_thresh,
+	trace_sched_load_to_gov(rq, aggr_grp_load, tt_load, sched_freq_aggr_en,
 				load, reporting_policy, walt_rotation_enabled,
 				sysctl_sched_little_cluster_coloc_fmin_khz,
 				coloc_boost_load);
@@ -2489,15 +2488,10 @@ static void transfer_busy_time(struct rq *rq, struct related_thread_group *grp,
  */
 unsigned int __read_mostly sysctl_sched_enable_thread_grouping;
 
-/* Maximum allowed threshold before freq aggregation must be enabled */
-#define MAX_FREQ_AGGR_THRESH 1000
-
 struct related_thread_group *related_thread_groups[MAX_NUM_CGROUP_COLOC_ID];
 static LIST_HEAD(active_related_thread_groups);
 DEFINE_RWLOCK(related_thread_group_lock);
 
-unsigned int __read_mostly sysctl_sched_freq_aggregate_threshold_pct;
-
 /*
  * Task groups whose aggregate demand on a cpu is more than
  * sched_group_upmigrate need to be up-migrated if possible.
@@ -2649,23 +2643,6 @@ DEFINE_MUTEX(policy_mutex);
 #define pct_to_real(tunable)	\
 		(div64_u64((u64)tunable * (u64)max_task_load(), 100))
 
-unsigned int update_freq_aggregate_threshold(unsigned int threshold)
-{
-	unsigned int old_threshold;
-
-	mutex_lock(&policy_mutex);
-
-	old_threshold = sysctl_sched_freq_aggregate_threshold_pct;
-
-	sysctl_sched_freq_aggregate_threshold_pct = threshold;
-	sched_freq_aggregate_threshold =
-		pct_to_real(sysctl_sched_freq_aggregate_threshold_pct);
-
-	mutex_unlock(&policy_mutex);
-
-	return old_threshold;
-}
-
 #define ADD_TASK	0
 #define REM_TASK	1
 
@@ -2896,7 +2873,6 @@ static int __init create_default_coloc_group(void)
 	list_add(&grp->list, &active_related_thread_groups);
 	write_unlock_irqrestore(&related_thread_group_lock, flags);
 
-	update_freq_aggregate_threshold(MAX_FREQ_AGGR_THRESH);
 	return 0;
 }
 late_initcall(create_default_coloc_group);
diff --git a/kernel/sched/walt.h b/kernel/sched/walt.h
index 496a8e5..44d1277 100644
--- a/kernel/sched/walt.h
+++ b/kernel/sched/walt.h
@@ -39,7 +39,6 @@ extern struct mutex cluster_lock;
 extern rwlock_t related_thread_group_lock;
 extern __read_mostly unsigned int sched_ravg_hist_size;
 extern __read_mostly unsigned int sched_freq_aggregate;
-extern __read_mostly int sched_freq_aggregate_threshold;
 extern __read_mostly unsigned int sched_window_stats_policy;
 extern __read_mostly unsigned int sched_group_upmigrate;
 extern __read_mostly unsigned int sched_group_downmigrate;
@@ -298,6 +297,12 @@ extern void walt_rotation_checkpoint(int nr_big);
 extern unsigned int walt_rotation_enabled;
 extern unsigned int walt_get_default_coloc_group_load(void);
 
+extern __read_mostly bool sched_freq_aggr_en;
+static inline void walt_enable_frequency_aggregation(bool enable)
+{
+	sched_freq_aggr_en = enable;
+}
+
 #else /* CONFIG_SCHED_WALT */
 
 static inline void walt_sched_init_rq(struct rq *rq) { }
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 25eeb6d..edcc786 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -963,7 +963,7 @@ static struct genl_family genl_ctrl __ro_after_init = {
 static int genl_bind(struct net *net, int group)
 {
 	struct genl_family *f;
-	int err = -ENOENT;
+	int err = 0;
 	unsigned int id;
 
 	down_read(&cb_lock);