Skip to content

Commit 00bcf78

Browse files
marcankettenis
authored andcommitted
arm: apple: rtkit: Add OSLog buffer support
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 <[email protected]>
1 parent b6faea1 commit 00bcf78

File tree

1 file changed

+56
-13
lines changed

1 file changed

+56
-13
lines changed

arch/arm/mach-apple/rtkit.c

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#define APPLE_RTKIT_EP_SYSLOG 2
2020
#define APPLE_RTKIT_EP_DEBUG 3
2121
#define APPLE_RTKIT_EP_IOREPORT 4
22+
#define APPLE_RTKIT_EP_OSLOG 8
2223
#define APPLE_RTKIT_EP_TRACEKIT 10
2324

2425
/* Messages for management endpoint. */
@@ -47,6 +48,11 @@
4748
#define APPLE_RTKIT_MGMT_EPMAP_REPLY 8
4849
#define APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE BIT(0)
4950

51+
#define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
52+
#define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1
53+
#define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36)
54+
#define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0)
55+
5056
#define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
5157
#define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
5258

@@ -66,6 +72,7 @@ struct apple_rtkit {
6672
struct apple_rtkit_buffer syslog_buffer;
6773
struct apple_rtkit_buffer crashlog_buffer;
6874
struct apple_rtkit_buffer ioreport_buffer;
75+
struct apple_rtkit_buffer oslog_buffer;
6976

7077
int iop_pwr;
7178
int ap_pwr;
@@ -98,30 +105,26 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
98105
rtk->shmem_destroy(rtk->cookie, &rtk->crashlog_buffer);
99106
if (rtk->ioreport_buffer.buffer)
100107
rtk->shmem_destroy(rtk->cookie, &rtk->ioreport_buffer);
108+
if (rtk->oslog_buffer.buffer)
109+
rtk->shmem_destroy(rtk->cookie, &rtk->oslog_buffer);
101110
} else {
102111
if (rtk->syslog_buffer.buffer)
103112
free(rtk->syslog_buffer.buffer);
104113
if (rtk->crashlog_buffer.buffer)
105114
free(rtk->crashlog_buffer.buffer);
106115
if (rtk->ioreport_buffer.buffer)
107116
free(rtk->ioreport_buffer.buffer);
117+
if (rtk->oslog_buffer.buffer)
118+
free(rtk->oslog_buffer.buffer);
108119
}
109120
free(rtk);
110121
}
111122

112123
static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct apple_mbox_msg *msg)
113124
{
114125
struct apple_rtkit_buffer *buf;
115-
size_t num_4kpages;
116126
int ret;
117127

118-
num_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0);
119-
120-
if (num_4kpages == 0) {
121-
printf("%s: unexpected request for buffer without size\n", __func__);
122-
return -1;
123-
}
124-
125128
switch (endpoint) {
126129
case APPLE_RTKIT_EP_CRASHLOG:
127130
buf = &rtk->crashlog_buffer;
@@ -132,13 +135,31 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
132135
case APPLE_RTKIT_EP_IOREPORT:
133136
buf = &rtk->ioreport_buffer;
134137
break;
138+
case APPLE_RTKIT_EP_OSLOG:
139+
buf = &rtk->oslog_buffer;
140+
break;
135141
default:
136142
printf("%s: unexpected endpoint %d\n", __func__, endpoint);
137143
return -1;
138144
}
139145

146+
switch (endpoint) {
147+
case APPLE_RTKIT_EP_OSLOG:
148+
buf->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg->msg0);
149+
buf->dva = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg->msg0 << 12);
150+
break;
151+
default:
152+
buf->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg->msg0) << 12;
153+
buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0);
154+
break;
155+
}
156+
157+
if (buf->size == 0) {
158+
printf("%s: unexpected request for buffer without size\n", __func__);
159+
return -1;
160+
}
161+
140162
buf->dva = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg->msg0);
141-
buf->size = num_4kpages << 12;
142163
buf->is_mapped = !!buf->dva;
143164

144165
if (rtk->shmem_setup) {
@@ -157,10 +178,18 @@ static int rtkit_handle_buf_req(struct apple_rtkit *rtk, int endpoint, struct ap
157178
}
158179

159180
if (!buf->is_mapped) {
160-
msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE, APPLE_RTKIT_BUFFER_REQUEST) |
161-
FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, num_4kpages) |
162-
FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva);
163-
msg->msg1 = endpoint;
181+
/* oslog uses different fields */
182+
if (endpoint == APPLE_RTKIT_EP_OSLOG) {
183+
msg->msg0 = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE,
184+
APPLE_RTKIT_OSLOG_BUFFER_REQUEST);
185+
msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buf->size);
186+
msg->msg0 |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA, buf->dva >> 12);
187+
} else {
188+
msg->msg0 = FIELD_PREP(APPLE_RTKIT_MGMT_TYPE,
189+
APPLE_RTKIT_BUFFER_REQUEST);
190+
msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, buf->size >> 12);
191+
msg->msg0 |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, buf->dva);
192+
}
164193

165194
return mbox_send(rtk->chan, msg);
166195
}
@@ -193,6 +222,20 @@ int apple_rtkit_poll(struct apple_rtkit *rtk, ulong timeout)
193222
}
194223
}
195224

225+
if (endpoint == APPLE_RTKIT_EP_OSLOG) {
226+
msgtype = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg.msg0);
227+
228+
if (msgtype == APPLE_RTKIT_OSLOG_BUFFER_REQUEST) {
229+
ret = rtkit_handle_buf_req(rtk, endpoint, &msg);
230+
if (ret < 0)
231+
return ret;
232+
return 0;
233+
} else {
234+
/* Ignore */
235+
return 0;
236+
}
237+
}
238+
196239
if (endpoint == APPLE_RTKIT_EP_IOREPORT) {
197240
// these two messages have to be ack-ed for proper startup
198241
if (msgtype == 0xc || msgtype == 0x8) {

0 commit comments

Comments
 (0)