Re: [PATCH v2 1/3] venus: add firmware version based check

From: Dikshita Agarwal
Date: Tue Apr 18 2023 - 05:48:24 EST



On 4/8/2023 12:45 PM, Konrad Dybcio wrote:

On 7.04.2023 08:25, Dikshita Agarwal wrote:
Add firmware version based checks to enable/disable
features for different SOCs.

Signed-off-by: Dikshita Agarwal <quic_dikshita@xxxxxxxxxxx>
Signed-off-by: Vikash Garodia <quic_vgarodia@xxxxxxxxxxx>
Signed-off-by: Viswanath Boma <quic_vboma@xxxxxxxxxxx>
Tested-by: Nathan Hebert <nhebert@xxxxxxxxxxxx>
---
Reviewed-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxx>

One extra question: some firmware builds have a TYPE-n suffix like
PROD-1 in:

14:VIDEO.VE.6.0-00042-PROD-1

Is the -1 a sign of an incremental build, or some "point release" of a
given fw revision? Does it matter as far as this checking function
goes?

this part of string gets added based on the tool version used to build the firmware.

this doesn't matter and can be ignored.

Thanks,

Dikshita

Konrad
drivers/media/platform/qcom/venus/core.h | 20 ++++++++++++++++++++
drivers/media/platform/qcom/venus/hfi_msgs.c | 11 +++++++++--
2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
index 32551c2..9d1e4b2 100644
--- a/drivers/media/platform/qcom/venus/core.h
+++ b/drivers/media/platform/qcom/venus/core.h
@@ -202,6 +202,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 {
@@ -500,4 +505,19 @@ venus_caps_by_codec(struct venus_core *core, u32 codec, u32 domain)
return NULL;
}
+static inline int
+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 int
+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
diff --git a/drivers/media/platform/qcom/venus/hfi_msgs.c b/drivers/media/platform/qcom/venus/hfi_msgs.c
index df96db3..07ac0fc 100644
--- a/drivers/media/platform/qcom/venus/hfi_msgs.c
+++ b/drivers/media/platform/qcom/venus/hfi_msgs.c
@@ -248,9 +248,10 @@ 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;
@@ -263,6 +264,12 @@ sys_get_prop_image_version(struct device *dev,
return;
img_ver = pkt->data;
+ if (IS_V4(core))
+ sscanf(img_ver, "14:VIDEO.VE.%u.%u-%u-PROD",
+ &core->venus_ver.major, &core->venus_ver.minor, &core->venus_ver.rev);
+ else if (IS_V6(core))
+ sscanf(img_ver, "14:VIDEO.VPU.%u.%u-%u-PROD",
+ &core->venus_ver.major, &core->venus_ver.minor, &core->venus_ver.rev);
dev_dbg(dev, VDBGL "F/W version: %s\n", img_ver);
@@ -286,7 +293,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");