diff --git a/docs/porting-guide.md b/docs/porting-guide.md index eb3b86d968efbd1fa3ad5adb03bdf5560581fa85..3070775ae449ee389f5f5071a75797c62390d72d 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 867abbfa32c06728bfa1ec90d4082701f7e3ac12..adb38b0ff5bb9c59b2b4bf099deeadb56859dce4 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 204310a42a536f0f95d28cd39ce8e05e8c1120d5..a3a8186d0fede11f1a327004ca6e84de56c8355a 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 1f695a6dbfd5d0c110c2024b4c883d58c3fd2be5..b4a04f19c8cdb6778b7b97a28a424d2303c4a0f7 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);