]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: renesas: vsp1: Pass subdev state to entity operations
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Sun, 12 Nov 2023 02:14:05 +0000 (04:14 +0200)
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Wed, 19 Jun 2024 22:36:48 +0000 (01:36 +0300)
To prepare for the removal of the vsp1_entity.state field, pass the
state to all entity operations that needs to access it, instead of
accessing the state from the entity inside the operation handlers. This
lowers the number of accesses to the field.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
17 files changed:
drivers/media/platform/renesas/vsp1/vsp1_brx.c
drivers/media/platform/renesas/vsp1/vsp1_clu.c
drivers/media/platform/renesas/vsp1/vsp1_drm.c
drivers/media/platform/renesas/vsp1/vsp1_entity.c
drivers/media/platform/renesas/vsp1/vsp1_entity.h
drivers/media/platform/renesas/vsp1/vsp1_hgo.c
drivers/media/platform/renesas/vsp1/vsp1_hgt.c
drivers/media/platform/renesas/vsp1/vsp1_hsit.c
drivers/media/platform/renesas/vsp1/vsp1_lif.c
drivers/media/platform/renesas/vsp1/vsp1_lut.c
drivers/media/platform/renesas/vsp1/vsp1_pipe.c
drivers/media/platform/renesas/vsp1/vsp1_rpf.c
drivers/media/platform/renesas/vsp1/vsp1_sru.c
drivers/media/platform/renesas/vsp1/vsp1_uds.c
drivers/media/platform/renesas/vsp1/vsp1_uif.c
drivers/media/platform/renesas/vsp1/vsp1_video.c
drivers/media/platform/renesas/vsp1/vsp1_wpf.c

