69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
|
/*
|
|
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/amlogic/arm-smccc.h>
|
|
#include <linux/platform_device.h>
|
|
|
|
#include <linux/amlogic/secmon.h>
|
|
#include <linux/amlogic/tee.h>
|
|
#include <linux/amlogic/tee_demux.h>
|
|
#include <asm/cputype.h>
|
|
#include <linux/printk.h>
|
|
|
|
static void __iomem *dmx_shm_input;
|
|
static void __iomem *dmx_shm_output;
|
|
|
|
static int get_share_memory(void)
|
|
{
|
|
if (!dmx_shm_input)
|
|
dmx_shm_input = get_meson_sm_input_base();
|
|
|
|
if (!dmx_shm_output)
|
|
dmx_shm_output = get_meson_sm_output_base();
|
|
|
|
if (dmx_shm_input && dmx_shm_output)
|
|
return 0;
|
|
|
|
return -1;
|
|
}
|
|
|
|
int tee_demux_set(enum tee_dmx_cmd cmd, void *data, u32 len)
|
|
{
|
|
struct arm_smccc_res res;
|
|
|
|
if (!data || !len || get_share_memory())
|
|
return -1;
|
|
|
|
meson_sm_mutex_lock();
|
|
memcpy((void *)dmx_shm_input, (const void *)data, len);
|
|
arm_smccc_smc(0x82000076, cmd, len, 0, 0, 0, 0, 0, &res);
|
|
meson_sm_mutex_unlock();
|
|
|
|
return res.a0;
|
|
}
|
|
EXPORT_SYMBOL(tee_demux_set);
|
|
|
|
int tee_demux_get(enum tee_dmx_cmd cmd,
|
|
void *in, u32 in_len, void *out, u32 out_len)
|
|
{
|
|
struct arm_smccc_res res;
|
|
|
|
if (!out || !out_len || get_share_memory())
|
|
return -1;
|
|
|
|
meson_sm_mutex_lock();
|
|
if (in && in_len)
|
|
memcpy((void *)dmx_shm_input, (const void *)in, in_len);
|
|
arm_smccc_smc(0x82000076, cmd, in_len, out_len, 0, 0, 0, 0, &res);
|
|
if (!res.a0)
|
|
memcpy((void *)out, (void *)dmx_shm_output, out_len);
|
|
meson_sm_mutex_unlock();
|
|
|
|
return res.a0;
|
|
}
|
|
EXPORT_SYMBOL(tee_demux_get);
|