Merge LA.UM.9.12.R2.10.00.00.685.039 via branch 'qcom-msm-4.19-7250' into android-msm-pixel-4.19

 Conflicts:
	msm/vidc/msm_vidc_common.c

Bug: 172988823
Signed-off-by: Lucas Wei <lucaswei@google.com>
Change-Id: Ia851acbba50ef633cb45130bccd5be788e8e4cf7
diff --git a/Makefile b/Makefile
index 0235ce8..bef408f 100644
--- a/Makefile
+++ b/Makefile
@@ -1,21 +1,27 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
 # auto-detect subdirs
-ifeq ($(CONFIG_ARCH_KONA), y)
-include $(srctree)/techpack/video/config/konavid.conf
+ifeq ($(CONFIG_MSM_VIDC_V4L2:M=m), m)
+SUFFIX_MSM_VIDC_V4L2:=-gki
+else
+SUFFIX_MSM_VIDC_V4L2:=
 endif
 
 ifeq ($(CONFIG_ARCH_KONA), y)
-LINUXINCLUDE    += -include $(srctree)/techpack/video/config/konavidconf.h
+include $(srctree)/techpack/video/config/konavid$(SUFFIX_MSM_VIDC_V4L2).conf
+endif
+
+ifeq ($(CONFIG_ARCH_KONA), y)
+LINUXINCLUDE    += -include $(srctree)/techpack/video/config/konavidconf$(SUFFIX_MSM_VIDC_V4L2).h
 endif
 
 # auto-detect subdirs
 ifeq ($(CONFIG_ARCH_LITO), y)
-include $(srctree)/techpack/video/config/litovid.conf
+include $(srctree)/techpack/video/config/litovid$(SUFFIX_MSM_VIDC_V4L2).conf
 endif
 
 ifeq ($(CONFIG_ARCH_LITO), y)
-LINUXINCLUDE    += -include $(srctree)/techpack/video/config/litovidconf.h
+LINUXINCLUDE    += -include $(srctree)/techpack/video/config/litovidconf$(SUFFIX_MSM_VIDC_V4L2).h
 endif
 
 # auto-detect subdirs
diff --git a/config/konavid-gki.conf b/config/konavid-gki.conf
new file mode 100644
index 0000000..10a2274
--- /dev/null
+++ b/config/konavid-gki.conf
@@ -0,0 +1 @@
+export CONFIG_MSM_VIDC_V4L2=m
diff --git a/config/konavidconf-gki.h b/config/konavidconf-gki.h
new file mode 100644
index 0000000..c1e6e4e
--- /dev/null
+++ b/config/konavidconf-gki.h
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ */
+
+#define CONFIG_MSM_VIDC_V4L2_MODULE 1
diff --git a/config/konavidconf.h b/config/konavidconf.h
index da305d5..78d6c57 100644
--- a/config/konavidconf.h
+++ b/config/konavidconf.h
@@ -3,4 +3,4 @@
  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
  */
 
-#define CONFIG_MSM_VIDC_V4L2 1 
+#define CONFIG_MSM_VIDC_V4L2 1
diff --git a/config/litovid-gki.conf b/config/litovid-gki.conf
new file mode 100644
index 0000000..efb4eed
--- /dev/null
+++ b/config/litovid-gki.conf
@@ -0,0 +1 @@
+export CONFIG_MSM_VIDC_V4L2=y
diff --git a/config/litovidconf-gki.h b/config/litovidconf-gki.h
new file mode 100644
index 0000000..78d6c57
--- /dev/null
+++ b/config/litovidconf-gki.h
@@ -0,0 +1,6 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (c) 2019, The Linux Foundation. All rights reserved.
+ */
+
+#define CONFIG_MSM_VIDC_V4L2 1
diff --git a/msm/vidc/hfi_common.c b/msm/vidc/hfi_common.c
index d7223d8..6cdceac 100644
--- a/msm/vidc/hfi_common.c
+++ b/msm/vidc/hfi_common.c
@@ -3076,6 +3076,8 @@
 	struct hfi_sfr_struct *vsfr = NULL;
 	u32 vsfr_size = 0;
 	void *p = NULL;
