Page MenuHomeFreeBSD

D43042.1775372290.diff
No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None

D43042.1775372290.diff

diff --git a/sys/dev/firmware/arm/scmi.c b/sys/dev/firmware/arm/scmi.c
--- a/sys/dev/firmware/arm/scmi.c
+++ b/sys/dev/firmware/arm/scmi.c
@@ -85,7 +85,7 @@
req->msg_header |= SCMI_MSG_TYPE_CMD << SCMI_HDR_MESSAGE_TYPE_S;
req->msg_header |= req->protocol_id << SCMI_HDR_PROTOCOL_ID_S;
- ret = scmi_shmem_prepare_msg(sc->a2p_dev, req);
+ ret = scmi_shmem_prepare_msg(sc->a2p_dev, req, cold);
if (ret != 0)
return (ret);
diff --git a/sys/dev/firmware/arm/scmi_mailbox.c b/sys/dev/firmware/arm/scmi_mailbox.c
--- a/sys/dev/firmware/arm/scmi_mailbox.c
+++ b/sys/dev/firmware/arm/scmi_mailbox.c
@@ -49,6 +49,7 @@
#include "scmi.h"
#include "scmi_protocols.h"
+#include "scmi_shmem.h"
struct scmi_mailbox_softc {
struct scmi_softc base;
@@ -91,7 +92,7 @@
do {
if (cold) {
- if (arm_doorbell_get(sc->db))
+ if (scmi_shmem_poll_msg(sc->base.a2p_dev))
break;
DELAY(10000);
} else {
diff --git a/sys/dev/firmware/arm/scmi_shmem.h b/sys/dev/firmware/arm/scmi_shmem.h
--- a/sys/dev/firmware/arm/scmi_shmem.h
+++ b/sys/dev/firmware/arm/scmi_shmem.h
@@ -63,7 +63,9 @@
struct scmi_req;
device_t scmi_shmem_get(device_t sdev, phandle_t node, int index);
-int scmi_shmem_prepare_msg(device_t dev, struct scmi_req *req);
+int scmi_shmem_prepare_msg(device_t dev, struct scmi_req *req,
+ bool polling);
+bool scmi_shmem_poll_msg(device_t);
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);
diff --git a/sys/dev/firmware/arm/scmi_shmem.c b/sys/dev/firmware/arm/scmi_shmem.c
--- a/sys/dev/firmware/arm/scmi_shmem.c
+++ b/sys/dev/firmware/arm/scmi_shmem.c
@@ -168,7 +168,7 @@
}
int
-scmi_shmem_prepare_msg(device_t dev, struct scmi_req *req)
+scmi_shmem_prepare_msg(device_t dev, struct scmi_req *req, bool polling)
{
struct scmi_smt_header hdr = {};
uint32_t channel_status;
@@ -185,7 +185,10 @@
hdr.channel_status &= ~SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE;
hdr.msg_header = htole32(req->msg_header);
hdr.length = htole32(sizeof(req->msg_header) + req->in_size);
- hdr.flags |= SCMI_SHMEM_FLAG_INTR_ENABLED;
+ if (!polling)
+ hdr.flags |= SCMI_SHMEM_FLAG_INTR_ENABLED;
+ else
+ hdr.flags &= ~SCMI_SHMEM_FLAG_INTR_ENABLED;
/* Write header */
scmi_shmem_write(dev, 0, &hdr, SMT_SIZE_HEADER);
@@ -239,6 +242,17 @@
return (0);
}
+bool scmi_shmem_poll_msg(device_t dev)
+{
+ uint32_t status;
+
+ scmi_shmem_read(dev, SMT_OFFSET_CHAN_STATUS, &status,
+ SMT_SIZE_CHAN_STATUS);
+
+ return (status & (SCMI_SHMEM_CHAN_STAT_CHANNEL_ERROR |
+ SCMI_SHMEM_CHAN_STAT_CHANNEL_FREE));
+}
+
static device_method_t shmem_methods[] = {
DEVMETHOD(device_probe, shmem_probe),
DEVMETHOD(device_attach, shmem_attach),

File Metadata

Mime Type
text/plain
Expires
Sun, Apr 5, 6:58 AM (14 h, 7 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28259068
Default Alt Text
D43042.1775372290.diff (2 KB)

Event Timeline