aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--product/n1sdp/module/n1sdp_system/src/mod_n1sdp_system.c51
-rw-r--r--product/n1sdp/scp_ramfw/config_sds.c4
-rw-r--r--product/rdn1e1/module/rdn1e1_system/src/mod_rdn1e1_system.c53
-rw-r--r--product/rdn1e1/scp_ramfw/config_sds.c4
-rw-r--r--product/sgi575/module/sgi575_system/src/mod_sgi575_system.c53
-rw-r--r--product/sgi575/scp_ramfw/config_sds.c4
-rw-r--r--product/sgm775/module/sgm775_system/src/mod_sgm775_system.c53
-rw-r--r--product/sgm775/scp_ramfw/config_sds.c2
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 = {