// SPDX-License-Identifier: GPL-2.0+ /* Copyright (C) 2022 AVM GmbH */ #define pr_fmt(fmt) "mrpc/avm_crashlog_client: " fmt #include "avm_crashlog_mrpc.h" #include #include #include #include #include #define AVM_CRASHLOG_MRPC_TIMEOUT 60000 static struct mrpc_client *client; static int __init crashlog_client_init(void) { client = mrpc_client_register( MRPC_RESERVED_ID_AVM_CRASHLOG, "AVM crashlog client"); if (!client) return -ENODEV; return 0; } static_notifier_module_init(mrpc_ready, crashlog_client_init); #ifdef CONFIG_TFFS_REMOTE_CRASHLOG_READER int avm_remote_crashlog_sem_down(void) { int ret, errcode; if (!client) return -ENODEV; ret = mrpc_call(client, MRPC_AVM_CRASHLOG_PROC_SEM_DOWN, NULL, 0, NULL, 0, AVM_CRASHLOG_MRPC_TIMEOUT, &errcode); if (ret) pr_err("[%s]: MRPC call failed with code=%d\n", __func__, ret); if (ret > 0) return -EIO; else return ret; } int avm_remote_crashlog_sem_up(void) { int ret, errcode; if (!client) return -ENODEV; ret = mrpc_call(client, MRPC_AVM_CRASHLOG_PROC_SEM_UP, NULL, 0, NULL, 0, AVM_CRASHLOG_MRPC_TIMEOUT, &errcode); if (ret) pr_err("[%s]: MRPC call failed with code=%d\n", __func__, ret); if (ret > 0) return -EIO; else return ret; } #endif /* CONFIG_TFFS_REMOTE_CRASHLOG_READER */ #ifdef CONFIG_TFFS_REMOTE_CRASHLOG_WRITER int avm_remote_crashlog_is_read_forbidden(void) { int ret, errcode, reply; if (!client) return 0; ret = mrpc_call(client, MRPC_AVM_CRASHLOG_PROC_IS_READ_FORBIDDEN, NULL, 0, &reply, sizeof(reply), AVM_CRASHLOG_MRPC_TIMEOUT, &errcode); if (ret) { pr_err("[%s]: MRPC call failed with code=%d\n", __func__, ret); /* Don't lock on MRPC call failure */ return 0; } return be32_to_cpu(reply); } #endif /* CONFIG_TFFS_REMOTE_CRASHLOG_WRITER */