Files
2025-08-12 22:16:57 +02:00

83 lines
2.1 KiB
C
Executable File

// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
*/
#define pr_fmt(fmt) "tmelog: [%s][%d]:" fmt, __func__, __LINE__
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/tmelog.h>
#include "tmecom.h"
#define TME_MSG_CBOR_TAG_LOG_GET (280)
#define TME_LOG_CBOR_TAG 0x481801D9 /* _be32 0xD9011848 */
struct tmelog_get_req_t {
uint32_t cbor_header;
uint32_t log_len;
uint32_t log_ptr;
} __packed;
struct tmelog_get_rsp_t {
uint32_t status;
uint32_t log_len;
uint32_t log_ptr;
} __packed;
int tmelog_process_request(uint32_t buf, uint32_t buf_capacity, uint32_t *buf_size)
{
struct tmelog_get_req_t *request;
struct tmelog_get_rsp_t *response;
size_t response_len = 0;
int ret = 0;
if (!buf || !buf_size) {
pr_err("Invalid input parameters\n");
return -EINVAL;
}
request = kzalloc(sizeof(*request), GFP_KERNEL);
response = kzalloc(sizeof(*response), GFP_KERNEL);
if (!response || !request) {
pr_err("Memory allocation failed!\n");
ret = -ENOMEM;
goto err_exit;
}
request->cbor_header = TME_LOG_CBOR_TAG;
request->log_len = buf_capacity;
request->log_ptr = buf;
response->status = -1;
pr_debug("request var: cbor_header: %#x, log_len: %#x, log_ptr: %#x\n",
request->cbor_header, request->log_len, request->log_ptr);
pr_debug("request_size: %ld, response_size: %ld\n", sizeof(*request), sizeof(*response));
ret = tmecom_process_request(request, sizeof(*request), response, &response_len);
if (ret != 0) {
pr_err("Tme log request failed, ret: %d\n", ret);
goto err_exit;
}
if (response_len != sizeof(*response)) {
pr_err("Tme Log failed with invalid length: %zu, %ld\n",
response_len, sizeof(response));
ret = -EBADMSG;
goto err_exit;
}
*buf_size = response->log_len;
ret = response->status;
pr_debug("response var: status: %d, log_len: %#x, log_ptr: %#x\n",
response->status, response->log_len, response->log_ptr);
err_exit:
kfree(request);
kfree(response);
return ret;
}
EXPORT_SYMBOL_GPL(tmelog_process_request);