Commit 8c589e17 authored by Dave Stevenson's avatar Dave Stevenson Committed by Greg Kroah-Hartman
Browse files

staging: mmal-vchiq: Allocate and free components as required



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: default avatarDave Stevenson <dave.stevenson@raspberrypi.org>
Signed-off-by: default avatarJacopo Mondi <jacopo@jmondi.org>
Signed-off-by: default avatarNicolas Saenz Julienne <nsaenzjulienne@suse.de>
Link: https://lore.kernel.org/r/20200623164235.29566-3-nsaenzjulienne@suse.de


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b18ee53a
Loading
Loading
Loading
Loading
+19 −10
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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 */