Hi Laurent,

On 26/06/17 19:12, Laurent Pinchart wrote:
> The VSP2-DL instance (present in the H3 ES2.0 and M3-N SoCs) has two LIF
> instances. Adapt the driver infrastructure to support multiple LIFs.
> Support for multiple display pipelines will be added separately.
> 
> The change to the entity routing table removes the ability to connect
> the LIF output to the HGO or HGT histogram generators. This feature is
> only available on Gen2 hardware, isn't supported by the rest of the
> driver, and has no known use case, so this isn't an issue.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
This looks good.

Reviewed-by: Kieran Bingham <kieran.bingham+rene...@ideasonboard.com>

> ---
>  drivers/media/platform/vsp1/vsp1.h        |  5 ++--
>  drivers/media/platform/vsp1/vsp1_drm.c    |  8 ++---
>  drivers/media/platform/vsp1/vsp1_drv.c    | 49 
> +++++++++++++++++++------------
>  drivers/media/platform/vsp1/vsp1_entity.c |  3 +-
>  drivers/media/platform/vsp1/vsp1_lif.c    |  5 ++--
>  drivers/media/platform/vsp1/vsp1_lif.h    |  2 +-
>  drivers/media/platform/vsp1/vsp1_regs.h   |  4 ++-
>  7 files changed, 46 insertions(+), 30 deletions(-)
> 
> diff --git a/drivers/media/platform/vsp1/vsp1.h 
> b/drivers/media/platform/vsp1/vsp1.h
> index 73858a0ed35c..78ef838416b3 100644
> --- a/drivers/media/platform/vsp1/vsp1.h
> +++ b/drivers/media/platform/vsp1/vsp1.h
> @@ -41,11 +41,11 @@ struct vsp1_rwpf;
>  struct vsp1_sru;
>  struct vsp1_uds;
>  
> +#define VSP1_MAX_LIF         2
>  #define VSP1_MAX_RPF         5
>  #define VSP1_MAX_UDS         3
>  #define VSP1_MAX_WPF         4
>  
> -#define VSP1_HAS_LIF         (1 << 0)

I guess I can re-use this 'bit' for the Writeback prototype which used to be
BIT(9) (which is now the BRS)


