aboutsummaryrefslogtreecommitdiff
path: root/product/rdn1e1
diff options
context:
space:
mode:
authorNicola Mazzucato <nicola.mazzucato@arm.com>2019-04-12 10:18:30 +0100
committerronald-cron-arm <39518861+ronald-cron-arm@users.noreply.github.com>2019-06-12 15:32:45 +0200
commit2bdf7be38999850eb261c74c1349580d5f20be09 (patch)
tree61383f7c4b35823c251c6569c4d72437b0b25e7c /product/rdn1e1
parent3e8ea89a38a96b45de8d308a743952160332d430 (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.c53
-rw-r--r--product/rdn1e1/scp_ramfw/config_sds.c4
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,