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

Bug: 210578498
Signed-off-by: JohnnLee <johnnlee@google.com>
Change-Id: I99bbe71e6ccce56296068bb45df6cb49df89033a
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 ae412f2..3c19b8f 100644
--- a/msm/vidc/hfi_common.c
+++ b/msm/vidc/hfi_common.c
@@ -3081,6 +3081,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) {
@@ -3095,6 +3097,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);
 	}
 }
@@ -4813,7 +4829,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 5f6a82a..250b480 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");
@@ -496,6 +497,16 @@
 		goto err_core_init;
 	}
 	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");
@@ -596,7 +607,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");
@@ -722,6 +733,7 @@
 {
 	int rc = 0;
 	struct msm_vidc_core *core;
+	u32 sku_index = 0;
 
 	/*
 	 * Bail out if
@@ -733,6 +745,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__);
@@ -759,14 +776,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 02c924a..cab9a56 100644
--- a/msm/vidc/msm_venc.c
+++ b/msm/vidc/msm_venc.c
@@ -4587,7 +4587,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_clocks.c b/msm/vidc/msm_vidc_clocks.c
index f06ace0..af0fd9a 100644
--- a/msm/vidc/msm_vidc_clocks.c
+++ b/msm/vidc/msm_vidc_clocks.c
@@ -1765,13 +1765,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 ee8c1b2..785fa9c 100644
--- a/msm/vidc/msm_vidc_common.c
+++ b/msm/vidc/msm_vidc_common.c
@@ -1342,6 +1342,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);
@@ -1359,6 +1360,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 {
@@ -6828,8 +6835,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);
 		}
 	}
 
diff --git a/msm/vidc/msm_vidc_debug.c b/msm/vidc/msm_vidc_debug.c
index 75b6d2e..aea6398 100644
--- a/msm/vidc/msm_vidc_debug.c
+++ b/msm/vidc/msm_vidc_debug.c
@@ -180,7 +180,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);
@@ -520,7 +520,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 90a63ec..b788cce 100644
--- a/msm/vidc/msm_vidc_platform.c
+++ b/msm/vidc/msm_vidc_platform.c
@@ -287,8 +287,8 @@
 	   unknown as well, which creates a problem of allowing client
 	   to set higher level than supported */
 	{CAP_H264_LEVEL, ENC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
-	                            V4L2_MPEG_VIDEO_H264_LEVEL_6_0, 1,
-	                            V4L2_MPEG_VIDEO_H264_LEVEL_6_0},
+	                            V4L2_MPEG_VIDEO_H264_LEVEL_5_2, 1,
+	                            V4L2_MPEG_VIDEO_H264_LEVEL_5_2},
 	{CAP_HEVC_LEVEL, ENC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
 	                            V4L2_MPEG_VIDEO_HEVC_LEVEL_6, 1,
 	                            V4L2_MPEG_VIDEO_HEVC_LEVEL_6},
@@ -389,8 +389,8 @@
 	   unknown as well, which creates a problem of allowing client
 	   to set higher level than supported */
 	{CAP_H264_LEVEL, ENC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0,
-	                            V4L2_MPEG_VIDEO_H264_LEVEL_6_0, 1,
-	                            V4L2_MPEG_VIDEO_H264_LEVEL_6_0},
+	                            V4L2_MPEG_VIDEO_H264_LEVEL_5_2, 1,
+	                            V4L2_MPEG_VIDEO_H264_LEVEL_5_2},
 	{CAP_HEVC_LEVEL, ENC, HEVC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
 	                            V4L2_MPEG_VIDEO_HEVC_LEVEL_6, 1,
 	                            V4L2_MPEG_VIDEO_HEVC_LEVEL_6},
@@ -943,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
 		 */
 	},
 	{
@@ -967,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",
@@ -1030,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,