Skip to content

Commit 3f778b8

Browse files
marcanjannau
authored andcommitted
soc: apple: rtkit: Implement OSLog buffers properly
Apparently nobody can figure out where the old logic came from, but it seems like it has never been actually used on any supported firmware to this day. OSLog buffers were apparently never requested. But starting with 13.3, we actually need this implemented properly for MTP (and later AOP) to work, so let's actually do that. Signed-off-by: Hector Martin <marcan@marcan.st>
1 parent dd0b4bf commit 3f778b8

2 files changed

Lines changed: 34 additions & 22 deletions

File tree

drivers/soc/apple/rtkit-internal.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ struct apple_rtkit {
4444

4545
struct apple_rtkit_shmem ioreport_buffer;
4646
struct apple_rtkit_shmem crashlog_buffer;
47+
struct apple_rtkit_shmem oslog_buffer;
4748

4849
struct apple_rtkit_shmem syslog_buffer;
4950
char *syslog_msg_buffer;

drivers/soc/apple/rtkit.c

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ enum {
6767
#define APPLE_RTKIT_SYSLOG_MSG_SIZE GENMASK_ULL(31, 24)
6868

6969
#define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
70-
#define APPLE_RTKIT_OSLOG_INIT 1
71-
#define APPLE_RTKIT_OSLOG_ACK 3
70+
#define APPLE_RTKIT_OSLOG_BUFFER_REQUEST 1
71+
#define APPLE_RTKIT_OSLOG_SIZE GENMASK_ULL(55, 36)
72+
#define APPLE_RTKIT_OSLOG_IOVA GENMASK_ULL(35, 0)
7273

7374
#define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
7475
#define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
@@ -260,15 +261,20 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
260261
struct apple_rtkit_shmem *buffer,
261262
u8 ep, u64 msg)
262263
{
263-
size_t n_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg);
264264
u64 reply;
265265
int err;
266266

267+
if (ep == APPLE_RTKIT_EP_OSLOG) {
268+
buffer->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg);
269+
buffer->iova = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg) << 12;
270+
} else {
271+
buffer->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg) << 12;
272+
buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg);
273+
}
274+
267275
buffer->buffer = NULL;
268276
buffer->iomem = NULL;
269277
buffer->is_mapped = false;
270-
buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg);
271-
buffer->size = n_4kpages << 12;
272278

273279
dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n",
274280
buffer->size, &buffer->iova);
@@ -293,11 +299,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
293299
}
294300

295301
if (!buffer->is_mapped) {
296-
reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE,
297-
APPLE_RTKIT_BUFFER_REQUEST);
298-
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, n_4kpages);
299-
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA,
300-
buffer->iova);
302+
/* oslog uses different fields */
303+
if (ep == APPLE_RTKIT_EP_OSLOG) {
304+
reply = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE,
305+
APPLE_RTKIT_OSLOG_BUFFER_REQUEST);
306+
reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buffer->size);
307+
reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA,
308+
buffer->iova >> 12);
309+
} else {
310+
reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE,
311+
APPLE_RTKIT_BUFFER_REQUEST);
312+
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE,
313+
buffer->size >> 12);
314+
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA,
315+
buffer->iova);
316+
}
301317
apple_rtkit_send_message(rtk, ep, reply, NULL, false);
302318
}
303319

@@ -494,25 +510,18 @@ static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg)
494510
}
495511
}
496512

497-
static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg)
498-
{
499-
u64 ack;
500-
501-
dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg);
502-
ack = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, APPLE_RTKIT_OSLOG_ACK);
503-
apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false);
504-
}
505-
506513
static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg)
507514
{
508515
u8 type = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg);
509516

510517
switch (type) {
511-
case APPLE_RTKIT_OSLOG_INIT:
512-
apple_rtkit_oslog_rx_init(rtk, msg);
518+
case APPLE_RTKIT_OSLOG_BUFFER_REQUEST:
519+
apple_rtkit_common_rx_get_buffer(rtk, &rtk->oslog_buffer,
520+
APPLE_RTKIT_EP_OSLOG, msg);
513521
break;
514522
default:
515-
dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg);
523+
dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n",
524+
msg);
516525
}
517526
}
518527

@@ -729,6 +738,7 @@ int apple_rtkit_reinit(struct apple_rtkit *rtk)
729738

730739
apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
731740
apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
741+
apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer);
732742
apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
733743

734744
kfree(rtk->syslog_msg_buffer);
@@ -916,6 +926,7 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
916926

917927
apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
918928
apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
929+
apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer);
919930
apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
920931

921932
kfree(rtk->syslog_msg_buffer);

0 commit comments

Comments
 (0)