• Home
  • Raw
  • Download

Lines Matching full:sysmon

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