Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F144549015
D43042.1775372290.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D43042.1775372290.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D43042: scmi: Fix SCMI mailbox polling mechanism
Attached
Detach File
Event Timeline
Log In to Comment