git: d49ed3608010 - main - Revert "scmi: Make transports report the effective length of the received messages"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 09 Jun 2025 15:45:58 UTC
The branch main has been updated by andrew:
URL: https://cgit.FreeBSD.org/src/commit/?id=d49ed3608010681a5d1958b6499b336d48ec0dcc
commit d49ed3608010681a5d1958b6499b336d48ec0dcc
Author: Andrew Turner <andrew@FreeBSD.org>
AuthorDate: 2025-06-09 13:21:52 +0000
Commit: Andrew Turner <andrew@FreeBSD.org>
CommitDate: 2025-06-04 01:32:39 +0000
Revert "scmi: Make transports report the effective length of the received messages"
Revert to reapply series as some patches were incorrect versions
This reverts commit 9342829d578e26f10a5cbc26e2b9e66cfd9864c4.
---
sys/dev/firmware/arm/scmi.c | 10 ++++------
sys/dev/firmware/arm/scmi.h | 2 +-
sys/dev/firmware/arm/scmi_mailbox.c | 10 +++++-----
sys/dev/firmware/arm/scmi_shmem.c | 22 +++++++++++++---------
sys/dev/firmware/arm/scmi_shmem.h | 6 +++---
sys/dev/firmware/arm/scmi_smc.c | 4 ++--
sys/dev/firmware/arm/scmi_virtio.c | 5 +++--
7 files changed, 31 insertions(+), 28 deletions(-)
diff --git a/sys/dev/firmware/arm/scmi.c b/sys/dev/firmware/arm/scmi.c
index 00a229762414..37496136c828 100644
--- a/sys/dev/firmware/arm/scmi.c
+++ b/sys/dev/firmware/arm/scmi.c
@@ -146,8 +146,7 @@ static struct scmi_req *scmi_req_lookup_inflight(struct scmi_softc *, uint32_t);
static int scmi_wait_for_response(struct scmi_softc *,
struct scmi_req *, void **);
-static void scmi_process_response(struct scmi_softc *, uint32_t,
- unsigned int);
+static void scmi_process_response(struct scmi_softc *, uint32_t);
int
scmi_attach(device_t dev)
@@ -470,7 +469,7 @@ scmi_req_lookup_inflight(struct scmi_softc *sc, uint32_t hdr)
}
static void
-scmi_process_response(struct scmi_softc *sc, uint32_t hdr, uint32_t rx_len)
+scmi_process_response(struct scmi_softc *sc, uint32_t hdr)
{
bool timed_out = false;
struct scmi_req *req;
@@ -485,7 +484,6 @@ scmi_process_response(struct scmi_softc *sc, uint32_t hdr, uint32_t rx_len)
mtx_lock_spin(&req->mtx);
req->done = true;
- req->msg.rx_len = rx_len;
if (!req->timed_out) {
/*
* Consider the case in which a polled message is picked
@@ -514,7 +512,7 @@ scmi_process_response(struct scmi_softc *sc, uint32_t hdr, uint32_t rx_len)
}
void
-scmi_rx_irq_callback(device_t dev, void *chan, uint32_t hdr, uint32_t rx_len)
+scmi_rx_irq_callback(device_t dev, void *chan, uint32_t hdr)
{
struct scmi_softc *sc;
@@ -526,7 +524,7 @@ scmi_rx_irq_callback(device_t dev, void *chan, uint32_t hdr, uint32_t rx_len)
return;
}
- scmi_process_response(sc, hdr, rx_len);
+ scmi_process_response(sc, hdr);
}
static int
diff --git a/sys/dev/firmware/arm/scmi.h b/sys/dev/firmware/arm/scmi.h
index 5ad7b0db3f5f..345ae6eeb03a 100644
--- a/sys/dev/firmware/arm/scmi.h
+++ b/sys/dev/firmware/arm/scmi.h
@@ -75,7 +75,7 @@ void *scmi_buf_get(device_t dev, uint8_t protocol_id, uint8_t message_id,
int tx_payd_sz, int rx_payld_sz);
void scmi_buf_put(device_t dev, void *buf);
int scmi_request(device_t dev, void *in, void **);
-void scmi_rx_irq_callback(device_t dev, void *chan, uint32_t hdr, uint32_t rx_len);
+void scmi_rx_irq_callback(device_t dev, void *chan, uint32_t hdr);
DECLARE_CLASS(scmi_driver);
diff --git a/sys/dev/firmware/arm/scmi_mailbox.c b/sys/dev/firmware/arm/scmi_mailbox.c
index d7b642b69b85..858b81f68845 100644
--- a/sys/dev/firmware/arm/scmi_mailbox.c
+++ b/sys/dev/firmware/arm/scmi_mailbox.c
@@ -70,14 +70,14 @@ static void
scmi_mailbox_a2p_callback(void *arg)
{
struct scmi_mailbox_softc *sc;
- uint32_t msg_header, rx_len;
+ uint32_t msg_header;
int ret;
sc = arg;
- ret = scmi_shmem_read_msg_header(sc->a2p_dev, &msg_header, &rx_len);
+ ret = scmi_shmem_read_msg_header(sc->a2p_dev, &msg_header);
if (ret == 0)
- scmi_rx_irq_callback(sc->base.dev, sc->a2p_dev, msg_header, rx_len);
+ scmi_rx_irq_callback(sc->base.dev, sc->a2p_dev, msg_header);
}
static int
@@ -154,7 +154,7 @@ scmi_mailbox_poll_msg(device_t dev, struct scmi_msg *msg, unsigned int tmo_ms)
sc = device_get_softc(dev);
do {
- if (scmi_shmem_poll_msg(sc->a2p_dev, &msg->hdr, &msg->rx_len))
+ if (scmi_shmem_poll_msg(sc->a2p_dev, &msg->hdr))
break;
DELAY(SCMI_MBOX_POLL_INTERVAL_MS * 1000);
} while (tmo_loops--);
@@ -171,7 +171,7 @@ scmi_mailbox_collect_reply(device_t dev, struct scmi_msg *msg)
sc = device_get_softc(dev);
ret = scmi_shmem_read_msg_payload(sc->a2p_dev,
- msg->payld, msg->rx_len - SCMI_MSG_HDR_SIZE, msg->rx_len);
+ msg->payld, msg->rx_len - SCMI_MSG_HDR_SIZE);
return (ret);
}
diff --git a/sys/dev/firmware/arm/scmi_shmem.c b/sys/dev/firmware/arm/scmi_shmem.c
index a63d96b64cb5..9bab4bc4004e 100644
--- a/sys/dev/firmware/arm/scmi_shmem.c
+++ b/sys/dev/firmware/arm/scmi_shmem.c
@@ -247,7 +247,7 @@ scmi_shmem_clear_channel(device_t dev)
}
int
-scmi_shmem_read_msg_header(device_t dev, uint32_t *msg_header, unsigned int *rx_len)
+scmi_shmem_read_msg_header(device_t dev, uint32_t *msg_header)
{
uint32_t length, header;
@@ -256,7 +256,6 @@ scmi_shmem_read_msg_header(device_t dev, uint32_t *msg_header, unsigned int *rx_
if (le32toh(length) < sizeof(header))
return (EINVAL);
- *rx_len = le32toh(length);
/* Read header. */
scmi_shmem_read(dev, SMT_OFFSET_MSG_HEADER, &header,
SMT_SIZE_MSG_HEADER);
@@ -267,11 +266,14 @@ scmi_shmem_read_msg_header(device_t dev, uint32_t *msg_header, unsigned int *rx_
}
int
-scmi_shmem_read_msg_payload(device_t dev, uint8_t *buf, uint32_t buf_len, uint32_t rx_len)
+scmi_shmem_read_msg_payload(device_t dev, uint8_t *buf, uint32_t buf_len)
{
- uint32_t payld_len;
+ uint32_t length, payld_len;
+
+ /* Read length. */
+ scmi_shmem_read(dev, SMT_OFFSET_LENGTH, &length, SMT_SIZE_LENGTH);
+ payld_len = le32toh(length) - SCMI_MSG_HDR_SIZE;
- payld_len = rx_len - SCMI_MSG_HDR_SIZE;
if (payld_len > buf_len) {
device_printf(dev,
"RX payload %dbytes exceeds buflen %dbytes. Truncate.\n",
@@ -294,7 +296,7 @@ scmi_shmem_tx_complete(device_t dev)
scmi_shmem_release_channel(sc);
}
-bool scmi_shmem_poll_msg(device_t dev, uint32_t *msg_header, uint32_t *rx_len)
+bool scmi_shmem_poll_msg(device_t dev, uint32_t *msg_header)
{
uint32_t status;
bool ret;
@@ -304,10 +306,12 @@ bool scmi_shmem_poll_msg(device_t dev, uint32_t *msg_header, uint32_t *rx_len)
ret = (status & (SCMI_SHMEM_CHAN_STAT_CHANNEL_ERROR |
SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE));
- if (ret == 0)
- return (ret);
- return (scmi_shmem_read_msg_header(dev, msg_header, rx_len));
+ if (ret)
+ scmi_shmem_read(dev, SMT_OFFSET_MSG_HEADER, msg_header,
+ SMT_SIZE_MSG_HEADER);
+
+ return (ret);
}
static device_method_t shmem_methods[] = {
diff --git a/sys/dev/firmware/arm/scmi_shmem.h b/sys/dev/firmware/arm/scmi_shmem.h
index bc8284502129..ed8763d5c145 100644
--- a/sys/dev/firmware/arm/scmi_shmem.h
+++ b/sys/dev/firmware/arm/scmi_shmem.h
@@ -63,9 +63,9 @@ struct scmi_smt_header {
device_t scmi_shmem_get(device_t sdev, phandle_t node, int index);
int scmi_shmem_prepare_msg(device_t dev, uint8_t *msg, uint32_t tx_len,
bool polling);
-bool scmi_shmem_poll_msg(device_t dev, uint32_t *msg_header, uint32_t *rx_len);
-int scmi_shmem_read_msg_header(device_t dev, uint32_t *msg_header, uint32_t *rx_len);
-int scmi_shmem_read_msg_payload(device_t dev, uint8_t *buf, uint32_t buf_len, uint32_t rx_len);
+bool scmi_shmem_poll_msg(device_t dev, uint32_t *msg_header);
+int scmi_shmem_read_msg_header(device_t dev, uint32_t *msg_header);
+int scmi_shmem_read_msg_payload(device_t dev, uint8_t *buf, uint32_t buf_len);
void scmi_shmem_tx_complete(device_t);
void scmi_shmem_clear_channel(device_t);
diff --git a/sys/dev/firmware/arm/scmi_smc.c b/sys/dev/firmware/arm/scmi_smc.c
index 81c66ad7bb46..9f0d899233fa 100644
--- a/sys/dev/firmware/arm/scmi_smc.c
+++ b/sys/dev/firmware/arm/scmi_smc.c
@@ -122,7 +122,7 @@ scmi_smc_poll_msg(device_t dev, struct scmi_msg *msg, unsigned int tmo)
* Nothing to poll since commands are completed as soon as smc
* returns ... but did we get back what we were poling for ?
*/
- scmi_shmem_read_msg_header(sc->a2p_dev, &msg->hdr, &msg->rx_len);
+ scmi_shmem_read_msg_header(sc->a2p_dev, &msg->hdr);
return (0);
}
@@ -136,7 +136,7 @@ scmi_smc_collect_reply(device_t dev, struct scmi_msg *msg)
sc = device_get_softc(dev);
ret = scmi_shmem_read_msg_payload(sc->a2p_dev,
- msg->payld, msg->rx_len - SCMI_MSG_HDR_SIZE, msg->rx_len);
+ msg->payld, msg->rx_len - SCMI_MSG_HDR_SIZE);
return (ret);
}
diff --git a/sys/dev/firmware/arm/scmi_virtio.c b/sys/dev/firmware/arm/scmi_virtio.c
index 8714fee2ec87..12cbb9ecefd5 100644
--- a/sys/dev/firmware/arm/scmi_virtio.c
+++ b/sys/dev/firmware/arm/scmi_virtio.c
@@ -76,7 +76,7 @@ scmi_virtio_callback(void *msg, unsigned int len, void *priv)
}
hdr = le32toh(*((uint32_t *)msg));
- scmi_rx_irq_callback(sc->base.dev, msg, hdr, len);
+ scmi_rx_irq_callback(sc->base.dev, msg, hdr);
}
static void *
@@ -225,6 +225,7 @@ scmi_virtio_poll_msg(device_t dev, struct scmi_msg *msg, unsigned int tmo_ms)
}
rx_msg = hdr_to_msg(rx_buf);
+ rx_msg->rx_len = rx_len;
/* Complete the polling on any poll path */
if (rx_msg->polling)
atomic_store_rel_int(&rx_msg->poll_done, 1);
@@ -241,7 +242,7 @@ scmi_virtio_poll_msg(device_t dev, struct scmi_msg *msg, unsigned int tmo_ms)
rx_msg->hdr, rx_msg->polling);
if (!rx_msg->polling)
- scmi_rx_irq_callback(sc->base.dev, rx_msg, rx_msg->hdr, rx_len);
+ scmi_rx_irq_callback(sc->base.dev, rx_msg, rx_msg->hdr);
}
return (tmo_loops > 0 ? 0 : ETIMEDOUT);