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/rdn1e1 | |
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/rdn1e1')
-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 |
2 files changed, 50 insertions, 7 deletions
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, |