@@ -25,6 +25,7 @@
#define VIDC_CLKS_NUM_MAX 4
#define VIDC_VCODEC_CLKS_NUM_MAX 2
#define VIDC_PMDOMAINS_NUM_MAX 3
+#define VER_STR_SZ 128
struct freq_tbl {
unsigned int load;
@@ -162,6 +163,7 @@ struct venus_core {
unsigned int core0_usage_count;
unsigned int core1_usage_count;
struct dentry *root;
+ char venus_img_ver[VER_STR_SZ];
};
struct vdec_controls {
@@ -511,6 +511,7 @@ static int pkt_session_set_property_1x(struct hfi_session_set_property_pkt *pkt,
pkt->shdr.hdr.size += sizeof(u32) + sizeof(*en);
break;
}
+ case HFI_PROPERTY_PARAM_VDEC_ENABLE_SUFFICIENT_SEQCHANGE_EVENT:
case HFI_PROPERTY_CONFIG_VDEC_POST_LOOP_DEBLOCKER: {
struct hfi_enable *in = pdata;
struct hfi_enable *en = prop_data;
@@ -463,6 +463,8 @@
#define HFI_PROPERTY_PARAM_VDEC_PIXEL_BITDEPTH 0x1003007
#define HFI_PROPERTY_PARAM_VDEC_PIC_STRUCT 0x1003009
#define HFI_PROPERTY_PARAM_VDEC_COLOUR_SPACE 0x100300a
+#define HFI_PROPERTY_PARAM_VDEC_ENABLE_SUFFICIENT_SEQCHANGE_EVENT \
+ 0x0100300b
/*
* HFI_PROPERTY_CONFIG_VDEC_COMMON_START
@@ -16,7 +16,6 @@
#include "hfi_parser.h"
#define SMEM_IMG_VER_TBL 469
-#define VER_STR_SZ 128
#define SMEM_IMG_OFFSET_VENUS (14 * 128)
static void event_seq_changed(struct venus_core *core, struct venus_inst *inst,
@@ -241,11 +240,11 @@ static void hfi_sys_init_done(struct venus_core *core, struct venus_inst *inst,
}
static void
-sys_get_prop_image_version(struct device *dev,
+sys_get_prop_image_version(struct venus_core *core,
struct hfi_msg_sys_property_info_pkt *pkt)
{
+ struct device *dev = core->dev;
u8 *smem_tbl_ptr;
- u8 *img_ver;
int req_bytes;
size_t smem_blk_sz;
@@ -255,15 +254,15 @@ sys_get_prop_image_version(struct device *dev,
/* bad packet */
return;
- img_ver = (u8 *)&pkt->data[1];
+ strncpy(core->venus_img_ver, (u8 *)&pkt->data[1], VER_STR_SZ);
- dev_dbg(dev, VDBGL "F/W version: %s\n", img_ver);
+ dev_dbg(dev, VDBGL "F/W version: %s\n", core->venus_img_ver);
smem_tbl_ptr = qcom_smem_get(QCOM_SMEM_HOST_ANY,
SMEM_IMG_VER_TBL, &smem_blk_sz);
if (!IS_ERR(smem_tbl_ptr) && smem_blk_sz >= SMEM_IMG_OFFSET_VENUS + VER_STR_SZ)
memcpy(smem_tbl_ptr + SMEM_IMG_OFFSET_VENUS,
- img_ver, VER_STR_SZ);
+ core->venus_img_ver, VER_STR_SZ);
}
static void hfi_sys_property_info(struct venus_core *core,
@@ -279,7 +278,7 @@ static void hfi_sys_property_info(struct venus_core *core,
switch (pkt->data[0]) {
case HFI_PROPERTY_SYS_IMAGE_VERSION:
- sys_get_prop_image_version(dev, pkt);
+ sys_get_prop_image_version(core, pkt);
break;
default:
dev_dbg(dev, VDBGL "unknown property data\n");
@@ -627,7 +627,7 @@ static int vdec_set_properties(struct venus_inst *inst)
{
struct vdec_controls *ctr = &inst->controls.dec;
struct hfi_enable en = { .enable = 1 };
- u32 ptype;
+ u32 ptype, major, minor, rev;
int ret;
if (ctr->post_loop_deb_mode) {
@@ -637,6 +637,20 @@ static int vdec_set_properties(struct venus_inst *inst)
return ret;
}
+
+ /* Enabling sufficient sequence change support for VP9 */
+ ret = sscanf(inst->core->venus_img_ver, "14:VIDEO.VE.%u.%u-%u-PROD",
+ &major, &minor, &rev);
+ if (ret != 3)
+ return -EINVAL;
+
+ if (major == 5 && minor == 4 && rev >= 51) {
+ ptype = HFI_PROPERTY_PARAM_VDEC_ENABLE_SUFFICIENT_SEQCHANGE_EVENT;
+ ret = hfi_session_set_property(inst, ptype, &en);
+ if (ret)
+ return ret;
+ }
+
return 0;
}