From: Dave Stevenson <dave.steven...@raspberrypi.org>

The existing code assumed that there would only ever be 4 components,
and never freed the entries once used.
Allow arbitrary creation and destruction of components.

Signed-off-by: Dave Stevenson <dave.steven...@raspberrypi.org>
Signed-off-by: Jacopo Mondi <jac...@jmondi.org>
Signed-off-by: Nicolas Saenz Julienne <nsaenzjulie...@suse.de>
---
 .../vc04_services/vchiq-mmal/mmal-vchiq.c     | 29 ++++++++++++-------
 .../vc04_services/vchiq-mmal/mmal-vchiq.h     |  1 +
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c 
b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
index daf21087f8f9..cbe262b111fe 100644
--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.c
@@ -32,8 +32,11 @@
 #define USE_VCHIQ_ARM
 #include "interface/vchi/vchi.h"
 
-/* maximum number of components supported */
-#define VCHIQ_MMAL_MAX_COMPONENTS 4
+/*
+ * maximum number of components supported.
+ * This matches the maximum permitted by default on the VPU
+ */
+#define VCHIQ_MMAL_MAX_COMPONENTS 64
 
 /*#define FULL_MSG_DUMP 1*/
 
@@ -168,8 +171,6 @@ struct vchiq_mmal_instance {
        /* protect accesses to context_map */
        struct mutex context_map_lock;
 
-       /* component to use next */
-       int component_idx;
        struct vchiq_mmal_component component[VCHIQ_MMAL_MAX_COMPONENTS];
 
        /* ordered workqueue to process all bulk operations */
@@ -1626,18 +1627,24 @@ int vchiq_mmal_component_init(struct 
vchiq_mmal_instance *instance,
 {
        int ret;
        int idx;                /* port index */
-       struct vchiq_mmal_component *component;
+       struct vchiq_mmal_component *component = NULL;
 
        if (mutex_lock_interruptible(&instance->vchiq_mutex))
                return -EINTR;
 
-       if (instance->component_idx == VCHIQ_MMAL_MAX_COMPONENTS) {
+       for (idx = 0; idx < VCHIQ_MMAL_MAX_COMPONENTS; idx++) {
+               if (!instance->component[idx].in_use) {
+                       component = &instance->component[idx];
+                       component->in_use = 1;
+                       break;
+               }
+       }
+
+       if (!component) {
                ret = -EINVAL;  /* todo is this correct error? */
                goto unlock;
        }
 
-       component = &instance->component[instance->component_idx];
-
        ret = create_component(instance, component, name);
        if (ret < 0) {
                pr_err("%s: failed to create component %d (Not enough GPU 
mem?)\n",
@@ -1688,8 +1695,6 @@ int vchiq_mmal_component_init(struct vchiq_mmal_instance 
*instance,
                        goto release_component;
        }
 
-       instance->component_idx++;
-
        *component_out = component;
 
        mutex_unlock(&instance->vchiq_mutex);
@@ -1699,6 +1704,8 @@ int vchiq_mmal_component_init(struct vchiq_mmal_instance 
*instance,
 release_component:
        destroy_component(instance, component);
 unlock:
+       if (component)
+               component->in_use = 0;
        mutex_unlock(&instance->vchiq_mutex);
 
        return ret;
@@ -1721,6 +1728,8 @@ int vchiq_mmal_component_finalise(struct 
vchiq_mmal_instance *instance,
 
        ret = destroy_component(instance, component);
 
+       component->in_use = 0;
+
        mutex_unlock(&instance->vchiq_mutex);
 
        return ret;
diff --git a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h 
b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
index 47897e81ec58..4e34728d87e5 100644
--- a/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
+++ b/drivers/staging/vc04_services/vchiq-mmal/mmal-vchiq.h
@@ -82,6 +82,7 @@ struct vchiq_mmal_port {
 };
 
 struct vchiq_mmal_component {
+       u32 in_use:1;
        u32 enabled:1;
        u32 handle;  /* VideoCore handle for component */
        u32 inputs;  /* Number of input ports */
-- 
2.27.0

Reply via email to