diff options
author | Nicola Mazzucato <nicola.mazzucato@arm.com> | 2019-04-12 10:18:30 +0100 |
---|---|---|
committer | ronald-cron-arm <39518861+ronald-cron-arm@users.noreply.github.com> | 2019-06-12 15:32:45 +0200 |
commit | 2bdf7be38999850eb261c74c1349580d5f20be09 (patch) | |
tree | 61383f7c4b35823c251c6569c4d72437b0b25e7c /product | |
parent | 3e8ea89a38a96b45de8d308a743952160332d430 (diff) |
product/module/*_system: Enable 'messaging stack ready'
This patch transfers the implicit 'messaging stack ready' from sds
to a product-specific module, enabling at the same time an explicit
dependency between SDS, transport and SCMI.
Change-Id: I700ef2031be6fa07ef9ac5657fda07a02e62a7d1
Signed-off-by: Nicola Mazzucato <nicola.mazzucato@arm.com>
Diffstat (limited to 'product')
-rw-r--r-- | product/n1sdp/module/n1sdp_system/src/mod_n1sdp_system.c | 51 | ||||
-rw-r--r-- | product/n1sdp/scp_ramfw/config_sds.c | 4 | ||||
-rw-r--r-- | product/rdn1e1/module/rdn1e1_system/src/mod_rdn1e1_system.c | 53 | ||||
-rw-r--r-- | product/rdn1e1/scp_ramfw/config_sds.c | 4 | ||||
-rw-r--r-- | product/sgi575/module/sgi575_system/src/mod_sgi575_system.c | 53 | ||||
-rw-r--r-- | product/sgi575/scp_ramfw/config_sds.c | 4 | ||||
-rw-r--r-- | product/sgm775/module/sgm775_system/src/mod_sgm775_system.c | 53 | ||||
-rw-r--r-- | product/sgm775/scp_ramfw/config_sds.c | 2 |
8 files changed, 198 insertions, 26 deletions
diff --git a/product/n1sdp/module/n1sdp_system/src/mod_n1sdp_system.c b/product/n1sdp/module/n1sdp_system/src/mod_n1sdp_system.c index 66c047c0..d735e33a 100644 --- a/product/n1sdp/module/n1sdp_system/src/mod_n1sdp_system.c +++ b/product/n1sdp/module/n1sdp_system/src/mod_n1sdp_system.c @@ -33,6 +33,7 @@ #include <n1sdp_scp_irq.h> #include <n1sdp_scp_mmap.h> #include <n1sdp_scp_scmi.h> +#include <n1sdp_sds.h> #include <n1sdp_ssc.h> #include <config_clock.h> @@ -52,6 +53,13 @@ static unsigned int scmi_notification_table[] = { SCP_N1SDP_SCMI_SERVICE_IDX_OSPM, }; +/* SDS Feature flags */ +static const uint32_t feature_flags = (N1SDP_SDS_FEATURE_FIRMWARE_MASK | + N1SDP_SDS_FEATURE_DMC_MASK | + N1SDP_SDS_FEATURE_MESSAGING_MASK); +static fwk_id_t sds_feature_availability_id = + FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SDS, 3); + /* Module context */ struct n1sdp_system_ctx { @@ -66,6 +74,9 @@ struct n1sdp_system_ctx { /* Pointer to N1SDP Flash APIs */ const struct mod_n1sdp_flash_api *flash_api; + + /* Pointer to SDS */ + const struct mod_sds_api *sds_api; }; struct n1sdp_system_isr { @@ -389,6 +400,19 @@ static int n1sdp_system_init_primary_core(void) return FWK_SUCCESS; } +static int messaging_stack_ready(void) +{ + const struct mod_sds_structure_desc *sds_structure_desc = + fwk_module_get_data(sds_feature_availability_id); + + /* + * Write SDS Feature Availability to signal the completion of the messaging + * stack + */ + return n1sdp_system_ctx.sds_api->struct_write(sds_structure_desc->id, + 0, (void *)(&feature_flags), sds_structure_desc->size); +} + /* * Functions fulfilling the framework's module interface */ @@ -434,9 +458,15 @@ static int n1sdp_system_bind(fwk_id_t id, unsigned int round) if (status != FWK_SUCCESS) return status; - return fwk_module_bind(FWK_ID_MODULE(FWK_MODULE_IDX_PPU_V1), + status = fwk_module_bind(FWK_ID_MODULE(FWK_MODULE_IDX_PPU_V1), FWK_ID_API(FWK_MODULE_IDX_PPU_V1, MOD_PPU_V1_API_IDX_ISR), &n1sdp_system_ctx.ppu_v1_isr_api); + if (status != FWK_SUCCESS) + return status; + + return fwk_module_bind(fwk_module_id_sds, + FWK_ID_API(FWK_MODULE_IDX_SDS, 0), + &n1sdp_system_ctx.sds_api); } static int n1sdp_system_process_bind_request(fwk_id_t requester_id, @@ -534,6 +564,8 @@ static int n1sdp_system_process_notification(const struct fwk_event *event, struct fwk_event *resp_event) { struct clock_notification_params *params = NULL; + static unsigned int scmi_notification_count = 0; + static bool sds_notification_received = false; int status; assert(fwk_id_is_type(event->target_id, FWK_ID_TYPE_MODULE)); @@ -562,13 +594,22 @@ static int n1sdp_system_process_notification(const struct fwk_event *event, return FWK_SUCCESS; } else if (fwk_id_is_equal(event->id, mod_scmi_notification_id_initialized)) { - return FWK_SUCCESS; + scmi_notification_count++; } else if (fwk_id_is_equal(event->id, mod_sds_notification_id_initialized)) { - return FWK_SUCCESS; - } + sds_notification_received = true; + } else + return FWK_E_PARAM; + + if ((scmi_notification_count == FWK_ARRAY_SIZE(scmi_notification_table)) && + sds_notification_received) { + messaging_stack_ready(); - return FWK_E_PARAM; + scmi_notification_count = 0; + sds_notification_received = false; + } + + return FWK_SUCCESS; } const struct fwk_module module_n1sdp_system = { diff --git a/product/n1sdp/scp_ramfw/config_sds.c b/product/n1sdp/scp_ramfw/config_sds.c index 765043c3..53f022a3 100644 --- a/product/n1sdp/scp_ramfw/config_sds.c +++ b/product/n1sdp/scp_ramfw/config_sds.c @@ -19,9 +19,7 @@ #include <config_clock.h> static const uint32_t version_packed = FWK_BUILD_VERSION; -static const uint32_t feature_flags = (N1SDP_SDS_FEATURE_FIRMWARE_MASK | - N1SDP_SDS_FEATURE_DMC_MASK | - N1SDP_SDS_FEATURE_MESSAGING_MASK); +static const uint32_t feature_flags = 0x00000000; const struct mod_sds_config sds_module_config = { .region_base_address = SCP_SDS_MEM_BASE, diff --git a/product/rdn1e1/module/rdn1e1_system/src/mod_rdn1e1_system.c b/product/rdn1e1/module/rdn1e1_system/src/mod_rdn1e1_system.c index 5409350b..419d3494 100644 --- a/product/rdn1e1/module/rdn1e1_system/src/mod_rdn1e1_system.c +++ b/product/rdn1e1/module/rdn1e1_system/src/mod_rdn1e1_system.c @@ -27,6 +27,7 @@ #include <mod_ppu_v1.h> #include <rdn1e1_core.h> #include <rdn1e1_pik_scp.h> +#include <rdn1e1_sds.h> #include <scp_rdn1e1_irq.h> #include <scp_rdn1e1_mmap.h> #include <scp_rdn1e1_scmi.h> @@ -51,6 +52,9 @@ struct rdn1e1_system_ctx { /* Power domain module restricted API pointer */ struct mod_pd_restricted_api *mod_pd_restricted_api; + + /* SDS API pointer */ + const struct mod_sds_api *sds_api; }; struct rdn1e1_system_isr { @@ -61,6 +65,30 @@ struct rdn1e1_system_isr { static struct rdn1e1_system_ctx rdn1e1_system_ctx; const struct fwk_module_config config_rdn1e1_system = { 0 }; +static const uint32_t feature_flags = (RDN1E1_SDS_FEATURE_FIRMWARE_MASK | + RDN1E1_SDS_FEATURE_DMC_MASK | + RDN1E1_SDS_FEATURE_MESSAGING_MASK); + +static fwk_id_t sds_feature_availability_id = + FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SDS, 3); + +/* + * SCMI Messaging stack + */ + +static int messaging_stack_ready(void) +{ + const struct mod_sds_structure_desc *sds_structure_desc = + fwk_module_get_data(sds_feature_availability_id); + + /* + * Write SDS Feature Availability to signal the completion of the messaging + * stack + */ + return rdn1e1_system_ctx.sds_api->struct_write(sds_structure_desc->id, + 0, (void *)(&feature_flags), sds_structure_desc->size); +} + /* * PPU Interrupt Service Routines for cluster and core power domains */ @@ -196,9 +224,15 @@ static int rdn1e1_system_bind(fwk_id_t id, unsigned int round) if (status != FWK_SUCCESS) return status; - return fwk_module_bind(FWK_ID_MODULE(FWK_MODULE_IDX_PPU_V1), + status = fwk_module_bind(FWK_ID_MODULE(FWK_MODULE_IDX_PPU_V1), FWK_ID_API(FWK_MODULE_IDX_PPU_V1, MOD_PPU_V1_API_IDX_ISR), &rdn1e1_system_ctx.ppu_v1_isr_api); + if (status != FWK_SUCCESS) + return status; + + return fwk_module_bind(fwk_module_id_sds, + FWK_ID_API(FWK_MODULE_IDX_SDS, 0), + &rdn1e1_system_ctx.sds_api); } static int rdn1e1_system_process_bind_request(fwk_id_t requester_id, @@ -263,6 +297,8 @@ int rdn1e1_system_process_notification(const struct fwk_event *event, int status; struct clock_notification_params *params; struct mod_pd_restricted_api *mod_pd_restricted_api; + static unsigned int scmi_notification_count = 0; + static bool sds_notification_received = false; assert(fwk_id_is_type(event->target_id, FWK_ID_TYPE_MODULE)); @@ -295,13 +331,22 @@ int rdn1e1_system_process_notification(const struct fwk_event *event, return FWK_SUCCESS; } else if (fwk_id_is_equal(event->id, mod_scmi_notification_id_initialized)) { - return FWK_SUCCESS; + scmi_notification_count++; } else if (fwk_id_is_equal(event->id, mod_sds_notification_id_initialized)) { - return FWK_SUCCESS; + sds_notification_received = true; + } else + return FWK_E_PARAM; + + if ((scmi_notification_count == FWK_ARRAY_SIZE(scmi_notification_table)) && + sds_notification_received) { + messaging_stack_ready(); + + scmi_notification_count = 0; + sds_notification_received = false; } - return FWK_E_PARAM; + return FWK_SUCCESS; } const struct fwk_module module_rdn1e1_system = { diff --git a/product/rdn1e1/scp_ramfw/config_sds.c b/product/rdn1e1/scp_ramfw/config_sds.c index db795fba..766823e5 100644 --- a/product/rdn1e1/scp_ramfw/config_sds.c +++ b/product/rdn1e1/scp_ramfw/config_sds.c @@ -21,9 +21,7 @@ #include <config_clock.h> static const uint32_t version_packed = FWK_BUILD_VERSION; -static const uint32_t feature_flags = (RDN1E1_SDS_FEATURE_FIRMWARE_MASK | - RDN1E1_SDS_FEATURE_DMC_MASK | - RDN1E1_SDS_FEATURE_MESSAGING_MASK); +static const uint32_t feature_flags = 0x00000000; const struct mod_sds_config sds_module_config = { .region_base_address = SCP_SDS_MEM_BASE, diff --git a/product/sgi575/module/sgi575_system/src/mod_sgi575_system.c b/product/sgi575/module/sgi575_system/src/mod_sgi575_system.c index 1e2d65f9..be6ab856 100644 --- a/product/sgi575/module/sgi575_system/src/mod_sgi575_system.c +++ b/product/sgi575/module/sgi575_system/src/mod_sgi575_system.c @@ -30,6 +30,7 @@ #include <scp_sgi575_scmi.h> #include <sgi575_core.h> #include <sgi575_pik_scp.h> +#include <sgi575_sds.h> #include <config_clock.h> /* SCMI services required to enable the messaging stack */ @@ -51,6 +52,9 @@ struct sgi575_system_ctx { /* Power domain module restricted API pointer */ struct mod_pd_restricted_api *mod_pd_restricted_api; + + /* SDS API pointer */ + const struct mod_sds_api *sds_api; }; struct sgi575_system_isr { @@ -61,6 +65,30 @@ struct sgi575_system_isr { static struct sgi575_system_ctx sgi575_system_ctx; const struct fwk_module_config config_sgi575_system = { 0 }; +static const uint32_t feature_flags = (SGI575_SDS_FEATURE_FIRMWARE_MASK | + SGI575_SDS_FEATURE_DMC_MASK | + SGI575_SDS_FEATURE_MESSAGING_MASK); + +static fwk_id_t sds_feature_availability_id = + FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SDS, 4); + +/* + * SCMI Messaging stack + */ + +static int messaging_stack_ready(void) +{ + const struct mod_sds_structure_desc *sds_structure_desc = + fwk_module_get_data(sds_feature_availability_id); + + /* + * Write SDS Feature Availability to signal the completion of the messaging + * stack + */ + return sgi575_system_ctx.sds_api->struct_write(sds_structure_desc->id, + 0, (void *)(&feature_flags), sds_structure_desc->size); +} + /* * PPU Interrupt Service Routines for cluster and core power domains */ @@ -196,9 +224,15 @@ static int sgi575_system_bind(fwk_id_t id, unsigned int round) if (status != FWK_SUCCESS) return status; - return fwk_module_bind(FWK_ID_MODULE(FWK_MODULE_IDX_PPU_V1), + status = fwk_module_bind(FWK_ID_MODULE(FWK_MODULE_IDX_PPU_V1), FWK_ID_API(FWK_MODULE_IDX_PPU_V1, MOD_PPU_V1_API_IDX_ISR), &sgi575_system_ctx.ppu_v1_isr_api); + if (status != FWK_SUCCESS) + return status; + + return fwk_module_bind(fwk_module_id_sds, + FWK_ID_API(FWK_MODULE_IDX_SDS, 0), + &sgi575_system_ctx.sds_api); } static int sgi575_system_process_bind_request(fwk_id_t requester_id, @@ -263,6 +297,8 @@ int sgi575_system_process_notification(const struct fwk_event *event, int status; struct clock_notification_params *params; struct mod_pd_restricted_api *mod_pd_restricted_api; + static unsigned int scmi_notification_count = 0; + static bool sds_notification_received = false; assert(fwk_id_is_type(event->target_id, FWK_ID_TYPE_MODULE)); @@ -295,13 +331,22 @@ int sgi575_system_process_notification(const struct fwk_event *event, return FWK_SUCCESS; } else if (fwk_id_is_equal(event->id, mod_scmi_notification_id_initialized)) { - return FWK_SUCCESS; + scmi_notification_count++; } else if (fwk_id_is_equal(event->id, mod_sds_notification_id_initialized)) { - return FWK_SUCCESS; + sds_notification_received = true; + } else + return FWK_E_PARAM; + + if ((scmi_notification_count == FWK_ARRAY_SIZE(scmi_notification_table)) && + sds_notification_received) { + messaging_stack_ready(); + + scmi_notification_count = 0; + sds_notification_received = false; } - return FWK_E_PARAM; + return FWK_SUCCESS; } const struct fwk_module module_sgi575_system = { diff --git a/product/sgi575/scp_ramfw/config_sds.c b/product/sgi575/scp_ramfw/config_sds.c index f6d0152a..98265fb4 100644 --- a/product/sgi575/scp_ramfw/config_sds.c +++ b/product/sgi575/scp_ramfw/config_sds.c @@ -21,9 +21,7 @@ #include <config_clock.h> static const uint32_t version_packed = FWK_BUILD_VERSION; -static const uint32_t feature_flags = (SGI575_SDS_FEATURE_FIRMWARE_MASK | - SGI575_SDS_FEATURE_DMC_MASK | - SGI575_SDS_FEATURE_MESSAGING_MASK); +static const uint32_t feature_flags = 0x00000000; const struct mod_sds_config sds_module_config = { .region_base_address = SCP_SDS_MEM_BASE, diff --git a/product/sgm775/module/sgm775_system/src/mod_sgm775_system.c b/product/sgm775/module/sgm775_system/src/mod_sgm775_system.c index c939fee5..94c39770 100644 --- a/product/sgm775/module/sgm775_system/src/mod_sgm775_system.c +++ b/product/sgm775/module/sgm775_system/src/mod_sgm775_system.c @@ -19,6 +19,11 @@ #include <mod_system_power.h> #include <mod_sgm775_system.h> #include <sgm775_scmi.h> +#include <sgm775_sds.h> + +static const uint32_t feature_flags = SGM775_SDS_FEATURE_FIRMWARE_MASK; +static fwk_id_t sds_feature_availability_id = + FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_SDS, 1); /* SCMI services required to enable the messaging stack */ static unsigned int scmi_notification_table[] = { @@ -27,6 +32,25 @@ static unsigned int scmi_notification_table[] = { SGM775_SCMI_SERVICE_IDX_OSPM_1, }; +static struct mod_sds_api *sds_api; + +/* + * Static helpers + */ + +static int messaging_stack_ready(void) +{ + const struct mod_sds_structure_desc *sds_structure_desc = + fwk_module_get_data(sds_feature_availability_id); + + /* + * Write SDS Feature Availability to signal the completion of the messaging + * stack + */ + return sds_api->struct_write(sds_structure_desc->id, + 0, (void *)(&feature_flags), sds_structure_desc->size); +} + /* * Functions fulfilling the framework's module interface */ @@ -53,6 +77,16 @@ static int sgm775_system_init(fwk_id_t module_id, unsigned int unused, return FWK_SUCCESS; } +static int sgm775_system_bind(fwk_id_t id, unsigned int round) +{ + if (round > 0) + return FWK_SUCCESS; + + return fwk_module_bind(fwk_module_id_sds, + FWK_ID_API(FWK_MODULE_IDX_SDS, 0), + &sds_api); +} + static int sgm775_system_process_bind_request(fwk_id_t source_id, fwk_id_t target_id, fwk_id_t api_id, const void **api) { @@ -95,18 +129,30 @@ static int sgm775_system_start(fwk_id_t id) static int sgm775_system_process_notification(const struct fwk_event *event, struct fwk_event *resp_event) { + static unsigned int scmi_notification_count = 0; + static bool sds_notification_received = false; + if (!fwk_expect(fwk_id_is_type(event->target_id, FWK_ID_TYPE_MODULE))) return FWK_E_PARAM; if (fwk_id_is_equal(event->id, mod_scmi_notification_id_initialized)) { - return FWK_SUCCESS; + scmi_notification_count++; } else if (fwk_id_is_equal(event->id, mod_sds_notification_id_initialized)) { - return FWK_SUCCESS; + sds_notification_received = true; + } else + return FWK_E_PARAM; + + if ((scmi_notification_count == FWK_ARRAY_SIZE(scmi_notification_table)) && + sds_notification_received) { + messaging_stack_ready(); + + scmi_notification_count = 0; + sds_notification_received = false; } - return FWK_E_PARAM; + return FWK_SUCCESS; } const struct fwk_module module_sgm775_system = { @@ -114,6 +160,7 @@ const struct fwk_module module_sgm775_system = { .api_count = MOD_SGM775_SYSTEM_API_COUNT, .type = FWK_MODULE_TYPE_DRIVER, .init = sgm775_system_init, + .bind = sgm775_system_bind, .process_bind_request = sgm775_system_process_bind_request, .start = sgm775_system_start, .process_notification = sgm775_system_process_notification, diff --git a/product/sgm775/scp_ramfw/config_sds.c b/product/sgm775/scp_ramfw/config_sds.c index fff3734d..9d60183b 100644 --- a/product/sgm775/scp_ramfw/config_sds.c +++ b/product/sgm775/scp_ramfw/config_sds.c @@ -16,7 +16,7 @@ #include <sgm775_sds.h> #include <clock_devices.h> -static const uint32_t feature_flags = SGM775_SDS_FEATURE_FIRMWARE_MASK; +static const uint32_t feature_flags = 0x00000000; static const uint32_t version_packed = FWK_BUILD_VERSION; const struct mod_sds_config sds_module_config = { |