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