Message ID | 20250226-apple-soc-misc-v2-2-c3ec37f9021b@svenpeter.dev (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Miscellaneous Apple RTKit fixes | expand |
Reviewed-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Le Wed , Feb 26, 2025 at 07:00:04PM +0000, Sven Peter via B4 Relay a écrit : > From: Hector Martin <marcan@marcan.st> > > 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> > Signed-off-by: Sven Peter <sven@svenpeter.dev> > --- > drivers/soc/apple/rtkit-internal.h | 1 + > drivers/soc/apple/rtkit.c | 56 +++++++++++++++++++++++--------------- > 2 files changed, 35 insertions(+), 22 deletions(-) > > diff --git a/drivers/soc/apple/rtkit-internal.h b/drivers/soc/apple/rtkit-internal.h > index 27c9fa745fd5..b8d5244678f0 100644 > --- a/drivers/soc/apple/rtkit-internal.h > +++ b/drivers/soc/apple/rtkit-internal.h > @@ -44,6 +44,7 @@ struct apple_rtkit { > > struct apple_rtkit_shmem ioreport_buffer; > struct apple_rtkit_shmem crashlog_buffer; > + struct apple_rtkit_shmem oslog_buffer; > > struct apple_rtkit_shmem syslog_buffer; > char *syslog_msg_buffer; > diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c > index be0d08861168..7e7b4f64ab17 100644 > --- a/drivers/soc/apple/rtkit.c > +++ b/drivers/soc/apple/rtkit.c > @@ -67,8 +67,9 @@ enum { > #define APPLE_RTKIT_SYSLOG_MSG_SIZE GENMASK_ULL(31, 24) > > #define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56) > -#define APPLE_RTKIT_OSLOG_INIT 1 > -#define APPLE_RTKIT_OSLOG_ACK 3 > +#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 > @@ -259,15 +260,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk, > struct apple_rtkit_shmem *buffer, > u8 ep, u64 msg) > { > - size_t n_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg); > u64 reply; > int err; > > + /* The different size vs. IOVA shifts look odd but are indeed correct this way */ > + if (ep == APPLE_RTKIT_EP_OSLOG) { > + buffer->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg); > + buffer->iova = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg) << 12; > + } else { > + buffer->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg) << 12; > + buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg); > + } > + > buffer->buffer = NULL; > buffer->iomem = NULL; > buffer->is_mapped = false; > - buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg); > - buffer->size = n_4kpages << 12; > > dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n", > buffer->size, &buffer->iova); > @@ -292,11 +299,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk, > } > > if (!buffer->is_mapped) { > - reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE, > - APPLE_RTKIT_BUFFER_REQUEST); > - reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, n_4kpages); > - reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, > - buffer->iova); > + /* oslog uses different fields and needs a shifted IOVA instead of size */ > + if (ep == APPLE_RTKIT_EP_OSLOG) { > + reply = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, > + APPLE_RTKIT_OSLOG_BUFFER_REQUEST); > + reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buffer->size); > + reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA, > + buffer->iova >> 12); > + } else { > + reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE, > + APPLE_RTKIT_BUFFER_REQUEST); > + reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, > + buffer->size >> 12); > + reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, > + buffer->iova); > + } > apple_rtkit_send_message(rtk, ep, reply, NULL, false); > } > > @@ -494,25 +511,18 @@ static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg) > } > } > > -static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg) > -{ > - u64 ack; > - > - dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg); > - ack = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, APPLE_RTKIT_OSLOG_ACK); > - apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false); > -} > - > static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg) > { > u8 type = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg); > > switch (type) { > - case APPLE_RTKIT_OSLOG_INIT: > - apple_rtkit_oslog_rx_init(rtk, msg); > + case APPLE_RTKIT_OSLOG_BUFFER_REQUEST: > + apple_rtkit_common_rx_get_buffer(rtk, &rtk->oslog_buffer, > + APPLE_RTKIT_EP_OSLOG, msg); > break; > default: > - dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg); > + dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", > + msg); > } > } > > @@ -729,6 +739,7 @@ int apple_rtkit_reinit(struct apple_rtkit *rtk) > > apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); > apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer); > + apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer); > apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer); > > kfree(rtk->syslog_msg_buffer); > @@ -916,6 +927,7 @@ void apple_rtkit_free(struct apple_rtkit *rtk) > > apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); > apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer); > + apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer); > apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer); > > kfree(rtk->syslog_msg_buffer); > > -- > 2.34.1 > >
diff --git a/drivers/soc/apple/rtkit-internal.h b/drivers/soc/apple/rtkit-internal.h index 27c9fa745fd5..b8d5244678f0 100644 --- a/drivers/soc/apple/rtkit-internal.h +++ b/drivers/soc/apple/rtkit-internal.h @@ -44,6 +44,7 @@ struct apple_rtkit { struct apple_rtkit_shmem ioreport_buffer; struct apple_rtkit_shmem crashlog_buffer; + struct apple_rtkit_shmem oslog_buffer; struct apple_rtkit_shmem syslog_buffer; char *syslog_msg_buffer; diff --git a/drivers/soc/apple/rtkit.c b/drivers/soc/apple/rtkit.c index be0d08861168..7e7b4f64ab17 100644 --- a/drivers/soc/apple/rtkit.c +++ b/drivers/soc/apple/rtkit.c @@ -67,8 +67,9 @@ enum { #define APPLE_RTKIT_SYSLOG_MSG_SIZE GENMASK_ULL(31, 24) #define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56) -#define APPLE_RTKIT_OSLOG_INIT 1 -#define APPLE_RTKIT_OSLOG_ACK 3 +#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 @@ -259,15 +260,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk, struct apple_rtkit_shmem *buffer, u8 ep, u64 msg) { - size_t n_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg); u64 reply; int err; + /* The different size vs. IOVA shifts look odd but are indeed correct this way */ + if (ep == APPLE_RTKIT_EP_OSLOG) { + buffer->size = FIELD_GET(APPLE_RTKIT_OSLOG_SIZE, msg); + buffer->iova = FIELD_GET(APPLE_RTKIT_OSLOG_IOVA, msg) << 12; + } else { + buffer->size = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg) << 12; + buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg); + } + buffer->buffer = NULL; buffer->iomem = NULL; buffer->is_mapped = false; - buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg); - buffer->size = n_4kpages << 12; dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n", buffer->size, &buffer->iova); @@ -292,11 +299,21 @@ static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk, } if (!buffer->is_mapped) { - reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE, - APPLE_RTKIT_BUFFER_REQUEST); - reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, n_4kpages); - reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, - buffer->iova); + /* oslog uses different fields and needs a shifted IOVA instead of size */ + if (ep == APPLE_RTKIT_EP_OSLOG) { + reply = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, + APPLE_RTKIT_OSLOG_BUFFER_REQUEST); + reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_SIZE, buffer->size); + reply |= FIELD_PREP(APPLE_RTKIT_OSLOG_IOVA, + buffer->iova >> 12); + } else { + reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE, + APPLE_RTKIT_BUFFER_REQUEST); + reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, + buffer->size >> 12); + reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA, + buffer->iova); + } apple_rtkit_send_message(rtk, ep, reply, NULL, false); } @@ -494,25 +511,18 @@ static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg) } } -static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg) -{ - u64 ack; - - dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg); - ack = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, APPLE_RTKIT_OSLOG_ACK); - apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false); -} - static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg) { u8 type = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg); switch (type) { - case APPLE_RTKIT_OSLOG_INIT: - apple_rtkit_oslog_rx_init(rtk, msg); + case APPLE_RTKIT_OSLOG_BUFFER_REQUEST: + apple_rtkit_common_rx_get_buffer(rtk, &rtk->oslog_buffer, + APPLE_RTKIT_EP_OSLOG, msg); break; default: - dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg); + dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", + msg); } } @@ -729,6 +739,7 @@ int apple_rtkit_reinit(struct apple_rtkit *rtk) apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer); + apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer); apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer); kfree(rtk->syslog_msg_buffer); @@ -916,6 +927,7 @@ void apple_rtkit_free(struct apple_rtkit *rtk) apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer); apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer); + apple_rtkit_free_buffer(rtk, &rtk->oslog_buffer); apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer); kfree(rtk->syslog_msg_buffer);