Hi Bryan, Thank you for the patch. On Wed, Aug 23, 2023 at 11:44:34AM +0100, Bryan O'Donoghue wrote: > line_num indicates the number of RDI - raw data interface channels which > are associated with a given IFE/VFE - image/video front end. Should the variable then be renamed to num_rdi or similar ? > On several SoCs the RDI number is not static for each VFE - for example > on sm8250 VFE Lite has four RDIs where regular VFE has three. > > Assigning line_num statically in the subdev_init() phase initialises > each VFE to the lower number, meaning in practical terms that we are > lobbing off one RDI on some VFEs. > > Interrupt handling uses static for (i = RDI0; i < RDI2; i++) {} in some > of our VFE blocks but this can't work for situations where we have a > mixture of VFE @ 3 RDI and VFE-lite @ 4 RDI blocks. > > First step to remediate is to pass line_num from a compat string > controlled data-structure and do so on a per-VFE basis. > > Later patches will assign the correct number of RDI blocks per VFE. > > Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx> > Reviewed-by: Konrad Dybcio <konrad.dybcio@xxxxxxxxxx> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > .../media/platform/qcom/camss/camss-vfe-170.c | 2 -- > .../media/platform/qcom/camss/camss-vfe-4-1.c | 2 -- > .../media/platform/qcom/camss/camss-vfe-4-7.c | 2 -- > .../media/platform/qcom/camss/camss-vfe-4-8.c | 2 -- > .../media/platform/qcom/camss/camss-vfe-480.c | 1 - > drivers/media/platform/qcom/camss/camss-vfe.c | 5 +++ > drivers/media/platform/qcom/camss/camss.c | 36 ++++++++++++------- > drivers/media/platform/qcom/camss/camss.h | 1 + > 8 files changed, 30 insertions(+), 21 deletions(-) > > diff --git a/drivers/media/platform/qcom/camss/camss-vfe-170.c b/drivers/media/platform/qcom/camss/camss-vfe-170.c > index 9905bb06b3823..8aa921400ded0 100644 > --- a/drivers/media/platform/qcom/camss/camss-vfe-170.c > +++ b/drivers/media/platform/qcom/camss/camss-vfe-170.c > @@ -756,8 +756,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) > { > vfe->isr_ops = vfe_isr_ops_170; > vfe->video_ops = vfe_video_ops_170; > - > - vfe->line_num = VFE_LINE_NUM_GEN2; > } > > const struct vfe_hw_ops vfe_ops_170 = { > diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-1.c b/drivers/media/platform/qcom/camss/camss-vfe-4-1.c > index bc309f326f519..2911e4126e7ad 100644 > --- a/drivers/media/platform/qcom/camss/camss-vfe-4-1.c > +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-1.c > @@ -992,8 +992,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) > vfe->isr_ops = vfe_isr_ops_gen1; > vfe->ops_gen1 = &vfe_ops_gen1_4_1; > vfe->video_ops = vfe_video_ops_gen1; > - > - vfe->line_num = VFE_LINE_NUM_GEN1; > } > > const struct vfe_hw_ops vfe_ops_4_1 = { > diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-7.c b/drivers/media/platform/qcom/camss/camss-vfe-4-7.c > index 8acd76c9746ba..b65ed0fef595e 100644 > --- a/drivers/media/platform/qcom/camss/camss-vfe-4-7.c > +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-7.c > @@ -1188,8 +1188,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) > vfe->isr_ops = vfe_isr_ops_gen1; > vfe->ops_gen1 = &vfe_ops_gen1_4_7; > vfe->video_ops = vfe_video_ops_gen1; > - > - vfe->line_num = VFE_LINE_NUM_GEN1; > } > > const struct vfe_hw_ops vfe_ops_4_7 = { > diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-8.c b/drivers/media/platform/qcom/camss/camss-vfe-4-8.c > index 3a0167ecf873a..7b3805177f037 100644 > --- a/drivers/media/platform/qcom/camss/camss-vfe-4-8.c > +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-8.c > @@ -1173,8 +1173,6 @@ static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) > vfe->isr_ops = vfe_isr_ops_gen1; > vfe->ops_gen1 = &vfe_ops_gen1_4_8; > vfe->video_ops = vfe_video_ops_gen1; > - > - vfe->line_num = VFE_LINE_NUM_GEN1; > } > > const struct vfe_hw_ops vfe_ops_4_8 = { > diff --git a/drivers/media/platform/qcom/camss/camss-vfe-480.c b/drivers/media/platform/qcom/camss/camss-vfe-480.c > index 80338efceb9e1..b1a07e846e25b 100644 > --- a/drivers/media/platform/qcom/camss/camss-vfe-480.c > +++ b/drivers/media/platform/qcom/camss/camss-vfe-480.c > @@ -572,7 +572,6 @@ static const struct camss_video_ops vfe_video_ops_480 = { > static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) > { > vfe->video_ops = vfe_video_ops_480; > - vfe->line_num = MAX_VFE_OUTPUT_LINES; > } > > const struct vfe_hw_ops vfe_ops_480 = { > diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c > index 526dd4ab343fe..b789b3b2e4cfd 100644 > --- a/drivers/media/platform/qcom/camss/camss-vfe.c > +++ b/drivers/media/platform/qcom/camss/camss-vfe.c > @@ -1305,6 +1305,11 @@ int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe, > default: > return -EINVAL; > } > + > + if (!res->line_num) > + return -EINVAL; > + > + vfe->line_num = res->line_num; > vfe->ops->subdev_init(dev, vfe); > > /* Memory */ > diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c > index c8a2571e664fe..ce0d86e45fe48 100644 > --- a/drivers/media/platform/qcom/camss/camss.c > +++ b/drivers/media/platform/qcom/camss/camss.c > @@ -123,7 +123,8 @@ static const struct resources vfe_res_8x16[] = { > { 0 }, > { 0 } }, > .reg = { "vfe0" }, > - .interrupt = { "vfe0" } > + .interrupt = { "vfe0" }, > + .line_num = VFE_LINE_NUM_GEN1, > } > }; > > @@ -263,7 +264,8 @@ static const struct resources vfe_res_8x96[] = { > { 0 }, > { 0 } }, > .reg = { "vfe0" }, > - .interrupt = { "vfe0" } > + .interrupt = { "vfe0" }, > + .line_num = VFE_LINE_NUM_GEN1, > }, > > /* VFE1 */ > @@ -281,7 +283,8 @@ static const struct resources vfe_res_8x96[] = { > { 0 }, > { 0 } }, > .reg = { "vfe1" }, > - .interrupt = { "vfe1" } > + .interrupt = { "vfe1" }, > + .line_num = VFE_LINE_NUM_GEN1, > } > }; > > @@ -442,7 +445,8 @@ static const struct resources vfe_res_660[] = { > { 0 }, > { 0 } }, > .reg = { "vfe0" }, > - .interrupt = { "vfe0" } > + .interrupt = { "vfe0" }, > + .line_num = VFE_LINE_NUM_GEN1, > }, > > /* VFE1 */ > @@ -463,7 +467,8 @@ static const struct resources vfe_res_660[] = { > { 0 }, > { 0 } }, > .reg = { "vfe1" }, > - .interrupt = { "vfe1" } > + .interrupt = { "vfe1" }, > + .line_num = VFE_LINE_NUM_GEN1, > } > }; > > @@ -621,7 +626,8 @@ static const struct resources vfe_res_845[] = { > { 19200000, 75000000, 384000000, 538666667 }, > { 384000000 } }, > .reg = { "vfe0" }, > - .interrupt = { "vfe0" } > + .interrupt = { "vfe0" }, > + .line_num = VFE_LINE_NUM_GEN2, > }, > > /* VFE1 */ > @@ -641,7 +647,8 @@ static const struct resources vfe_res_845[] = { > { 19200000, 75000000, 384000000, 538666667 }, > { 384000000 } }, > .reg = { "vfe1" }, > - .interrupt = { "vfe1" } > + .interrupt = { "vfe1" }, > + .line_num = VFE_LINE_NUM_GEN2, > }, > > /* VFE-lite */ > @@ -660,7 +667,8 @@ static const struct resources vfe_res_845[] = { > { 19200000, 75000000, 384000000, 538666667 }, > { 384000000 } }, > .reg = { "vfe_lite" }, > - .interrupt = { "vfe_lite" } > + .interrupt = { "vfe_lite" }, > + .line_num = VFE_LINE_NUM_GEN2, > } > }; > > @@ -787,7 +795,8 @@ static const struct resources vfe_res_8250[] = { > { 0 }, > { 0 } }, > .reg = { "vfe0" }, > - .interrupt = { "vfe0" } > + .interrupt = { "vfe0" }, > + .line_num = 4, > }, > /* VFE1 */ > { > @@ -805,7 +814,8 @@ static const struct resources vfe_res_8250[] = { > { 0 }, > { 0 } }, > .reg = { "vfe1" }, > - .interrupt = { "vfe1" } > + .interrupt = { "vfe1" }, > + .line_num = 4, > }, > /* VFE2 (lite) */ > { > @@ -822,7 +832,8 @@ static const struct resources vfe_res_8250[] = { > { 400000000, 480000000 }, > { 0 } }, > .reg = { "vfe_lite0" }, > - .interrupt = { "vfe_lite0" } > + .interrupt = { "vfe_lite0" }, > + .line_num = 4, > }, > /* VFE3 (lite) */ > { > @@ -839,7 +850,8 @@ static const struct resources vfe_res_8250[] = { > { 400000000, 480000000 }, > { 0 } }, > .reg = { "vfe_lite1" }, > - .interrupt = { "vfe_lite1" } > + .interrupt = { "vfe_lite1" }, > + .line_num = 4, > }, > }; > > diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/platform/qcom/camss/camss.h > index dd8c58d349685..101ce6e527931 100644 > --- a/drivers/media/platform/qcom/camss/camss.h > +++ b/drivers/media/platform/qcom/camss/camss.h > @@ -48,6 +48,7 @@ struct resources { > u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX]; > char *reg[CAMSS_RES_MAX]; > char *interrupt[CAMSS_RES_MAX]; > + u8 line_num; > }; > > struct icc_bw_tbl { -- Regards, Laurent Pinchart