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,