forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-10-09 244b2c5ca8b14627e4a17755e5922221e121c771
kernel/drivers/firmware/arm_scmi/shmem.c
....@@ -26,7 +26,7 @@
2626 #define SCMI_SHMEM_FLAG_INTR_ENABLED BIT(0)
2727 __le32 length;
2828 __le32 msg_header;
29
- u8 msg_payload[0];
29
+ u8 msg_payload[];
3030 };
3131
3232 void shmem_tx_prepare(struct scmi_shared_mem __iomem *shmem,
....@@ -58,15 +58,33 @@
5858 void shmem_fetch_response(struct scmi_shared_mem __iomem *shmem,
5959 struct scmi_xfer *xfer)
6060 {
61
+ size_t len = ioread32(&shmem->length);
62
+
6163 xfer->hdr.status = ioread32(shmem->msg_payload);
6264 /* Skip the length of header and status in shmem area i.e 8 bytes */
63
- xfer->rx.len = min_t(size_t, xfer->rx.len,
64
- ioread32(&shmem->length) - 8);
65
+ xfer->rx.len = min_t(size_t, xfer->rx.len, len > 8 ? len - 8 : 0);
6566
6667 /* Take a copy to the rx buffer.. */
6768 memcpy_fromio(xfer->rx.buf, shmem->msg_payload + 4, xfer->rx.len);
6869 }
6970
71
+void shmem_fetch_notification(struct scmi_shared_mem __iomem *shmem,
72
+ size_t max_len, struct scmi_xfer *xfer)
73
+{
74
+ size_t len = ioread32(&shmem->length);
75
+
76
+ /* Skip only the length of header in shmem area i.e 4 bytes */
77
+ xfer->rx.len = min_t(size_t, max_len, len > 4 ? len - 4 : 0);
78
+
79
+ /* Take a copy to the rx buffer.. */
80
+ memcpy_fromio(xfer->rx.buf, shmem->msg_payload, xfer->rx.len);
81
+}
82
+
83
+void shmem_clear_channel(struct scmi_shared_mem __iomem *shmem)
84
+{
85
+ iowrite32(SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE, &shmem->channel_status);
86
+}
87
+
7088 bool shmem_poll_done(struct scmi_shared_mem __iomem *shmem,
7189 struct scmi_xfer *xfer)
7290 {