Skip to content

Commit

Permalink
firmware: arm_scmi: Implement is_notify_supported callback in powerca…
Browse files Browse the repository at this point in the history
…p protocol

Add a preliminary check to verify if the powercap 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 <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Sudeep Holla <[email protected]>
  • Loading branch information
freefall75 authored and sudeep-holla committed Feb 20, 2024
1 parent 12d6a03 commit e85beaf
Showing 1 changed file with 41 additions and 4 deletions.
45 changes: 41 additions & 4 deletions drivers/firmware/arm_scmi/powercap.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ struct scmi_powercap_state {
struct powercap_info {
u32 version;
int num_domains;
bool notify_cap_cmd;
bool notify_measurements_cmd;
struct scmi_powercap_state *states;
struct scmi_powercap_info *powercaps;
};
Expand Down Expand Up @@ -157,6 +159,18 @@ scmi_powercap_attributes_get(const struct scmi_protocol_handle *ph,
}

ph->xops->xfer_put(ph, t);

if (!ret) {
if (!ph->hops->protocol_msg_check(ph,
POWERCAP_CAP_NOTIFY, NULL))
pi->notify_cap_cmd = true;

if (!ph->hops->protocol_msg_check(ph,
POWERCAP_MEASUREMENTS_NOTIFY,
NULL))
pi->notify_measurements_cmd = true;
}

return ret;
}

Expand Down Expand Up @@ -200,10 +214,12 @@ scmi_powercap_domain_attributes_get(const struct scmi_protocol_handle *ph,
flags = le32_to_cpu(resp->attributes);

dom_info->id = domain;
dom_info->notify_powercap_cap_change =
SUPPORTS_POWERCAP_CAP_CHANGE_NOTIFY(flags);
dom_info->notify_powercap_measurement_change =
SUPPORTS_POWERCAP_MEASUREMENTS_CHANGE_NOTIFY(flags);
if (pinfo->notify_cap_cmd)
dom_info->notify_powercap_cap_change =
SUPPORTS_POWERCAP_CAP_CHANGE_NOTIFY(flags);
if (pinfo->notify_measurements_cmd)
dom_info->notify_powercap_measurement_change =
SUPPORTS_POWERCAP_MEASUREMENTS_CHANGE_NOTIFY(flags);
dom_info->async_powercap_cap_set =
SUPPORTS_ASYNC_POWERCAP_CAP_SET(flags);
dom_info->powercap_cap_config =
Expand Down Expand Up @@ -788,6 +804,26 @@ static int scmi_powercap_notify(const struct scmi_protocol_handle *ph,
return ret;
}

static bool
scmi_powercap_notify_supported(const struct scmi_protocol_handle *ph,
u8 evt_id, u32 src_id)
{
bool supported = false;
const struct scmi_powercap_info *dom_info;
struct powercap_info *pi = ph->get_priv(ph);

if (evt_id >= ARRAY_SIZE(evt_2_cmd) || src_id >= pi->num_domains)
return false;

dom_info = pi->powercaps + src_id;
if (evt_id == SCMI_EVENT_POWERCAP_CAP_CHANGED)
supported = dom_info->notify_powercap_cap_change;
else if (evt_id == SCMI_EVENT_POWERCAP_MEASUREMENTS_CHANGED)
supported = dom_info->notify_powercap_measurement_change;

return supported;
}

static int
scmi_powercap_set_notify_enabled(const struct scmi_protocol_handle *ph,
u8 evt_id, u32 src_id, bool enable)
Expand Down Expand Up @@ -904,6 +940,7 @@ static const struct scmi_event powercap_events[] = {
};

static const struct scmi_event_ops powercap_event_ops = {
.is_notify_supported = scmi_powercap_notify_supported,
.get_num_sources = scmi_powercap_get_num_sources,
.set_notify_enabled = scmi_powercap_set_notify_enabled,
.fill_custom_report = scmi_powercap_fill_custom_report,
Expand Down

0 comments on commit e85beaf

Please sign in to comment.