xref: /rk3399_rockchip-uboot/lib/optee_clientApi/OpteeClientRkFs_common.c (revision d079c1a5ed50ce9f1e3b37be5ce4e13edec90bd0)
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