1*c7757d46SBeniamino Galvani /* 2*c7757d46SBeniamino Galvani * (C) Copyright 2016 Beniamino Galvani <b.galvani@gmail.com> 3*c7757d46SBeniamino Galvani * 4*c7757d46SBeniamino Galvani * SPDX-License-Identifier: GPL-2.0+ 5*c7757d46SBeniamino Galvani * 6*c7757d46SBeniamino Galvani * Secure monitor calls. 7*c7757d46SBeniamino Galvani */ 8*c7757d46SBeniamino Galvani 9*c7757d46SBeniamino Galvani #include <common.h> 10*c7757d46SBeniamino Galvani #include <asm/arch/gxbb.h> 11*c7757d46SBeniamino Galvani #include <linux/kernel.h> 12*c7757d46SBeniamino Galvani 13*c7757d46SBeniamino Galvani #define FN_GET_SHARE_MEM_INPUT_BASE 0x82000020 14*c7757d46SBeniamino Galvani #define FN_GET_SHARE_MEM_OUTPUT_BASE 0x82000021 15*c7757d46SBeniamino Galvani #define FN_EFUSE_READ 0x82000030 16*c7757d46SBeniamino Galvani #define FN_EFUSE_WRITE 0x82000031 17*c7757d46SBeniamino Galvani 18*c7757d46SBeniamino Galvani static void *shmem_input; 19*c7757d46SBeniamino Galvani static void *shmem_output; 20*c7757d46SBeniamino Galvani meson_init_shmem(void)21*c7757d46SBeniamino Galvanistatic void meson_init_shmem(void) 22*c7757d46SBeniamino Galvani { 23*c7757d46SBeniamino Galvani struct pt_regs regs; 24*c7757d46SBeniamino Galvani 25*c7757d46SBeniamino Galvani if (shmem_input && shmem_output) 26*c7757d46SBeniamino Galvani return; 27*c7757d46SBeniamino Galvani 28*c7757d46SBeniamino Galvani regs.regs[0] = FN_GET_SHARE_MEM_INPUT_BASE; 29*c7757d46SBeniamino Galvani smc_call(®s); 30*c7757d46SBeniamino Galvani shmem_input = (void *)regs.regs[0]; 31*c7757d46SBeniamino Galvani 32*c7757d46SBeniamino Galvani regs.regs[0] = FN_GET_SHARE_MEM_OUTPUT_BASE; 33*c7757d46SBeniamino Galvani smc_call(®s); 34*c7757d46SBeniamino Galvani shmem_output = (void *)regs.regs[0]; 35*c7757d46SBeniamino Galvani 36*c7757d46SBeniamino Galvani debug("Secure Monitor shmem: 0x%p 0x%p\n", shmem_input, shmem_output); 37*c7757d46SBeniamino Galvani } 38*c7757d46SBeniamino Galvani meson_sm_read_efuse(uintptr_t offset,void * buffer,size_t size)39*c7757d46SBeniamino Galvanissize_t meson_sm_read_efuse(uintptr_t offset, void *buffer, size_t size) 40*c7757d46SBeniamino Galvani { 41*c7757d46SBeniamino Galvani struct pt_regs regs; 42*c7757d46SBeniamino Galvani 43*c7757d46SBeniamino Galvani meson_init_shmem(); 44*c7757d46SBeniamino Galvani 45*c7757d46SBeniamino Galvani regs.regs[0] = FN_EFUSE_READ; 46*c7757d46SBeniamino Galvani regs.regs[1] = offset; 47*c7757d46SBeniamino Galvani regs.regs[2] = size; 48*c7757d46SBeniamino Galvani 49*c7757d46SBeniamino Galvani smc_call(®s); 50*c7757d46SBeniamino Galvani 51*c7757d46SBeniamino Galvani if (regs.regs[0] == 0) 52*c7757d46SBeniamino Galvani return -1; 53*c7757d46SBeniamino Galvani 54*c7757d46SBeniamino Galvani memcpy(buffer, shmem_output, min(size, regs.regs[0])); 55*c7757d46SBeniamino Galvani 56*c7757d46SBeniamino Galvani return regs.regs[0]; 57*c7757d46SBeniamino Galvani } 58