0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/types.h>
0012
0013 #include "common.h"
0014
0015
0016
0017
0018
0019
0020
0021 struct scmi_msg_payld {
0022 __le32 msg_header;
0023 __le32 msg_payload[];
0024 };
0025
0026
0027
0028
0029
0030
0031
0032
0033 size_t msg_command_size(struct scmi_xfer *xfer)
0034 {
0035 return sizeof(struct scmi_msg_payld) + xfer->tx.len;
0036 }
0037
0038
0039
0040
0041
0042
0043
0044
0045 size_t msg_response_size(struct scmi_xfer *xfer)
0046 {
0047 return sizeof(struct scmi_msg_payld) + sizeof(__le32) + xfer->rx.len;
0048 }
0049
0050
0051
0052
0053
0054
0055
0056 void msg_tx_prepare(struct scmi_msg_payld *msg, struct scmi_xfer *xfer)
0057 {
0058 msg->msg_header = cpu_to_le32(pack_scmi_header(&xfer->hdr));
0059 if (xfer->tx.buf)
0060 memcpy(msg->msg_payload, xfer->tx.buf, xfer->tx.len);
0061 }
0062
0063
0064
0065
0066
0067
0068
0069
0070 u32 msg_read_header(struct scmi_msg_payld *msg)
0071 {
0072 return le32_to_cpu(msg->msg_header);
0073 }
0074
0075
0076
0077
0078
0079
0080
0081
0082 void msg_fetch_response(struct scmi_msg_payld *msg, size_t len,
0083 struct scmi_xfer *xfer)
0084 {
0085 size_t prefix_len = sizeof(*msg) + sizeof(msg->msg_payload[0]);
0086
0087 xfer->hdr.status = le32_to_cpu(msg->msg_payload[0]);
0088 xfer->rx.len = min_t(size_t, xfer->rx.len,
0089 len >= prefix_len ? len - prefix_len : 0);
0090
0091
0092 memcpy(xfer->rx.buf, &msg->msg_payload[1], xfer->rx.len);
0093 }
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103 void msg_fetch_notification(struct scmi_msg_payld *msg, size_t len,
0104 size_t max_len, struct scmi_xfer *xfer)
0105 {
0106 xfer->rx.len = min_t(size_t, max_len,
0107 len >= sizeof(*msg) ? len - sizeof(*msg) : 0);
0108
0109
0110 memcpy(xfer->rx.buf, msg->msg_payload, xfer->rx.len);
0111 }