[PATCH 4/6] arm: apple: rtkit: Add OSLog buffer support
Mark Kettenis
kettenis at openbsd.org
Sun Apr 20 13:58:06 CEST 2025
From: Hector Martin <marcan at marcan.st>
This will work for u-boot itself, but needs a special workaround in the
MTP driver for Linux handoff to work.
Signed-off-by: Hector Martin <marcan at marcan.st>
Signed-off-by: Mark Kettenis <kettenis at openbsd.org>
---
arch/arm/mach-apple/rtkit.c | 69 ++++++++++++++++++++++++++++++-------
1 file changed, 56 insertions(+), 13 deletions(-)
diff --git a/arch/arm/mach-apple/rtkit.c b/arch/arm/mach-apple/rtkit.c
index 5e8e282ec0e..d294ee09350 100644
--- a/arch/arm/mach-apple/rtkit.c
+++ b/arch/arm/mach-apple/rtkit.c
@@ -19,6 +19,7 @@
#define APPLE_RTKIT_EP_SYSLOG 2
#define APPLE_RTKIT_EP_DEBUG 3
#define APPLE_RTKIT_EP_IOREPORT 4
+#define APPLE_RTKIT_EP_OSLOG 8
#define APPLE_RTKIT_EP_TRACEKIT 10
/* Messages for management endpoint. */
@@ -47,6 +48,11 @@
#define APPLE_RTKIT_MGMT_EPMAP_REPLY 8
#define APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE BIT(0)
+#define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
+#define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1
+#define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36)
+#define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0)
+
#define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
#define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
@@ -66,6 +72,7 @@ struct apple_rtkit {
struct apple_rtkit_buffer syslog_buffer;
struct apple_rtkit_buffer crashlog_buffer;
struct apple_rtkit_buffer ioreport_buffer;
+ struct apple_rtkit_buffer oslog_buffer;
int iop_pwr;
int ap_pwr;
@@ -98,6 +105,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
rtk->shmem_destroy(rtk->cookie, &rtk->crashlog_buffer);
if (rtk->ioreport_buffer.buffer)
rtk->shmem_destroy(rtk->cookie, &rtk->ioreport_buffer);
+ if (rtk->oslog_buffer.buffer)
+ rtk->shmem_destroy(rtk->cookie, &rtk->oslog_buffer);
} else {
if (rtk->syslog_buffer.buffer)
free(rtk->syslog_buffer.buffer);
@@ -105,6 +114,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
free(rtk->crashlog_buffer.buffer);
if (rtk->ioreport_buffer.buffer)
free(rtk->ioreport_buffer.buffer);
+ if (rtk->oslog_buffer.buffer)
+ free(rtk->oslog_buffer.buffer);
}
free(rtk);
}
@@ -112,16 +123,8 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct apple_mbox_msg *msg)
{
struct apple_rtkit_buffer *buf;
- size_t num_4kpages;
int ret;
- num_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0);
-
- if (num_4kpages == 0) {
- printf("%s: unexpected request for buffer without size\n", __func__);
- return -1;
- }
-
switch (endpoint) {
case APPLE_RTKIT_EP_CRASHLOG:
buf = &rtk->crashlog_buffer;
@@ -132,13 +135,31 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
case APPLE_RTKIT_EP_IOREPORT:
buf = &rtk->ioreport_buffer;
break;
+ case APPLE_RTKIT_EP_OSLOG:
+ buf = &rtk->oslog_buffer;
+ break;
default:
printf("%s: unexpected endpoint %d\n", __func__, endpoint);
return -1;
}
+ switch (endpoint) {
+ case APPLE_RTKIT_EP_OSLOG:
+ buf->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg->msg0);
+ buf->dva = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg->msg0 << 12);
+ break;
+ default:
+ buf->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0) << 12;
+ buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0);
+ break;
+ }
+
+ if (buf->size == 0) {
+ printf("%s: unexpected request for buffer without size\n", __func__);
+ return -1;
+ }
+
buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0);
- buf->size = num_4kpages << 12;
buf->is_mapped = !!buf->dva;
if (rtk->shmem_setup) {
@@ -157,10 +178,18 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
}
if (!buf->is_mapped) {
- msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE, APPLE_RTKIT_BUFFER_REQUEST) |
- FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, num_4kpages) |
- FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva);
- msg->msg1 = endpoint;
+ /* oslog uses different fields */
+ if (endpoint == APPLE_RTKIT_EP_OSLOG) {
+ msg->msg0 = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE,
+ APPLE_RTKIT_OSLOG_BUFFER_REQUEST);
+ msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buf->size);
+ msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA, buf->dva >> 12);
+ } else {
+ msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE,
+ APPLE_RTKIT_BUFFER_REQUEST);
+ msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, buf->size >> 12);
+ msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva);
+ }
return mbox_send(rtk->chan, msg);
}
@@ -193,6 +222,20 @@ int apple_rtkit_poll(struct apple_rtkit *rtk, ulong timeout)
}
}
+ if (endpoint == APPLE_RTKIT_EP_OSLOG) {
+ msgtype = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg.msg0);
+
+ if (msgtype == APPLE_RTKIT_OSLOG_BUFFER_REQUEST) {
+ ret = rtkit_handle_buf_req(rtk, endpoint, &msg);
+ if (ret < 0)
+ return ret;
+ return 0;
+ } else {
+ /* Ignore */
+ return 0;
+ }
+ }
+
if (endpoint == APPLE_RTKIT_EP_IOREPORT) {
// these two messages have to be ack-ed for proper startup
if (msgtype == 0xc || msgtype == 0x8) {
--
2.49.0
More information about the U-Boot
mailing list