To prepare for addition of more flags to the display list, replace the
'internal' flag field by a bitmask 'flags' field.

Signed-off-by: Laurent Pinchart <laurent.pinchart+rene...@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham+rene...@ideasonboard.com>
---
Changes since v4:

- Fix check for the completed flag in vsp1_du_pipeline_frame_end()
---
 drivers/media/platform/vsp1/vsp1_dl.c    | 31 +++++++++++++-----------
 drivers/media/platform/vsp1/vsp1_dl.h    |  2 +-
 drivers/media/platform/vsp1/vsp1_drm.c   |  8 ++++--
 drivers/media/platform/vsp1/vsp1_video.c |  2 +-
 4 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/drivers/media/platform/vsp1/vsp1_dl.c 
b/drivers/media/platform/vsp1/vsp1_dl.c
index 64af449791b0..886b3a69d329 100644
--- a/drivers/media/platform/vsp1/vsp1_dl.c
+++ b/drivers/media/platform/vsp1/vsp1_dl.c
@@ -178,7 +178,7 @@ struct vsp1_dl_cmd_pool {
  * @post_cmd: post command to be issued through extended dl header
  * @has_chain: if true, indicates that there's a partition chain
  * @chain: entry in the display list partition chain
- * @internal: whether the display list is used for internal purpose
+ * @flags: display list flags, a combination of VSP1_DL_FRAME_END_*
  */
 struct vsp1_dl_list {
        struct list_head list;
@@ -197,7 +197,7 @@ struct vsp1_dl_list {
        bool has_chain;
        struct list_head chain;
 
-       bool internal;
+       unsigned int flags;
 };
 
 /**
@@ -861,13 +861,15 @@ static void vsp1_dl_list_commit_continuous(struct 
vsp1_dl_list *dl)
         *
         * If a display list is already pending we simply drop it as the new
         * display list is assumed to contain a more recent configuration. It is
-        * an error if the already pending list has the internal flag set, as
-        * there is then a process waiting for that list to complete. This
-        * shouldn't happen as the waiting process should perform proper
-        * locking, but warn just in case.
+        * an error if the already pending list has the
+        * VSP1_DL_FRAME_END_INTERNAL flag set, as there is then a process
+        * waiting for that list to complete. This shouldn't happen as the
+        * waiting process should perform proper locking, but warn just in
+        * case.
         */
        if (vsp1_dl_list_hw_update_pending(dlm)) {
-               WARN_ON(dlm->pending && dlm->pending->internal);
+               WARN_ON(dlm->pending &&
+                       (dlm->pending->flags & VSP1_DL_FRAME_END_INTERNAL));
                __vsp1_dl_list_put(dlm->pending);
                dlm->pending = dl;
                return;
@@ -897,7 +899,7 @@ static void vsp1_dl_list_commit_singleshot(struct 
vsp1_dl_list *dl)
        dlm->active = dl;
 }
 
-void vsp1_dl_list_commit(struct vsp1_dl_list *dl, bool internal)
+void vsp1_dl_list_commit(struct vsp1_dl_list *dl, unsigned int dl_flags)
 {
        struct vsp1_dl_manager *dlm = dl->dlm;
        struct vsp1_dl_list *dl_next;
@@ -912,7 +914,7 @@ void vsp1_dl_list_commit(struct vsp1_dl_list *dl, bool 
internal)
                vsp1_dl_list_fill_header(dl_next, last);
        }
 
-       dl->internal = internal;
+       dl->flags = dl_flags & ~VSP1_DL_FRAME_END_COMPLETED;
 
        spin_lock_irqsave(&dlm->lock, flags);
 
@@ -941,9 +943,10 @@ void vsp1_dl_list_commit(struct vsp1_dl_list *dl, bool 
internal)
  * set in single-shot mode as display list processing is then not continuous 
and
  * races never occur.
  *
- * The VSP1_DL_FRAME_END_INTERNAL flag indicates that the previous display list
- * has completed and had been queued with the internal notification flag.
- * Internal notification is only supported for continuous mode.
+ * The following flags are only supported for continuous mode.
+ *
+ * The VSP1_DL_FRAME_END_INTERNAL flag indicates that the display list that 
just
+ * became active had been queued with the internal notification flag.
  */
 unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager *dlm)
 {
@@ -986,9 +989,9 @@ unsigned int vsp1_dlm_irq_frame_end(struct vsp1_dl_manager 
*dlm)
         * frame end interrupt. The display list thus becomes active.
         */
        if (dlm->queued) {
-               if (dlm->queued->internal)
+               if (dlm->queued->flags & VSP1_DL_FRAME_END_INTERNAL)
                        flags |= VSP1_DL_FRAME_END_INTERNAL;
-               dlm->queued->internal = false;
+               dlm->queued->flags &= ~VSP1_DL_FRAME_END_INTERNAL;
 
                __vsp1_dl_list_put(dlm->active);
                dlm->active = dlm->queued;
diff --git a/drivers/media/platform/vsp1/vsp1_dl.h 
b/drivers/media/platform/vsp1/vsp1_dl.h
index 125750dc8b5c..e0fdb145e6ed 100644
--- a/drivers/media/platform/vsp1/vsp1_dl.h
+++ b/drivers/media/platform/vsp1/vsp1_dl.h
@@ -61,7 +61,7 @@ struct vsp1_dl_list *vsp1_dl_list_get(struct vsp1_dl_manager 
*dlm);
 void vsp1_dl_list_put(struct vsp1_dl_list *dl);
 struct vsp1_dl_body *vsp1_dl_list_get_body0(struct vsp1_dl_list *dl);
 struct vsp1_dl_ext_cmd *vsp1_dl_get_pre_cmd(struct vsp1_dl_list *dl);
-void vsp1_dl_list_commit(struct vsp1_dl_list *dl, bool internal);
+void vsp1_dl_list_commit(struct vsp1_dl_list *dl, unsigned int dl_flags);
 
 struct vsp1_dl_body_pool *
 vsp1_dl_body_pool_create(struct vsp1_device *vsp1, unsigned int num_bodies,
diff --git a/drivers/media/platform/vsp1/vsp1_drm.c 
b/drivers/media/platform/vsp1/vsp1_drm.c
index f5e810ca1f13..e8f83d4b7a39 100644
--- a/drivers/media/platform/vsp1/vsp1_drm.c
+++ b/drivers/media/platform/vsp1/vsp1_drm.c
@@ -34,7 +34,7 @@ static void vsp1_du_pipeline_frame_end(struct vsp1_pipeline 
*pipe,
                                       unsigned int completion)
 {
        struct vsp1_drm_pipeline *drm_pipe = to_vsp1_drm_pipeline(pipe);
-       bool complete = completion == VSP1_DL_FRAME_END_COMPLETED;
+       bool complete = completion & VSP1_DL_FRAME_END_COMPLETED;
 
        if (drm_pipe->du_complete) {
                struct vsp1_entity *uif = drm_pipe->uif;
@@ -537,6 +537,10 @@ static void vsp1_du_pipeline_configure(struct 
vsp1_pipeline *pipe)
        struct vsp1_entity *next;
        struct vsp1_dl_list *dl;
        struct vsp1_dl_body *dlb;
+       unsigned int dl_flags = 0;
+
+       if (drm_pipe->force_brx_release)
+               dl_flags |= VSP1_DL_FRAME_END_INTERNAL;
 
        dl = vsp1_dl_list_get(pipe->output->dlm);
        dlb = vsp1_dl_list_get_body0(dl);
@@ -559,7 +563,7 @@ static void vsp1_du_pipeline_configure(struct vsp1_pipeline 
*pipe)
                vsp1_entity_configure_partition(entity, pipe, dl, dlb);
        }
 
-       vsp1_dl_list_commit(dl, drm_pipe->force_brx_release);
+       vsp1_dl_list_commit(dl, dl_flags);
 }
 
 /* 
-----------------------------------------------------------------------------
diff --git a/drivers/media/platform/vsp1/vsp1_video.c 
b/drivers/media/platform/vsp1/vsp1_video.c
index 328d686189be..9ae20982604a 100644
--- a/drivers/media/platform/vsp1/vsp1_video.c
+++ b/drivers/media/platform/vsp1/vsp1_video.c
@@ -421,7 +421,7 @@ static void vsp1_video_pipeline_run(struct vsp1_pipeline 
*pipe)
        }
 
        /* Complete, and commit the head display list. */
-       vsp1_dl_list_commit(dl, false);
+       vsp1_dl_list_commit(dl, 0);
        pipe->configured = true;
 
        vsp1_pipeline_run(pipe);
-- 
Regards,

Laurent Pinchart

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to