0001
0002
0003
0004
0005
0006
0007 #include "rtkit-internal.h"
0008
0009 enum {
0010 APPLE_RTKIT_PWR_STATE_OFF = 0x00,
0011 APPLE_RTKIT_PWR_STATE_SLEEP = 0x01,
0012 APPLE_RTKIT_PWR_STATE_QUIESCED = 0x10,
0013 APPLE_RTKIT_PWR_STATE_ON = 0x20,
0014 };
0015
0016 enum {
0017 APPLE_RTKIT_EP_MGMT = 0,
0018 APPLE_RTKIT_EP_CRASHLOG = 1,
0019 APPLE_RTKIT_EP_SYSLOG = 2,
0020 APPLE_RTKIT_EP_DEBUG = 3,
0021 APPLE_RTKIT_EP_IOREPORT = 4,
0022 APPLE_RTKIT_EP_OSLOG = 8,
0023 };
0024
0025 #define APPLE_RTKIT_MGMT_TYPE GENMASK_ULL(59, 52)
0026
0027 enum {
0028 APPLE_RTKIT_MGMT_HELLO = 1,
0029 APPLE_RTKIT_MGMT_HELLO_REPLY = 2,
0030 APPLE_RTKIT_MGMT_STARTEP = 5,
0031 APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE = 6,
0032 APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE_ACK = 7,
0033 APPLE_RTKIT_MGMT_EPMAP = 8,
0034 APPLE_RTKIT_MGMT_EPMAP_REPLY = 8,
0035 APPLE_RTKIT_MGMT_SET_AP_PWR_STATE = 0xb,
0036 APPLE_RTKIT_MGMT_SET_AP_PWR_STATE_ACK = 0xb,
0037 };
0038
0039 #define APPLE_RTKIT_MGMT_HELLO_MINVER GENMASK_ULL(15, 0)
0040 #define APPLE_RTKIT_MGMT_HELLO_MAXVER GENMASK_ULL(31, 16)
0041
0042 #define APPLE_RTKIT_MGMT_EPMAP_LAST BIT_ULL(51)
0043 #define APPLE_RTKIT_MGMT_EPMAP_BASE GENMASK_ULL(34, 32)
0044 #define APPLE_RTKIT_MGMT_EPMAP_BITMAP GENMASK_ULL(31, 0)
0045
0046 #define APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE BIT_ULL(0)
0047
0048 #define APPLE_RTKIT_MGMT_STARTEP_EP GENMASK_ULL(39, 32)
0049 #define APPLE_RTKIT_MGMT_STARTEP_FLAG BIT_ULL(1)
0050
0051 #define APPLE_RTKIT_MGMT_PWR_STATE GENMASK_ULL(15, 0)
0052
0053 #define APPLE_RTKIT_CRASHLOG_CRASH 1
0054
0055 #define APPLE_RTKIT_BUFFER_REQUEST 1
0056 #define APPLE_RTKIT_BUFFER_REQUEST_SIZE GENMASK_ULL(51, 44)
0057 #define APPLE_RTKIT_BUFFER_REQUEST_IOVA GENMASK_ULL(41, 0)
0058
0059 #define APPLE_RTKIT_SYSLOG_TYPE GENMASK_ULL(59, 52)
0060
0061 #define APPLE_RTKIT_SYSLOG_LOG 5
0062
0063 #define APPLE_RTKIT_SYSLOG_INIT 8
0064 #define APPLE_RTKIT_SYSLOG_N_ENTRIES GENMASK_ULL(7, 0)
0065 #define APPLE_RTKIT_SYSLOG_MSG_SIZE GENMASK_ULL(31, 24)
0066
0067 #define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
0068 #define APPLE_RTKIT_OSLOG_INIT 1
0069 #define APPLE_RTKIT_OSLOG_ACK 3
0070
0071 #define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
0072 #define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
0073
0074 struct apple_rtkit_msg {
0075 struct completion *completion;
0076 struct apple_mbox_msg mbox_msg;
0077 };
0078
0079 struct apple_rtkit_rx_work {
0080 struct apple_rtkit *rtk;
0081 u8 ep;
0082 u64 msg;
0083 struct work_struct work;
0084 };
0085
0086 bool apple_rtkit_is_running(struct apple_rtkit *rtk)
0087 {
0088 if (rtk->crashed)
0089 return false;
0090 if ((rtk->iop_power_state & 0xff) != APPLE_RTKIT_PWR_STATE_ON)
0091 return false;
0092 if ((rtk->ap_power_state & 0xff) != APPLE_RTKIT_PWR_STATE_ON)
0093 return false;
0094 return true;
0095 }
0096 EXPORT_SYMBOL_GPL(apple_rtkit_is_running);
0097
0098 bool apple_rtkit_is_crashed(struct apple_rtkit *rtk)
0099 {
0100 return rtk->crashed;
0101 }
0102 EXPORT_SYMBOL_GPL(apple_rtkit_is_crashed);
0103
0104 static void apple_rtkit_management_send(struct apple_rtkit *rtk, u8 type,
0105 u64 msg)
0106 {
0107 msg &= ~APPLE_RTKIT_MGMT_TYPE;
0108 msg |= FIELD_PREP(APPLE_RTKIT_MGMT_TYPE, type);
0109 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_MGMT, msg, NULL, false);
0110 }
0111
0112 static void apple_rtkit_management_rx_hello(struct apple_rtkit *rtk, u64 msg)
0113 {
0114 u64 reply;
0115
0116 int min_ver = FIELD_GET(APPLE_RTKIT_MGMT_HELLO_MINVER, msg);
0117 int max_ver = FIELD_GET(APPLE_RTKIT_MGMT_HELLO_MAXVER, msg);
0118 int want_ver = min(APPLE_RTKIT_MAX_SUPPORTED_VERSION, max_ver);
0119
0120 dev_dbg(rtk->dev, "RTKit: Min ver %d, max ver %d\n", min_ver, max_ver);
0121
0122 if (min_ver > APPLE_RTKIT_MAX_SUPPORTED_VERSION) {
0123 dev_err(rtk->dev, "RTKit: Firmware min version %d is too new\n",
0124 min_ver);
0125 goto abort_boot;
0126 }
0127
0128 if (max_ver < APPLE_RTKIT_MIN_SUPPORTED_VERSION) {
0129 dev_err(rtk->dev, "RTKit: Firmware max version %d is too old\n",
0130 max_ver);
0131 goto abort_boot;
0132 }
0133
0134 dev_info(rtk->dev, "RTKit: Initializing (protocol version %d)\n",
0135 want_ver);
0136 rtk->version = want_ver;
0137
0138 reply = FIELD_PREP(APPLE_RTKIT_MGMT_HELLO_MINVER, want_ver);
0139 reply |= FIELD_PREP(APPLE_RTKIT_MGMT_HELLO_MAXVER, want_ver);
0140 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_HELLO_REPLY, reply);
0141
0142 return;
0143
0144 abort_boot:
0145 rtk->boot_result = -EINVAL;
0146 complete_all(&rtk->epmap_completion);
0147 }
0148
0149 static void apple_rtkit_management_rx_epmap(struct apple_rtkit *rtk, u64 msg)
0150 {
0151 int i, ep;
0152 u64 reply;
0153 unsigned long bitmap = FIELD_GET(APPLE_RTKIT_MGMT_EPMAP_BITMAP, msg);
0154 u32 base = FIELD_GET(APPLE_RTKIT_MGMT_EPMAP_BASE, msg);
0155
0156 dev_dbg(rtk->dev,
0157 "RTKit: received endpoint bitmap 0x%lx with base 0x%x\n",
0158 bitmap, base);
0159
0160 for_each_set_bit(i, &bitmap, 32) {
0161 ep = 32 * base + i;
0162 dev_dbg(rtk->dev, "RTKit: Discovered endpoint 0x%02x\n", ep);
0163 set_bit(ep, rtk->endpoints);
0164 }
0165
0166 reply = FIELD_PREP(APPLE_RTKIT_MGMT_EPMAP_BASE, base);
0167 if (msg & APPLE_RTKIT_MGMT_EPMAP_LAST)
0168 reply |= APPLE_RTKIT_MGMT_EPMAP_LAST;
0169 else
0170 reply |= APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE;
0171
0172 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_EPMAP_REPLY, reply);
0173
0174 if (!(msg & APPLE_RTKIT_MGMT_EPMAP_LAST))
0175 return;
0176
0177 for_each_set_bit(ep, rtk->endpoints, APPLE_RTKIT_APP_ENDPOINT_START) {
0178 switch (ep) {
0179
0180 case APPLE_RTKIT_EP_MGMT:
0181 break;
0182
0183
0184 case APPLE_RTKIT_EP_SYSLOG:
0185 case APPLE_RTKIT_EP_CRASHLOG:
0186 case APPLE_RTKIT_EP_DEBUG:
0187 case APPLE_RTKIT_EP_IOREPORT:
0188 case APPLE_RTKIT_EP_OSLOG:
0189 dev_dbg(rtk->dev,
0190 "RTKit: Starting system endpoint 0x%02x\n", ep);
0191 apple_rtkit_start_ep(rtk, ep);
0192 break;
0193
0194 default:
0195 dev_warn(rtk->dev,
0196 "RTKit: Unknown system endpoint: 0x%02x\n",
0197 ep);
0198 }
0199 }
0200
0201 rtk->boot_result = 0;
0202 complete_all(&rtk->epmap_completion);
0203 }
0204
0205 static void apple_rtkit_management_rx_iop_pwr_ack(struct apple_rtkit *rtk,
0206 u64 msg)
0207 {
0208 unsigned int new_state = FIELD_GET(APPLE_RTKIT_MGMT_PWR_STATE, msg);
0209
0210 dev_dbg(rtk->dev, "RTKit: IOP power state transition: 0x%x -> 0x%x\n",
0211 rtk->iop_power_state, new_state);
0212 rtk->iop_power_state = new_state;
0213
0214 complete_all(&rtk->iop_pwr_ack_completion);
0215 }
0216
0217 static void apple_rtkit_management_rx_ap_pwr_ack(struct apple_rtkit *rtk,
0218 u64 msg)
0219 {
0220 unsigned int new_state = FIELD_GET(APPLE_RTKIT_MGMT_PWR_STATE, msg);
0221
0222 dev_dbg(rtk->dev, "RTKit: AP power state transition: 0x%x -> 0x%x\n",
0223 rtk->ap_power_state, new_state);
0224 rtk->ap_power_state = new_state;
0225
0226 complete_all(&rtk->ap_pwr_ack_completion);
0227 }
0228
0229 static void apple_rtkit_management_rx(struct apple_rtkit *rtk, u64 msg)
0230 {
0231 u8 type = FIELD_GET(APPLE_RTKIT_MGMT_TYPE, msg);
0232
0233 switch (type) {
0234 case APPLE_RTKIT_MGMT_HELLO:
0235 apple_rtkit_management_rx_hello(rtk, msg);
0236 break;
0237 case APPLE_RTKIT_MGMT_EPMAP:
0238 apple_rtkit_management_rx_epmap(rtk, msg);
0239 break;
0240 case APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE_ACK:
0241 apple_rtkit_management_rx_iop_pwr_ack(rtk, msg);
0242 break;
0243 case APPLE_RTKIT_MGMT_SET_AP_PWR_STATE_ACK:
0244 apple_rtkit_management_rx_ap_pwr_ack(rtk, msg);
0245 break;
0246 default:
0247 dev_warn(
0248 rtk->dev,
0249 "RTKit: unknown management message: 0x%llx (type: 0x%02x)\n",
0250 msg, type);
0251 }
0252 }
0253
0254 static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
0255 struct apple_rtkit_shmem *buffer,
0256 u8 ep, u64 msg)
0257 {
0258 size_t n_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg);
0259 u64 reply;
0260 int err;
0261
0262 buffer->buffer = NULL;
0263 buffer->iomem = NULL;
0264 buffer->is_mapped = false;
0265 buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg);
0266 buffer->size = n_4kpages << 12;
0267
0268 dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n",
0269 buffer->size, &buffer->iova);
0270
0271 if (buffer->iova &&
0272 (!rtk->ops->shmem_setup || !rtk->ops->shmem_destroy)) {
0273 err = -EINVAL;
0274 goto error;
0275 }
0276
0277 if (rtk->ops->shmem_setup) {
0278 err = rtk->ops->shmem_setup(rtk->cookie, buffer);
0279 if (err)
0280 goto error;
0281 } else {
0282 buffer->buffer = dma_alloc_coherent(rtk->dev, buffer->size,
0283 &buffer->iova, GFP_KERNEL);
0284 if (!buffer->buffer) {
0285 err = -ENOMEM;
0286 goto error;
0287 }
0288 }
0289
0290 if (!buffer->is_mapped) {
0291 reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE,
0292 APPLE_RTKIT_BUFFER_REQUEST);
0293 reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, n_4kpages);
0294 reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA,
0295 buffer->iova);
0296 apple_rtkit_send_message(rtk, ep, reply, NULL, false);
0297 }
0298
0299 return 0;
0300
0301 error:
0302 buffer->buffer = NULL;
0303 buffer->iomem = NULL;
0304 buffer->iova = 0;
0305 buffer->size = 0;
0306 buffer->is_mapped = false;
0307 return err;
0308 }
0309
0310 static void apple_rtkit_free_buffer(struct apple_rtkit *rtk,
0311 struct apple_rtkit_shmem *bfr)
0312 {
0313 if (bfr->size == 0)
0314 return;
0315
0316 if (rtk->ops->shmem_destroy)
0317 rtk->ops->shmem_destroy(rtk->cookie, bfr);
0318 else if (bfr->buffer)
0319 dma_free_coherent(rtk->dev, bfr->size, bfr->buffer, bfr->iova);
0320
0321 bfr->buffer = NULL;
0322 bfr->iomem = NULL;
0323 bfr->iova = 0;
0324 bfr->size = 0;
0325 bfr->is_mapped = false;
0326 }
0327
0328 static void apple_rtkit_memcpy(struct apple_rtkit *rtk, void *dst,
0329 struct apple_rtkit_shmem *bfr, size_t offset,
0330 size_t len)
0331 {
0332 if (bfr->iomem)
0333 memcpy_fromio(dst, bfr->iomem + offset, len);
0334 else
0335 memcpy(dst, bfr->buffer + offset, len);
0336 }
0337
0338 static void apple_rtkit_crashlog_rx(struct apple_rtkit *rtk, u64 msg)
0339 {
0340 u8 type = FIELD_GET(APPLE_RTKIT_SYSLOG_TYPE, msg);
0341 u8 *bfr;
0342
0343 if (type != APPLE_RTKIT_CRASHLOG_CRASH) {
0344 dev_warn(rtk->dev, "RTKit: Unknown crashlog message: %llx\n",
0345 msg);
0346 return;
0347 }
0348
0349 if (!rtk->crashlog_buffer.size) {
0350 apple_rtkit_common_rx_get_buffer(rtk, &rtk->crashlog_buffer,
0351 APPLE_RTKIT_EP_CRASHLOG, msg);
0352 return;
0353 }
0354
0355 dev_err(rtk->dev, "RTKit: co-processor has crashed\n");
0356
0357
0358
0359
0360
0361
0362 bfr = kzalloc(rtk->crashlog_buffer.size, GFP_KERNEL);
0363 if (bfr) {
0364 apple_rtkit_memcpy(rtk, bfr, &rtk->crashlog_buffer, 0,
0365 rtk->crashlog_buffer.size);
0366 apple_rtkit_crashlog_dump(rtk, bfr, rtk->crashlog_buffer.size);
0367 kfree(bfr);
0368 } else {
0369 dev_err(rtk->dev,
0370 "RTKit: Couldn't allocate crashlog shadow buffer\n");
0371 }
0372
0373 rtk->crashed = true;
0374 if (rtk->ops->crashed)
0375 rtk->ops->crashed(rtk->cookie);
0376 }
0377
0378 static void apple_rtkit_ioreport_rx(struct apple_rtkit *rtk, u64 msg)
0379 {
0380 u8 type = FIELD_GET(APPLE_RTKIT_SYSLOG_TYPE, msg);
0381
0382 switch (type) {
0383 case APPLE_RTKIT_BUFFER_REQUEST:
0384 apple_rtkit_common_rx_get_buffer(rtk, &rtk->ioreport_buffer,
0385 APPLE_RTKIT_EP_IOREPORT, msg);
0386 break;
0387
0388 case 0x8:
0389 case 0xc:
0390 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_IOREPORT, msg,
0391 NULL, false);
0392 break;
0393 default:
0394 dev_warn(rtk->dev, "RTKit: Unknown ioreport message: %llx\n",
0395 msg);
0396 }
0397 }
0398
0399 static void apple_rtkit_syslog_rx_init(struct apple_rtkit *rtk, u64 msg)
0400 {
0401 rtk->syslog_n_entries = FIELD_GET(APPLE_RTKIT_SYSLOG_N_ENTRIES, msg);
0402 rtk->syslog_msg_size = FIELD_GET(APPLE_RTKIT_SYSLOG_MSG_SIZE, msg);
0403
0404 rtk->syslog_msg_buffer = kzalloc(rtk->syslog_msg_size, GFP_KERNEL);
0405
0406 dev_dbg(rtk->dev,
0407 "RTKit: syslog initialized: entries: %zd, msg_size: %zd\n",
0408 rtk->syslog_n_entries, rtk->syslog_msg_size);
0409 }
0410
0411 static void apple_rtkit_syslog_rx_log(struct apple_rtkit *rtk, u64 msg)
0412 {
0413 u8 idx = msg & 0xff;
0414 char log_context[24];
0415 size_t entry_size = 0x20 + rtk->syslog_msg_size;
0416
0417 if (!rtk->syslog_msg_buffer) {
0418 dev_warn(
0419 rtk->dev,
0420 "RTKit: received syslog message but no syslog_msg_buffer\n");
0421 goto done;
0422 }
0423 if (!rtk->syslog_buffer.size) {
0424 dev_warn(
0425 rtk->dev,
0426 "RTKit: received syslog message but syslog_buffer.size is zero\n");
0427 goto done;
0428 }
0429 if (!rtk->syslog_buffer.buffer && !rtk->syslog_buffer.iomem) {
0430 dev_warn(
0431 rtk->dev,
0432 "RTKit: received syslog message but no syslog_buffer.buffer or syslog_buffer.iomem\n");
0433 goto done;
0434 }
0435 if (idx > rtk->syslog_n_entries) {
0436 dev_warn(rtk->dev, "RTKit: syslog index %d out of range\n",
0437 idx);
0438 goto done;
0439 }
0440
0441 apple_rtkit_memcpy(rtk, log_context, &rtk->syslog_buffer,
0442 idx * entry_size + 8, sizeof(log_context));
0443 apple_rtkit_memcpy(rtk, rtk->syslog_msg_buffer, &rtk->syslog_buffer,
0444 idx * entry_size + 8 + sizeof(log_context),
0445 rtk->syslog_msg_size);
0446
0447 log_context[sizeof(log_context) - 1] = 0;
0448 rtk->syslog_msg_buffer[rtk->syslog_msg_size - 1] = 0;
0449 dev_info(rtk->dev, "RTKit: syslog message: %s: %s\n", log_context,
0450 rtk->syslog_msg_buffer);
0451
0452 done:
0453 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_SYSLOG, msg, NULL, false);
0454 }
0455
0456 static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg)
0457 {
0458 u8 type = FIELD_GET(APPLE_RTKIT_SYSLOG_TYPE, msg);
0459
0460 switch (type) {
0461 case APPLE_RTKIT_BUFFER_REQUEST:
0462 apple_rtkit_common_rx_get_buffer(rtk, &rtk->syslog_buffer,
0463 APPLE_RTKIT_EP_SYSLOG, msg);
0464 break;
0465 case APPLE_RTKIT_SYSLOG_INIT:
0466 apple_rtkit_syslog_rx_init(rtk, msg);
0467 break;
0468 case APPLE_RTKIT_SYSLOG_LOG:
0469 apple_rtkit_syslog_rx_log(rtk, msg);
0470 break;
0471 default:
0472 dev_warn(rtk->dev, "RTKit: Unknown syslog message: %llx\n",
0473 msg);
0474 }
0475 }
0476
0477 static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg)
0478 {
0479 u64 ack;
0480
0481 dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg);
0482 ack = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, APPLE_RTKIT_OSLOG_ACK);
0483 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false);
0484 }
0485
0486 static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg)
0487 {
0488 u8 type = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg);
0489
0490 switch (type) {
0491 case APPLE_RTKIT_OSLOG_INIT:
0492 apple_rtkit_oslog_rx_init(rtk, msg);
0493 break;
0494 default:
0495 dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg);
0496 }
0497 }
0498
0499 static void apple_rtkit_rx_work(struct work_struct *work)
0500 {
0501 struct apple_rtkit_rx_work *rtk_work =
0502 container_of(work, struct apple_rtkit_rx_work, work);
0503 struct apple_rtkit *rtk = rtk_work->rtk;
0504
0505 switch (rtk_work->ep) {
0506 case APPLE_RTKIT_EP_MGMT:
0507 apple_rtkit_management_rx(rtk, rtk_work->msg);
0508 break;
0509 case APPLE_RTKIT_EP_CRASHLOG:
0510 apple_rtkit_crashlog_rx(rtk, rtk_work->msg);
0511 break;
0512 case APPLE_RTKIT_EP_SYSLOG:
0513 apple_rtkit_syslog_rx(rtk, rtk_work->msg);
0514 break;
0515 case APPLE_RTKIT_EP_IOREPORT:
0516 apple_rtkit_ioreport_rx(rtk, rtk_work->msg);
0517 break;
0518 case APPLE_RTKIT_EP_OSLOG:
0519 apple_rtkit_oslog_rx(rtk, rtk_work->msg);
0520 break;
0521 case APPLE_RTKIT_APP_ENDPOINT_START ... 0xff:
0522 if (rtk->ops->recv_message)
0523 rtk->ops->recv_message(rtk->cookie, rtk_work->ep,
0524 rtk_work->msg);
0525 else
0526 dev_warn(
0527 rtk->dev,
0528 "Received unexpected message to EP%02d: %llx\n",
0529 rtk_work->ep, rtk_work->msg);
0530 break;
0531 default:
0532 dev_warn(rtk->dev,
0533 "RTKit: message to unknown endpoint %02x: %llx\n",
0534 rtk_work->ep, rtk_work->msg);
0535 }
0536
0537 kfree(rtk_work);
0538 }
0539
0540 static void apple_rtkit_rx(struct mbox_client *cl, void *mssg)
0541 {
0542 struct apple_rtkit *rtk = container_of(cl, struct apple_rtkit, mbox_cl);
0543 struct apple_mbox_msg *msg = mssg;
0544 struct apple_rtkit_rx_work *work;
0545 u8 ep = msg->msg1;
0546
0547
0548
0549
0550
0551
0552 dma_rmb();
0553
0554 if (!test_bit(ep, rtk->endpoints))
0555 dev_warn(rtk->dev,
0556 "RTKit: Message to undiscovered endpoint 0x%02x\n",
0557 ep);
0558
0559 if (ep >= APPLE_RTKIT_APP_ENDPOINT_START &&
0560 rtk->ops->recv_message_early &&
0561 rtk->ops->recv_message_early(rtk->cookie, ep, msg->msg0))
0562 return;
0563
0564 work = kzalloc(sizeof(*work), GFP_ATOMIC);
0565 if (!work)
0566 return;
0567
0568 work->rtk = rtk;
0569 work->ep = ep;
0570 work->msg = msg->msg0;
0571 INIT_WORK(&work->work, apple_rtkit_rx_work);
0572 queue_work(rtk->wq, &work->work);
0573 }
0574
0575 static void apple_rtkit_tx_done(struct mbox_client *cl, void *mssg, int r)
0576 {
0577 struct apple_rtkit_msg *msg =
0578 container_of(mssg, struct apple_rtkit_msg, mbox_msg);
0579
0580 if (r == -ETIME)
0581 return;
0582
0583 if (msg->completion)
0584 complete(msg->completion);
0585 kfree(msg);
0586 }
0587
0588 int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message,
0589 struct completion *completion, bool atomic)
0590 {
0591 struct apple_rtkit_msg *msg;
0592 int ret;
0593 gfp_t flags;
0594
0595 if (rtk->crashed)
0596 return -EINVAL;
0597 if (ep >= APPLE_RTKIT_APP_ENDPOINT_START &&
0598 !apple_rtkit_is_running(rtk))
0599 return -EINVAL;
0600
0601 if (atomic)
0602 flags = GFP_ATOMIC;
0603 else
0604 flags = GFP_KERNEL;
0605
0606 msg = kzalloc(sizeof(*msg), flags);
0607 if (!msg)
0608 return -ENOMEM;
0609
0610 msg->mbox_msg.msg0 = message;
0611 msg->mbox_msg.msg1 = ep;
0612 msg->completion = completion;
0613
0614
0615
0616
0617
0618
0619 dma_wmb();
0620
0621 ret = mbox_send_message(rtk->mbox_chan, &msg->mbox_msg);
0622 if (ret < 0) {
0623 kfree(msg);
0624 return ret;
0625 }
0626
0627 return 0;
0628 }
0629 EXPORT_SYMBOL_GPL(apple_rtkit_send_message);
0630
0631 int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message,
0632 unsigned long timeout, bool atomic)
0633 {
0634 DECLARE_COMPLETION_ONSTACK(completion);
0635 int ret;
0636 long t;
0637
0638 ret = apple_rtkit_send_message(rtk, ep, message, &completion, atomic);
0639 if (ret < 0)
0640 return ret;
0641
0642 if (atomic) {
0643 ret = mbox_flush(rtk->mbox_chan, timeout);
0644 if (ret < 0)
0645 return ret;
0646
0647 if (try_wait_for_completion(&completion))
0648 return 0;
0649
0650 return -ETIME;
0651 } else {
0652 t = wait_for_completion_interruptible_timeout(
0653 &completion, msecs_to_jiffies(timeout));
0654 if (t < 0)
0655 return t;
0656 else if (t == 0)
0657 return -ETIME;
0658 return 0;
0659 }
0660 }
0661 EXPORT_SYMBOL_GPL(apple_rtkit_send_message_wait);
0662
0663 int apple_rtkit_start_ep(struct apple_rtkit *rtk, u8 endpoint)
0664 {
0665 u64 msg;
0666
0667 if (!test_bit(endpoint, rtk->endpoints))
0668 return -EINVAL;
0669 if (endpoint >= APPLE_RTKIT_APP_ENDPOINT_START &&
0670 !apple_rtkit_is_running(rtk))
0671 return -EINVAL;
0672
0673 msg = FIELD_PREP(APPLE_RTKIT_MGMT_STARTEP_EP, endpoint);
0674 msg |= APPLE_RTKIT_MGMT_STARTEP_FLAG;
0675 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_STARTEP, msg);
0676
0677 return 0;
0678 }
0679 EXPORT_SYMBOL_GPL(apple_rtkit_start_ep);
0680
0681 static int apple_rtkit_request_mbox_chan(struct apple_rtkit *rtk)
0682 {
0683 if (rtk->mbox_name)
0684 rtk->mbox_chan = mbox_request_channel_byname(&rtk->mbox_cl,
0685 rtk->mbox_name);
0686 else
0687 rtk->mbox_chan =
0688 mbox_request_channel(&rtk->mbox_cl, rtk->mbox_idx);
0689
0690 if (IS_ERR(rtk->mbox_chan))
0691 return PTR_ERR(rtk->mbox_chan);
0692 return 0;
0693 }
0694
0695 static struct apple_rtkit *apple_rtkit_init(struct device *dev, void *cookie,
0696 const char *mbox_name, int mbox_idx,
0697 const struct apple_rtkit_ops *ops)
0698 {
0699 struct apple_rtkit *rtk;
0700 int ret;
0701
0702 if (!ops)
0703 return ERR_PTR(-EINVAL);
0704
0705 rtk = kzalloc(sizeof(*rtk), GFP_KERNEL);
0706 if (!rtk)
0707 return ERR_PTR(-ENOMEM);
0708
0709 rtk->dev = dev;
0710 rtk->cookie = cookie;
0711 rtk->ops = ops;
0712
0713 init_completion(&rtk->epmap_completion);
0714 init_completion(&rtk->iop_pwr_ack_completion);
0715 init_completion(&rtk->ap_pwr_ack_completion);
0716
0717 bitmap_zero(rtk->endpoints, APPLE_RTKIT_MAX_ENDPOINTS);
0718 set_bit(APPLE_RTKIT_EP_MGMT, rtk->endpoints);
0719
0720 rtk->mbox_name = mbox_name;
0721 rtk->mbox_idx = mbox_idx;
0722 rtk->mbox_cl.dev = dev;
0723 rtk->mbox_cl.tx_block = false;
0724 rtk->mbox_cl.knows_txdone = false;
0725 rtk->mbox_cl.rx_callback = &apple_rtkit_rx;
0726 rtk->mbox_cl.tx_done = &apple_rtkit_tx_done;
0727
0728 rtk->wq = alloc_ordered_workqueue("rtkit-%s", WQ_MEM_RECLAIM,
0729 dev_name(rtk->dev));
0730 if (!rtk->wq) {
0731 ret = -ENOMEM;
0732 goto free_rtk;
0733 }
0734
0735 ret = apple_rtkit_request_mbox_chan(rtk);
0736 if (ret)
0737 goto destroy_wq;
0738
0739 return rtk;
0740
0741 destroy_wq:
0742 destroy_workqueue(rtk->wq);
0743 free_rtk:
0744 kfree(rtk);
0745 return ERR_PTR(ret);
0746 }
0747
0748 static int apple_rtkit_wait_for_completion(struct completion *c)
0749 {
0750 long t;
0751
0752 t = wait_for_completion_interruptible_timeout(c,
0753 msecs_to_jiffies(1000));
0754 if (t < 0)
0755 return t;
0756 else if (t == 0)
0757 return -ETIME;
0758 else
0759 return 0;
0760 }
0761
0762 int apple_rtkit_reinit(struct apple_rtkit *rtk)
0763 {
0764
0765 mbox_free_channel(rtk->mbox_chan);
0766 flush_workqueue(rtk->wq);
0767
0768 apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
0769 apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
0770 apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
0771
0772 kfree(rtk->syslog_msg_buffer);
0773
0774 rtk->syslog_msg_buffer = NULL;
0775 rtk->syslog_n_entries = 0;
0776 rtk->syslog_msg_size = 0;
0777
0778 bitmap_zero(rtk->endpoints, APPLE_RTKIT_MAX_ENDPOINTS);
0779 set_bit(APPLE_RTKIT_EP_MGMT, rtk->endpoints);
0780
0781 reinit_completion(&rtk->epmap_completion);
0782 reinit_completion(&rtk->iop_pwr_ack_completion);
0783 reinit_completion(&rtk->ap_pwr_ack_completion);
0784
0785 rtk->crashed = false;
0786 rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_OFF;
0787 rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_OFF;
0788
0789 return apple_rtkit_request_mbox_chan(rtk);
0790 }
0791 EXPORT_SYMBOL_GPL(apple_rtkit_reinit);
0792
0793 static int apple_rtkit_set_ap_power_state(struct apple_rtkit *rtk,
0794 unsigned int state)
0795 {
0796 u64 msg;
0797 int ret;
0798
0799 reinit_completion(&rtk->ap_pwr_ack_completion);
0800
0801 msg = FIELD_PREP(APPLE_RTKIT_MGMT_PWR_STATE, state);
0802 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_AP_PWR_STATE,
0803 msg);
0804
0805 ret = apple_rtkit_wait_for_completion(&rtk->ap_pwr_ack_completion);
0806 if (ret)
0807 return ret;
0808
0809 if (rtk->ap_power_state != state)
0810 return -EINVAL;
0811 return 0;
0812 }
0813
0814 static int apple_rtkit_set_iop_power_state(struct apple_rtkit *rtk,
0815 unsigned int state)
0816 {
0817 u64 msg;
0818 int ret;
0819
0820 reinit_completion(&rtk->iop_pwr_ack_completion);
0821
0822 msg = FIELD_PREP(APPLE_RTKIT_MGMT_PWR_STATE, state);
0823 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE,
0824 msg);
0825
0826 ret = apple_rtkit_wait_for_completion(&rtk->iop_pwr_ack_completion);
0827 if (ret)
0828 return ret;
0829
0830 if (rtk->iop_power_state != state)
0831 return -EINVAL;
0832 return 0;
0833 }
0834
0835 int apple_rtkit_boot(struct apple_rtkit *rtk)
0836 {
0837 int ret;
0838
0839 if (apple_rtkit_is_running(rtk))
0840 return 0;
0841 if (rtk->crashed)
0842 return -EINVAL;
0843
0844 dev_dbg(rtk->dev, "RTKit: waiting for boot to finish\n");
0845 ret = apple_rtkit_wait_for_completion(&rtk->epmap_completion);
0846 if (ret)
0847 return ret;
0848 if (rtk->boot_result)
0849 return rtk->boot_result;
0850
0851 dev_dbg(rtk->dev, "RTKit: waiting for IOP power state ACK\n");
0852 ret = apple_rtkit_wait_for_completion(&rtk->iop_pwr_ack_completion);
0853 if (ret)
0854 return ret;
0855
0856 return apple_rtkit_set_ap_power_state(rtk, APPLE_RTKIT_PWR_STATE_ON);
0857 }
0858 EXPORT_SYMBOL_GPL(apple_rtkit_boot);
0859
0860 int apple_rtkit_shutdown(struct apple_rtkit *rtk)
0861 {
0862 int ret;
0863
0864
0865 ret = apple_rtkit_set_ap_power_state(rtk,
0866 APPLE_RTKIT_PWR_STATE_QUIESCED);
0867 if (ret)
0868 return ret;
0869
0870 ret = apple_rtkit_set_iop_power_state(rtk, APPLE_RTKIT_PWR_STATE_SLEEP);
0871 if (ret)
0872 return ret;
0873
0874 return apple_rtkit_reinit(rtk);
0875 }
0876 EXPORT_SYMBOL_GPL(apple_rtkit_shutdown);
0877
0878 int apple_rtkit_quiesce(struct apple_rtkit *rtk)
0879 {
0880 int ret;
0881
0882 ret = apple_rtkit_set_ap_power_state(rtk,
0883 APPLE_RTKIT_PWR_STATE_QUIESCED);
0884 if (ret)
0885 return ret;
0886
0887 ret = apple_rtkit_set_iop_power_state(rtk,
0888 APPLE_RTKIT_PWR_STATE_QUIESCED);
0889 if (ret)
0890 return ret;
0891
0892 ret = apple_rtkit_reinit(rtk);
0893 if (ret)
0894 return ret;
0895
0896 rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_QUIESCED;
0897 rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_QUIESCED;
0898 return 0;
0899 }
0900 EXPORT_SYMBOL_GPL(apple_rtkit_quiesce);
0901
0902 int apple_rtkit_wake(struct apple_rtkit *rtk)
0903 {
0904 u64 msg;
0905
0906 if (apple_rtkit_is_running(rtk))
0907 return -EINVAL;
0908
0909 reinit_completion(&rtk->iop_pwr_ack_completion);
0910
0911
0912
0913
0914
0915 msg = FIELD_PREP(APPLE_RTKIT_MGMT_PWR_STATE, APPLE_RTKIT_PWR_STATE_ON);
0916 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE,
0917 msg);
0918
0919 return apple_rtkit_boot(rtk);
0920 }
0921 EXPORT_SYMBOL_GPL(apple_rtkit_wake);
0922
0923 static void apple_rtkit_free(struct apple_rtkit *rtk)
0924 {
0925 mbox_free_channel(rtk->mbox_chan);
0926 destroy_workqueue(rtk->wq);
0927
0928 apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
0929 apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
0930 apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
0931
0932 kfree(rtk->syslog_msg_buffer);
0933 kfree(rtk);
0934 }
0935
0936 struct apple_rtkit *devm_apple_rtkit_init(struct device *dev, void *cookie,
0937 const char *mbox_name, int mbox_idx,
0938 const struct apple_rtkit_ops *ops)
0939 {
0940 struct apple_rtkit *rtk;
0941 int ret;
0942
0943 rtk = apple_rtkit_init(dev, cookie, mbox_name, mbox_idx, ops);
0944 if (IS_ERR(rtk))
0945 return rtk;
0946
0947 ret = devm_add_action_or_reset(dev, (void (*)(void *))apple_rtkit_free,
0948 rtk);
0949 if (ret)
0950 return ERR_PTR(ret);
0951
0952 return rtk;
0953 }
0954 EXPORT_SYMBOL_GPL(devm_apple_rtkit_init);
0955
0956 MODULE_LICENSE("Dual MIT/GPL");
0957 MODULE_AUTHOR("Sven Peter <sven@svenpeter.dev>");
0958 MODULE_DESCRIPTION("Apple RTKit driver");