Commit ae8cdfc3 authored by Dikshita Agarwal's avatar Dikshita Agarwal Committed by Mauro Carvalho Chehab

media: venus: add firmware version based check

Add firmware version based checks to enable/disable
features for different SOCs.
Tested-by: default avatarNathan Hebert <nhebert@chromium.org>
Signed-off-by: default avatarVikash Garodia <quic_vgarodia@quicinc.com>
Signed-off-by: default avatarViswanath Boma <quic_vboma@quicinc.com>
Signed-off-by: default avatarDikshita Agarwal <quic_dikshita@quicinc.com>
Signed-off-by: default avatarStanimir Varbanov <stanimir.k.varbanov@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@kernel.org>
parent e03ac408
......@@ -201,6 +201,11 @@ struct venus_core {
unsigned int core0_usage_count;
unsigned int core1_usage_count;
struct dentry *root;
struct venus_img_version {
u32 major;
u32 minor;
u32 rev;
} venus_ver;
};
struct vdec_controls {
......@@ -508,4 +513,19 @@ venus_caps_by_codec(struct venus_core *core, u32 codec, u32 domain)
return NULL;
}
static inline bool
is_fw_rev_or_newer(struct venus_core *core, u32 vmajor, u32 vminor, u32 vrev)
{
return ((core)->venus_ver.major == vmajor &&
(core)->venus_ver.minor == vminor &&
(core)->venus_ver.rev >= vrev);
}
static inline bool
is_fw_rev_or_older(struct venus_core *core, u32 vmajor, u32 vminor, u32 vrev)
{
return ((core)->venus_ver.major == vmajor &&
(core)->venus_ver.minor == vminor &&
(core)->venus_ver.rev <= vrev);
}
#endif
......@@ -248,13 +248,15 @@ 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;
int ret;
req_bytes = pkt->hdr.size - sizeof(*pkt);
......@@ -263,8 +265,30 @@ sys_get_prop_image_version(struct device *dev,
return;
img_ver = pkt->data;
if (!img_ver)
return;
ret = sscanf(img_ver, "14:video-firmware.%u.%u-%u",
&core->venus_ver.major, &core->venus_ver.minor, &core->venus_ver.rev);
if (ret)
goto done;
ret = sscanf(img_ver, "14:VIDEO.VPU.%u.%u-%u",
&core->venus_ver.major, &core->venus_ver.minor, &core->venus_ver.rev);
if (ret)
goto done;
ret = sscanf(img_ver, "14:VIDEO.VE.%u.%u-%u",
&core->venus_ver.major, &core->venus_ver.minor, &core->venus_ver.rev);
if (ret)
goto done;
dev_dbg(dev, VDBGL "F/W version: %s\n", img_ver);
dev_err(dev, VDBGL "error reading F/W version\n");
return;
done:
dev_dbg(dev, VDBGL "F/W version: %s, major %u, minor %u, revision %u\n",
img_ver, core->venus_ver.major, core->venus_ver.minor, core->venus_ver.rev);
smem_tbl_ptr = qcom_smem_get(QCOM_SMEM_HOST_ANY,
SMEM_IMG_VER_TBL, &smem_blk_sz);
......@@ -286,7 +310,7 @@ static void hfi_sys_property_info(struct venus_core *core,
switch (pkt->property) {
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");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment