aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--module/scmi_reset_domain/include/internal/scmi_reset_domain.h3
-rw-r--r--module/scmi_reset_domain/src/mod_scmi_reset_domain.c11
2 files changed, 14 insertions, 0 deletions
diff --git a/module/scmi_reset_domain/include/internal/scmi_reset_domain.h b/module/scmi_reset_domain/include/internal/scmi_reset_domain.h
index bedd4273..38dcc77f 100644
--- a/module/scmi_reset_domain/include/internal/scmi_reset_domain.h
+++ b/module/scmi_reset_domain/include/internal/scmi_reset_domain.h
@@ -71,6 +71,9 @@ struct scmi_reset_domain_attributes_p2a {
(SCMI_RESET_DOMAIN_ASYNC | SCMI_RESET_DOMAIN_EXPLICIT | \
SCMI_RESET_DOMAIN_AUTO)
+#define SCMI_RESET_DOMAIN_RESET_STATE_TYPE_MASK (1UL << 31)
+#define SCMI_RESET_DOMAIN_RESET_STATE_ID_MASK UINT32_C(0x7FFFFFFF)
+
struct scmi_reset_domain_request_a2p {
uint32_t domain_id;
uint32_t flags;
diff --git a/module/scmi_reset_domain/src/mod_scmi_reset_domain.c b/module/scmi_reset_domain/src/mod_scmi_reset_domain.c
index 895cfbac..e18326a5 100644
--- a/module/scmi_reset_domain/src/mod_scmi_reset_domain.c
+++ b/module/scmi_reset_domain/src/mod_scmi_reset_domain.c
@@ -314,6 +314,17 @@ static int reset_request_handler(fwk_id_t service_id,
goto exit;
}
+ /**
+ * Verify that the reset state ID is 0 when the reset
+ * state type is Architectural.
+ */
+ if (((params.reset_state & SCMI_RESET_DOMAIN_RESET_STATE_TYPE_MASK) == 0) &&
+ ((params.reset_state & SCMI_RESET_DOMAIN_RESET_STATE_ID_MASK) != 0)) {
+ status = FWK_SUCCESS;
+ outmsg.status = SCMI_INVALID_PARAMETERS;
+ goto exit;
+ }
+
status = scmi_rd_ctx.scmi_api->get_agent_id(service_id, &agent_id);
if (status != FWK_SUCCESS)
goto exit;