index 05940d0427bf0d89cbff5fd4b20c3a8e337f4678..5dee0490c593b54bee5c7a602a1a46e1ae89b63f 100644 (file)
@@ -272,6 +272,7 @@ static const struct v4l2_subdev_ops brx_ops = {
  */
 
 static void brx_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -281,8 +282,7 @@ static void brx_configure_stream(struct vsp1_entity *entity,
        unsigned int flags;
        unsigned int i;
 
-       format = v4l2_subdev_state_get_format(brx->entity.state,
-                                             brx->entity.source_pad);
+       format = v4l2_subdev_state_get_format(state, brx->entity.source_pad);
 
        /*
         * The hardware is extremely flexible but we have no userspace API to
index 1e57676a420c581d3c7bd085604a1e56e342f85e..98645bd2a983387ae7f37b25cc625bf4266ac681 100644 (file)
@@ -170,6 +170,7 @@ static const struct v4l2_subdev_ops clu_ops = {
  */
 
 static void clu_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -181,7 +182,7 @@ static void clu_configure_stream(struct vsp1_entity *entity,
         * The yuv_mode can't be changed during streaming. Cache it internally
         * for future runtime configuration calls.
         */
-       format = v4l2_subdev_state_get_format(clu->entity.state, CLU_PAD_SINK);
+       format = v4l2_subdev_state_get_format(state, CLU_PAD_SINK);
        clu->yuv_mode = format->code == MEDIA_BUS_FMT_AYUV8_1X32;
 }
 
index 11313e26a298e1c6aa7a4b9f8ad6a674893cf9a6..b5d1f238f7beeab0615aa7fb815cdd61e79616b6 100644 (file)
@@ -574,7 +574,8 @@ static void vsp1_du_pipeline_configure(struct vsp1_pipeline *pipe)
                }
 
                vsp1_entity_route_setup(entity, pipe, dlb);
-               vsp1_entity_configure_stream(entity, pipe, dl, dlb);
+               vsp1_entity_configure_stream(entity, entity->state, pipe,
+                                            dl, dlb);
                vsp1_entity_configure_frame(entity, pipe, dl, dlb);
                vsp1_entity_configure_partition(entity, pipe,
                                                &pipe->part_table[0], dl, dlb);
index e9de75de8bde0662d9add215dc3ad85a6e9667c3..8b8945bd8f108354f1b484530bc496dbac7d3d88 100644 (file)
@@ -70,12 +70,13 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
 }
 
 void vsp1_entity_configure_stream(struct vsp1_entity *entity,
+                                 struct v4l2_subdev_state *state,
                                  struct vsp1_pipeline *pipe,
                                  struct vsp1_dl_list *dl,
                                  struct vsp1_dl_body *dlb)
 {
        if (entity->ops->configure_stream)
-               entity->ops->configure_stream(entity, pipe, dl, dlb);
+               entity->ops->configure_stream(entity, state, pipe, dl, dlb);
 }
 
 void vsp1_entity_configure_frame(struct vsp1_entity *entity,
index 42000d6e25308914d18aa9508c5b8f4d2ffc8c26..1bcc9e27dfdc7385e91987c84c46fc3725f3b90e 100644 (file)
@@ -79,6 +79,7 @@ struct vsp1_route {
 struct vsp1_entity_operations {
        void (*destroy)(struct vsp1_entity *entity);
        void (*configure_stream)(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb);
@@ -92,8 +93,10 @@ struct vsp1_entity_operations {
                                    struct vsp1_dl_list *dl,
                                    struct vsp1_dl_body *dlb);
        unsigned int (*max_width)(struct vsp1_entity *entity,
+                                 struct v4l2_subdev_state *state,
                                  struct vsp1_pipeline *pipe);
        void (*partition)(struct vsp1_entity *entity,
+                         struct v4l2_subdev_state *state,
                          struct vsp1_pipeline *pipe,
                          struct vsp1_partition *partition,
                          unsigned int index,
@@ -151,6 +154,7 @@ void vsp1_entity_route_setup(struct vsp1_entity *entity,
                             struct vsp1_dl_body *dlb);
 
 void vsp1_entity_configure_stream(struct vsp1_entity *entity,
+                                 struct v4l2_subdev_state *state,
                                  struct vsp1_pipeline *pipe,
                                  struct vsp1_dl_list *dl,
                                  struct vsp1_dl_body *dlb);
index 4ee5f0e5e9c343ae466ca31e86d468721f3b3c18..0ea87014a701d6c288b19ff3d0de419cf782588a 100644 (file)
@@ -130,6 +130,7 @@ static const struct v4l2_ctrl_config hgo_num_bins_control = {
  */
 
 static void hgo_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -140,8 +141,8 @@ static void hgo_configure_stream(struct vsp1_entity *entity,
        unsigned int hratio;
        unsigned int vratio;
 
-       crop = v4l2_subdev_state_get_crop(entity->state, HISTO_PAD_SINK);
-       compose = v4l2_subdev_state_get_compose(entity->state, HISTO_PAD_SINK);
+       crop = v4l2_subdev_state_get_crop(state, HISTO_PAD_SINK);
+       compose = v4l2_subdev_state_get_compose(state, HISTO_PAD_SINK);
 
        vsp1_hgo_write(hgo, dlb, VI6_HGO_REGRST, VI6_HGO_REGRST_RCLEA);
 
index b739d80455760e4b5eec850caafeb9bd61b3221b..496354c8df0eb28179b4da04135c211d1fc52572 100644 (file)
@@ -126,6 +126,7 @@ static const struct v4l2_ctrl_config hgt_hue_areas = {
  */
 
 static void hgt_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -139,8 +140,8 @@ static void hgt_configure_stream(struct vsp1_entity *entity,
        u8 upper;
        unsigned int i;
 
-       crop = v4l2_subdev_state_get_crop(entity->state, HISTO_PAD_SINK);
-       compose = v4l2_subdev_state_get_compose(entity->state, HISTO_PAD_SINK);
+       crop = v4l2_subdev_state_get_crop(state, HISTO_PAD_SINK);
+       compose = v4l2_subdev_state_get_compose(state, HISTO_PAD_SINK);
 
        vsp1_hgt_write(hgt, dlb, VI6_HGT_REGRST, VI6_HGT_REGRST_RCLEA);
 
index 4a8cce808c93ecec789c9c57a3428ea386c295a4..8ba2a7c7305c76499557bdc91e2d1606e700cbcc 100644 (file)
@@ -127,6 +127,7 @@ static const struct v4l2_subdev_ops hsit_ops = {
  */
 
 static void hsit_configure_stream(struct vsp1_entity *entity,
+                                 struct v4l2_subdev_state *state,
                                  struct vsp1_pipeline *pipe,
                                  struct vsp1_dl_list *dl,
                                  struct vsp1_dl_body *dlb)
index 29d4c1521e6a5cc924965cff2a64243bf4be29e5..b3d83d1c5306a9b2880af6b973fa4ebeee086167 100644 (file)
@@ -83,6 +83,7 @@ static const struct v4l2_subdev_ops lif_ops = {
  */
 
 static void lif_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -93,8 +94,7 @@ static void lif_configure_stream(struct vsp1_entity *entity,
        unsigned int obth;
        unsigned int lbth;
 
-       format = v4l2_subdev_state_get_format(lif->entity.state,
-                                             LIF_PAD_SOURCE);
+       format = v4l2_subdev_state_get_format(state, LIF_PAD_SOURCE);
 
        switch (entity->vsp1->version & VI6_IP_VERSION_MODEL_MASK) {
        case VI6_IP_VERSION_MODEL_VSPD_GEN2:
index 451d24ab0b56fb30c28b82ecdca1e86dc819f919..dd264e6532e043abcafcfc2aae267f75685f0826 100644 (file)
@@ -146,6 +146,7 @@ static const struct v4l2_subdev_ops lut_ops = {
  */
 
 static void lut_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
index 87cb62cf38fa6119d8b83b9815f16a221ff27183..bb0739f684f39e23326a4d8fdb9f43e020bc23c8 100644 (file)
@@ -487,8 +487,8 @@ static void vsp1_pipeline_propagate_partition(struct vsp1_pipeline *pipe,
 
        list_for_each_entry_reverse(entity, &pipe->entities, list_pipe) {
                if (entity->ops->partition)
-                       entity->ops->partition(entity, pipe, partition, index,
-                                              window);
+                       entity->ops->partition(entity, entity->state, pipe,
+                                              partition, index, window);
        }
 }
 
index b4558670b46fdd9a8738e8b3c2ca104a26e7433b..5c8b3ba1bd3c2c7b9289f05c9c2578e9717c23ff 100644 (file)
@@ -48,6 +48,7 @@ static inline void vsp1_rpf_write(struct vsp1_rwpf *rpf,
  */
 
 static void rpf_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -80,10 +81,8 @@ static void rpf_configure_stream(struct vsp1_entity *entity,
        vsp1_rpf_write(rpf, dlb, VI6_RPF_SRCM_PSTRIDE, pstride);
 
        /* Format */
-       sink_format = v4l2_subdev_state_get_format(rpf->entity.state,
-                                                  RWPF_PAD_SINK);
-       source_format = v4l2_subdev_state_get_format(rpf->entity.state,
-                                                    RWPF_PAD_SOURCE);
+       sink_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SINK);
+       source_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SOURCE);
 
        infmt = VI6_RPF_INFMT_CIPM
              | (fmtinfo->hwfmt << VI6_RPF_INFMT_RDFMT_SHIFT);
@@ -347,6 +346,7 @@ static void rpf_configure_partition(struct vsp1_entity *entity,
 }
 
 static void rpf_partition(struct vsp1_entity *entity,
+                         struct v4l2_subdev_state *state,
                          struct vsp1_pipeline *pipe,
                          struct vsp1_partition *partition,
                          unsigned int partition_idx,
@@ -364,7 +364,7 @@ static void rpf_partition(struct vsp1_entity *entity,
         * our crop to provide a 'sub-crop' matching the expected partition
         * window.
         */
-       *rpf_rect = *v4l2_subdev_state_get_crop(entity->state, RWPF_PAD_SINK);
+       *rpf_rect = *v4l2_subdev_state_get_crop(state, RWPF_PAD_SINK);
 
        if (pipe->partitions > 1) {
                rpf_rect->width = window->width;
index 8ce949de8d9aa022675531373ab4b767c20fac72..1759ce642e6e02e46c59f61751e208696cb493b1 100644 (file)
@@ -265,6 +265,7 @@ static const struct v4l2_subdev_ops sru_ops = {
  */
 
 static void sru_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -275,9 +276,8 @@ static void sru_configure_stream(struct vsp1_entity *entity,
        struct v4l2_mbus_framefmt *output;
        u32 ctrl0;
 
-       input = v4l2_subdev_state_get_format(sru->entity.state, SRU_PAD_SINK);
-       output = v4l2_subdev_state_get_format(sru->entity.state,
-                                             SRU_PAD_SOURCE);
+       input = v4l2_subdev_state_get_format(state, SRU_PAD_SINK);
+       output = v4l2_subdev_state_get_format(state, SRU_PAD_SOURCE);
 
        if (input->code == MEDIA_BUS_FMT_ARGB8888_1X32)
                ctrl0 = VI6_SRU_CTRL0_PARAM2 | VI6_SRU_CTRL0_PARAM3
@@ -298,15 +298,14 @@ static void sru_configure_stream(struct vsp1_entity *entity,
 }
 
 static unsigned int sru_max_width(struct vsp1_entity *entity,
+                                 struct v4l2_subdev_state *state,
                                  struct vsp1_pipeline *pipe)
 {
-       struct vsp1_sru *sru = to_sru(&entity->subdev);
        struct v4l2_mbus_framefmt *input;
        struct v4l2_mbus_framefmt *output;
 
-       input = v4l2_subdev_state_get_format(sru->entity.state, SRU_PAD_SINK);
-       output = v4l2_subdev_state_get_format(sru->entity.state,
-                                             SRU_PAD_SOURCE);
+       input = v4l2_subdev_state_get_format(state, SRU_PAD_SINK);
+       output = v4l2_subdev_state_get_format(state, SRU_PAD_SOURCE);
 
        /*
         * The maximum input width of the SRU is 288 input pixels, but 32
@@ -320,18 +319,17 @@ static unsigned int sru_max_width(struct vsp1_entity *entity,
 }
 
 static void sru_partition(struct vsp1_entity *entity,
+                         struct v4l2_subdev_state *state,
                          struct vsp1_pipeline *pipe,
                          struct vsp1_partition *partition,
                          unsigned int partition_idx,
                          struct v4l2_rect *window)
 {
-       struct vsp1_sru *sru = to_sru(&entity->subdev);
        struct v4l2_mbus_framefmt *input;
        struct v4l2_mbus_framefmt *output;
 
-       input = v4l2_subdev_state_get_format(sru->entity.state, SRU_PAD_SINK);
-       output = v4l2_subdev_state_get_format(sru->entity.state,
-                                             SRU_PAD_SOURCE);
+       input = v4l2_subdev_state_get_format(state, SRU_PAD_SINK);
+       output = v4l2_subdev_state_get_format(state, SRU_PAD_SOURCE);
 
        /* Adapt if SRUx2 is enabled. */
        if (input->width != output->width) {
index e5953d86c17c1354af2705ee1da9bf2b26c9cf68..c5a38478cf8c0959957e73daf638f46a5f94a761 100644 (file)
@@ -252,6 +252,7 @@ static const struct v4l2_subdev_ops uds_ops = {
  */
 
 static void uds_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -263,9 +264,8 @@ static void uds_configure_stream(struct vsp1_entity *entity,
        unsigned int vscale;
        bool multitap;
 
-       input = v4l2_subdev_state_get_format(uds->entity.state, UDS_PAD_SINK);
-       output = v4l2_subdev_state_get_format(uds->entity.state,
-                                             UDS_PAD_SOURCE);
+       input = v4l2_subdev_state_get_format(state, UDS_PAD_SINK);
+       output = v4l2_subdev_state_get_format(state, UDS_PAD_SOURCE);
 
        hscale = uds_compute_ratio(input->width, output->width);
        vscale = uds_compute_ratio(input->height, output->height);
@@ -321,16 +321,15 @@ static void uds_configure_partition(struct vsp1_entity *entity,
 }
 
 static unsigned int uds_max_width(struct vsp1_entity *entity,
+                                 struct v4l2_subdev_state *state,
                                  struct vsp1_pipeline *pipe)
 {
-       struct vsp1_uds *uds = to_uds(&entity->subdev);
        const struct v4l2_mbus_framefmt *output;
        const struct v4l2_mbus_framefmt *input;
        unsigned int hscale;
 
-       input = v4l2_subdev_state_get_format(uds->entity.state, UDS_PAD_SINK);
-       output = v4l2_subdev_state_get_format(uds->entity.state,
-                                             UDS_PAD_SOURCE);
+       input = v4l2_subdev_state_get_format(state, UDS_PAD_SINK);
+       output = v4l2_subdev_state_get_format(state, UDS_PAD_SOURCE);
        hscale = output->width / input->width;
 
        /*
@@ -356,18 +355,17 @@ static unsigned int uds_max_width(struct vsp1_entity *entity,
  */
 
 static void uds_partition(struct vsp1_entity *entity,
+                         struct v4l2_subdev_state *state,
                          struct vsp1_pipeline *pipe,
                          struct vsp1_partition *partition,
                          unsigned int partition_idx,
                          struct v4l2_rect *window)
 {
-       struct vsp1_uds *uds = to_uds(&entity->subdev);
        const struct v4l2_mbus_framefmt *output;
        const struct v4l2_mbus_framefmt *input;
 
-       input = v4l2_subdev_state_get_format(uds->entity.state, UDS_PAD_SINK);
-       output = v4l2_subdev_state_get_format(uds->entity.state,
-                                             UDS_PAD_SOURCE);
+       input = v4l2_subdev_state_get_format(state, UDS_PAD_SINK);
+       output = v4l2_subdev_state_get_format(state, UDS_PAD_SOURCE);
 
        partition->uds_sink.width = window->width * input->width
                                  / output->width;
index cecd2f7024f40a4f40a76449d6ce97ed6090ad89..edaf28b544d25c08aefdfd9f6ce2eb8f665b1319 100644 (file)
@@ -188,6 +188,7 @@ static const struct v4l2_subdev_ops uif_ops = {
  */
 
 static void uif_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -200,7 +201,7 @@ static void uif_configure_stream(struct vsp1_entity *entity,
        vsp1_uif_write(uif, dlb, VI6_UIF_DISCOM_DOCMPMR,
                       VI6_UIF_DISCOM_DOCMPMR_SEL(9));
 
-       crop = v4l2_subdev_state_get_crop(entity->state, UIF_PAD_SINK);
+       crop = v4l2_subdev_state_get_crop(state, UIF_PAD_SINK);
 
        left = crop->left;
        width = crop->width;
index 64d3a69d65b2bae9c7cbbf95537c0b91a24b9e55..fdb46ec0c872a12e2f4e9f6a348e6c3437c25a4d 100644 (file)
@@ -699,7 +699,9 @@ static int vsp1_video_pipeline_setup_partitions(struct vsp1_pipeline *pipe)
                        if (!entity->ops->max_width)
                                continue;
 
-                       entity_max = entity->ops->max_width(entity, pipe);
+                       entity_max = entity->ops->max_width(entity,
+                                                           entity->state,
+                                                           pipe);
                        if (entity_max)
                                div_size = min(div_size, entity_max);
                }
@@ -760,7 +762,7 @@ static int vsp1_video_setup_pipeline(struct vsp1_pipeline *pipe)
 
        list_for_each_entry(entity, &pipe->entities, list_pipe) {
                vsp1_entity_route_setup(entity, pipe, pipe->stream_config);
-               vsp1_entity_configure_stream(entity, pipe, NULL,
+               vsp1_entity_configure_stream(entity, entity->state, pipe, NULL,
                                             pipe->stream_config);
        }
 
index 5c363ff1d36c633b002779d7bf43c0d31c9bd6c8..f176750ccd9847fdb8d51f7f51a6bd5092b70197 100644 (file)
@@ -229,6 +229,7 @@ static int wpf_configure_writeback_chain(struct vsp1_rwpf *wpf,
 }
 
 static void wpf_configure_stream(struct vsp1_entity *entity,
+                                struct v4l2_subdev_state *state,
                                 struct vsp1_pipeline *pipe,
                                 struct vsp1_dl_list *dl,
                                 struct vsp1_dl_body *dlb)
@@ -243,10 +244,8 @@ static void wpf_configure_stream(struct vsp1_entity *entity,
        u32 srcrpf = 0;
        int ret;
 
-       sink_format = v4l2_subdev_state_get_format(wpf->entity.state,
-                                                  RWPF_PAD_SINK);
-       source_format = v4l2_subdev_state_get_format(wpf->entity.state,
-                                                    RWPF_PAD_SOURCE);
+       sink_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SINK);
+       source_format = v4l2_subdev_state_get_format(state, RWPF_PAD_SOURCE);
 
        /* Format */
        if (!pipe->lif || wpf->writeback) {
@@ -496,6 +495,7 @@ static void wpf_configure_partition(struct vsp1_entity *entity,
 }
 
 static unsigned int wpf_max_width(struct vsp1_entity *entity,
+                                 struct v4l2_subdev_state *state,
                                  struct vsp1_pipeline *pipe)
 {
        struct vsp1_rwpf *wpf = to_rwpf(&entity->subdev);
@@ -504,6 +504,7 @@ static unsigned int wpf_max_width(struct vsp1_entity *entity,
 }
 
 static void wpf_partition(struct vsp1_entity *entity,
+                         struct v4l2_subdev_state *state,
                          struct vsp1_pipeline *pipe,
                          struct vsp1_partition *partition,
                          unsigned int partition_idx,