| .. | .. |
|---|
| 26 | 26 | #define SCMI_SHMEM_FLAG_INTR_ENABLED BIT(0) |
|---|
| 27 | 27 | __le32 length; |
|---|
| 28 | 28 | __le32 msg_header; |
|---|
| 29 | | - u8 msg_payload[0]; |
|---|
| 29 | + u8 msg_payload[]; |
|---|
| 30 | 30 | }; |
|---|
| 31 | 31 | |
|---|
| 32 | 32 | void shmem_tx_prepare(struct scmi_shared_mem __iomem *shmem, |
|---|
| .. | .. |
|---|
| 58 | 58 | void shmem_fetch_response(struct scmi_shared_mem __iomem *shmem, |
|---|
| 59 | 59 | struct scmi_xfer *xfer) |
|---|
| 60 | 60 | { |
|---|
| 61 | + size_t len = ioread32(&shmem->length); |
|---|
| 62 | + |
|---|
| 61 | 63 | xfer->hdr.status = ioread32(shmem->msg_payload); |
|---|
| 62 | 64 | /* 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); |
|---|
| 65 | 66 | |
|---|
| 66 | 67 | /* Take a copy to the rx buffer.. */ |
|---|
| 67 | 68 | memcpy_fromio(xfer->rx.buf, shmem->msg_payload + 4, xfer->rx.len); |
|---|
| 68 | 69 | } |
|---|
| 69 | 70 | |
|---|
| 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 | + |
|---|
| 70 | 88 | bool shmem_poll_done(struct scmi_shared_mem __iomem *shmem, |
|---|
| 71 | 89 | struct scmi_xfer *xfer) |
|---|
| 72 | 90 | { |
|---|