Skip to content

Commit e91408e

Browse files
marcanopsiff
authored andcommitted
soc: apple: rtkit: Implement OSLog buffers properly
[ Upstream commit a063986 ] 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> Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Link: https://lore.kernel.org/r/20250226-apple-soc-misc-v2-2-c3ec37f9021b@svenpeter.dev Signed-off-by: Sven Peter <sven@svenpeter.dev> Signed-off-by: Sasha Levin <sashal@kernel.org> (cherry picked from commit c7c729d7a85a94cee1aeba4df459a0cd30db6171)
1 parent bdd418c commit e91408e

2 files changed

Lines changed: 35 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
@@ -48,6 +48,7 @@ struct apple_rtkit {
4848

4949
struct apple_rtkit_shmem ioreport_buffer;
5050
struct apple_rtkit_shmem crashlog_buffer;
51+
struct apple_rtkit_shmem oslog_buffer;
5152

5253
struct apple_rtkit_shmem syslog_buffer;
5354
char *syslog_msg_buffer;

drivers/soc/apple/rtkit.c

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

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

7273
#define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
7374
#define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
@@ -256,15 +257,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
256257
struct apple_rtkit_shmem *buffer,
257258
u8 ep, u64 msg)
258259
{
259-
size_t n_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg);
260260
u64 reply;
261261
int err;
262262

263+
/* The different size vs. IOVA shifts look odd but are indeed correct this way */
264+
if (ep == APPLE_RTKIT_EP_OSLOG) {
265+
buffer->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg);
266+
buffer->iova = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg) << 12;
267+
} else {
268+
buffer->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg) << 12;
269+
buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg);
270+
}
271+
263272
buffer->buffer = NULL;
264273
buffer->iomem = NULL;
265274
buffer->is_mapped = false;
266-
buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg);
267-
buffer->size = n_4kpages << 12;
268275

269276
dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n",
270277
buffer->size, &buffer->iova);
@@ -289,11 +296,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
289296
}
290297

291298
if (!buffer->is_mapped) {
292-
reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE,
293-
APPLE_RTKIT_BUFFER_REQUEST);
294-
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, n_4kpages);
295-
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA,
296-
buffer->iova);
299+
/* oslog uses different fields and needs a shifted IOVA instead of size */
300+
if (ep == APPLE_RTKIT_EP_OSLOG) {
301+
reply = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE,
302+
APPLE_RTKIT_OSLOG_BUFFER_REQUEST);
303+
reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buffer->size);
304+
reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA,
305+
buffer->iova >> 12);
306+
} else {
307+
reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE,
308+
APPLE_RTKIT_BUFFER_REQUEST);
309+
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE,
310+
buffer->size >> 12);
311+
reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA,
312+
buffer->iova);
313+
}
297314
apple_rtkit_send_message(rtk, ep, reply, NULL, false);
298315
}
299316

@@ -487,25 +504,18 @@ static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg)
487504
}
488505
}
489506

490-
static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg)
491-
{
492-
u64 ack;
493-
494-
dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg);
495-
ack = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, APPLE_RTKIT_OSLOG_ACK);
496-
apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false);
497-
}
498-
499507
static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg)
500508
{
501509
u8 type = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg);
502510

503511
switch (type) {
504-
case APPLE_RTKIT_OSLOG_INIT:
505-
apple_rtkit_oslog_rx_init(rtk, msg);
512+
case APPLE_RTKIT_OSLOG_BUFFER_REQUEST:
513+
apple_rtkit_common_rx_get_buffer(rtk, &rtk->oslog_buffer,
514+
APPLE_RTKIT_EP_OSLOG, msg);
506515
break;
507516
default:
508-
dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg);
517+
dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n",
518+
msg);
509519
}
510520
}
511521

@@ -787,6 +797,7 @@ int apple_rtkit_reinit(struct apple_rtkit *rtk)
787797

788798
apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
789799
apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
800+
apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer);
790801
apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
791802

792803
kfree(rtk->syslog_msg_buffer);
@@ -967,6 +978,7 @@ void apple_rtkit_free(struct apple_rtkit *rtk)
967978

968979
apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
969980
apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
981+
apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer);
970982
apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
971983

972984
kfree(rtk->syslog_msg_buffer);

0 commit comments

Comments
 (0)