/* * (C) Copyright 2016 Beniamino Galvani * * SPDX-License-Identifier: GPL-2.0+ * * Secure monitor calls. */ #include #include #include #define FN_GET_SHARE_MEM_INPUT_BASE 0x82000020 #define FN_GET_SHARE_MEM_OUTPUT_BASE 0x82000021 #define FN_EFUSE_READ 0x82000030 #define FN_EFUSE_WRITE 0x82000031 static void *shmem_input; static void *shmem_output; static void meson_init_shmem(void) { struct pt_regs regs; if (shmem_input && shmem_output) return; regs.regs[0] = FN_GET_SHARE_MEM_INPUT_BASE; smc_call(®s); shmem_input = (void *)regs.regs[0]; regs.regs[0] = FN_GET_SHARE_MEM_OUTPUT_BASE; smc_call(®s); shmem_output = (void *)regs.regs[0]; debug("Secure Monitor shmem: 0x%p 0x%p\n", shmem_input, shmem_output); } ssize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size) { struct pt_regs regs; meson_init_shmem(); regs.regs[0] = FN_EFUSE_READ; regs.regs[1] = offset; regs.regs[2] = size; smc_call(®s); if (regs.regs[0] == 0) return -1; memcpy(buffer, shmem_output, min(size, regs.regs[0])); return regs.regs[0]; }