blob: 00941ad1d10fb72a2ab7c8064aa5dfcf4f6c0178 [file] [log] [blame]
// 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/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);