]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
firmware: arm_scmi: Remove fixed size fields from reports/scmi_event_header
authorCristian Marussi <cristian.marussi@arm.com>
Fri, 10 Jul 2020 13:39:19 +0000 (14:39 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Mon, 13 Jul 2020 08:40:21 +0000 (09:40 +0100)
Event reports are used to convey information describing events to the
registered user-callbacks: they are necessarily derived from the underlying
raw SCMI events' messages but they are not meant to expose or directly
mirror any of those messages data layout, which belong to the protocol
layer.

Using fixed size types for report fields, mirroring messages structure,
is at odd with this: get rid of them using more generic, equivalent,
typing.

Substitute scmi_event_header fixed size fields with generic types too and
shuffle around fields definitions to minimize implicit padding while
adapting involved functions.

Link: https://lore.kernel.org/r/20200710133919.39792-3-cristian.marussi@arm.com
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/base.c
drivers/firmware/arm_scmi/driver.c
drivers/firmware/arm_scmi/notify.c
drivers/firmware/arm_scmi/notify.h
drivers/firmware/arm_scmi/perf.c
drivers/firmware/arm_scmi/power.c
drivers/firmware/arm_scmi/reset.c
drivers/firmware/arm_scmi/sensors.c
include/linux/scmi_protocol.h

index 54f378e946f10bb562c590ee33e483fabfa7073c..9853bd3c4d456b490855a36425935b29378427c6 100644 (file)
@@ -273,7 +273,7 @@ static int scmi_base_set_notify_enabled(const struct scmi_handle *handle,
 }
 
 static void *scmi_base_fill_custom_report(const struct scmi_handle *handle,
-                                         u8 evt_id, u64 timestamp,
+                                         u8 evt_id, ktime_t timestamp,
                                          const void *payld, size_t payld_sz,
                                          void *report, u32 *src_id)
 {
index 19a4287fc0f7621619e230f2d753a2c4ab023aa0..03ec74242c141ecff333a1256049e8de907124d7 100644 (file)
@@ -205,13 +205,13 @@ __scmi_xfer_put(struct scmi_xfers_info *minfo, struct scmi_xfer *xfer)
 
 static void scmi_handle_notification(struct scmi_chan_info *cinfo, u32 msg_hdr)
 {
-       u64 ts;
        struct scmi_xfer *xfer;
        struct device *dev = cinfo->dev;
        struct scmi_info *info = handle_to_scmi_info(cinfo->handle);
        struct scmi_xfers_info *minfo = &info->rx_minfo;
+       ktime_t ts;
 
-       ts = ktime_get_boottime_ns();
+       ts = ktime_get_boottime();
        xfer = scmi_xfer_get(cinfo->handle, minfo);
        if (IS_ERR(xfer)) {
                dev_err(dev, "failed to get free message slot (%ld)\n",
index 752415367305a7d3e0f3d8b94c3aa9b4081ae7d9..4731daaacd19ea482d517efc7604cef9665d5ee0 100644 (file)
@@ -80,6 +80,7 @@
 #include <linux/err.h>
 #include <linux/hashtable.h>
 #include <linux/kernel.h>
+#include <linux/ktime.h>
 #include <linux/kfifo.h>
 #include <linux/list.h>
 #include <linux/mutex.h>
@@ -246,18 +247,18 @@ struct events_queue {
  * struct scmi_event_header  - A utility header
  * @timestamp: The timestamp, in nanoseconds (boottime), which was associated
  *            to this event as soon as it entered the SCMI RX ISR
- * @evt_id: Event ID (corresponds to the Event MsgID for this Protocol)
  * @payld_sz: Effective size of the embedded message payload which follows
+ * @evt_id: Event ID (corresponds to the Event MsgID for this Protocol)
  * @payld: A reference to the embedded event payload
  *
  * This header is prepended to each received event message payload before
  * queueing it on the related &struct events_queue.
  */
 struct scmi_event_header {
-       u64     timestamp;
-       u8      evt_id;
-       size_t  payld_sz;
-       u8      payld[];
+       ktime_t timestamp;
+       size_t payld_sz;
+       unsigned char evt_id;
+       unsigned char payld[];
 };
 
 struct scmi_registered_event;
@@ -572,7 +573,7 @@ static void scmi_events_dispatcher(struct work_struct *work)
  * Return: 0 on Success
  */
 int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id,
-               const void *buf, size_t len, u64 ts)
+               const void *buf, size_t len, ktime_t ts)
 {
        struct scmi_registered_event *r_evt;
        struct scmi_event_header eh;
@@ -595,7 +596,7 @@ int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id,
        if (kfifo_avail(&r_evt->proto->equeue.kfifo) < sizeof(eh) + len) {
                dev_warn(handle->dev,
                         "queue full, dropping proto_id:%d  evt_id:%d  ts:%lld\n",
-                        proto_id, evt_id, ts);
+                        proto_id, evt_id, ktime_to_ns(ts));
                return -ENOMEM;
        }
 
index 3791bb7aa79b33e84fe3977205f847155559dd1a..3485f20fa70e113ddd881a215082f158b6c4c2a4 100644 (file)
@@ -10,6 +10,7 @@
 #define _SCMI_NOTIFY_H
 
 #include <linux/device.h>
+#include <linux/ktime.h>
 #include <linux/types.h>
 
 #define SCMI_PROTO_QUEUE_SZ    4096
@@ -48,8 +49,9 @@ struct scmi_event_ops {
        int (*set_notify_enabled)(const struct scmi_handle *handle,
                                  u8 evt_id, u32 src_id, bool enabled);
        void *(*fill_custom_report)(const struct scmi_handle *handle,
-                                   u8 evt_id, u64 timestamp, const void *payld,
-                                   size_t payld_sz, void *report, u32 *src_id);
+                                   u8 evt_id, ktime_t timestamp,
+                                   const void *payld, size_t payld_sz,
+                                   void *report, u32 *src_id);
 };
 
 int scmi_notification_init(struct scmi_handle *handle);
@@ -61,6 +63,6 @@ int scmi_register_protocol_events(const struct scmi_handle *handle,
                                  const struct scmi_event *evt, int num_events,
                                  int num_sources);
 int scmi_notify(const struct scmi_handle *handle, u8 proto_id, u8 evt_id,
-               const void *buf, size_t len, u64 ts);
+               const void *buf, size_t len, ktime_t ts);
 
 #endif /* _SCMI_NOTIFY_H */
index 8bcad96e06ca54f02e2c904e91e1585b9476a7ee..3e1e87012c95b4c5852ea1235dfa4818c440e4e8 100644 (file)
@@ -780,7 +780,7 @@ static int scmi_perf_set_notify_enabled(const struct scmi_handle *handle,
 }
 
 static void *scmi_perf_fill_custom_report(const struct scmi_handle *handle,
-                                         u8 evt_id, u64 timestamp,
+                                         u8 evt_id, ktime_t timestamp,
                                          const void *payld, size_t payld_sz,
                                          void *report, u32 *src_id)
 {
index 4f6757980739392e6f7582b1eb01c6f5feab8b72..46f213644c4905ff4c2b06e80447ada427961475 100644 (file)
@@ -227,7 +227,7 @@ static int scmi_power_set_notify_enabled(const struct scmi_handle *handle,
 }
 
 static void *scmi_power_fill_custom_report(const struct scmi_handle *handle,
-                                          u8 evt_id, u64 timestamp,
+                                          u8 evt_id, ktime_t timestamp,
                                           const void *payld, size_t payld_sz,
                                           void *report, u32 *src_id)
 {
index fb7cb517900bd341dbfbbcc503b9a49119ee029a..3691bafca0574bf3cecad7736c499e60a1282f3c 100644 (file)
@@ -240,7 +240,7 @@ static int scmi_reset_set_notify_enabled(const struct scmi_handle *handle,
 }
 
 static void *scmi_reset_fill_custom_report(const struct scmi_handle *handle,
-                                          u8 evt_id, u64 timestamp,
+                                          u8 evt_id, ktime_t timestamp,
                                           const void *payld, size_t payld_sz,
                                           void *report, u32 *src_id)
 {
index 2120ac4787c928ffdce0b141f6fb09258532c1ad..1af0ad362e823c141d45a52400ea4f965c5b4591 100644 (file)
@@ -296,7 +296,7 @@ static int scmi_sensor_set_notify_enabled(const struct scmi_handle *handle,
 }
 
 static void *scmi_sensor_fill_custom_report(const struct scmi_handle *handle,
-                                           u8 evt_id, u64 timestamp,
+                                           u8 evt_id, ktime_t timestamp,
                                            const void *payld, size_t payld_sz,
                                            void *report, u32 *src_id)
 {
index 7d4348fb733055b5cf7c3463ea7551325e99fde7..7e5dd7d1e22120e8b34ff08bc4475ec47869a727 100644 (file)
@@ -381,47 +381,47 @@ enum scmi_notification_events {
 };
 
 struct scmi_power_state_changed_report {
-       u64 timestamp;
-       u32 agent_id;
-       u32 domain_id;
-       u32 power_state;
+       ktime_t         timestamp;
+       unsigned int    agent_id;
+       unsigned int    domain_id;
+       unsigned int    power_state;
 };
 
 struct scmi_perf_limits_report {
-       u64 timestamp;
-       u32 agent_id;
-       u32 domain_id;
-       u32 range_max;
-       u32 range_min;
+       ktime_t         timestamp;
+       unsigned int    agent_id;
+       unsigned int    domain_id;
+       unsigned int    range_max;
+       unsigned int    range_min;
 };
 
 struct scmi_perf_level_report {
-       u64 timestamp;
-       u32 agent_id;
-       u32 domain_id;
-       u32 performance_level;
+       ktime_t         timestamp;
+       unsigned int    agent_id;
+       unsigned int    domain_id;
+       unsigned int    performance_level;
 };
 
 struct scmi_sensor_trip_point_report {
-       u64 timestamp;
-       u32 agent_id;
-       u32 sensor_id;
-       u32 trip_point_desc;
+       ktime_t         timestamp;
+       unsigned int    agent_id;
+       unsigned int    sensor_id;
+       unsigned int    trip_point_desc;
 };
 
 struct scmi_reset_issued_report {
-       u64 timestamp;
-       u32 agent_id;
-       u32 domain_id;
-       u32 reset_state;
+       ktime_t         timestamp;
+       unsigned int    agent_id;
+       unsigned int    domain_id;
+       unsigned int    reset_state;
 };
 
 struct scmi_base_error_report {
-       u64 timestamp;
-       u32 agent_id;
-       bool fatal;
-       u16 cmd_count;
-       u64 reports[];
+       ktime_t                 timestamp;
+       unsigned int            agent_id;
+       bool                    fatal;
+       unsigned int            cmd_count;
+       unsigned long long      reports[];
 };
 
 #endif /* _LINUX_SCMI_PROTOCOL_H */