+	char *fatal_reason = NULL;
+	char crash_reason[MAX_SSR_REASON_LEN];
 
 	vsfr = (struct hfi_sfr_struct *)device->sfr.align_virtual_addr;
 	if (vsfr) {
@@ -3090,6 +3092,20 @@
 		if (p == NULL)
 			vsfr->rg_data[vsfr_size - 1] = '\0';
 
+		fatal_reason =
+			strnstr(vsfr->rg_data, "Err_Fatal", MAX_SSR_REASON_LEN);
+		if (fatal_reason) {
+			subsystem_set_crash_reason("venus", fatal_reason);
+		} else if (call_venus_op(device, watchdog, device->intr_status)) {
+			snprintf(crash_reason, MAX_SSR_REASON_LEN,
+				 "Watchdog_Timeout - %s", vsfr->rg_data);
+				 subsystem_set_crash_reason("venus", crash_reason);
+		} else {
+			snprintf(crash_reason, MAX_SSR_REASON_LEN,
+				 "Unknown - %s", vsfr->rg_data);
+			subsystem_set_crash_reason("venus", crash_reason);
+		}
+
 		d_vpr_e("SFR Message from FW: %s\n", vsfr->rg_data);
 	}
 }
@@ -4808,7 +4824,7 @@
 
 	hdevice->res = res;
 	hdevice->device_id = device_id;
-	hdevice->callback = (msm_vidc_callback) callback;
+	hdevice->callback = callback;
 
 	__init_venus_ops(hdevice);
 
diff --git a/msm/vidc/hfi_common.h b/msm/vidc/hfi_common.h
index 9d288c1..f027176 100644
--- a/msm/vidc/hfi_common.h
+++ b/msm/vidc/hfi_common.h
@@ -259,7 +259,7 @@
 	struct msm_vidc_bus_data bus_vote;
 	bool power_enabled;
 	struct mutex lock;
-	msm_vidc_callback callback;
+	hfi_cmd_response_callback callback;
 	struct vidc_mem_addr iface_q_table;
 	struct vidc_mem_addr dsp_iface_q_table;
 	struct vidc_mem_addr qdss;
diff --git a/msm/vidc/hfi_iris2.c b/msm/vidc/hfi_iris2.c
index 179fb2a..0f16e9b 100644
--- a/msm/vidc/hfi_iris2.c
+++ b/msm/vidc/hfi_iris2.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
  */
+#include <linux/kernel.h>
 
 #include "msm_vidc_debug.h"
 #include "hfi_common.h"
@@ -167,9 +168,9 @@
 				(u32)device->qdss.align_device_addr, sid);
 	/* update queues vaddr for debug purpose */
 	__write_register(device, CPU_CS_VCICMDARG0_IRIS2,
-		(u32)device->iface_q_table.align_virtual_addr, sid);
+		(u32)((uintptr_t)device->iface_q_table.align_virtual_addr & UINT_MAX), sid);
 	__write_register(device, CPU_CS_VCICMDARG1_IRIS2,
-		(u32)((u64)device->iface_q_table.align_virtual_addr >> 32),
+		(u32)((uintptr_t)device->iface_q_table.align_virtual_addr >> 32),
 		sid);
 }
 
diff --git a/msm/vidc/msm_v4l2_vidc.c b/msm/vidc/msm_v4l2_vidc.c
index 0fd761e..3beb77c 100644
--- a/msm/vidc/msm_v4l2_vidc.c
+++ b/msm/vidc/msm_v4l2_vidc.c
@@ -437,7 +437,7 @@
 		.attrs = msm_vidc_core_attrs,
 };
 
