logger: compatible logger for dynamic and static share memory [1/1]

PD#SWPL-101942

Problem:
logger is invalid if dynamic share memory enabled

Solution:
compatible logger for dynamic and static share memory

Verify:
Android T + sc2_ah212

Change-Id: I012f4543089fea2706d89a5ba294c7d0eb5cd748
Signed-off-by: Wentao.Sun <wentao.sun@amlogic.com>
This commit is contained in:
Wentao.Sun
2023-03-29 17:54:35 +08:00
committed by gerrit autosubmit
parent 9560a9bc42
commit 471d01ac38
4 changed files with 53 additions and 21 deletions
+37 -8
View File
@@ -16,9 +16,11 @@
#include <linux/string.h>
#include <linux/types.h>
#include <linux/workqueue.h>
#include <linux/io.h>
#include "optee_smc.h"
#include "log.h"
#include "optee_private.h"
#define LOGGER_LOOPBUFFER_MAGIC 0xAA00AA00
#define LOGGER_LOOPBUFFER_OFFSET 0x00000080
@@ -136,21 +138,49 @@ static void do_log_timer(struct work_struct *work)
pr_err("%s:%d Failed to join the workqueue\n", __func__, __LINE__);
}
int optee_log_init(void *va, phys_addr_t pa, size_t size)
int optee_log_init(void *va)
{
int rc = 0;
struct arm_smccc_res smccc;
size_t size = 0;
phys_addr_t begin = 0;
phys_addr_t end = 0;
struct arm_smccc_res smccc = { 0 };
struct loopbuffer_ctl_s *log_ctl = NULL;
arm_smccc_smc(OPTEE_SMC_ENABLE_LOGGER, 1, 0, 0, 0, 0, 0, 0,
&smccc);
log_buf_va = va;
log_ctl = (struct loopbuffer_ctl_s *)va;
if (smccc.a0 != TEEC_SUCCESS) {
pr_err("smc enable logger failed, res = 0x%lx\n", smccc.a0);
rc = -EACCES;
goto err;
}
if (smccc.a1 == LOGGER_SHM_ADDR_MAGIC) {
/*
* for new logger solution
* a1: logger get flags
* a2: logger start address
* a3: logger size
*/
begin = roundup(smccc.a2, PAGE_SIZE);
end = rounddown(smccc.a2 + smccc.a3, PAGE_SIZE);
size = end - begin;
log_buf_va = memremap(begin, size, MEMREMAP_WB);
} else {
/* for previous logger solution */
log_buf_va = va;
}
if (!log_buf_va) {
pr_err("shared memory logger ioremap failed\n");
return -ENOMEM;
}
log_ctl = (struct loopbuffer_ctl_s *)log_buf_va;
if (log_ctl->magic != LOGGER_LOOPBUFFER_MAGIC || log_ctl->inited != 1) {
pr_err("tee log buffer init failed\n");
rc = -1;
rc = -EINVAL;
goto err;
}
@@ -159,8 +189,7 @@ int optee_log_init(void *va, phys_addr_t pa, size_t size)
INIT_DELAYED_WORK(&log_work, do_log_timer);
if (queue_delayed_work(log_workqueue, &log_work, OPTEE_LOG_TIMER_INTERVAL * HZ) == 0) {
pr_err("%s:%d failed to join the workqueue.\n", __func__, __LINE__);
rc = -1;
rc = -EBUSY;
goto err;
}
+3 -1
View File
@@ -2,9 +2,11 @@
#ifndef _OPTEE_LOG_H_
#define _OPTEE_LOG_H_
#define LOGGER_SHM_ADDR_MAGIC 0x1001
#define DEF_LOGGER_SHM_SIZE (256 * 1024)
int optee_log_init(void *va, phys_addr_t pa, size_t size);
int optee_log_init(void *va);
void optee_log_uninit(void);
+7 -7
View File
@@ -556,18 +556,18 @@ struct optee_smc_disable_shm_cache_result {
OPTEE_SMC_RPC_VAL(OPTEE_SMC_RPC_FUNC_CMD)
/*
* enable logger
* Enable logger
*
* Call register usage:
* a0 SMC Function ID, OPTEE_SMC_ENABLE_LOGGER
* a1 enable logger: a1 > 0; disable logger: a1 = 0;
* a2 logger share-mem phy addr
* a3 logger share-mem size
* a4-7 Not used
* a1 Enable logger: a1 > 0; disable logger: a1 = 0;
* a2-a7 Not used
*
* Normal return register usage:
* a0 enable logger result
* a1-7 Preserved
* a0 Enable logger result
* a1 Logger get flags
* a2 Logger share-mem phy addr
* a3 Logger share-mem size
*/
#define OPTEE_SMC_FUNCID_ENABLE_LOGGER 0xE001
#define OPTEE_SMC_ENABLE_LOGGER OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_ENABLE_LOGGER)
+6 -5
View File
@@ -1223,7 +1223,7 @@ static bool optee_msg_exchange_capabilities(optee_invoke_fn *invoke_fn,
}
static struct tee_shm_pool *
optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm)
optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm, void **log_va)
{
union {
struct arm_smccc_res smccc;
@@ -1267,9 +1267,7 @@ optee_config_shm_memremap(optee_invoke_fn *invoke_fn, void **memremaped_shm)
else
*memremaped_shm = va;
optee_log_init(va + size - DEF_LOGGER_SHM_SIZE,
end - DEF_LOGGER_SHM_SIZE,
DEF_LOGGER_SHM_SIZE);
*log_va = va + size - DEF_LOGGER_SHM_SIZE;
return rc;
}
@@ -1370,6 +1368,7 @@ static int optee_probe(struct platform_device *pdev)
struct tee_shm_pool *pool = ERR_PTR(-EINVAL);
struct optee *optee = NULL;
void *memremaped_shm = NULL;
void *shm_log_va = NULL;
unsigned int rpc_param_count;
struct tee_device *teedev;
struct tee_context *ctx;
@@ -1445,12 +1444,14 @@ static int optee_probe(struct platform_device *pdev)
*/
arg_cache_flags = OPTEE_SHM_ARG_SHARED |
OPTEE_SHM_ARG_ALLOC_PRIV;
pool = optee_config_shm_memremap(invoke_fn, &memremaped_shm);
pool = optee_config_shm_memremap(invoke_fn, &memremaped_shm, &shm_log_va);
}
if (IS_ERR(pool))
return PTR_ERR(pool);
optee_log_init(shm_log_va);
optee = kzalloc(sizeof(*optee), GFP_KERNEL);
if (!optee) {
rc = -ENOMEM;