summaryrefslogtreecommitdiffstats
path: root/meta-egvirt/recipes-kernel/linux/linux-yocto/scmi/0006-firmware-arm_scmi-add-SCMIv3.0-Sensor-notifications.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-egvirt/recipes-kernel/linux/linux-yocto/scmi/0006-firmware-arm_scmi-add-SCMIv3.0-Sensor-notifications.patch')
-rw-r--r--meta-egvirt/recipes-kernel/linux/linux-yocto/scmi/0006-firmware-arm_scmi-add-SCMIv3.0-Sensor-notifications.patch234
1 files changed, 0 insertions, 234 deletions
diff --git a/meta-egvirt/recipes-kernel/linux/linux-yocto/scmi/0006-firmware-arm_scmi-add-SCMIv3.0-Sensor-notifications.patch b/meta-egvirt/recipes-kernel/linux/linux-yocto/scmi/0006-firmware-arm_scmi-add-SCMIv3.0-Sensor-notifications.patch
deleted file mode 100644
index e8c8f420..00000000
--- a/meta-egvirt/recipes-kernel/linux/linux-yocto/scmi/0006-firmware-arm_scmi-add-SCMIv3.0-Sensor-notifications.patch
+++ /dev/null
@@ -1,234 +0,0 @@
-From 53a49c0e12be913ecb81c55e6ee1f214704043cc Mon Sep 17 00:00:00 2001
-From: Cristian Marussi <cristian.marussi@arm.com>
-Date: Thu, 19 Nov 2020 17:49:06 +0000
-Subject: [PATCH] firmware: arm_scmi: add SCMIv3.0 Sensor notifications
-
-Add support for new SCMIv3.0 SENSOR_UPDATE notification.
-
-Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
-Signed-off-by: Vasyl Vavrychuk <vasyl.vavrychuk@opensynergy.com>
----
- drivers/firmware/arm_scmi/sensors.c | 124 +++++++++++++++++++++++-----
- include/linux/scmi_protocol.h | 9 ++
- 2 files changed, 114 insertions(+), 19 deletions(-)
-
-diff --git a/drivers/firmware/arm_scmi/sensors.c b/drivers/firmware/arm_scmi/sensors.c
-index 10c271d430e7..b3d7c08c09a0 100644
---- a/drivers/firmware/arm_scmi/sensors.c
-+++ b/drivers/firmware/arm_scmi/sensors.c
-@@ -25,6 +25,7 @@ enum scmi_sensor_protocol_cmd {
- SENSOR_LIST_UPDATE_INTERVALS = 0x8,
- SENSOR_CONFIG_GET = 0x9,
- SENSOR_CONFIG_SET = 0xA,
-+ SENSOR_CONTINUOUS_UPDATE_NOTIFY = 0xB,
- };
-
- struct scmi_msg_resp_sensor_attributes {
-@@ -132,10 +133,10 @@ struct scmi_msg_resp_sensor_list_update_intervals {
- __le32 intervals[];
- };
-
--struct scmi_msg_sensor_trip_point_notify {
-+struct scmi_msg_sensor_request_notify {
- __le32 id;
- __le32 event_control;
--#define SENSOR_TP_NOTIFY_ALL BIT(0)
-+#define SENSOR_NOTIFY_ALL BIT(0)
- };
-
- struct scmi_msg_set_sensor_trip_point {
-@@ -185,6 +186,12 @@ struct scmi_sensor_trip_notify_payld {
- __le32 trip_point_desc;
- };
-
-+struct scmi_sensor_update_notify_payld {
-+ __le32 agent_id;
-+ __le32 sensor_id;
-+ struct scmi_sensor_reading_le readings[];
-+};
-+
- struct sensors_info {
- u32 version;
- int num_sensors;
-@@ -550,15 +557,16 @@ static int scmi_sensor_description_get(const struct scmi_handle *handle,
- return ret;
- }
-
--static int scmi_sensor_trip_point_notify(const struct scmi_handle *handle,
-- u32 sensor_id, bool enable)
-+static inline int
-+scmi_sensor_request_notify(const struct scmi_handle *handle, u32 sensor_id,
-+ u8 message_id, bool enable)
- {
- int ret;
-- u32 evt_cntl = enable ? SENSOR_TP_NOTIFY_ALL : 0;
-+ u32 evt_cntl = enable ? SENSOR_NOTIFY_ALL : 0;
- struct scmi_xfer *t;
-- struct scmi_msg_sensor_trip_point_notify *cfg;
-+ struct scmi_msg_sensor_request_notify *cfg;
-
-- ret = scmi_xfer_get_init(handle, SENSOR_TRIP_POINT_NOTIFY,
-+ ret = scmi_xfer_get_init(handle, message_id,
- SCMI_PROTOCOL_SENSOR, sizeof(*cfg), 0, &t);
- if (ret)
- return ret;
-@@ -573,6 +581,23 @@ static int scmi_sensor_trip_point_notify(const struct scmi_handle *handle,
- return ret;
- }
-
-+static int scmi_sensor_trip_point_notify(const struct scmi_handle *handle,
-+ u32 sensor_id, bool enable)
-+{
-+ return scmi_sensor_request_notify(handle, sensor_id,
-+ SENSOR_TRIP_POINT_NOTIFY,
-+ enable);
-+}
-+
-+static int
-+scmi_sensor_continuous_update_notify(const struct scmi_handle *handle,
-+ u32 sensor_id, bool enable)
-+{
-+ return scmi_sensor_request_notify(handle, sensor_id,
-+ SENSOR_CONTINUOUS_UPDATE_NOTIFY,
-+ enable);
-+}
-+
- static int
- scmi_sensor_trip_point_config(const struct scmi_handle *handle, u32 sensor_id,
- u8 trip_id, u64 trip_value)
-@@ -815,7 +840,19 @@ static int scmi_sensor_set_notify_enabled(const struct scmi_handle *handle,
- {
- int ret;
-
-- ret = scmi_sensor_trip_point_notify(handle, src_id, enable);
-+ switch (evt_id) {
-+ case SCMI_EVENT_SENSOR_TRIP_POINT_EVENT:
-+ ret = scmi_sensor_trip_point_notify(handle, src_id, enable);
-+ break;
-+ case SCMI_EVENT_SENSOR_UPDATE:
-+ ret = scmi_sensor_continuous_update_notify(handle, src_id,
-+ enable);
-+ break;
-+ default:
-+ ret = -EINVAL;
-+ break;
-+ }
-+
- if (ret)
- pr_debug("FAIL_ENABLED - evt[%X] dom[%d] - ret:%d\n",
- evt_id, src_id, ret);
-@@ -828,20 +865,59 @@ static void *scmi_sensor_fill_custom_report(const struct scmi_handle *handle,
- const void *payld, size_t payld_sz,
- void *report, u32 *src_id)
- {
-- const struct scmi_sensor_trip_notify_payld *p = payld;
-- struct scmi_sensor_trip_point_report *r = report;
-+ void *rep = NULL;
-
-- if (evt_id != SCMI_EVENT_SENSOR_TRIP_POINT_EVENT ||
-- sizeof(*p) != payld_sz)
-- return NULL;
-+ switch (evt_id) {
-+ case SCMI_EVENT_SENSOR_TRIP_POINT_EVENT:
-+ {
-+ const struct scmi_sensor_trip_notify_payld *p = payld;
-+ struct scmi_sensor_trip_point_report *r = report;
-
-- r->timestamp = timestamp;
-- r->agent_id = le32_to_cpu(p->agent_id);
-- r->sensor_id = le32_to_cpu(p->sensor_id);
-- r->trip_point_desc = le32_to_cpu(p->trip_point_desc);
-- *src_id = r->sensor_id;
-+ if (sizeof(*p) != payld_sz)
-+ break;
-
-- return r;
-+ r->timestamp = timestamp;
-+ r->agent_id = le32_to_cpu(p->agent_id);
-+ r->sensor_id = le32_to_cpu(p->sensor_id);
-+ r->trip_point_desc = le32_to_cpu(p->trip_point_desc);
-+ *src_id = r->sensor_id;
-+ rep = r;
-+ break;
-+ }
-+ case SCMI_EVENT_SENSOR_UPDATE:
-+ {
-+ int i;
-+ struct scmi_sensor_info *s;
-+ const struct scmi_sensor_update_notify_payld *p = payld;
-+ struct scmi_sensor_update_report *r = report;
-+ struct sensors_info *sinfo = handle->sensor_priv;
-+
-+ /* payld_sz is variable for this event */
-+ r->sensor_id = le32_to_cpu(p->sensor_id);
-+ if (r->sensor_id >= sinfo->num_sensors)
-+ break;
-+ r->timestamp = timestamp;
-+ r->agent_id = le32_to_cpu(p->agent_id);
-+ s = &sinfo->sensors[r->sensor_id];
-+ /*
-+ * The generated report r (@struct scmi_sensor_update_report)
-+ * was pre-allocated to contain up to SCMI_MAX_NUM_SENSOR_AXIS
-+ * readings: here it is filled with the effective @num_axis
-+ * readings defined for this sensor or 1 for scalar sensors.
-+ */
-+ r->readings_count = s->num_axis ?: 1;
-+ for (i = 0; i < r->readings_count; i++)
-+ scmi_parse_sensor_readings(&r->readings[i],
-+ &p->readings[i]);
-+ *src_id = r->sensor_id;
-+ rep = r;
-+ break;
-+ }
-+ default:
-+ break;
-+ }
-+
-+ return rep;
- }
-
- static const struct scmi_event sensor_events[] = {
-@@ -850,6 +926,16 @@ static const struct scmi_event sensor_events[] = {
- .max_payld_sz = sizeof(struct scmi_sensor_trip_notify_payld),
- .max_report_sz = sizeof(struct scmi_sensor_trip_point_report),
- },
-+ {
-+ .id = SCMI_EVENT_SENSOR_UPDATE,
-+ .max_payld_sz =
-+ sizeof(struct scmi_sensor_update_notify_payld) +
-+ SCMI_MAX_NUM_SENSOR_AXIS *
-+ sizeof(struct scmi_sensor_reading_le),
-+ .max_report_sz = sizeof(struct scmi_sensor_update_report) +
-+ SCMI_MAX_NUM_SENSOR_AXIS *
-+ sizeof(struct scmi_sensor_reading),
-+ },
- };
-
- static const struct scmi_event_ops sensor_event_ops = {
-diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h
-index 7e9e2cd3d46b..be0be5ff7514 100644
---- a/include/linux/scmi_protocol.h
-+++ b/include/linux/scmi_protocol.h
-@@ -657,6 +657,7 @@ enum scmi_notification_events {
- SCMI_EVENT_PERFORMANCE_LIMITS_CHANGED = 0x0,
- SCMI_EVENT_PERFORMANCE_LEVEL_CHANGED = 0x1,
- SCMI_EVENT_SENSOR_TRIP_POINT_EVENT = 0x0,
-+ SCMI_EVENT_SENSOR_UPDATE = 0x1,
- SCMI_EVENT_RESET_ISSUED = 0x0,
- SCMI_EVENT_BASE_ERROR_EVENT = 0x0,
- SCMI_EVENT_SYSTEM_POWER_STATE_NOTIFIER = 0x0,
-@@ -698,6 +699,14 @@ struct scmi_sensor_trip_point_report {
- unsigned int trip_point_desc;
- };
-
-+struct scmi_sensor_update_report {
-+ ktime_t timestamp;
-+ unsigned int agent_id;
-+ unsigned int sensor_id;
-+ unsigned int readings_count;
-+ struct scmi_sensor_reading readings[];
-+};
-+
- struct scmi_reset_issued_report {
- ktime_t timestamp;
- unsigned int agent_id;