-static const struct of_device_id msm_vidc_dt_match[] = {
+static const struct of_device_id msm_vidc_v4l2_dt_match[] = {
 	{.compatible = "qcom,msm-vidc"},
 	{.compatible = "qcom,msm-vidc,context-bank"},
 	{.compatible = "qcom,msm-vidc,bus"},
@@ -479,6 +479,7 @@
 	struct msm_vidc_core *core;
 	struct device *dev = NULL;
 	int nr = BASE_DEVICE_NUMBER;
+	u32 sku_index = 0;
 
 	if (!vidc_driver) {
 		d_vpr_e("Invalid vidc driver\n");
@@ -491,6 +492,16 @@
 
 	core->platform_data = vidc_get_drv_data(&pdev->dev);
 	dev_set_drvdata(&pdev->dev, core);
+
+	/* If the sku_version != the DT node's sku-index, then return as a successful
+	 * probe to prevent the bus from staying on. */
+	rc = of_property_read_u32(pdev->dev.of_node, "sku-index",
+			&sku_index);
+	if (!rc && sku_index != core->platform_data->sku_version) {
+		rc = 0;
+		goto err_core_init;
+	}
+
 	rc = msm_vidc_initialize_core(pdev, core);
 	if (rc) {
 		d_vpr_e("Failed to init core\n");
@@ -585,7 +596,7 @@
 	 * context-bank details and store it in core->resources.context_banks
 	 * list.
 	 */
-	rc = of_platform_populate(pdev->dev.of_node, msm_vidc_dt_match, NULL,
+	rc = of_platform_populate(pdev->dev.of_node, msm_vidc_v4l2_dt_match, NULL,
 			&pdev->dev);
 	if (rc) {
 		d_vpr_e("Failed to trigger probe for sub-devices\n");
@@ -708,6 +719,7 @@
 {
 	int rc = 0;
 	struct msm_vidc_core *core;
+	u32 sku_index = 0;
 
 	/*
 	 * Bail out if
@@ -719,6 +731,11 @@
 		!of_device_is_compatible(dev->of_node, "qcom,msm-vidc"))
 		return 0;
 
+	rc = of_property_read_u32(dev->of_node, "sku-index",
+			&sku_index);
+	if (!rc && sku_index != vidc_driver->sku_version)
+		return 0;
+
 	core = dev_get_drvdata(dev);
 	if (!core) {
 		d_vpr_e("%s: invalid core\n", __func__);
@@ -745,14 +762,14 @@
 	SET_SYSTEM_SLEEP_PM_OPS(msm_vidc_pm_suspend, msm_vidc_pm_resume)
 };
 
-MODULE_DEVICE_TABLE(of, msm_vidc_dt_match);
+MODULE_DEVICE_TABLE(of, msm_vidc_v4l2_dt_match);
 
 static struct platform_driver msm_vidc_driver = {
 	.probe = msm_vidc_probe,
 	.remove = msm_vidc_remove,
 	.driver = {
 		.name = "msm_vidc_v4l2",
-		.of_match_table = msm_vidc_dt_match,
+		.of_match_table = msm_vidc_v4l2_dt_match,
 		.pm = &msm_vidc_pm_ops,
 	},
 };
diff --git a/msm/vidc/msm_venc.c b/msm/vidc/msm_venc.c
index 0ad13a8..262277d 100644
--- a/msm/vidc/msm_venc.c
+++ b/msm/vidc/msm_venc.c
@@ -4600,7 +4600,8 @@
 	 * However, all-intra is intended for quality bitstream. Hence,
 	 * fallback to VBR RC mode if client needs all-intra encoding.
 	 */
-	if (inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
+	if (inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR ||
+		inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR_VFR)
 		inst->rc_type = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR;
 
 	/* check supported bit rate mode and frame rate */
diff --git a/msm/vidc/msm_vidc_buffer_calculations.c b/msm/vidc/msm_vidc_buffer_calculations.c
index 26e48d5..4aa5634 100644
--- a/msm/vidc/msm_vidc_buffer_calculations.c
+++ b/msm/vidc/msm_vidc_buffer_calculations.c
@@ -273,6 +273,7 @@
 #define HFI_VENUS_HEIGHT_ALIGNMENT 32
 
 #define SYSTEM_LAL_TILE10 192
+#define NUM_MBS_480P (((640 + 15) >> 4) * ((480 + 15) >> 4))
 #define NUM_MBS_720P (((1280 + 15) >> 4) * ((720 + 15) >> 4))
 #define NUM_MBS_4k (((4096 + 15) >> 4) * ((2304 + 15) >> 4))
 #define MB_SIZE_IN_PIXEL (16 * 16)
@@ -1004,8 +1005,9 @@
 	f = &inst->fmts[OUTPUT_PORT].v4l2_fmt;
 	/*
 	 * Encoder output size calculation: 32 Align width/height
-	 * For resolution < 720p : YUVsize * 4
-	 * For resolution > 720p & <= 4K : YUVsize / 2
+	 * For CQ or heic session : YUVsize * 2
+	 * For resolution <= 480p : YUVsize * 2
+	 * For resolution > 480p & <= 4K : YUVsize / 2
 	 * For resolution > 4k : YUVsize / 4
 	 * Initially frame_size = YUVsize * 2;
 	 */
@@ -1018,24 +1020,29 @@
 	mbs_per_frame = NUM_MBS_PER_FRAME(width, height);
 	frame_size = (width * height * 3);
 
-	if (mbs_per_frame < NUM_MBS_720P)
-		frame_size = frame_size << 1;
+	if (inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ ||
+		is_grid_session(inst) || is_image_session(inst))
+		goto calc_done;
+
+	if (mbs_per_frame <= NUM_MBS_480P)
+		goto calc_done; /* Default frame_size = YUVsize * 2 */
 	else if (mbs_per_frame <= NUM_MBS_4k)
 		frame_size = frame_size >> 2;
 	else
 		frame_size = frame_size >> 3;
 
-	if ((inst->rc_type == RATE_CONTROL_OFF) ||
-		(inst->rc_type == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ))
+	if (inst->rc_type == RATE_CONTROL_OFF)
 		frame_size = frame_size << 1;
 
 	if (inst->rc_type == RATE_CONTROL_LOSSLESS)
 		frame_size = (width * height * 9) >> 2;
 
 	/* multiply by 10/8 (1.25) to get size for 10 bit case */
-	if (f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEVC)
+	if (inst->core->platform_data->vpu_ver != VPU_VERSION_AR50_LITE &&
+		f->fmt.pix_mp.pixelformat == V4L2_PIX_FMT_HEVC)
 		frame_size = frame_size + (frame_size >> 2);
 
+calc_done:
 	return ALIGN(frame_size, SZ_4K);
 }
 
diff --git a/msm/vidc/msm_vidc_clocks.c b/msm/vidc/msm_vidc_clocks.c
index 5fdfe53..f7797ea 100644
--- a/msm/vidc/msm_vidc_clocks.c
+++ b/msm/vidc/msm_vidc_clocks.c
@@ -1746,13 +1746,10 @@
 		msm_vidc_power_save_mode_enable(inst, enable);
 	} else if (cur_inst_lp_load + core_load <= max_freq) {
 		msm_vidc_power_save_mode_enable(inst, true);
-	} else if (cur_inst_lp_load + core_lp_load <= max_freq) {
+	} else {
 		s_vpr_h(inst->sid, "Moved all inst's to LP");
 		msm_vidc_move_core_to_power_save_mode(core,
 			VIDC_CORE_ID_1, inst->sid);
-	} else {
-		s_vpr_e(inst->sid, "Core cannot support this load\n");
-		return -EINVAL;
 	}
 
 	inst->clk_data.core_id = VIDC_CORE_ID_1;
diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c
index 21adfe4..4dfc6a7 100644
--- a/msm/vidc/msm_vidc_common.c
+++ b/msm/vidc/msm_vidc_common.c
@@ -1323,6 +1323,7 @@
 {
 	int rc = 0;
 	struct hfi_device *hdev;
+	char crash_reason[MAX_SSR_REASON_LEN];
 
 	if (!inst) {
 		d_vpr_e("Invalid(%pK) instance id\n", inst);
@@ -1340,6 +1341,12 @@
 	if (!rc) {
 		s_vpr_e(inst->sid, "Wait interrupted or timed out: %d\n",
 				SESSION_MSG_INDEX(cmd));
+		snprintf(crash_reason, MAX_SSR_REASON_LEN,
+			 "HW_RSP_Timeout - Wait interrupted or timed out: %d",
+			 SESSION_MSG_INDEX(cmd));
+
+		subsystem_set_crash_reason("venus", crash_reason);
+
 		msm_comm_kill_session(inst);
 		rc = -EIO;
 	} else {
@@ -6804,8 +6811,15 @@
 			rc = msm_smem_cache_operations(mbuf->smem[i].dma_buf,
 					cache_op, offset, size, inst->sid);
 			if (rc)
-				print_vidc_buffer(VIDC_ERR,
-					"qbuf cache ops failed", inst, mbuf);
+				dprintk_ratelimit(VIDC_ERR,
+					"qbuf cache ops failed: %s: idx %2d fd %d off %d daddr %x size %d filled %d flags 0x%x ts %lld refcnt %d mflags 0x%x\n",
+					vb->type == INPUT_MPLANE ?
+					"OUTPUT" : "CAPTURE",
+					vb->index, vb->planes[i].m.fd,
+					vb->planes[i].data_offset, mbuf->smem[i].device_addr,
+					vb->planes[i].length, vb->planes[i].bytesused,
+					mbuf->vvb.flags, mbuf->vvb.vb2_buf.timestamp,
+					mbuf->smem[i].refcount, mbuf->flags);
 		}
 	}
 
@@ -7534,6 +7548,12 @@
 		!frame_data->filled_len)
 		return 0;
 
+	/*
+	 * MaxAvgFrameSize <= (1 + B/S) * (MaxClock / fps - 25*NumOfMacroBlockperFrame) / 1.35
+	 * S: Sliding window = #Frames in 40ms (av sync window) Closest point
+	 * B: Buffer Count = B(vsp-vpp) = 2 for 2Stage, 0 for 1stage
+	 */
+
 	fps = inst->clk_data.frame_rate >> 16;
 	window_size = inst->core->resources.avsync_window_size * fps;
 	window_size = DIV_ROUND_CLOSEST(window_size, 1000);
diff --git a/msm/vidc/msm_vidc_debug.c b/msm/vidc/msm_vidc_debug.c
index e803269..aa1de10 100644
--- a/msm/vidc/msm_vidc_debug.c
+++ b/msm/vidc/msm_vidc_debug.c
@@ -182,7 +182,7 @@
 		goto exit;
 	}
 	core->resources.msm_vidc_hw_rsp_timeout =
-	((msm_vidc_debug & 0xFF) > (VIDC_ERR | VIDC_HIGH)) ? 1500 : 1000;
+	((msm_vidc_debug & 0xFF) > (VIDC_ERR | VIDC_HIGH)) ? 2500 : 1000;
 	rc = count;
 	d_vpr_h("debug timeout updated to - %d\n",
 		core->resources.msm_vidc_hw_rsp_timeout);
@@ -522,7 +522,7 @@
 {
 	struct dentry *dentry = NULL;
 
-	if (!inst || !inst->debugfs_root)
+	if (!inst || IS_ERR_OR_NULL(inst->debugfs_root))
 		return;
 
 	dentry = inst->debugfs_root;
diff --git a/msm/vidc/msm_vidc_platform.c b/msm/vidc/msm_vidc_platform.c
index c93865c..e694896 100644
--- a/msm/vidc/msm_vidc_platform.c
+++ b/msm/vidc/msm_vidc_platform.c
@@ -202,8 +202,10 @@
 
 static struct msm_vidc_codec_capability lito_capabilities_v0[] = {
 	/* {cap_type, domains, codecs, min, max, step_size, default_value} */
-	{CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 96, 5760, 1, 1920},
-	{CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 96, 5760, 1, 1080},
+	{CAP_FRAME_WIDTH, DEC, CODECS_ALL, 96, 5760, 1, 1920},
+	{CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 5760, 1, 1080},
+	{CAP_FRAME_WIDTH, ENC, CODECS_ALL, 96, 5760, 2, 1920},
+	{CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 96, 5760, 2, 1080},
 	/*  ((5760 * 2880) / 256) */
 	{CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 36, 64800, 1, 8160},
 	/* ((3840x2176)/256)@60fps */
@@ -234,8 +236,10 @@
 	{CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1},
 
 	/* VP8 specific */
-	{CAP_FRAME_WIDTH, ENC|DEC, VP8, 96, 4096, 1, 1920},
-	{CAP_FRAME_HEIGHT, ENC|DEC, VP8, 96, 4096, 1, 1080},
+	{CAP_FRAME_WIDTH, DEC, VP8, 96, 4096, 1, 1920},
+	{CAP_FRAME_HEIGHT, DEC, VP8, 96, 4096, 1, 1080},
+	{CAP_FRAME_WIDTH, ENC, VP8, 96, 4096, 2, 1920},
+	{CAP_FRAME_HEIGHT, ENC, VP8, 96, 4096, 2, 1080},
 	/* (4096 * 2176) / 256 */
 	{CAP_MBS_PER_FRAME, ENC|DEC, VP8, 36, 34816, 1, 8160},
 	/* (3840 * 2176) / 256) * 30*/
@@ -255,8 +259,10 @@
 	{CAP_BITRATE, DEC, MPEG2, 1, 40000000, 1, 20000000},
 
 	/* Secure usecase specific */
-	{CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 96, 4096, 1, 1920},
-	{CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 96, 4096, 1, 1080},
+	{CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920},
+	{CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080},
+	{CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 96, 4096, 2, 1920},
+	{CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 96, 4096, 2, 1080},
 	/* (4096 * 2176) / 256 */
 	{CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 36, 34816, 1, 8160},
 	{CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 40000000, 1, 20000000},
@@ -270,10 +276,10 @@
 	{CAP_ALLINTRA_MAX_FPS, ENC, H264|HEVC, 1, 240, 1, 30},
 
 	/* Image specific */
-	{CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512},
-	{CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512},
-	{CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 1, 8192},
-	{CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192},
+	{CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512},
+	{CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512},
+	{CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 2, 8192},
+	{CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 2, 8192},
 
 	/* Level for AVC and HEVC encoder specific.
 	   Default for levels is UNKNOWN value. But if we use unknown
@@ -298,8 +304,10 @@
 
 static struct msm_vidc_codec_capability lito_capabilities_v1[] = {
 	/* {cap_type, domains, codecs, min, max, step_size, default_value} */
-	{CAP_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 96, 4096, 1, 1920},
-	{CAP_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 96, 4096, 1, 1080},
+	{CAP_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920},
+	{CAP_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080},
+	{CAP_FRAME_WIDTH, ENC, CODECS_ALL, 96, 4096, 2, 1920},
+	{CAP_FRAME_HEIGHT, ENC, CODECS_ALL, 96, 4096, 2, 1080},
 	/*  ((4096 * 2176) / 256) */
 	{CAP_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 36, 34816, 1, 8160},
 	/* UHD@30 decode + 1080@30 encode */
@@ -330,8 +338,10 @@
 	{CAP_MAX_VIDEOCORES, DOMAINS_ALL, CODECS_ALL, 0, 1, 1, 1},
 
 	/* VP8 specific */
-	{CAP_FRAME_WIDTH, ENC|DEC, VP8, 96, 1920, 1, 1920},
-	{CAP_FRAME_HEIGHT, ENC|DEC, VP8, 96, 1920, 1, 1080},
+	{CAP_FRAME_WIDTH, DEC, VP8, 96, 1920, 1, 1920},
+	{CAP_FRAME_HEIGHT, DEC, VP8, 96, 1920, 1, 1080},
+	{CAP_FRAME_WIDTH, ENC, VP8, 96, 1920, 2, 1920},
+	{CAP_FRAME_HEIGHT, ENC, VP8, 96, 1920, 2, 1080},
 	/* (1920 * 1088) / 256 */
 	{CAP_MBS_PER_FRAME, ENC|DEC, VP8, 36, 8160, 1, 8160},
 	/* ((1920 * 1088) / 256) * 60*/
@@ -351,8 +361,10 @@
 	{CAP_BITRATE, DEC, MPEG2, 1, 40000000, 1, 20000000},
 
 	/* Secure usecase specific */
-	{CAP_SECURE_FRAME_WIDTH, DOMAINS_ALL, CODECS_ALL, 96, 4096, 1, 1920},
-	{CAP_SECURE_FRAME_HEIGHT, DOMAINS_ALL, CODECS_ALL, 96, 4096, 1, 1080},
+	{CAP_SECURE_FRAME_WIDTH, DEC, CODECS_ALL, 96, 4096, 1, 1920},
+	{CAP_SECURE_FRAME_HEIGHT, DEC, CODECS_ALL, 96, 4096, 1, 1080},
+	{CAP_SECURE_FRAME_WIDTH, ENC, CODECS_ALL, 96, 4096, 2, 1920},
+	{CAP_SECURE_FRAME_HEIGHT, ENC, CODECS_ALL, 96, 4096, 2, 1080},
 	/* (4096 * 2176) / 256 */
 	{CAP_SECURE_MBS_PER_FRAME, DOMAINS_ALL, CODECS_ALL, 36, 34816, 1, 8160},
 	{CAP_SECURE_BITRATE, DOMAINS_ALL, CODECS_ALL, 1, 40000000, 1, 20000000},
@@ -366,10 +378,10 @@
 	{CAP_ALLINTRA_MAX_FPS, ENC, H264|HEVC, 1, 240, 1, 30},
 
 	/* Image specific */
-	{CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 1, 512},
-	{CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 1, 512},
-	{CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 1, 8192},
-	{CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 1, 8192},
+	{CAP_HEVC_IMAGE_FRAME_WIDTH, ENC, HEVC, 128, 512, 2, 512},
+	{CAP_HEVC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 128, 512, 2, 512},
+	{CAP_HEIC_IMAGE_FRAME_WIDTH, ENC, HEVC, 512, 8192, 2, 8192},
+	{CAP_HEIC_IMAGE_FRAME_HEIGHT, ENC, HEVC, 512, 8192, 2, 8192},
 
 	/* Level for AVC and HEVC encoder specific.
 	   Default for levels is UNKNOWN value. But if we use unknown
@@ -931,10 +943,11 @@
 	},
 	{
 		.key = "qcom,max-hw-load",
-		.value = 1958400,
+		.value = 3916800,
 		/**
-		 * ((3840x2176)/256)@60
+		 * supported is: ((3840x2176)/256)@60
 		 * UHD@30 decode + UHD@30 encode
+                 * mentioned value is as per UHD@120
 		 */
 	},
 	{
@@ -955,7 +968,7 @@
 	},
 	{
 		.key = "qcom,max-b-frame-mbs-per-sec",
-		.value = 244800,/* ((1920x1088)/256) MBs@30fps */
+		.value = 489600,/* ((1920x1088)/256) MBs@60fps */
 	},
 	{
 		.key = "qcom,max-mbpf",
@@ -1018,9 +1031,11 @@
 	},
 	{
 		.key = "qcom,max-hw-load",
-		.value = 1224000,
+		.value = 3916800,
 		/**
+		 * supported is:
 		 * UHD@30 decode + 1080@30 encode
+		 * mentioned is as per UHD@120
 		 */
 	},
 		{
diff --git a/msm/vidc/vidc_hfi_api.h b/msm/vidc/vidc_hfi_api.h
index 212b227..4f16a8f 100644
--- a/msm/vidc/vidc_hfi_api.h
+++ b/msm/vidc/vidc_hfi_api.h
@@ -728,7 +728,6 @@
 
 typedef void (*hfi_cmd_response_callback) (enum hal_command_response cmd,
 			void *data);
-typedef void (*msm_vidc_callback) (u32 response, void *callback);
 
 struct hfi_device *vidc_hfi_initialize(enum msm_vidc_hfi_type hfi_type,
 		u32 device_id, struct msm_vidc_platform_resources *res,