1/*
2 * Copyright (c) 2012-2022 Huawei Technologies Co., Ltd.
3 * Description: get and set static mem info.
4 *
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14
15#include "declare_static_ion.h"
16#include <linux/of_reserved_mem.h>
17#include <linux/of.h>
18#include "tc_ns_log.h"
19
20static u64 g_ion_mem_addr;
21static u64 g_ion_mem_size;
22
23static int supersonic_reserve_tee_mem(const struct reserved_mem *rmem)
24{
25	if (rmem) {
26		g_ion_mem_addr = rmem->base;
27		g_ion_mem_size = rmem->size;
28	} else {
29		tloge("rmem is NULL\n");
30	}
31
32	return 0;
33}
34
35RESERVEDMEM_OF_DECLARE(supersonic, "platform-supersonic",
36	supersonic_reserve_tee_mem);
37
38static u64 g_secfacedetect_mem_addr;
39static u64 g_secfacedetect_mem_size;
40
41static int secfacedetect_reserve_tee_mem(const struct reserved_mem *rmem)
42{
43	if (rmem) {
44		g_secfacedetect_mem_addr = rmem->base;
45		g_secfacedetect_mem_size = rmem->size;
46	} else {
47		tloge("secfacedetect_reserve_tee_mem mem is NULL\n");
48	}
49	return 0;
50}
51RESERVEDMEM_OF_DECLARE(secfacedetect, "platform-secfacedetect",
52	secfacedetect_reserve_tee_mem);
53
54static u64 g_pt_addr = 0;
55static u64 g_pt_size = 0;
56
57static int reserve_pt_mem(const struct reserved_mem *rmem)
58{
59	if (rmem) {
60		g_pt_size = rmem->size;
61		g_pt_addr = rmem->base;
62		tloge("reserve pt mem is not NULL\n");
63	} else {
64		tloge("reserve pt mem is NULL\n");
65	}
66	return 0;
67}
68
69RESERVEDMEM_OF_DECLARE(pagetable, "platform-ai-pagetable",
70	reserve_pt_mem);
71
72static u64 g_pp_addr = 0;
73static u64 g_pp_size = 0;
74
75static int reserve_pp_mem(const struct reserved_mem *rmem)
76{
77	if (rmem) {
78		g_pp_addr = rmem->base;
79		g_pp_size = rmem->size;
80	} else {
81		tloge("reserve pp mem is NULL\n");
82	}
83	return 0;
84}
85
86RESERVEDMEM_OF_DECLARE(ai_running, "platform-ai-running",
87	reserve_pp_mem);
88
89static u64 g_voiceid_addr = 0;
90static u64 g_voiceid_size = 0;
91static int voiceid_reserve_tee_mem(const struct reserved_mem *rmem)
92{
93	if (rmem) {
94		g_voiceid_addr = rmem->base;
95		g_voiceid_size = rmem->size;
96	} else {
97		tloge("voiceid reserve tee mem is NULL\n");
98	}
99	return 0;
100}
101RESERVEDMEM_OF_DECLARE(voiceid, "platform-voiceid",
102	voiceid_reserve_tee_mem);
103
104static u64 g_secos_ex_addr;
105static u64 g_secos_ex_size;
106static int secos_reserve_tee_mem(const struct reserved_mem *rmem)
107{
108	if (rmem) {
109		g_secos_ex_addr = rmem->base;
110		g_secos_ex_size = rmem->size;
111	} else {
112		tloge("secos reserve tee mem is NULL\n");
113	}
114	return 0;
115}
116RESERVEDMEM_OF_DECLARE(secos_ex, "platform-secos-ex",
117	secos_reserve_tee_mem);
118
119static u64 g_ion_ex_mem_addr;
120static u64 g_ion_ex_mem_size;
121static int supersonic_ex_reserve_tee_mem(const struct reserved_mem *rmem)
122{
123	if (rmem) {
124		g_ion_ex_mem_addr = rmem->base;
125		g_ion_ex_mem_size = rmem->size;
126	} else {
127		tloge("rmem is NULL\n");
128	}
129	return 0;
130}
131RESERVEDMEM_OF_DECLARE(supersonic_ex, "platform-supersonic-ex",
132	supersonic_ex_reserve_tee_mem);
133
134static void set_mem_tag(struct register_ion_mem_tag *memtag,
135	u64 addr, u64 size, uint32_t tag, uint32_t *pos)
136{
137	memtag->memaddr[*pos] = addr;
138	memtag->memsize[*pos] = size;
139	memtag->memtag[*pos] = tag;
140	(*pos)++;
141}
142
143void set_ion_mem_info(struct register_ion_mem_tag *memtag)
144{
145	uint32_t pos = 0;
146	if(!memtag) {
147		tloge("invalid memtag\n");
148		return;
149	}
150
151	tlogi("ion mem static reserved for tee face=%d, finger=%d,voiceid=%d,"
152		"secos=%d,finger-ex=%d, pt_size= %d,pp_size=%d\n",
153		(uint32_t)g_secfacedetect_mem_size, (uint32_t)g_ion_mem_size,
154		(uint32_t)g_voiceid_size, (uint32_t)g_secos_ex_size,
155		(uint32_t)g_ion_ex_mem_size, (uint32_t)g_pt_size,
156		(uint32_t)g_pp_size);
157
158	if (g_ion_mem_addr != (u64)0 && g_ion_mem_size != (u64)0)
159		set_mem_tag(memtag,g_ion_mem_addr, g_ion_mem_size, PP_MEM_TAG, &pos);
160	if (g_secfacedetect_mem_addr != (u64)0 && g_secfacedetect_mem_size != (u64)0)
161		set_mem_tag(memtag,g_secfacedetect_mem_addr, g_secfacedetect_mem_size, PP_MEM_TAG, &pos);
162	if (g_voiceid_addr != (u64)0 && g_voiceid_size != (u64)0)
163		set_mem_tag(memtag, g_voiceid_addr, g_voiceid_size, PP_MEM_TAG, &pos);
164	if (g_secos_ex_addr != (u64)0 && g_secos_ex_size != (u64)0)
165		set_mem_tag(memtag, g_secos_ex_addr, g_secos_ex_size, PP_MEM_TAG, &pos);
166	if (g_pt_addr != (u64)0 && g_pt_size != (u64)0)
167		set_mem_tag(memtag, g_pt_addr, g_pt_size, PT_MEM_TAG, &pos);
168	if (g_pp_addr != (u64)0 && g_pp_size != (u64)0)
169		set_mem_tag(memtag, g_pp_addr, g_pp_size, PRI_PP_MEM_TAG, &pos);
170	if (g_ion_ex_mem_addr != (u64)0 && g_ion_ex_mem_size != (u64)0)
171		set_mem_tag(memtag, g_ion_ex_mem_addr, g_ion_ex_mem_size, PP_MEM_TAG, &pos);
172	/* here pos max is 7, memaddr[] has 10 positions, just 3 free */
173	memtag->size = pos;
174	return;
175}