firmware: arm_scmi: Avoid padding in sensor message structure
authorCristian Marussi <cristian.marussi@arm.com>
Mon, 28 Jun 2021 17:00:42 +0000 (18:00 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Tue, 13 Jul 2021 10:42:14 +0000 (11:42 +0100)
scmi_resp_sensor_reading_complete structure is meant to represent an
SCMI asynchronous reading complete message. The readings field with
a 64bit type forces padding and breaks reads in scmi_sensor_reading_get.

Split it in two adjacent 32bit readings_low/high subfields to avoid the
padding within the structure. Alternatively we could to mark the structure
packed.

Link: https://lore.kernel.org/r/20210628170042.34105-1-cristian.marussi@arm.com
Fixes: e2083d3673916 ("firmware: arm_scmi: Add SCMI v3.0 sensors timestamped reads")
Signed-off-by: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/sensors.c

index 2c88aa2..3084715 100644 (file)
@@ -166,7 +166,8 @@ struct scmi_msg_sensor_reading_get {
 
 struct scmi_resp_sensor_reading_complete {
        __le32 id;
-       __le64 readings;
+       __le32 readings_low;
+       __le32 readings_high;
 };
 
 struct scmi_sensor_reading_resp {
@@ -717,7 +718,8 @@ static int scmi_sensor_reading_get(const struct scmi_protocol_handle *ph,
 
                        resp = t->rx.buf;
                        if (le32_to_cpu(resp->id) == sensor_id)
-                               *value = get_unaligned_le64(&resp->readings);
+                               *value =
+                                       get_unaligned_le64(&resp->readings_low);
                        else
                                ret = -EPROTO;
                }