1*d079c1a5SHisping Lin /* 2*d079c1a5SHisping Lin * Copyright 2020, Rockchip Electronics Co., Ltd 3*d079c1a5SHisping Lin * hisping lin, <hisping.lin@rock-chips.com> 4*d079c1a5SHisping Lin * 5*d079c1a5SHisping Lin * SPDX-License-Identifier: GPL-2.0+ 6*d079c1a5SHisping Lin */ 7*d079c1a5SHisping Lin 8*d079c1a5SHisping Lin #include <common.h> 9*d079c1a5SHisping Lin #include <stdlib.h> 10*d079c1a5SHisping Lin #include <command.h> 11*d079c1a5SHisping Lin #include <boot_rkimg.h> 12*d079c1a5SHisping Lin #include <part.h> 13*d079c1a5SHisping Lin #include <optee_include/OpteeClientRkFs.h> 14*d079c1a5SHisping Lin 15*d079c1a5SHisping Lin static int rkss_version; 16*d079c1a5SHisping Lin static int get_rkss_version(void) 17*d079c1a5SHisping Lin { 18*d079c1a5SHisping Lin struct blk_desc *dev_desc = NULL; 19*d079c1a5SHisping Lin disk_partition_t part_info; 20*d079c1a5SHisping Lin uint8_t *read_buff; 21*d079c1a5SHisping Lin unsigned long ret = 0; 22*d079c1a5SHisping Lin uint32_t *version; 23*d079c1a5SHisping Lin uint32_t *checkstr; 24*d079c1a5SHisping Lin 25*d079c1a5SHisping Lin if (rkss_version != 0) 26*d079c1a5SHisping Lin return rkss_version; 27*d079c1a5SHisping Lin 28*d079c1a5SHisping Lin dev_desc = rockchip_get_bootdev(); 29*d079c1a5SHisping Lin if (!dev_desc) { 30*d079c1a5SHisping Lin printf("TEEC: %s: Could not find device\n", __func__); 31*d079c1a5SHisping Lin return -1; 32*d079c1a5SHisping Lin } 33*d079c1a5SHisping Lin 34*d079c1a5SHisping Lin if (part_get_info_by_name(dev_desc, 35*d079c1a5SHisping Lin "security", &part_info) < 0) { 36*d079c1a5SHisping Lin printf("TEEC: Waring: Could not find security partition\n"); 37*d079c1a5SHisping Lin rkss_version = RKSS_VERSION_ERR; 38*d079c1a5SHisping Lin return rkss_version; 39*d079c1a5SHisping Lin } 40*d079c1a5SHisping Lin 41*d079c1a5SHisping Lin read_buff = (uint8_t *)malloc(512); 42*d079c1a5SHisping Lin if (!read_buff) { 43*d079c1a5SHisping Lin printf("TEEC: Malloc failed!\n"); 44*d079c1a5SHisping Lin return -1; 45*d079c1a5SHisping Lin } 46*d079c1a5SHisping Lin 47*d079c1a5SHisping Lin ret = blk_dread(dev_desc, part_info.start, 1, read_buff); 48*d079c1a5SHisping Lin if (ret != 1) { 49*d079c1a5SHisping Lin printf("TEEC: blk_dread fail\n"); 50*d079c1a5SHisping Lin free(read_buff); 51*d079c1a5SHisping Lin return -1; 52*d079c1a5SHisping Lin } 53*d079c1a5SHisping Lin 54*d079c1a5SHisping Lin version = (uint32_t *)(read_buff + 512 - 8); 55*d079c1a5SHisping Lin checkstr = (uint32_t *)(read_buff + 512 - 4); 56*d079c1a5SHisping Lin 57*d079c1a5SHisping Lin if (*version == 1 && *checkstr == 0x12345678) 58*d079c1a5SHisping Lin rkss_version = RKSS_VERSION_V1; 59*d079c1a5SHisping Lin else 60*d079c1a5SHisping Lin rkss_version = RKSS_VERSION_V2; 61*d079c1a5SHisping Lin 62*d079c1a5SHisping Lin free(read_buff); 63*d079c1a5SHisping Lin return rkss_version; 64*d079c1a5SHisping Lin } 65*d079c1a5SHisping Lin 66*d079c1a5SHisping Lin int OpteeClientRkFsInit(void) 67*d079c1a5SHisping Lin { 68*d079c1a5SHisping Lin int version; 69*d079c1a5SHisping Lin 70*d079c1a5SHisping Lin version = get_rkss_version(); 71*d079c1a5SHisping Lin debug("TEEC: OpteeClientRkFsInit version=%d\n", version); 72*d079c1a5SHisping Lin if (version == RKSS_VERSION_V1) 73*d079c1a5SHisping Lin return tee_supp_rk_fs_init_v1(); 74*d079c1a5SHisping Lin else if (version == RKSS_VERSION_V2) 75*d079c1a5SHisping Lin return tee_supp_rk_fs_init_v2(); 76*d079c1a5SHisping Lin else if (version == RKSS_VERSION_ERR) 77*d079c1a5SHisping Lin return 0; 78*d079c1a5SHisping Lin else 79*d079c1a5SHisping Lin return -1; 80*d079c1a5SHisping Lin } 81*d079c1a5SHisping Lin 82*d079c1a5SHisping Lin int OpteeClientRkFsProcess(void *cmd, size_t cmd_size) 83*d079c1a5SHisping Lin { 84*d079c1a5SHisping Lin int version; 85*d079c1a5SHisping Lin 86*d079c1a5SHisping Lin version = get_rkss_version(); 87*d079c1a5SHisping Lin debug("TEEC: OpteeClientRkFsProcess version=%d\n", version); 88*d079c1a5SHisping Lin if (version == RKSS_VERSION_V1) 89*d079c1a5SHisping Lin return tee_supp_rk_fs_process_v1(cmd, cmd_size); 90*d079c1a5SHisping Lin else if (version == RKSS_VERSION_V2) 91*d079c1a5SHisping Lin return tee_supp_rk_fs_process_v2(cmd, cmd_size); 92*d079c1a5SHisping Lin else 93*d079c1a5SHisping Lin return -1; 94*d079c1a5SHisping Lin } 95