|  | /* | 
|  | * Copyright (c) 2021 Nordic Semiconductor ASA | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #include <zephyr/kernel.h> | 
|  | #include <zephyr/ipc/ipc_service.h> | 
|  | #include <zephyr/logging/log_link.h> | 
|  | #include <zephyr/logging/log_multidomain_helper.h> | 
|  | #include <zephyr/logging/log_core.h> | 
|  | #include <zephyr/logging/log.h> | 
|  |  | 
|  | LOG_MODULE_REGISTER(link_ipc); | 
|  |  | 
|  | struct log_link_ipc_service { | 
|  | struct ipc_ept ept; | 
|  | struct log_multidomain_link link_remote; | 
|  | }; | 
|  |  | 
|  | static void bound_cb(void *priv) | 
|  | { | 
|  | struct log_multidomain_link *link_remote = priv; | 
|  |  | 
|  | log_multidomain_link_on_started(link_remote, 0); | 
|  | } | 
|  |  | 
|  | static void error_cb(const char *message, void *priv) | 
|  | { | 
|  | struct log_multidomain_link *link_remote = priv; | 
|  |  | 
|  | log_multidomain_link_on_error(link_remote, -EIO); | 
|  | } | 
|  |  | 
|  | static void recv_cb(const void *data, size_t len, void *priv) | 
|  | { | 
|  | struct log_multidomain_link *link_remote = priv; | 
|  |  | 
|  | log_multidomain_link_on_recv_cb(link_remote, data, len); | 
|  | } | 
|  |  | 
|  | static int link_ipc_service_send(struct log_multidomain_link *link_remote, | 
|  | void *data, size_t len) | 
|  | { | 
|  | struct log_link_ipc_service *link_ipc_service = | 
|  | CONTAINER_OF(link_remote, struct log_link_ipc_service, link_remote); | 
|  |  | 
|  | return ipc_service_send(&link_ipc_service->ept, data, len); | 
|  | } | 
|  |  | 
|  | static int link_ipc_service_init(struct log_multidomain_link *link_remote) | 
|  | { | 
|  | struct log_link_ipc_service *link_ipc_service = | 
|  | CONTAINER_OF(link_remote, struct log_link_ipc_service, link_remote); | 
|  | static struct ipc_ept_cfg ept_cfg = { | 
|  | .name = "logging", | 
|  | .prio = 0, | 
|  | .cb = { | 
|  | .bound    = bound_cb, | 
|  | .received = recv_cb, | 
|  | .error    = error_cb, | 
|  | }, | 
|  | }; | 
|  | const struct device *ipc_instance = DEVICE_DT_GET(DT_CHOSEN(zephyr_log_ipc)); | 
|  | int err; | 
|  |  | 
|  | ept_cfg.priv = (void *)link_remote; | 
|  | err = ipc_service_open_instance(ipc_instance); | 
|  | if (err < 0 && err != -EALREADY) { | 
|  | __ASSERT(0, "ipc_service_open_instance() failure (err:%d)\n", err); | 
|  | return err; | 
|  | } | 
|  |  | 
|  | err = ipc_service_register_endpoint(ipc_instance, &link_ipc_service->ept, &ept_cfg); | 
|  |  | 
|  | return err; | 
|  | } | 
|  |  | 
|  | struct log_multidomain_link_transport_api log_link_ipc_service_transport_api = { | 
|  | .init = link_ipc_service_init, | 
|  | .send = link_ipc_service_send | 
|  | }; | 
|  |  | 
|  | static struct log_link_ipc_service link_ipc_service_data = { | 
|  | .link_remote = { | 
|  | .transport_api = &log_link_ipc_service_transport_api | 
|  | } | 
|  | }; | 
|  |  | 
|  | LOG_LINK_DEF(link_ipc_service, log_multidomain_link_api, | 
|  | CONFIG_LOG_LINK_IPC_SERVICE_BUFFER_SIZE, | 
|  | &link_ipc_service_data.link_remote); | 
|  |  | 
|  | const struct log_link *log_link_ipc_get_link(void) | 
|  | { | 
|  | return &link_ipc_service; | 
|  | } |