Lines Matching defs:sysmon

77  * @sysmon:	sysmon context
78 * @event: sysmon event context
80 static void sysmon_send_event(struct qcom_sysmon *sysmon,
92 mutex_lock(&sysmon->lock);
93 reinit_completion(&sysmon->comp);
94 sysmon->ssr_ack = false;
96 ret = rpmsg_send(sysmon->ept, req, len);
98 dev_err(sysmon->dev, "failed to send sysmon event\n");
102 ret = wait_for_completion_timeout(&sysmon->comp,
105 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n");
109 if (!sysmon->ssr_ack)
110 dev_err(sysmon->dev, "unexpected response to sysmon event\n");
113 mutex_unlock(&sysmon->lock);
118 * @sysmon: sysmon context
122 static bool sysmon_request_shutdown(struct qcom_sysmon *sysmon)
128 mutex_lock(&sysmon->lock);
129 reinit_completion(&sysmon->comp);
130 sysmon->ssr_ack = false;
132 ret = rpmsg_send(sysmon->ept, req, strlen(req) + 1);
134 dev_err(sysmon->dev, "send sysmon shutdown request failed\n");
138 ret = wait_for_completion_timeout(&sysmon->comp,
141 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n");
145 if (!sysmon->ssr_ack)
146 dev_err(sysmon->dev,
147 "unexpected response to sysmon shutdown request\n");
152 mutex_unlock(&sysmon->lock);
160 struct qcom_sysmon *sysmon = priv;
164 if (!sysmon)
168 sysmon->ssr_ack = true;
170 complete(&sysmon->comp);
292 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi);
294 complete(&sysmon->ind_comp);
308 static bool ssctl_request_shutdown_wait(struct qcom_sysmon *sysmon)
312 ret = wait_for_completion_timeout(&sysmon->shutdown_comp, 10 * HZ);
316 ret = try_wait_for_completion(&sysmon->ind_comp);
320 dev_err(sysmon->dev, "timeout waiting for shutdown ack\n");
326 * @sysmon: sysmon context
330 static bool ssctl_request_shutdown(struct qcom_sysmon *sysmon)
337 reinit_completion(&sysmon->ind_comp);
338 reinit_completion(&sysmon->shutdown_comp);
339 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_shutdown_resp_ei, &resp);
341 dev_err(sysmon->dev, "failed to allocate QMI txn\n");
345 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn,
348 dev_err(sysmon->dev, "failed to send shutdown request\n");
355 dev_err(sysmon->dev, "timeout waiting for shutdown response\n");
357 dev_err(sysmon->dev, "shutdown request rejected\n");
359 dev_dbg(sysmon->dev, "shutdown request completed\n");
363 if (sysmon->shutdown_irq > 0)
364 return ssctl_request_shutdown_wait(sysmon);
371 * @sysmon: sysmon context
372 * @event: sysmon event context
374 static void ssctl_send_event(struct qcom_sysmon *sysmon,
383 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_subsys_event_resp_ei, &resp);
385 dev_err(sysmon->dev, "failed to allocate QMI txn\n");
396 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn,
400 dev_err(sysmon->dev, "failed to send subsystem event\n");
407 dev_err(sysmon->dev, "timeout waiting for subsystem event response\n");
409 dev_err(sysmon->dev, "subsystem event rejected\n");
411 dev_dbg(sysmon->dev, "subsystem event accepted\n");
423 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi);
429 if (strcmp(sysmon->name, "modem"))
433 if (svc->instance != sysmon->ssctl_instance)
440 sysmon->ssctl_version = svc->version;
442 sysmon->ssctl.sq_family = AF_QIPCRTR;
443 sysmon->ssctl.sq_node = svc->node;
444 sysmon->ssctl.sq_port = svc->port;
446 svc->priv = sysmon;
448 complete(&sysmon->ssctl_comp);
460 struct qcom_sysmon *sysmon = svc->priv;
462 sysmon->ssctl_version = 0;
472 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
475 .subsys_name = sysmon->name,
479 mutex_lock(&sysmon->state_lock);
480 sysmon->state = SSCTL_SSR_EVENT_BEFORE_POWERUP;
482 mutex_unlock(&sysmon->state_lock);
488 * sysmon_start() - start callback for the sysmon remoteproc subdevice
489 * @subdev: instance of the sysmon subdevice
491 * Inform all the listners of sysmon notifications that the rproc associated
498 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
502 .subsys_name = sysmon->name,
506 reinit_completion(&sysmon->ssctl_comp);
507 mutex_lock(&sysmon->state_lock);
508 sysmon->state = SSCTL_SSR_EVENT_AFTER_POWERUP;
510 mutex_unlock(&sysmon->state_lock);
515 if (target == sysmon || target->state != SSCTL_SSR_EVENT_AFTER_POWERUP) {
523 if (sysmon->ssctl_version == 2)
524 ssctl_send_event(sysmon, &event);
525 else if (sysmon->ept)
526 sysmon_send_event(sysmon, &event);
536 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon, subdev);
538 .subsys_name = sysmon->name,
542 sysmon->shutdown_acked = false;
544 mutex_lock(&sysmon->state_lock);
545 sysmon->state = SSCTL_SSR_EVENT_BEFORE_SHUTDOWN;
547 mutex_unlock(&sysmon->state_lock);
553 if (sysmon->ssctl_instance) {
554 if (!wait_for_completion_timeout(&sysmon->ssctl_comp, HZ / 2))
555 dev_err(sysmon->dev, "timeout waiting for ssctl service\n");
558 if (sysmon->ssctl_version)
559 sysmon->shutdown_acked = ssctl_request_shutdown(sysmon);
560 else if (sysmon->ept)
561 sysmon->shutdown_acked = sysmon_request_shutdown(sysmon);
566 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
569 .subsys_name = sysmon->name,
573 mutex_lock(&sysmon->state_lock);
574 sysmon->state = SSCTL_SSR_EVENT_AFTER_SHUTDOWN;
576 mutex_unlock(&sysmon->state_lock);
580 * sysmon_notify() - notify sysmon target of another's SSR
581 * @nb: notifier_block associated with sysmon instance
588 struct qcom_sysmon *sysmon = container_of(nb, struct qcom_sysmon, nb);
592 if (sysmon->state != SSCTL_SSR_EVENT_AFTER_POWERUP ||
593 !strcmp(sysmon_event->subsys_name, sysmon->name)) {
594 dev_dbg(sysmon->dev, "not notifying %s\n", sysmon->name);
599 if (sysmon->ssctl_version == 2)
600 ssctl_send_event(sysmon, sysmon_event);
601 else if (sysmon->ept)
602 sysmon_send_event(sysmon, sysmon_event);
609 struct qcom_sysmon *sysmon = data;
611 complete(&sysmon->shutdown_comp);
617 * qcom_add_sysmon_subdev() - create a sysmon subdev for the given remoteproc
628 struct qcom_sysmon *sysmon;
631 sysmon = kzalloc(sizeof(*sysmon), GFP_KERNEL);
632 if (!sysmon)
635 sysmon->dev = rproc->dev.parent;
636 sysmon->rproc = rproc;
638 sysmon->name = name;
639 sysmon->ssctl_instance = ssctl_instance;
641 init_completion(&sysmon->comp);
642 init_completion(&sysmon->ind_comp);
643 init_completion(&sysmon->shutdown_comp);
644 init_completion(&sysmon->ssctl_comp);
645 mutex_init(&sysmon->lock);
646 mutex_init(&sysmon->state_lock);
648 sysmon->shutdown_irq = of_irq_get_byname(sysmon->dev->of_node,
650 if (sysmon->shutdown_irq < 0) {
651 if (sysmon->shutdown_irq != -ENODATA) {
652 dev_err(sysmon->dev,
654 ret = sysmon->shutdown_irq;
655 kfree(sysmon);
659 ret = devm_request_threaded_irq(sysmon->dev,
660 sysmon->shutdown_irq,
663 "q6v5 shutdown-ack", sysmon);
665 dev_err(sysmon->dev,
667 kfree(sysmon);
672 ret = qmi_handle_init(&sysmon->qmi, SSCTL_MAX_MSG_LEN, &ssctl_ops,
675 dev_err(sysmon->dev, "failed to initialize qmi handle\n");
676 kfree(sysmon);
680 qmi_add_lookup(&sysmon->qmi, 43, 0, 0);
682 sysmon->subdev.prepare = sysmon_prepare;
683 sysmon->subdev.start = sysmon_start;
684 sysmon->subdev.stop = sysmon_stop;
685 sysmon->subdev.unprepare = sysmon_unprepare;
687 rproc_add_subdev(rproc, &sysmon->subdev);
689 sysmon->nb.notifier_call = sysmon_notify;
690 blocking_notifier_chain_register(&sysmon_notifiers, &sysmon->nb);
693 list_add(&sysmon->node, &sysmon_list);
696 return sysmon;
702 * @sysmon: sysmon context, as retrieved by qcom_add_sysmon_subdev()
704 void qcom_remove_sysmon_subdev(struct qcom_sysmon *sysmon)
706 if (!sysmon)
710 list_del(&sysmon->node);
713 blocking_notifier_chain_unregister(&sysmon_notifiers, &sysmon->nb);
715 rproc_remove_subdev(sysmon->rproc, &sysmon->subdev);
717 qmi_handle_release(&sysmon->qmi);
719 kfree(sysmon);
725 * @sysmon: sysmon context
727 * When sysmon is used to request a graceful shutdown of the remote processor
733 bool qcom_sysmon_shutdown_acked(struct qcom_sysmon *sysmon)
735 return sysmon && sysmon->shutdown_acked;
743 * Find the sysmon context associated with the ancestor remoteproc and assign
744 * this rpmsg device with said sysmon context.
750 struct qcom_sysmon *sysmon;
755 dev_err(&rpdev->dev, "sysmon device not child of rproc\n");
760 list_for_each_entry(sysmon, &sysmon_list, node) {
761 if (sysmon->rproc == rproc)
766 dev_err(&rpdev->dev, "no sysmon associated with parent rproc\n");
773 rpdev->ept->priv = sysmon;
774 sysmon->ept = rpdev->ept;
783 * Disassociate the rpmsg device with the sysmon instance.
787 struct qcom_sysmon *sysmon = rpdev->ept->priv;
789 sysmon->ept = NULL;
809 MODULE_DESCRIPTION("Qualcomm sysmon driver");