Lines Matching refs:sysmon
57 static void sysmon_send_event(struct qcom_sysmon *sysmon, const char *name) in sysmon_send_event() argument
67 mutex_lock(&sysmon->lock); in sysmon_send_event()
68 reinit_completion(&sysmon->comp); in sysmon_send_event()
69 sysmon->ssr_ack = false; in sysmon_send_event()
71 ret = rpmsg_send(sysmon->ept, req, len); in sysmon_send_event()
73 dev_err(sysmon->dev, "failed to send sysmon event\n"); in sysmon_send_event()
77 ret = wait_for_completion_timeout(&sysmon->comp, in sysmon_send_event()
80 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n"); in sysmon_send_event()
84 if (!sysmon->ssr_ack) in sysmon_send_event()
85 dev_err(sysmon->dev, "unexpected response to sysmon event\n"); in sysmon_send_event()
88 mutex_unlock(&sysmon->lock); in sysmon_send_event()
95 static void sysmon_request_shutdown(struct qcom_sysmon *sysmon) in sysmon_request_shutdown() argument
100 mutex_lock(&sysmon->lock); in sysmon_request_shutdown()
101 reinit_completion(&sysmon->comp); in sysmon_request_shutdown()
102 sysmon->ssr_ack = false; in sysmon_request_shutdown()
104 ret = rpmsg_send(sysmon->ept, req, strlen(req) + 1); in sysmon_request_shutdown()
106 dev_err(sysmon->dev, "send sysmon shutdown request failed\n"); in sysmon_request_shutdown()
110 ret = wait_for_completion_timeout(&sysmon->comp, in sysmon_request_shutdown()
113 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n"); in sysmon_request_shutdown()
117 if (!sysmon->ssr_ack) in sysmon_request_shutdown()
118 dev_err(sysmon->dev, in sysmon_request_shutdown()
122 mutex_unlock(&sysmon->lock); in sysmon_request_shutdown()
128 struct qcom_sysmon *sysmon = priv; in sysmon_callback() local
132 if (!sysmon) in sysmon_callback()
136 sysmon->ssr_ack = true; in sysmon_callback()
138 complete(&sysmon->comp); in sysmon_callback()
267 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi); in sysmon_ind_cb() local
269 complete(&sysmon->ind_comp); in sysmon_ind_cb()
287 static void ssctl_request_shutdown(struct qcom_sysmon *sysmon) in ssctl_request_shutdown() argument
293 reinit_completion(&sysmon->ind_comp); in ssctl_request_shutdown()
294 reinit_completion(&sysmon->shutdown_comp); in ssctl_request_shutdown()
295 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_shutdown_resp_ei, &resp); in ssctl_request_shutdown()
297 dev_err(sysmon->dev, "failed to allocate QMI txn\n"); in ssctl_request_shutdown()
301 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn, in ssctl_request_shutdown()
304 dev_err(sysmon->dev, "failed to send shutdown request\n"); in ssctl_request_shutdown()
311 dev_err(sysmon->dev, "failed receiving QMI response\n"); in ssctl_request_shutdown()
313 dev_err(sysmon->dev, "shutdown request failed\n"); in ssctl_request_shutdown()
315 dev_dbg(sysmon->dev, "shutdown request completed\n"); in ssctl_request_shutdown()
317 if (sysmon->shutdown_irq > 0) { in ssctl_request_shutdown()
318 ret = wait_for_completion_timeout(&sysmon->shutdown_comp, in ssctl_request_shutdown()
321 ret = try_wait_for_completion(&sysmon->ind_comp); in ssctl_request_shutdown()
323 dev_err(sysmon->dev, in ssctl_request_shutdown()
334 static void ssctl_send_event(struct qcom_sysmon *sysmon, const char *name) in ssctl_send_event() argument
342 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_subsys_event_resp_ei, &resp); in ssctl_send_event()
344 dev_err(sysmon->dev, "failed to allocate QMI txn\n"); in ssctl_send_event()
355 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn, in ssctl_send_event()
359 dev_err(sysmon->dev, "failed to send shutdown request\n"); in ssctl_send_event()
366 dev_err(sysmon->dev, "failed receiving QMI response\n"); in ssctl_send_event()
368 dev_err(sysmon->dev, "ssr event send failed\n"); in ssctl_send_event()
370 dev_dbg(sysmon->dev, "ssr event send completed\n"); in ssctl_send_event()
382 struct qcom_sysmon *sysmon = container_of(qmi, struct qcom_sysmon, qmi); in ssctl_new_server() local
388 if (strcmp(sysmon->name, "modem")) in ssctl_new_server()
392 if (svc->instance != sysmon->ssctl_instance) in ssctl_new_server()
399 sysmon->ssctl_version = svc->version; in ssctl_new_server()
401 sysmon->ssctl.sq_family = AF_QIPCRTR; in ssctl_new_server()
402 sysmon->ssctl.sq_node = svc->node; in ssctl_new_server()
403 sysmon->ssctl.sq_port = svc->port; in ssctl_new_server()
405 svc->priv = sysmon; in ssctl_new_server()
417 struct qcom_sysmon *sysmon = svc->priv; in ssctl_del_server() local
419 sysmon->ssctl_version = 0; in ssctl_del_server()
434 struct qcom_sysmon *sysmon = container_of(subdev, struct qcom_sysmon, subdev); in sysmon_stop() local
436 blocking_notifier_call_chain(&sysmon_notifiers, 0, (void *)sysmon->name); in sysmon_stop()
442 if (sysmon->ssctl_version) in sysmon_stop()
443 ssctl_request_shutdown(sysmon); in sysmon_stop()
444 else if (sysmon->ept) in sysmon_stop()
445 sysmon_request_shutdown(sysmon); in sysmon_stop()
457 struct qcom_sysmon *sysmon = container_of(nb, struct qcom_sysmon, nb); in sysmon_notify() local
458 struct rproc *rproc = sysmon->rproc; in sysmon_notify()
462 if (rproc->state != RPROC_RUNNING || !strcmp(data, sysmon->name)) { in sysmon_notify()
463 dev_dbg(sysmon->dev, "not notifying %s\n", sysmon->name); in sysmon_notify()
468 if (sysmon->ssctl_version == 2) in sysmon_notify()
469 ssctl_send_event(sysmon, ssr_name); in sysmon_notify()
470 else if (sysmon->ept) in sysmon_notify()
471 sysmon_send_event(sysmon, ssr_name); in sysmon_notify()
478 struct qcom_sysmon *sysmon = data; in sysmon_shutdown_interrupt() local
480 complete(&sysmon->shutdown_comp); in sysmon_shutdown_interrupt()
497 struct qcom_sysmon *sysmon; in qcom_add_sysmon_subdev() local
500 sysmon = kzalloc(sizeof(*sysmon), GFP_KERNEL); in qcom_add_sysmon_subdev()
501 if (!sysmon) in qcom_add_sysmon_subdev()
504 sysmon->dev = rproc->dev.parent; in qcom_add_sysmon_subdev()
505 sysmon->rproc = rproc; in qcom_add_sysmon_subdev()
507 sysmon->name = name; in qcom_add_sysmon_subdev()
508 sysmon->ssctl_instance = ssctl_instance; in qcom_add_sysmon_subdev()
510 init_completion(&sysmon->comp); in qcom_add_sysmon_subdev()
511 init_completion(&sysmon->ind_comp); in qcom_add_sysmon_subdev()
512 init_completion(&sysmon->shutdown_comp); in qcom_add_sysmon_subdev()
513 mutex_init(&sysmon->lock); in qcom_add_sysmon_subdev()
515 sysmon->shutdown_irq = of_irq_get_byname(sysmon->dev->of_node, in qcom_add_sysmon_subdev()
517 if (sysmon->shutdown_irq < 0) { in qcom_add_sysmon_subdev()
518 if (sysmon->shutdown_irq != -ENODATA) { in qcom_add_sysmon_subdev()
519 dev_err(sysmon->dev, in qcom_add_sysmon_subdev()
521 return ERR_PTR(sysmon->shutdown_irq); in qcom_add_sysmon_subdev()
524 ret = devm_request_threaded_irq(sysmon->dev, in qcom_add_sysmon_subdev()
525 sysmon->shutdown_irq, in qcom_add_sysmon_subdev()
528 "q6v5 shutdown-ack", sysmon); in qcom_add_sysmon_subdev()
530 dev_err(sysmon->dev, in qcom_add_sysmon_subdev()
536 ret = qmi_handle_init(&sysmon->qmi, SSCTL_MAX_MSG_LEN, &ssctl_ops, in qcom_add_sysmon_subdev()
539 dev_err(sysmon->dev, "failed to initialize qmi handle\n"); in qcom_add_sysmon_subdev()
540 kfree(sysmon); in qcom_add_sysmon_subdev()
544 qmi_add_lookup(&sysmon->qmi, 43, 0, 0); in qcom_add_sysmon_subdev()
546 sysmon->subdev.start = sysmon_start; in qcom_add_sysmon_subdev()
547 sysmon->subdev.stop = sysmon_stop; in qcom_add_sysmon_subdev()
549 rproc_add_subdev(rproc, &sysmon->subdev); in qcom_add_sysmon_subdev()
551 sysmon->nb.notifier_call = sysmon_notify; in qcom_add_sysmon_subdev()
552 blocking_notifier_chain_register(&sysmon_notifiers, &sysmon->nb); in qcom_add_sysmon_subdev()
555 list_add(&sysmon->node, &sysmon_list); in qcom_add_sysmon_subdev()
558 return sysmon; in qcom_add_sysmon_subdev()
566 void qcom_remove_sysmon_subdev(struct qcom_sysmon *sysmon) in qcom_remove_sysmon_subdev() argument
568 if (!sysmon) in qcom_remove_sysmon_subdev()
572 list_del(&sysmon->node); in qcom_remove_sysmon_subdev()
575 blocking_notifier_chain_unregister(&sysmon_notifiers, &sysmon->nb); in qcom_remove_sysmon_subdev()
577 rproc_remove_subdev(sysmon->rproc, &sysmon->subdev); in qcom_remove_sysmon_subdev()
579 qmi_handle_release(&sysmon->qmi); in qcom_remove_sysmon_subdev()
581 kfree(sysmon); in qcom_remove_sysmon_subdev()
596 struct qcom_sysmon *sysmon; in sysmon_probe() local
606 list_for_each_entry(sysmon, &sysmon_list, node) { in sysmon_probe()
607 if (sysmon->rproc == rproc) in sysmon_probe()
619 rpdev->ept->priv = sysmon; in sysmon_probe()
620 sysmon->ept = rpdev->ept; in sysmon_probe()
633 struct qcom_sysmon *sysmon = rpdev->ept->priv; in sysmon_remove() local
635 sysmon->ept = NULL; in sysmon_remove()