summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/porting-guide.md15
-rw-r--r--include/drivers/io_driver.h14
-rw-r--r--lib/io_storage.c29
-rw-r--r--plat/fvp/fvp_io_storage.c6
4 files changed, 25 insertions, 39 deletions
diff --git a/docs/porting-guide.md b/docs/porting-guide.md
index eb3b86d9..3070775a 100644
--- a/docs/porting-guide.md
+++ b/docs/porting-guide.md
@@ -218,6 +218,21 @@ be defined as well:
the secure memory identified by `TSP_SEC_MEM_BASE` and `TSP_SEC_MEM_SIZE`
constants.
+If the platform port uses the IO storage framework, the following constants
+must also be defined:
+
+* **#define : MAX_IO_DEVICES**
+
+ Defines the maximum number of registered IO devices. Attempting to register
+ more devices than this value using `io_register_device()` will fail with
+ IO_RESOURCES_EXHAUSTED.
+
+* **#define : MAX_IO_HANDLES**
+
+ Defines the maximum number of open IO handles. Attempting to open more IO
+ entities than this value using `io_open()` will fail with
+ IO_RESOURCES_EXHAUSTED.
+
The following constants are optional. They should be defined when the platform
memory layout implies some image overlaying like on FVP.
diff --git a/include/drivers/io_driver.h b/include/drivers/io_driver.h
index 867abbfa..adb38b0f 100644
--- a/include/drivers/io_driver.h
+++ b/include/drivers/io_driver.h
@@ -32,7 +32,6 @@
#define __IO_DRIVER_H__
#include <io_storage.h>
-#include <platform_def.h> /* For MAX_IO_DEVICES */
#include <stdint.h>
@@ -76,20 +75,9 @@ typedef struct io_dev_funcs {
} io_dev_funcs_t;
-/* IO platform data - used to track devices registered for a specific
- * platform */
-typedef struct io_plat_data {
- const io_dev_info_t *devices[MAX_IO_DEVICES];
- unsigned int dev_count;
-} io_plat_data_t;
-
-
/* Operations intended to be performed during platform initialisation */
-/* Initialise the IO layer */
-void io_init(io_plat_data_t *data);
-
-/* Register a device driver */
+/* Register an IO device */
int io_register_device(const io_dev_info_t *dev_info);
#endif /* __IO_DRIVER_H__ */
diff --git a/lib/io_storage.c b/lib/io_storage.c
index 204310a4..a3a8186d 100644
--- a/lib/io_storage.c
+++ b/lib/io_storage.c
@@ -31,13 +31,10 @@
#include <assert.h>
#include <io_driver.h>
#include <io_storage.h>
+#include <platform_def.h>
#include <stddef.h>
-#define MAX_DEVICES(plat_data) \
- (sizeof((plat_data)->devices)/sizeof((plat_data)->devices[0]))
-
-
/* Storage for a fixed maximum number of IO entities, definable by platform */
static io_entity_t entity_pool[MAX_IO_HANDLES];
@@ -48,9 +45,11 @@ static io_entity_t *entity_map[MAX_IO_HANDLES];
/* Track number of allocated entities */
static unsigned int entity_count;
+/* Array of fixed maximum of registered devices, definable by platform */
+static const io_dev_info_t *devices[MAX_IO_DEVICES];
-/* Used to keep a reference to platform-specific data */
-static io_plat_data_t *platform_data;
+/* Number of currently registered devices */
+static unsigned int dev_count;
#if DEBUG /* Extra validation functions only used in debug builds */
@@ -167,27 +166,15 @@ static int free_entity(const io_entity_t *entity)
/* Exported API */
-
-/* Initialise the IO layer */
-void io_init(io_plat_data_t *data)
-{
- assert(data != NULL);
- platform_data = data;
-}
-
-
/* Register a device driver */
int io_register_device(const io_dev_info_t *dev_info)
{
int result = IO_FAIL;
assert(dev_info != NULL);
- assert(platform_data != NULL);
-
- unsigned int dev_count = platform_data->dev_count;
- if (dev_count < MAX_DEVICES(platform_data)) {
- platform_data->devices[dev_count] = dev_info;
- platform_data->dev_count++;
+ if (dev_count < MAX_IO_DEVICES) {
+ devices[dev_count] = dev_info;
+ dev_count++;
result = IO_SUCCESS;
} else {
result = IO_RESOURCES_EXHAUSTED;
diff --git a/plat/fvp/fvp_io_storage.c b/plat/fvp/fvp_io_storage.c
index 1f695a6d..b4a04f19 100644
--- a/plat/fvp/fvp_io_storage.c
+++ b/plat/fvp/fvp_io_storage.c
@@ -35,12 +35,11 @@
#include <io_memmap.h>
#include <io_storage.h>
#include <io_semihosting.h>
+#include <platform_def.h>
#include <semihosting.h> /* For FOPEN_MODE_... */
#include <string.h>
-#include "fvp_def.h"
/* IO devices */
-static io_plat_data_t io_data;
static const io_dev_connector_t *sh_dev_con;
static uintptr_t sh_dev_spec;
static uintptr_t sh_init_params;
@@ -172,9 +171,6 @@ void fvp_io_setup (void)
{
int io_result = IO_FAIL;
- /* Initialise the IO layer */
- io_init(&io_data);
-
/* Register the IO devices on this platform */
io_result = register_io_dev_sh(&sh_dev_con);
assert(io_result == IO_SUCCESS);