Lines Matching refs:rtk

81 	struct apple_rtkit *rtk;
87 bool apple_rtkit_is_running(struct apple_rtkit *rtk)
89 if (rtk->crashed)
91 if ((rtk->iop_power_state & 0xff) != APPLE_RTKIT_PWR_STATE_ON)
93 if ((rtk->ap_power_state & 0xff) != APPLE_RTKIT_PWR_STATE_ON)
99 bool apple_rtkit_is_crashed(struct apple_rtkit *rtk)
101 return rtk->crashed;
105 static void apple_rtkit_management_send(struct apple_rtkit *rtk, u8 type,
110 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_MGMT, msg, NULL, false);
113 static void apple_rtkit_management_rx_hello(struct apple_rtkit *rtk, u64 msg)
121 dev_dbg(rtk->dev, "RTKit: Min ver %d, max ver %d\n", min_ver, max_ver);
124 dev_err(rtk->dev, "RTKit: Firmware min version %d is too new\n",
130 dev_err(rtk->dev, "RTKit: Firmware max version %d is too old\n",
135 dev_info(rtk->dev, "RTKit: Initializing (protocol version %d)\n",
137 rtk->version = want_ver;
141 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_HELLO_REPLY, reply);
146 rtk->boot_result = -EINVAL;
147 complete_all(&rtk->epmap_completion);
150 static void apple_rtkit_management_rx_epmap(struct apple_rtkit *rtk, u64 msg)
157 dev_dbg(rtk->dev,
163 dev_dbg(rtk->dev, "RTKit: Discovered endpoint 0x%02x\n", ep);
164 set_bit(ep, rtk->endpoints);
173 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_EPMAP_REPLY, reply);
178 for_each_set_bit(ep, rtk->endpoints, APPLE_RTKIT_APP_ENDPOINT_START) {
190 dev_dbg(rtk->dev,
192 apple_rtkit_start_ep(rtk, ep);
196 dev_warn(rtk->dev,
202 rtk->boot_result = 0;
203 complete_all(&rtk->epmap_completion);
206 static void apple_rtkit_management_rx_iop_pwr_ack(struct apple_rtkit *rtk,
211 dev_dbg(rtk->dev, "RTKit: IOP power state transition: 0x%x -> 0x%x\n",
212 rtk->iop_power_state, new_state);
213 rtk->iop_power_state = new_state;
215 complete_all(&rtk->iop_pwr_ack_completion);
218 static void apple_rtkit_management_rx_ap_pwr_ack(struct apple_rtkit *rtk,
223 dev_dbg(rtk->dev, "RTKit: AP power state transition: 0x%x -> 0x%x\n",
224 rtk->ap_power_state, new_state);
225 rtk->ap_power_state = new_state;
227 complete_all(&rtk->ap_pwr_ack_completion);
230 static void apple_rtkit_management_rx(struct apple_rtkit *rtk, u64 msg)
236 apple_rtkit_management_rx_hello(rtk, msg);
239 apple_rtkit_management_rx_epmap(rtk, msg);
242 apple_rtkit_management_rx_iop_pwr_ack(rtk, msg);
245 apple_rtkit_management_rx_ap_pwr_ack(rtk, msg);
249 rtk->dev,
255 static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
269 dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n",
273 (!rtk->ops->shmem_setup || !rtk->ops->shmem_destroy)) {
278 if (rtk->ops->shmem_setup) {
279 err = rtk->ops->shmem_setup(rtk->cookie, buffer);
283 buffer->buffer = dma_alloc_coherent(rtk->dev, buffer->size,
297 apple_rtkit_send_message(rtk, ep, reply, NULL, false);
311 static void apple_rtkit_free_buffer(struct apple_rtkit *rtk,
317 if (rtk->ops->shmem_destroy)
318 rtk->ops->shmem_destroy(rtk->cookie, bfr);
320 dma_free_coherent(rtk->dev, bfr->size, bfr->buffer, bfr->iova);
329 static void apple_rtkit_memcpy(struct apple_rtkit *rtk, void *dst,
339 static void apple_rtkit_crashlog_rx(struct apple_rtkit *rtk, u64 msg)
345 dev_warn(rtk->dev, "RTKit: Unknown crashlog message: %llx\n",
350 if (!rtk->crashlog_buffer.size) {
351 apple_rtkit_common_rx_get_buffer(rtk, &rtk->crashlog_buffer,
356 dev_err(rtk->dev, "RTKit: co-processor has crashed\n");
363 bfr = kzalloc(rtk->crashlog_buffer.size, GFP_KERNEL);
365 apple_rtkit_memcpy(rtk, bfr, &rtk->crashlog_buffer, 0,
366 rtk->crashlog_buffer.size);
367 apple_rtkit_crashlog_dump(rtk, bfr, rtk->crashlog_buffer.size);
370 dev_err(rtk->dev,
374 rtk->crashed = true;
375 if (rtk->ops->crashed)
376 rtk->ops->crashed(rtk->cookie);
379 static void apple_rtkit_ioreport_rx(struct apple_rtkit *rtk, u64 msg)
385 apple_rtkit_common_rx_get_buffer(rtk, &rtk->ioreport_buffer,
391 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_IOREPORT, msg,
395 dev_warn(rtk->dev, "RTKit: Unknown ioreport message: %llx\n",
400 static void apple_rtkit_syslog_rx_init(struct apple_rtkit *rtk, u64 msg)
402 rtk->syslog_n_entries = FIELD_GET(APPLE_RTKIT_SYSLOG_N_ENTRIES, msg);
403 rtk->syslog_msg_size = FIELD_GET(APPLE_RTKIT_SYSLOG_MSG_SIZE, msg);
405 rtk->syslog_msg_buffer = kzalloc(rtk->syslog_msg_size, GFP_KERNEL);
407 dev_dbg(rtk->dev,
409 rtk->syslog_n_entries, rtk->syslog_msg_size);
417 static void apple_rtkit_syslog_rx_log(struct apple_rtkit *rtk, u64 msg)
421 size_t entry_size = 0x20 + rtk->syslog_msg_size;
424 if (!rtk->syslog_msg_buffer) {
426 rtk->dev,
430 if (!rtk->syslog_buffer.size) {
432 rtk->dev,
436 if (!rtk->syslog_buffer.buffer && !rtk->syslog_buffer.iomem) {
438 rtk->dev,
442 if (idx > rtk->syslog_n_entries) {
443 dev_warn(rtk->dev, "RTKit: syslog index %d out of range\n",
448 apple_rtkit_memcpy(rtk, log_context, &rtk->syslog_buffer,
450 apple_rtkit_memcpy(rtk, rtk->syslog_msg_buffer, &rtk->syslog_buffer,
452 rtk->syslog_msg_size);
456 msglen = rtk->syslog_msg_size - 1;
458 should_crop_syslog_char(rtk->syslog_msg_buffer[msglen - 1]))
461 rtk->syslog_msg_buffer[msglen] = 0;
462 dev_info(rtk->dev, "RTKit: syslog message: %s: %s\n", log_context,
463 rtk->syslog_msg_buffer);
466 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_SYSLOG, msg, NULL, false);
469 static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg)
475 apple_rtkit_common_rx_get_buffer(rtk, &rtk->syslog_buffer,
479 apple_rtkit_syslog_rx_init(rtk, msg);
482 apple_rtkit_syslog_rx_log(rtk, msg);
485 dev_warn(rtk->dev, "RTKit: Unknown syslog message: %llx\n",
490 static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg)
494 dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg);
496 apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false);
499 static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg)
505 apple_rtkit_oslog_rx_init(rtk, msg);
508 dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg);
516 struct apple_rtkit *rtk = rtk_work->rtk;
520 apple_rtkit_management_rx(rtk, rtk_work->msg);
523 apple_rtkit_crashlog_rx(rtk, rtk_work->msg);
526 apple_rtkit_syslog_rx(rtk, rtk_work->msg);
529 apple_rtkit_ioreport_rx(rtk, rtk_work->msg);
532 apple_rtkit_oslog_rx(rtk, rtk_work->msg);
535 if (rtk->ops->recv_message)
536 rtk->ops->recv_message(rtk->cookie, rtk_work->ep,
540 rtk->dev,
545 dev_warn(rtk->dev,
555 struct apple_rtkit *rtk = container_of(cl, struct apple_rtkit, mbox_cl);
567 if (!test_bit(ep, rtk->endpoints))
568 dev_warn(rtk->dev,
573 rtk->ops->recv_message_early &&
574 rtk->ops->recv_message_early(rtk->cookie, ep, msg->msg0))
581 work->rtk = rtk;
585 queue_work(rtk->wq, &work->work);
601 int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message,
608 if (rtk->crashed)
611 !apple_rtkit_is_running(rtk))
634 ret = mbox_send_message(rtk->mbox_chan, &msg->mbox_msg);
644 int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message,
651 ret = apple_rtkit_send_message(rtk, ep, message, &completion, atomic);
656 ret = mbox_flush(rtk->mbox_chan, timeout);
676 int apple_rtkit_poll(struct apple_rtkit *rtk)
678 return mbox_client_peek_data(rtk->mbox_chan);
682 int apple_rtkit_start_ep(struct apple_rtkit *rtk, u8 endpoint)
686 if (!test_bit(endpoint, rtk->endpoints))
689 !apple_rtkit_is_running(rtk))
694 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_STARTEP, msg);
700 static int apple_rtkit_request_mbox_chan(struct apple_rtkit *rtk)
702 if (rtk->mbox_name)
703 rtk->mbox_chan = mbox_request_channel_byname(&rtk->mbox_cl,
704 rtk->mbox_name);
706 rtk->mbox_chan =
707 mbox_request_channel(&rtk->mbox_cl, rtk->mbox_idx);
709 if (IS_ERR(rtk->mbox_chan))
710 return PTR_ERR(rtk->mbox_chan);
718 struct apple_rtkit *rtk;
724 rtk = kzalloc(sizeof(*rtk), GFP_KERNEL);
725 if (!rtk)
728 rtk->dev = dev;
729 rtk->cookie = cookie;
730 rtk->ops = ops;
732 init_completion(&rtk->epmap_completion);
733 init_completion(&rtk->iop_pwr_ack_completion);
734 init_completion(&rtk->ap_pwr_ack_completion);
736 bitmap_zero(rtk->endpoints, APPLE_RTKIT_MAX_ENDPOINTS);
737 set_bit(APPLE_RTKIT_EP_MGMT, rtk->endpoints);
739 rtk->mbox_name = mbox_name;
740 rtk->mbox_idx = mbox_idx;
741 rtk->mbox_cl.dev = dev;
742 rtk->mbox_cl.tx_block = false;
743 rtk->mbox_cl.knows_txdone = false;
744 rtk->mbox_cl.rx_callback = &apple_rtkit_rx;
745 rtk->mbox_cl.tx_done = &apple_rtkit_tx_done;
747 rtk->wq = alloc_ordered_workqueue("rtkit-%s", WQ_MEM_RECLAIM,
748 dev_name(rtk->dev));
749 if (!rtk->wq) {
754 ret = apple_rtkit_request_mbox_chan(rtk);
758 return rtk;
761 destroy_workqueue(rtk->wq);
763 kfree(rtk);
782 int apple_rtkit_reinit(struct apple_rtkit *rtk)
785 mbox_free_channel(rtk->mbox_chan);
786 flush_workqueue(rtk->wq);
788 apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
789 apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
790 apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
792 kfree(rtk->syslog_msg_buffer);
794 rtk->syslog_msg_buffer = NULL;
795 rtk->syslog_n_entries = 0;
796 rtk->syslog_msg_size = 0;
798 bitmap_zero(rtk->endpoints, APPLE_RTKIT_MAX_ENDPOINTS);
799 set_bit(APPLE_RTKIT_EP_MGMT, rtk->endpoints);
801 reinit_completion(&rtk->epmap_completion);
802 reinit_completion(&rtk->iop_pwr_ack_completion);
803 reinit_completion(&rtk->ap_pwr_ack_completion);
805 rtk->crashed = false;
806 rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_OFF;
807 rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_OFF;
809 return apple_rtkit_request_mbox_chan(rtk);
813 static int apple_rtkit_set_ap_power_state(struct apple_rtkit *rtk,
819 reinit_completion(&rtk->ap_pwr_ack_completion);
822 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_AP_PWR_STATE,
825 ret = apple_rtkit_wait_for_completion(&rtk->ap_pwr_ack_completion);
829 if (rtk->ap_power_state != state)
834 static int apple_rtkit_set_iop_power_state(struct apple_rtkit *rtk,
840 reinit_completion(&rtk->iop_pwr_ack_completion);
843 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE,
846 ret = apple_rtkit_wait_for_completion(&rtk->iop_pwr_ack_completion);
850 if (rtk->iop_power_state != state)
855 int apple_rtkit_boot(struct apple_rtkit *rtk)
859 if (apple_rtkit_is_running(rtk))
861 if (rtk->crashed)
864 dev_dbg(rtk->dev, "RTKit: waiting for boot to finish\n");
865 ret = apple_rtkit_wait_for_completion(&rtk->epmap_completion);
868 if (rtk->boot_result)
869 return rtk->boot_result;
871 dev_dbg(rtk->dev, "RTKit: waiting for IOP power state ACK\n");
872 ret = apple_rtkit_wait_for_completion(&rtk->iop_pwr_ack_completion);
876 return apple_rtkit_set_ap_power_state(rtk, APPLE_RTKIT_PWR_STATE_ON);
880 int apple_rtkit_shutdown(struct apple_rtkit *rtk)
885 ret = apple_rtkit_set_ap_power_state(rtk,
890 ret = apple_rtkit_set_iop_power_state(rtk, APPLE_RTKIT_PWR_STATE_SLEEP);
894 return apple_rtkit_reinit(rtk);
898 int apple_rtkit_idle(struct apple_rtkit *rtk)
903 ret = apple_rtkit_set_ap_power_state(rtk,
908 ret = apple_rtkit_set_iop_power_state(rtk, APPLE_RTKIT_PWR_STATE_IDLE);
912 rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_IDLE;
913 rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_IDLE;
918 int apple_rtkit_quiesce(struct apple_rtkit *rtk)
922 ret = apple_rtkit_set_ap_power_state(rtk,
927 ret = apple_rtkit_set_iop_power_state(rtk,
932 ret = apple_rtkit_reinit(rtk);
936 rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_QUIESCED;
937 rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_QUIESCED;
942 int apple_rtkit_wake(struct apple_rtkit *rtk)
946 if (apple_rtkit_is_running(rtk))
949 reinit_completion(&rtk->iop_pwr_ack_completion);
956 apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE,
959 return apple_rtkit_boot(rtk);
963 void apple_rtkit_free(struct apple_rtkit *rtk)
965 mbox_free_channel(rtk->mbox_chan);
966 destroy_workqueue(rtk->wq);
968 apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
969 apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
970 apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
972 kfree(rtk->syslog_msg_buffer);
973 kfree(rtk);
986 struct apple_rtkit *rtk;
989 rtk = apple_rtkit_init(dev, cookie, mbox_name, mbox_idx, ops);
990 if (IS_ERR(rtk))
991 return rtk;
993 ret = devm_add_action_or_reset(dev, apple_rtkit_free_wrapper, rtk);
997 return rtk;