The branch main has been updated by andrew: URL: https://cgit.FreeBSD.org/src/commit/?id=d49ed3608010681a5d1958b6499b336d48ec0dcc
commit d49ed3608010681a5d1958b6499b336d48ec0dcc Author: Andrew Turner <and...@freebsd.org> AuthorDate: 2025-06-09 13:21:52 +0000 Commit: Andrew Turner <and...@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);