Message ID | 1680589032-26046-1-git-send-email-quic_dikshita@quicinc.com |
---|---|
Headers | show |
Series | fix decoder issues with firmware version check | expand |
On 4.04.2023 08:17, Dikshita Agarwal wrote: > Use firmware version based check to assign correct > device address for EOS buffer to fix the EOS handling > with different firmware version. > > Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com> > Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com> > Signed-off-by: Viswanath Boma <quic_vboma@quicinc.com> > Tested-by: Nathan Hebert <nhebert@chromium.org> > --- Does it only concern fw 1.0.xx? Konrad > drivers/media/platform/qcom/venus/vdec.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c > index f0394b9..c59b34f 100644 > --- a/drivers/media/platform/qcom/venus/vdec.c > +++ b/drivers/media/platform/qcom/venus/vdec.c > @@ -545,7 +545,7 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd) > > fdata.buffer_type = HFI_BUFFER_INPUT; > fdata.flags |= HFI_BUFFERFLAG_EOS; > - if (IS_V6(inst->core)) > + if (IS_V6(inst->core) && is_fw_rev_or_older(inst->core, 1, 0, 87)) > fdata.device_addr = 0; > else > fdata.device_addr = 0xdeadb000;
On 4/4/2023 11:54 PM, Konrad Dybcio wrote: > > On 4.04.2023 08:17, Dikshita Agarwal wrote: >> Use firmware version based check to assign correct >> device address for EOS buffer to fix the EOS handling >> with different firmware version. >> >> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com> >> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com> >> Signed-off-by: Viswanath Boma <quic_vboma@quicinc.com> >> Tested-by: Nathan Hebert <nhebert@chromium.org> >> --- > Does it only concern fw 1.0.xx? > > Konrad that's right. changes were made in later firmware (newer than 1.0.87) to make the behavior generic across all supported SOCs. Thanks, Dikshita >> drivers/media/platform/qcom/venus/vdec.c | 2 +- >> 1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c >> index f0394b9..c59b34f 100644 >> --- a/drivers/media/platform/qcom/venus/vdec.c >> +++ b/drivers/media/platform/qcom/venus/vdec.c >> @@ -545,7 +545,7 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd) >> >> fdata.buffer_type = HFI_BUFFER_INPUT; >> fdata.flags |= HFI_BUFFERFLAG_EOS; >> - if (IS_V6(inst->core)) >> + if (IS_V6(inst->core) && is_fw_rev_or_older(inst->core, 1, 0, 87)) >> fdata.device_addr = 0; >> else >> fdata.device_addr = 0xdeadb000;
On 5.04.2023 08:41, Dikshita Agarwal wrote: > > On 4/4/2023 11:54 PM, Konrad Dybcio wrote: >> >> On 4.04.2023 08:17, Dikshita Agarwal wrote: >>> Use firmware version based check to assign correct >>> device address for EOS buffer to fix the EOS handling >>> with different firmware version. >>> >>> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com> >>> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com> >>> Signed-off-by: Viswanath Boma <quic_vboma@quicinc.com> >>> Tested-by: Nathan Hebert <nhebert@chromium.org> >>> --- >> Does it only concern fw 1.0.xx? >> >> Konrad > > that's right. > > changes were made in later firmware (newer than 1.0.87) to > > make the behavior generic across all supported SOCs. > > Thanks, OK Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org> Konrad > > Dikshita > >>> drivers/media/platform/qcom/venus/vdec.c | 2 +- >>> 1 file changed, 1 insertion(+), 1 deletion(-) >>> >>> diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c >>> index f0394b9..c59b34f 100644 >>> --- a/drivers/media/platform/qcom/venus/vdec.c >>> +++ b/drivers/media/platform/qcom/venus/vdec.c >>> @@ -545,7 +545,7 @@ vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd) >>> fdata.buffer_type = HFI_BUFFER_INPUT; >>> fdata.flags |= HFI_BUFFERFLAG_EOS; >>> - if (IS_V6(inst->core)) >>> + if (IS_V6(inst->core) && is_fw_rev_or_older(inst->core, 1, 0, 87)) >>> fdata.device_addr = 0; >>> else >>> fdata.device_addr = 0xdeadb000;
On 4/4/2023 11:48 PM, Konrad Dybcio wrote: > > On 4.04.2023 08:17, Dikshita Agarwal wrote: >> Add firmware version based checks to enable/disable >> features for different SOCs. >> >> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com> >> Signed-off-by: Vikash Garodia <quic_vgarodia@quicinc.com> >> Signed-off-by: Viswanath Boma <quic_vboma@quicinc.com> >> Tested-by: Nathan Hebert <nhebert@chromium.org> >> --- >> drivers/media/platform/qcom/venus/core.h | 18 ++++++++++++++++++ >> drivers/media/platform/qcom/venus/hfi_msgs.c | 11 +++++++++-- >> 2 files changed, 27 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h >> index 32551c2..ee8b70a 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,17 @@ 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) > So this is trying to find the revision of a MAJ.MIN firmware release.. > > Is the MAJ.MIN part supposed to stay constant for a specific version of > a Venus block (say idk, IRIS2) and only the VREV part is supposed to > be updated with both feature and security developments? Yes Major and minor numbers will be constant for a SPC and only the revision will be updated with any new release. >> +{ >> + return ((core)->venus_ver.major == vmajor && (core)->venus_ver.minor == >> + vminor && (core)->venus_ver.rev >= vrev); > return ((core)->venus_ver.major == vmajor && > (core)->venus_ver.minor == vminor && > (core)->venus_ver.rev >= vrev); > > for readability Sure, will take care of this in next version. > Konrad >> +} >> + >> +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");