Lines Matching refs:sysmon
80 static void sysmon_send_event(struct qcom_sysmon *sysmon, in sysmon_send_event() argument
92 mutex_lock(&sysmon->lock); in sysmon_send_event()
93 reinit_completion(&sysmon->comp); in sysmon_send_event()
94 sysmon->ssr_ack = false; in sysmon_send_event()
96 ret = rpmsg_send(sysmon->ept, req, len); in sysmon_send_event()
98 dev_err(sysmon->dev, "failed to send sysmon event\n"); in sysmon_send_event()
102 ret = wait_for_completion_timeout(&sysmon->comp, in sysmon_send_event()
105 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n"); in sysmon_send_event()
109 if (!sysmon->ssr_ack) in sysmon_send_event()
110 dev_err(sysmon->dev, "unexpected response to sysmon event\n"); in sysmon_send_event()
113 mutex_unlock(&sysmon->lock); in sysmon_send_event()
122 static bool sysmon_request_shutdown(struct qcom_sysmon *sysmon) in sysmon_request_shutdown() argument
128 mutex_lock(&sysmon->lock); in sysmon_request_shutdown()
129 reinit_completion(&sysmon->comp); in sysmon_request_shutdown()
130 sysmon->ssr_ack = false; in sysmon_request_shutdown()
132 ret = rpmsg_send(sysmon->ept, req, strlen(req) + 1); in sysmon_request_shutdown()
134 dev_err(sysmon->dev, "send sysmon shutdown request failed\n"); in sysmon_request_shutdown()
138 ret = wait_for_completion_timeout(&sysmon->comp, in sysmon_request_shutdown()
141 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n"); in sysmon_request_shutdown()
145 if (!sysmon->ssr_ack) in sysmon_request_shutdown()
146 dev_err(sysmon->dev, in sysmon_request_shutdown()
152 mutex_unlock(&sysmon->lock); in sysmon_request_shutdown()
160 struct qcom_sysmon *sysmon = priv; in sysmon_callback() local
164 if (!sysmon) in sysmon_callback()
168 sysmon->ssr_ack = true; in sysmon_callback()
170 complete(&sysmon->comp); in sysmon_callback()
292 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi); in sysmon_ind_cb() local
294 complete(&sysmon->ind_comp); in sysmon_ind_cb()
308 static bool ssctl_request_shutdown_wait(struct qcom_sysmon *sysmon) in ssctl_request_shutdown_wait() argument
312 ret = wait_for_completion_timeout(&sysmon->shutdown_comp, 10 * HZ); in ssctl_request_shutdown_wait()
316 ret = try_wait_for_completion(&sysmon->ind_comp); in ssctl_request_shutdown_wait()
320 dev_err(sysmon->dev, "timeout waiting for shutdown ack\n"); in ssctl_request_shutdown_wait()
330 static bool ssctl_request_shutdown(struct qcom_sysmon *sysmon) in ssctl_request_shutdown() argument
337 reinit_completion(&sysmon->ind_comp); in ssctl_request_shutdown()
338 reinit_completion(&sysmon->shutdown_comp); in ssctl_request_shutdown()
339 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_shutdown_resp_ei, &resp); in ssctl_request_shutdown()
341 dev_err(sysmon->dev, "failed to allocate QMI txn\n"); in ssctl_request_shutdown()
345 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn, in ssctl_request_shutdown()
348 dev_err(sysmon->dev, "failed to send shutdown request\n"); in ssctl_request_shutdown()
355 dev_err(sysmon->dev, "timeout waiting for shutdown response\n"); in ssctl_request_shutdown()
357 dev_err(sysmon->dev, "shutdown request rejected\n"); in ssctl_request_shutdown()
359 dev_dbg(sysmon->dev, "shutdown request completed\n"); in ssctl_request_shutdown()
363 if (sysmon->shutdown_irq > 0) in ssctl_request_shutdown()
364 return ssctl_request_shutdown_wait(sysmon); in ssctl_request_shutdown()
374 static void ssctl_send_event(struct qcom_sysmon *sysmon, in ssctl_send_event() argument
383 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_subsys_event_resp_ei, &resp); in ssctl_send_event()
385 dev_err(sysmon->dev, "failed to allocate QMI txn\n"); in ssctl_send_event()
396 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn, in ssctl_send_event()
400 dev_err(sysmon->dev, "failed to send subsystem event\n"); in ssctl_send_event()
407 dev_err(sysmon->dev, "timeout waiting for subsystem event response\n"); in ssctl_send_event()
409 dev_err(sysmon->dev, "subsystem event rejected\n"); in ssctl_send_event()
411 dev_dbg(sysmon->dev, "subsystem event accepted\n"); in ssctl_send_event()
423 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi); in ssctl_new_server() local
429 if (strcmp(sysmon->name, "modem")) in ssctl_new_server()
433 if (svc->instance != sysmon->ssctl_instance) in ssctl_new_server()
440 sysmon->ssctl_version = svc->version; in ssctl_new_server()
442 sysmon->ssctl.sq_family = AF_QIPCRTR; in ssctl_new_server()
443 sysmon->ssctl.sq_node = svc->node; in ssctl_new_server()
444 sysmon->ssctl.sq_port = svc->port; in ssctl_new_server()
446 svc->priv = sysmon; in ssctl_new_server()
458 struct qcom_sysmon *sysmon = svc->priv; in ssctl_del_server() local
460 sysmon->ssctl_version = 0; in ssctl_del_server()
470 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon, in sysmon_prepare() local
473 .subsys_name = sysmon->name, in sysmon_prepare()
477 mutex_lock(&sysmon->state_lock); in sysmon_prepare()
478 sysmon->state = SSCTL_SSR_EVENT_BEFORE_POWERUP; in sysmon_prepare()
480 mutex_unlock(&sysmon->state_lock); in sysmon_prepare()
496 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon, in sysmon_start() local
500 .subsys_name = sysmon->name, in sysmon_start()
504 mutex_lock(&sysmon->state_lock); in sysmon_start()
505 sysmon->state = SSCTL_SSR_EVENT_AFTER_POWERUP; in sysmon_start()
507 mutex_unlock(&sysmon->state_lock); in sysmon_start()
511 if (target == sysmon) in sysmon_start()
518 if (sysmon->ssctl_version == 2) in sysmon_start()
519 ssctl_send_event(sysmon, &event); in sysmon_start()
520 else if (sysmon->ept) in sysmon_start()
521 sysmon_send_event(sysmon, &event); in sysmon_start()
531 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon, subdev); in sysmon_stop() local
533 .subsys_name = sysmon->name, in sysmon_stop()
537 sysmon->shutdown_acked = false; in sysmon_stop()
539 mutex_lock(&sysmon->state_lock); in sysmon_stop()
540 sysmon->state = SSCTL_SSR_EVENT_BEFORE_SHUTDOWN; in sysmon_stop()
542 mutex_unlock(&sysmon->state_lock); in sysmon_stop()
548 if (sysmon->ssctl_version) in sysmon_stop()
549 sysmon->shutdown_acked = ssctl_request_shutdown(sysmon); in sysmon_stop()
550 else if (sysmon->ept) in sysmon_stop()
551 sysmon->shutdown_acked = sysmon_request_shutdown(sysmon); in sysmon_stop()
556 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon, in sysmon_unprepare() local
559 .subsys_name = sysmon->name, in sysmon_unprepare()
563 mutex_lock(&sysmon->state_lock); in sysmon_unprepare()
564 sysmon->state = SSCTL_SSR_EVENT_AFTER_SHUTDOWN; in sysmon_unprepare()
566 mutex_unlock(&sysmon->state_lock); in sysmon_unprepare()
578 struct qcom_sysmon *sysmon = container_of(nb, struct qcom_sysmon, nb); in sysmon_notify() local
582 if (sysmon->state != SSCTL_SSR_EVENT_AFTER_POWERUP || in sysmon_notify()
583 !strcmp(sysmon_event->subsys_name, sysmon->name)) { in sysmon_notify()
584 dev_dbg(sysmon->dev, "not notifying %s\n", sysmon->name); in sysmon_notify()
589 if (sysmon->ssctl_version == 2) in sysmon_notify()
590 ssctl_send_event(sysmon, sysmon_event); in sysmon_notify()
591 else if (sysmon->ept) in sysmon_notify()
592 sysmon_send_event(sysmon, sysmon_event); in sysmon_notify()
599 struct qcom_sysmon *sysmon = data; in sysmon_shutdown_interrupt() local
601 complete(&sysmon->shutdown_comp); in sysmon_shutdown_interrupt()
618 struct qcom_sysmon *sysmon; in qcom_add_sysmon_subdev() local
621 sysmon = kzalloc(sizeof(*sysmon), GFP_KERNEL); in qcom_add_sysmon_subdev()
622 if (!sysmon) in qcom_add_sysmon_subdev()
625 sysmon->dev = rproc->dev.parent; in qcom_add_sysmon_subdev()
626 sysmon->rproc = rproc; in qcom_add_sysmon_subdev()
628 sysmon->name = name; in qcom_add_sysmon_subdev()
629 sysmon->ssctl_instance = ssctl_instance; in qcom_add_sysmon_subdev()
631 init_completion(&sysmon->comp); in qcom_add_sysmon_subdev()
632 init_completion(&sysmon->ind_comp); in qcom_add_sysmon_subdev()
633 init_completion(&sysmon->shutdown_comp); in qcom_add_sysmon_subdev()
634 mutex_init(&sysmon->lock); in qcom_add_sysmon_subdev()
635 mutex_init(&sysmon->state_lock); in qcom_add_sysmon_subdev()
637 sysmon->shutdown_irq = of_irq_get_byname(sysmon->dev->of_node, in qcom_add_sysmon_subdev()
639 if (sysmon->shutdown_irq < 0) { in qcom_add_sysmon_subdev()
640 if (sysmon->shutdown_irq != -ENODATA) { in qcom_add_sysmon_subdev()
641 dev_err(sysmon->dev, in qcom_add_sysmon_subdev()
643 return ERR_PTR(sysmon->shutdown_irq); in qcom_add_sysmon_subdev()
646 ret = devm_request_threaded_irq(sysmon->dev, in qcom_add_sysmon_subdev()
647 sysmon->shutdown_irq, in qcom_add_sysmon_subdev()
650 "q6v5 shutdown-ack", sysmon); in qcom_add_sysmon_subdev()
652 dev_err(sysmon->dev, in qcom_add_sysmon_subdev()
658 ret = qmi_handle_init(&sysmon->qmi, SSCTL_MAX_MSG_LEN, &ssctl_ops, in qcom_add_sysmon_subdev()
661 dev_err(sysmon->dev, "failed to initialize qmi handle\n"); in qcom_add_sysmon_subdev()
662 kfree(sysmon); in qcom_add_sysmon_subdev()
666 qmi_add_lookup(&sysmon->qmi, 43, 0, 0); in qcom_add_sysmon_subdev()
668 sysmon->subdev.prepare = sysmon_prepare; in qcom_add_sysmon_subdev()
669 sysmon->subdev.start = sysmon_start; in qcom_add_sysmon_subdev()
670 sysmon->subdev.stop = sysmon_stop; in qcom_add_sysmon_subdev()
671 sysmon->subdev.unprepare = sysmon_unprepare; in qcom_add_sysmon_subdev()
673 rproc_add_subdev(rproc, &sysmon->subdev); in qcom_add_sysmon_subdev()
675 sysmon->nb.notifier_call = sysmon_notify; in qcom_add_sysmon_subdev()
676 blocking_notifier_chain_register(&sysmon_notifiers, &sysmon->nb); in qcom_add_sysmon_subdev()
679 list_add(&sysmon->node, &sysmon_list); in qcom_add_sysmon_subdev()
682 return sysmon; in qcom_add_sysmon_subdev()
690 void qcom_remove_sysmon_subdev(struct qcom_sysmon *sysmon) in qcom_remove_sysmon_subdev() argument
692 if (!sysmon) in qcom_remove_sysmon_subdev()
696 list_del(&sysmon->node); in qcom_remove_sysmon_subdev()
699 blocking_notifier_chain_unregister(&sysmon_notifiers, &sysmon->nb); in qcom_remove_sysmon_subdev()
701 rproc_remove_subdev(sysmon->rproc, &sysmon->subdev); in qcom_remove_sysmon_subdev()
703 qmi_handle_release(&sysmon->qmi); in qcom_remove_sysmon_subdev()
705 kfree(sysmon); in qcom_remove_sysmon_subdev()
719 bool qcom_sysmon_shutdown_acked(struct qcom_sysmon *sysmon) in qcom_sysmon_shutdown_acked() argument
721 return sysmon && sysmon->shutdown_acked; in qcom_sysmon_shutdown_acked()
736 struct qcom_sysmon *sysmon; in sysmon_probe() local
746 list_for_each_entry(sysmon, &sysmon_list, node) { in sysmon_probe()
747 if (sysmon->rproc == rproc) in sysmon_probe()
759 rpdev->ept->priv = sysmon; in sysmon_probe()
760 sysmon->ept = rpdev->ept; in sysmon_probe()
773 struct qcom_sysmon *sysmon = rpdev->ept->priv; in sysmon_remove() local
775 sysmon->ept = NULL; in sysmon_remove()