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
120 static void sysmon_request_shutdown(struct qcom_sysmon *sysmon)
125 mutex_lock(&sysmon->lock);
126 reinit_completion(&sysmon->comp);
127 sysmon->ssr_ack = false;
129 ret = rpmsg_send(sysmon->ept, req, strlen(req) + 1);
131 dev_err(sysmon->dev, "send sysmon shutdown request failed\n");
135 ret = wait_for_completion_timeout(&sysmon->comp,
138 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n");
142 if (!sysmon->ssr_ack)
143 dev_err(sysmon->dev,
144 "unexpected response to sysmon shutdown request\n");
147 mutex_unlock(&sysmon->lock);
153 struct qcom_sysmon *sysmon = priv;
157 if (!sysmon)
161 sysmon->ssr_ack = true;
163 complete(&sysmon->comp);
285 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi);
287 complete(&sysmon->ind_comp);
303 * @sysmon: sysmon context
305 static void ssctl_request_shutdown(struct qcom_sysmon *sysmon)
311 reinit_completion(&sysmon->ind_comp);
312 reinit_completion(&sysmon->shutdown_comp);
313 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_shutdown_resp_ei, &resp);
315 dev_err(sysmon->dev, "failed to allocate QMI txn\n");
319 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn,
322 dev_err(sysmon->dev, "failed to send shutdown request\n");
329 dev_err(sysmon->dev, "failed receiving QMI response\n");
331 dev_err(sysmon->dev, "shutdown request failed\n");
333 dev_dbg(sysmon->dev, "shutdown request completed\n");
335 if (sysmon->shutdown_irq > 0) {
336 ret = wait_for_completion_timeout(&sysmon->shutdown_comp,
339 ret = try_wait_for_completion(&sysmon->ind_comp);
341 dev_err(sysmon->dev,
349 * @sysmon: sysmon context
350 * @event: sysmon event context
352 static void ssctl_send_event(struct qcom_sysmon *sysmon,
361 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_subsys_event_resp_ei, &resp);
363 dev_err(sysmon->dev, "failed to allocate QMI txn\n");
374 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn,
378 dev_err(sysmon->dev, "failed to send shutdown request\n");
385 dev_err(sysmon->dev, "failed receiving QMI response\n");
387 dev_err(sysmon->dev, "ssr event send failed\n");
389 dev_dbg(sysmon->dev, "ssr event send completed\n");
401 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi);
407 if (strcmp(sysmon->name, "modem"))
411 if (svc->instance != sysmon->ssctl_instance)
418 sysmon->ssctl_version = svc->version;
420 sysmon->ssctl.sq_family = AF_QIPCRTR;
421 sysmon->ssctl.sq_node = svc->node;
422 sysmon->ssctl.sq_port = svc->port;
424 svc->priv = sysmon;
426 complete(&sysmon->ssctl_comp);
438 struct qcom_sysmon *sysmon = svc->priv;
440 sysmon->ssctl_version = 0;
450 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
453 .subsys_name = sysmon->name,
457 mutex_lock(&sysmon->state_lock);
458 sysmon->state = SSCTL_SSR_EVENT_BEFORE_POWERUP;
460 mutex_unlock(&sysmon->state_lock);
466 * sysmon_start() - start callback for the sysmon remoteproc subdevice
467 * @subdev: instance of the sysmon subdevice
469 * Inform all the listners of sysmon notifications that the rproc associated
476 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
480 .subsys_name = sysmon->name,
484 reinit_completion(&sysmon->ssctl_comp);
485 mutex_lock(&sysmon->state_lock);
486 sysmon->state = SSCTL_SSR_EVENT_AFTER_POWERUP;
488 mutex_unlock(&sysmon->state_lock);
492 if (target == sysmon)
499 if (sysmon->ssctl_version == 2)
500 ssctl_send_event(sysmon, &event);
501 else if (sysmon->ept)
502 sysmon_send_event(sysmon, &event);
512 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon, subdev);
514 .subsys_name = sysmon->name,
518 mutex_lock(&sysmon->state_lock);
519 sysmon->state = SSCTL_SSR_EVENT_BEFORE_SHUTDOWN;
521 mutex_unlock(&sysmon->state_lock);
527 if (sysmon->ssctl_instance) {
528 if (!wait_for_completion_timeout(&sysmon->ssctl_comp, HZ / 2))
529 dev_err(sysmon->dev, "timeout waiting for ssctl service\n");
532 if (sysmon->ssctl_version)
533 ssctl_request_shutdown(sysmon);
534 else if (sysmon->ept)
535 sysmon_request_shutdown(sysmon);
540 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon,
543 .subsys_name = sysmon->name,
547 mutex_lock(&sysmon->state_lock);
548 sysmon->state = SSCTL_SSR_EVENT_AFTER_SHUTDOWN;
550 mutex_unlock(&sysmon->state_lock);
554 * sysmon_notify() - notify sysmon target of another's SSR
555 * @nb: notifier_block associated with sysmon instance
562 struct qcom_sysmon *sysmon = container_of(nb, struct qcom_sysmon, nb);
566 if (sysmon->state != SSCTL_SSR_EVENT_AFTER_POWERUP ||
567 !strcmp(sysmon_event->subsys_name, sysmon->name)) {
568 dev_dbg(sysmon->dev, "not notifying %s\n", sysmon->name);
573 if (sysmon->ssctl_version == 2)
574 ssctl_send_event(sysmon, sysmon_event);
575 else if (sysmon->ept)
576 sysmon_send_event(sysmon, sysmon_event);
583 struct qcom_sysmon *sysmon = data;
585 complete(&sysmon->shutdown_comp);
591 * qcom_add_sysmon_subdev() - create a sysmon subdev for the given remoteproc
602 struct qcom_sysmon *sysmon;
605 sysmon = kzalloc(sizeof(*sysmon), GFP_KERNEL);
606 if (!sysmon)
609 sysmon->dev = rproc->dev.parent;
610 sysmon->rproc = rproc;
612 sysmon->name = name;
613 sysmon->ssctl_instance = ssctl_instance;
615 init_completion(&sysmon->comp);
616 init_completion(&sysmon->ind_comp);
617 init_completion(&sysmon->shutdown_comp);
618 init_completion(&sysmon->ssctl_comp);
619 mutex_init(&sysmon->lock);
620 mutex_init(&sysmon->state_lock);
622 sysmon->shutdown_irq = of_irq_get_byname(sysmon->dev->of_node,
624 if (sysmon->shutdown_irq < 0) {
625 if (sysmon->shutdown_irq != -ENODATA) {
626 dev_err(sysmon->dev,
628 ret = sysmon->shutdown_irq;
629 kfree(sysmon);
633 ret = devm_request_threaded_irq(sysmon->dev,
634 sysmon->shutdown_irq,
637 "q6v5 shutdown-ack", sysmon);
639 dev_err(sysmon->dev,
641 kfree(sysmon);
646 ret = qmi_handle_init(&sysmon->qmi, SSCTL_MAX_MSG_LEN, &ssctl_ops,
649 dev_err(sysmon->dev, "failed to initialize qmi handle\n");
650 kfree(sysmon);
654 qmi_add_lookup(&sysmon->qmi, 43, 0, 0);
656 sysmon->subdev.prepare = sysmon_prepare;
657 sysmon->subdev.start = sysmon_start;
658 sysmon->subdev.stop = sysmon_stop;
659 sysmon->subdev.unprepare = sysmon_unprepare;
661 rproc_add_subdev(rproc, &sysmon->subdev);
663 sysmon->nb.notifier_call = sysmon_notify;
664 blocking_notifier_chain_register(&sysmon_notifiers, &sysmon->nb);
667 list_add(&sysmon->node, &sysmon_list);
670 return sysmon;
676 * @sysmon: sysmon context, as retrieved by qcom_add_sysmon_subdev()
678 void qcom_remove_sysmon_subdev(struct qcom_sysmon *sysmon)
680 if (!sysmon)
684 list_del(&sysmon->node);
687 blocking_notifier_chain_unregister(&sysmon_notifiers, &sysmon->nb);
689 rproc_remove_subdev(sysmon->rproc, &sysmon->subdev);
691 qmi_handle_release(&sysmon->qmi);
693 kfree(sysmon);
701 * Find the sysmon context associated with the ancestor remoteproc and assign
702 * this rpmsg device with said sysmon context.
708 struct qcom_sysmon *sysmon;
713 dev_err(&rpdev->dev, "sysmon device not child of rproc\n");
718 list_for_each_entry(sysmon, &sysmon_list, node) {
719 if (sysmon->rproc == rproc)
724 dev_err(&rpdev->dev, "no sysmon associated with parent rproc\n");
731 rpdev->ept->priv = sysmon;
732 sysmon->ept = rpdev->ept;
741 * Disassociate the rpmsg device with the sysmon instance.
745 struct qcom_sysmon *sysmon = rpdev->ept->priv;
747 sysmon->ept = NULL;
767 MODULE_DESCRIPTION("Qualcomm sysmon driver");