komeda_accemble_pipelines is for:

1. Verifing the component->supported_inputs according to the
   pipeline->avail_components.
2. Generating component->supported_outputs.

Signed-off-by: James (Qian) Wang <james.qian.w...@arm.com>
---
 .../gpu/drm/arm/display/komeda/komeda_dev.c   |  6 ++
 .../drm/arm/display/komeda/komeda_pipeline.c  | 75 +++++++++++++++++++
 .../drm/arm/display/komeda/komeda_pipeline.h  |  2 +-
 3 files changed, 82 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
index 2f8f4685eb62..ccadd6c23915 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c
@@ -152,6 +152,12 @@ struct komeda_dev *komeda_dev_create(struct device *dev)
                goto err_cleanup;
        }
 
+       err = komeda_assemble_pipelines(mdev);
+       if (err) {
+               DRM_ERROR("assemble display pipelines failed.\n");
+               goto err_cleanup;
+       }
+
        return mdev;
 
 err_cleanup:
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c 
b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
index 65b35495d3b7..d0f2d556fc6a 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
@@ -200,3 +200,78 @@ void komeda_component_destroy(struct komeda_dev *mdev,
 {
        devm_kfree(mdev->dev, c);
 }
+
+static void komeda_component_dump(struct komeda_component *c)
+{
+       if (!c)
+               return;
+
+       DRM_INFO("      %s: ID %d-0x%08lx.\n",
+                c->name, c->id, BIT(c->id));
+       DRM_INFO("              max_active_inputs:%d, supported_inputs: 
0x%08x.\n",
+                c->max_active_inputs, c->supported_inputs);
+       DRM_INFO("              max_active_outputs:%d, supported_outputs: 
0x%08x.\n",
+                c->max_active_outputs, c->supported_outputs);
+}
+
+static void komeda_pipeline_dump(struct komeda_pipeline *pipe)
+{
+       struct komeda_component *c;
+       int id;
+
+       DRM_INFO("Pipeline-%d: n_layers: %d, n_scalers: %d, output: %s\n",
+                pipe->id, pipe->n_layers, pipe->n_scalers,
+                pipe->of_output_dev ? pipe->of_output_dev->full_name : "none");
+
+       dp_for_each_set_bit(id, pipe->avail_comps) {
+               c = komeda_pipeline_get_component(pipe, id);
+
+               komeda_component_dump(c);
+       }
+}
+
+static void komeda_component_verify_inputs(struct komeda_component *c)
+{
+       struct komeda_pipeline *pipe = c->pipeline;
+       struct komeda_component *input;
+       int id;
+
+       dp_for_each_set_bit(id, c->supported_inputs) {
+               input = komeda_pipeline_get_component(pipe, id);
+               if (!input) {
+                       c->supported_inputs &= ~(BIT(id));
+                       DRM_WARN("Can not find input(ID-%d) for component: 
%s.\n",
+                                id, c->name);
+                       continue;
+               }
+
+               input->supported_outputs |= BIT(c->id);
+       }
+}
+
+static void komeda_pipeline_assemble(struct komeda_pipeline *pipe)
+{
+       struct komeda_component *c;
+       int id;
+
+       dp_for_each_set_bit(id, pipe->avail_comps) {
+               c = komeda_pipeline_get_component(pipe, id);
+
+               komeda_component_verify_inputs(c);
+       }
+}
+
+int komeda_assemble_pipelines(struct komeda_dev *mdev)
+{
+       struct komeda_pipeline *pipe;
+       int i;
+
+       for (i = 0; i < mdev->n_pipelines; i++) {
+               pipe = mdev->pipelines[i];
+
+               komeda_pipeline_assemble(pipe);
+               komeda_pipeline_dump(pipe);
+       }
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h 
b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
index b2bd6ab282cb..df82f986f9c9 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
@@ -365,7 +365,7 @@ komeda_pipeline_add(struct komeda_dev *mdev, size_t size,
                    struct komeda_pipeline_funcs *funcs);
 void komeda_pipeline_destroy(struct komeda_dev *mdev,
                             struct komeda_pipeline *pipe);
-
+int komeda_assemble_pipelines(struct komeda_dev *mdev);
 struct komeda_component *
 komeda_pipeline_get_component(struct komeda_pipeline *pipe, int id);
 
-- 
2.17.1

Reply via email to