>  #define VSP1_HAS_LUT         (1 << 1)
>  #define VSP1_HAS_SRU         (1 << 2)
>  #define VSP1_HAS_BRU         (1 << 3)
> @@ -61,6 +61,7 @@ struct vsp1_device_info {
>       const char *model;
>       unsigned int gen;
>       unsigned int features;
> +     unsigned int lif_count;
>       unsigned int rpf_count;
>       unsigned int uds_count;
>       unsigned int wpf_count;
> @@ -84,7 +85,7 @@ struct vsp1_device {
>       struct vsp1_hgt *hgt;
>       struct vsp1_hsit *hsi;
>       struct vsp1_hsit *hst;
> -     struct vsp1_lif *lif;
> +     struct vsp1_lif *lif[VSP1_MAX_LIF];
>       struct vsp1_lut *lut;
>       struct vsp1_rwpf *rpf[VSP1_MAX_RPF];
>       struct vsp1_sru *sru;
> diff --git a/drivers/media/platform/vsp1/vsp1_drm.c 
> b/drivers/media/platform/vsp1/vsp1_drm.c
> index daaafe7885fa..4e1b893e8f51 100644
> --- a/drivers/media/platform/vsp1/vsp1_drm.c
> +++ b/drivers/media/platform/vsp1/vsp1_drm.c
> @@ -181,7 +181,7 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int 
> pipe_index,
>               format.format.code);
>  
>       format.pad = LIF_PAD_SINK;
> -     ret = v4l2_subdev_call(&vsp1->lif->entity.subdev, pad, set_fmt, NULL,
> +     ret = v4l2_subdev_call(&vsp1->lif[0]->entity.subdev, pad, set_fmt, NULL,
>                              &format);
>       if (ret < 0)
>               return ret;
> @@ -599,15 +599,15 @@ int vsp1_drm_init(struct vsp1_device *vsp1)
>  
>       vsp1->bru->entity.sink = &vsp1->wpf[0]->entity;
>       vsp1->bru->entity.sink_pad = 0;
> -     vsp1->wpf[0]->entity.sink = &vsp1->lif->entity;
> +     vsp1->wpf[0]->entity.sink = &vsp1->lif[0]->entity;
>       vsp1->wpf[0]->entity.sink_pad = 0;
>  
>       list_add_tail(&vsp1->bru->entity.list_pipe, &pipe->entities);
>       list_add_tail(&vsp1->wpf[0]->entity.list_pipe, &pipe->entities);
> -     list_add_tail(&vsp1->lif->entity.list_pipe, &pipe->entities);
> +     list_add_tail(&vsp1->lif[0]->entity.list_pipe, &pipe->entities);
>  
>       pipe->bru = &vsp1->bru->entity;
> -     pipe->lif = &vsp1->lif->entity;
> +     pipe->lif = &vsp1->lif[0]->entity;
>       pipe->output = vsp1->wpf[0];
>       pipe->output->pipe = pipe;
>       pipe->frame_end = vsp1_du_pipeline_frame_end;
> diff --git a/drivers/media/platform/vsp1/vsp1_drv.c 
> b/drivers/media/platform/vsp1/vsp1_drv.c
> index c4f2ac61f7d2..e875982f02ae 100644
> --- a/drivers/media/platform/vsp1/vsp1_drv.c
> +++ b/drivers/media/platform/vsp1/vsp1_drv.c
> @@ -168,10 +168,13 @@ static int vsp1_uapi_create_links(struct vsp1_device 
> *vsp1)
>                       return ret;
>       }
>  
> -     if (vsp1->lif) {
> -             ret = media_create_pad_link(&vsp1->wpf[0]->entity.subdev.entity,
> +     for (i = 0; i < vsp1->info->lif_count; ++i) {
> +             if (!vsp1->lif[i])
> +                     continue;
> +
> +             ret = media_create_pad_link(&vsp1->wpf[i]->entity.subdev.entity,
>                                           RWPF_PAD_SOURCE,
> -                                         &vsp1->lif->entity.subdev.entity,
> +                                         &vsp1->lif[i]->entity.subdev.entity,
>                                           LIF_PAD_SINK, 0);
>               if (ret < 0)
>                       return ret;
> @@ -334,18 +337,23 @@ static int vsp1_create_entities(struct vsp1_device 
> *vsp1)
>       }
>  
>       /*
> -      * The LIF is only supported when used in conjunction with the DU, in
> +      * The LIFs are only supported when used in conjunction with the DU, in
>        * which case the userspace API is disabled. If the userspace API is
> -      * enabled skip the LIF, even when present.
> +      * enabled skip the LIFs, even when present.
>        */
> -     if (vsp1->info->features & VSP1_HAS_LIF && !vsp1->info->uapi) {
> -             vsp1->lif = vsp1_lif_create(vsp1);
> -             if (IS_ERR(vsp1->lif)) {
> -                     ret = PTR_ERR(vsp1->lif);
> -                     goto done;
> -             }
> +     if (!vsp1->info->uapi) {
> +             for (i = 0; i < vsp1->info->lif_count; ++i) {
> +                     struct vsp1_lif *lif;
> +
> +                     lif = vsp1_lif_create(vsp1, i);
> +                     if (IS_ERR(lif)) {
> +                             ret = PTR_ERR(lif);
> +                             goto done;
> +                     }
>  
> -             list_add_tail(&vsp1->lif->entity.list_dev, &vsp1->entities);
> +                     vsp1->lif[i] = lif;
> +                     list_add_tail(&lif->entity.list_dev, &vsp1->entities);
> +             }
>       }
>  
>       if (vsp1->info->features & VSP1_HAS_LUT) {
> @@ -638,8 +646,8 @@ static const struct vsp1_device_info vsp1_device_infos[] 
> = {
>               .version = VI6_IP_VERSION_MODEL_VSPD_GEN2,
>               .model = "VSP1-D",
>               .gen = 2,
> -             .features = VSP1_HAS_BRU | VSP1_HAS_HGO | VSP1_HAS_LIF
> -                       | VSP1_HAS_LUT,
> +             .features = VSP1_HAS_BRU | VSP1_HAS_HGO | VSP1_HAS_LUT,
> +             .lif_count = 1,
>               .rpf_count = 4,
>               .uds_count = 1,
>               .wpf_count = 1,
> @@ -672,8 +680,8 @@ static const struct vsp1_device_info vsp1_device_infos[] 
> = {
>               .version = VI6_IP_VERSION_MODEL_VSPD_V2H,
>               .model = "VSP1V-D",
>               .gen = 2,
> -             .features = VSP1_HAS_BRU | VSP1_HAS_CLU | VSP1_HAS_LUT
> -                       | VSP1_HAS_LIF,
> +             .features = VSP1_HAS_BRU | VSP1_HAS_CLU | VSP1_HAS_LUT,
> +             .lif_count = 1,
>               .rpf_count = 4,
>               .uds_count = 1,
>               .wpf_count = 1,
> @@ -721,7 +729,8 @@ static const struct vsp1_device_info vsp1_device_infos[] 
> = {
>               .version = VI6_IP_VERSION_MODEL_VSPD_GEN3,
>               .model = "VSP2-D",
>               .gen = 3,
> -             .features = VSP1_HAS_BRU | VSP1_HAS_LIF | VSP1_HAS_WPF_VFLIP,
> +             .features = VSP1_HAS_BRU | VSP1_HAS_WPF_VFLIP,
> +             .lif_count = 1,
>               .rpf_count = 5,
>               .wpf_count = 2,
>               .num_bru_inputs = 5,
> @@ -729,7 +738,8 @@ static const struct vsp1_device_info vsp1_device_infos[] 
> = {
>               .version = VI6_IP_VERSION_MODEL_VSPD_V3,
>               .model = "VSP2-D",
>               .gen = 3,
> -             .features = VSP1_HAS_BRS | VSP1_HAS_BRU | VSP1_HAS_LIF,
> +             .features = VSP1_HAS_BRS | VSP1_HAS_BRU,
> +             .lif_count = 1,
>               .rpf_count = 5,
>               .wpf_count = 1,
>               .num_bru_inputs = 5,
> @@ -737,7 +747,8 @@ static const struct vsp1_device_info vsp1_device_infos[] 
> = {
>               .version = VI6_IP_VERSION_MODEL_VSPDL_GEN3,
>               .model = "VSP2-DL",
>               .gen = 3,
> -             .features = VSP1_HAS_BRS | VSP1_HAS_BRU | VSP1_HAS_LIF,
> +             .features = VSP1_HAS_BRS | VSP1_HAS_BRU,
> +             .lif_count = 2,
>               .rpf_count = 5,
>               .wpf_count = 2,
>               .num_bru_inputs = 5,
> diff --git a/drivers/media/platform/vsp1/vsp1_entity.c 
> b/drivers/media/platform/vsp1/vsp1_entity.c
> index c06f7db093db..54de15095709 100644
> --- a/drivers/media/platform/vsp1/vsp1_entity.c
> +++ b/drivers/media/platform/vsp1/vsp1_entity.c
> @@ -468,7 +468,8 @@ static const struct vsp1_route vsp1_routes[] = {
>       { VSP1_ENTITY_HGT, 0, 0, { 0, }, 0 },
>       VSP1_ENTITY_ROUTE(HSI),
>       VSP1_ENTITY_ROUTE(HST),
> -     { VSP1_ENTITY_LIF, 0, 0, { VI6_DPR_NODE_LIF, }, VI6_DPR_NODE_LIF },
> +     { VSP1_ENTITY_LIF, 0, 0, { 0, }, 0 },
> +     { VSP1_ENTITY_LIF, 1, 0, { 0, }, 0 },
>       VSP1_ENTITY_ROUTE(LUT),
>       VSP1_ENTITY_ROUTE_RPF(0),
>       VSP1_ENTITY_ROUTE_RPF(1),
> diff --git a/drivers/media/platform/vsp1/vsp1_lif.c 
> b/drivers/media/platform/vsp1/vsp1_lif.c
> index 702487f895b3..e6fa16d7fda8 100644
> --- a/drivers/media/platform/vsp1/vsp1_lif.c
> +++ b/drivers/media/platform/vsp1/vsp1_lif.c
> @@ -30,7 +30,7 @@
>  static inline void vsp1_lif_write(struct vsp1_lif *lif, struct vsp1_dl_list 
> *dl,
>                                 u32 reg, u32 data)
>  {
> -     vsp1_dl_list_write(dl, reg, data);
> +     vsp1_dl_list_write(dl, reg + lif->entity.index * VI6_LIF_OFFSET, data);
>  }
>  
>  /* 
> -----------------------------------------------------------------------------
> @@ -165,7 +165,7 @@ static const struct vsp1_entity_operations lif_entity_ops 
> = {
>   * Initialization and Cleanup
>   */
>  
> -struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1)
> +struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1, unsigned int 
> index)
>  {
>       struct vsp1_lif *lif;
>       int ret;
> @@ -176,6 +176,7 @@ struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1)
>  
>       lif->entity.ops = &lif_entity_ops;
>       lif->entity.type = VSP1_ENTITY_LIF;
> +     lif->entity.index = index;
>  
>       /*
>        * The LIF is never exposed to userspace, but media entity registration
> diff --git a/drivers/media/platform/vsp1/vsp1_lif.h 
> b/drivers/media/platform/vsp1/vsp1_lif.h
> index 7b35879028de..3417339379b1 100644
> --- a/drivers/media/platform/vsp1/vsp1_lif.h
> +++ b/drivers/media/platform/vsp1/vsp1_lif.h
> @@ -32,6 +32,6 @@ static inline struct vsp1_lif *to_lif(struct v4l2_subdev 
> *subdev)
>       return container_of(subdev, struct vsp1_lif, entity.subdev);
>  }
>  
> -struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1);
> +struct vsp1_lif *vsp1_lif_create(struct vsp1_device *vsp1, unsigned int 
> index);
>  
>  #endif /* __VSP1_LIF_H__ */
> diff --git a/drivers/media/platform/vsp1/vsp1_regs.h 
> b/drivers/media/platform/vsp1/vsp1_regs.h
> index ab439a60a100..007e2bbc26c0 100644
> --- a/drivers/media/platform/vsp1/vsp1_regs.h
> +++ b/drivers/media/platform/vsp1/vsp1_regs.h
> @@ -351,7 +351,7 @@
>  #define VI6_DPR_NODE_HST             30
>  #define VI6_DPR_NODE_HSI             31
>  #define VI6_DPR_NODE_BRS_IN(n)               (38 + (n))
> -#define VI6_DPR_NODE_LIF             55
> +#define VI6_DPR_NODE_LIF             55              /* Gen2 only */
>  #define VI6_DPR_NODE_WPF(n)          (56 + (n))
>  #define VI6_DPR_NODE_UNUSED          63
>  
> @@ -663,6 +663,8 @@
>   * LIF Control Registers
>   */
>  
> +#define VI6_LIF_OFFSET                       (-0x100)
> +

Reverse order offsets ... lovely ...

>  #define VI6_LIF_CTRL                 0x3b00
>  #define VI6_LIF_CTRL_OBTH_MASK               (0x7ff << 16)
>  #define VI6_LIF_CTRL_OBTH_SHIFT              16
> 

Reply via email to