• Home
  • Raw
  • Download

Lines Matching +full:rpmsg +full:- +full:name

1 // SPDX-License-Identifier: GPL-2.0
14 #include <linux/rpmsg.h>
26 const char *name; member
49 * sysmon_send_event() - send notification of other remote's SSR event
51 * @name: other remote's name
53 static void sysmon_send_event(struct qcom_sysmon *sysmon, const char *name) in sysmon_send_event() argument
59 len = snprintf(req, sizeof(req), "ssr:%s:before_shutdown", name); in sysmon_send_event()
63 mutex_lock(&sysmon->lock); in sysmon_send_event()
64 reinit_completion(&sysmon->comp); in sysmon_send_event()
65 sysmon->ssr_ack = false; in sysmon_send_event()
67 ret = rpmsg_send(sysmon->ept, req, len); in sysmon_send_event()
69 dev_err(sysmon->dev, "failed to send sysmon event\n"); in sysmon_send_event()
73 ret = wait_for_completion_timeout(&sysmon->comp, in sysmon_send_event()
76 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n"); in sysmon_send_event()
80 if (!sysmon->ssr_ack) in sysmon_send_event()
81 dev_err(sysmon->dev, "unexpected response to sysmon event\n"); in sysmon_send_event()
84 mutex_unlock(&sysmon->lock); in sysmon_send_event()
88 * sysmon_request_shutdown() - request graceful shutdown of remote
96 mutex_lock(&sysmon->lock); in sysmon_request_shutdown()
97 reinit_completion(&sysmon->comp); in sysmon_request_shutdown()
98 sysmon->ssr_ack = false; in sysmon_request_shutdown()
100 ret = rpmsg_send(sysmon->ept, req, strlen(req) + 1); in sysmon_request_shutdown()
102 dev_err(sysmon->dev, "send sysmon shutdown request failed\n"); in sysmon_request_shutdown()
106 ret = wait_for_completion_timeout(&sysmon->comp, in sysmon_request_shutdown()
109 dev_err(sysmon->dev, "timeout waiting for sysmon ack\n"); in sysmon_request_shutdown()
113 if (!sysmon->ssr_ack) in sysmon_request_shutdown()
114 dev_err(sysmon->dev, in sysmon_request_shutdown()
118 mutex_unlock(&sysmon->lock); in sysmon_request_shutdown()
129 return -EINVAL; in sysmon_callback()
132 sysmon->ssr_ack = true; in sysmon_callback()
134 complete(&sysmon->comp); in sysmon_callback()
256 * ssctl_request_shutdown() - request shutdown via SSCTL QMI service
265 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_shutdown_resp_ei, &resp); in ssctl_request_shutdown()
267 dev_err(sysmon->dev, "failed to allocate QMI txn\n"); in ssctl_request_shutdown()
271 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn, in ssctl_request_shutdown()
274 dev_err(sysmon->dev, "failed to send shutdown request\n"); in ssctl_request_shutdown()
281 dev_err(sysmon->dev, "failed receiving QMI response\n"); in ssctl_request_shutdown()
283 dev_err(sysmon->dev, "shutdown request failed\n"); in ssctl_request_shutdown()
285 dev_dbg(sysmon->dev, "shutdown request completed\n"); in ssctl_request_shutdown()
289 * ssctl_send_event() - send notification of other remote's SSR event
291 * @name: other remote's name
293 static void ssctl_send_event(struct qcom_sysmon *sysmon, const char *name) in ssctl_send_event() argument
301 ret = qmi_txn_init(&sysmon->qmi, &txn, ssctl_subsys_event_resp_ei, &resp); in ssctl_send_event()
303 dev_err(sysmon->dev, "failed to allocate QMI txn\n"); in ssctl_send_event()
308 strlcpy(req.subsys_name, name, sizeof(req.subsys_name)); in ssctl_send_event()
314 ret = qmi_send_request(&sysmon->qmi, &sysmon->ssctl, &txn, in ssctl_send_event()
318 dev_err(sysmon->dev, "failed to send shutdown request\n"); in ssctl_send_event()
325 dev_err(sysmon->dev, "failed receiving QMI response\n"); in ssctl_send_event()
327 dev_err(sysmon->dev, "ssr event send failed\n"); in ssctl_send_event()
329 dev_dbg(sysmon->dev, "ssr event send completed\n"); in ssctl_send_event()
333 * ssctl_new_server() - QMI callback indicating a new service
337 * Return: 0 if we're interested in this service, -EINVAL otherwise.
343 switch (svc->version) { in ssctl_new_server()
345 if (svc->instance != 0) in ssctl_new_server()
346 return -EINVAL; in ssctl_new_server()
347 if (strcmp(sysmon->name, "modem")) in ssctl_new_server()
348 return -EINVAL; in ssctl_new_server()
351 if (svc->instance != sysmon->ssctl_instance) in ssctl_new_server()
352 return -EINVAL; in ssctl_new_server()
355 return -EINVAL; in ssctl_new_server()
358 sysmon->ssctl_version = svc->version; in ssctl_new_server()
360 sysmon->ssctl.sq_family = AF_QIPCRTR; in ssctl_new_server()
361 sysmon->ssctl.sq_node = svc->node; in ssctl_new_server()
362 sysmon->ssctl.sq_port = svc->port; in ssctl_new_server()
364 svc->priv = sysmon; in ssctl_new_server()
370 * ssctl_del_server() - QMI callback indicating that @svc is removed
376 struct qcom_sysmon *sysmon = svc->priv; in ssctl_del_server()
378 sysmon->ssctl_version = 0; in ssctl_del_server()
395 blocking_notifier_call_chain(&sysmon_notifiers, 0, (void *)sysmon->name); in sysmon_stop()
401 if (sysmon->ssctl_version) in sysmon_stop()
403 else if (sysmon->ept) in sysmon_stop()
408 * sysmon_notify() - notify sysmon target of another's SSR
417 struct rproc *rproc = sysmon->rproc; in sysmon_notify()
420 /* Skip non-running rprocs and the originating instance */ in sysmon_notify()
421 if (rproc->state != RPROC_RUNNING || !strcmp(data, sysmon->name)) { in sysmon_notify()
422 dev_dbg(sysmon->dev, "not notifying %s\n", sysmon->name); in sysmon_notify()
427 if (sysmon->ssctl_version == 2) in sysmon_notify()
429 else if (sysmon->ept) in sysmon_notify()
436 * qcom_add_sysmon_subdev() - create a sysmon subdev for the given remoteproc
438 * @name: name of this subdev, to use in SSR
444 const char *name, in qcom_add_sysmon_subdev() argument
454 sysmon->dev = rproc->dev.parent; in qcom_add_sysmon_subdev()
455 sysmon->rproc = rproc; in qcom_add_sysmon_subdev()
457 sysmon->name = name; in qcom_add_sysmon_subdev()
458 sysmon->ssctl_instance = ssctl_instance; in qcom_add_sysmon_subdev()
460 init_completion(&sysmon->comp); in qcom_add_sysmon_subdev()
461 mutex_init(&sysmon->lock); in qcom_add_sysmon_subdev()
463 ret = qmi_handle_init(&sysmon->qmi, SSCTL_MAX_MSG_LEN, &ssctl_ops, NULL); in qcom_add_sysmon_subdev()
465 dev_err(sysmon->dev, "failed to initialize qmi handle\n"); in qcom_add_sysmon_subdev()
470 qmi_add_lookup(&sysmon->qmi, 43, 0, 0); in qcom_add_sysmon_subdev()
472 sysmon->subdev.start = sysmon_start; in qcom_add_sysmon_subdev()
473 sysmon->subdev.stop = sysmon_stop; in qcom_add_sysmon_subdev()
475 rproc_add_subdev(rproc, &sysmon->subdev); in qcom_add_sysmon_subdev()
477 sysmon->nb.notifier_call = sysmon_notify; in qcom_add_sysmon_subdev()
478 blocking_notifier_chain_register(&sysmon_notifiers, &sysmon->nb); in qcom_add_sysmon_subdev()
481 list_add(&sysmon->node, &sysmon_list); in qcom_add_sysmon_subdev()
489 * qcom_remove_sysmon_subdev() - release a qcom_sysmon
498 list_del(&sysmon->node); in qcom_remove_sysmon_subdev()
501 blocking_notifier_chain_unregister(&sysmon_notifiers, &sysmon->nb); in qcom_remove_sysmon_subdev()
503 rproc_remove_subdev(sysmon->rproc, &sysmon->subdev); in qcom_remove_sysmon_subdev()
505 qmi_handle_release(&sysmon->qmi); in qcom_remove_sysmon_subdev()
512 * sysmon_probe() - probe sys_mon channel
513 * @rpdev: rpmsg device handle
516 * this rpmsg device with said sysmon context.
525 rproc = rproc_get_by_child(&rpdev->dev); in sysmon_probe()
527 dev_err(&rpdev->dev, "sysmon device not child of rproc\n"); in sysmon_probe()
528 return -EINVAL; in sysmon_probe()
533 if (sysmon->rproc == rproc) in sysmon_probe()
538 dev_err(&rpdev->dev, "no sysmon associated with parent rproc\n"); in sysmon_probe()
540 return -EINVAL; in sysmon_probe()
545 rpdev->ept->priv = sysmon; in sysmon_probe()
546 sysmon->ept = rpdev->ept; in sysmon_probe()
552 * sysmon_remove() - sys_mon channel remove handler
553 * @rpdev: rpmsg device handle
555 * Disassociate the rpmsg device with the sysmon instance.
559 struct qcom_sysmon *sysmon = rpdev->ept->priv; in sysmon_remove()
561 sysmon->ept = NULL; in sysmon_remove()
575 .name = "qcom_sysmon",