firmware: arm_scmi: Implement is_notify_supported callback in system power protocol
authorCristian Marussi <cristian.marussi@arm.com>
Mon, 12 Feb 2024 12:32:27 +0000 (12:32 +0000)
committerSudeep Holla <sudeep.holla@arm.com>
Tue, 20 Feb 2024 06:35:55 +0000 (06:35 +0000)
Add a preliminary check to verify if the system power protocol related
notify enable commands are supported at all by the SCMI platform, and
then provide the callback needed to allow the core SCMI notification
subsytem to do a fine-grain check if a specific resource domain supports
notifications.

Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Link: https://lore.kernel.org/r/20240212123233.1230090-6-cristian.marussi@arm.com
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/system.c

index 1621da9..b6358c1 100644 (file)
@@ -36,8 +36,20 @@ struct scmi_system_power_state_notifier_payld {
 struct scmi_system_info {
        u32 version;
        bool graceful_timeout_supported;
+       bool power_state_notify_cmd;
 };
 
+static bool scmi_system_notify_supported(const struct scmi_protocol_handle *ph,
+                                        u8 evt_id, u32 src_id)
+{
+       struct scmi_system_info *pinfo = ph->get_priv(ph);
+
+       if (evt_id != SCMI_EVENT_SYSTEM_POWER_STATE_NOTIFIER)
+               return false;
+
+       return pinfo->power_state_notify_cmd;
+}
+
 static int scmi_system_request_notify(const struct scmi_protocol_handle *ph,
                                      bool enable)
 {
@@ -114,6 +126,7 @@ static const struct scmi_event system_events[] = {
 };
 
 static const struct scmi_event_ops system_event_ops = {
+       .is_notify_supported = scmi_system_notify_supported,
        .set_notify_enabled = scmi_system_set_notify_enabled,
        .fill_custom_report = scmi_system_fill_custom_report,
 };
@@ -147,6 +160,9 @@ static int scmi_system_protocol_init(const struct scmi_protocol_handle *ph)
        if (PROTOCOL_REV_MAJOR(pinfo->version) >= 0x2)
                pinfo->graceful_timeout_supported = true;
 
+       if (!ph->hops->protocol_msg_check(ph, SYSTEM_POWER_STATE_NOTIFY, NULL))
+               pinfo->power_state_notify_cmd = true;
+
        return ph->set_priv(ph, pinfo, version);
 }