1ad9d40acSPeng Fan // SPDX-License-Identifier: GPL-2.0
2ad9d40acSPeng Fan /*
3ad9d40acSPeng Fan * Copyright 2018 NXP
4ad9d40acSPeng Fan *
5ad9d40acSPeng Fan * Peng Fan <peng.fan@nxp.com>
6ad9d40acSPeng Fan */
7ad9d40acSPeng Fan
8ad9d40acSPeng Fan #include <common.h>
9ad9d40acSPeng Fan #include <asm/io.h>
10ad9d40acSPeng Fan #include <dm.h>
11ad9d40acSPeng Fan #include <asm/arch/sci/sci.h>
12ad9d40acSPeng Fan #include <misc.h>
13ad9d40acSPeng Fan
14ad9d40acSPeng Fan DECLARE_GLOBAL_DATA_PTR;
15ad9d40acSPeng Fan
16ad9d40acSPeng Fan /* CLK and PM */
sc_pm_set_clock_rate(sc_ipc_t ipc,sc_rsrc_t resource,sc_pm_clk_t clk,sc_pm_clock_rate_t * rate)17ad9d40acSPeng Fan int sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
18ad9d40acSPeng Fan sc_pm_clock_rate_t *rate)
19ad9d40acSPeng Fan {
20ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
21ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
22ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
23ad9d40acSPeng Fan int ret;
24ad9d40acSPeng Fan
25ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
26ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
27ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)PM_FUNC_SET_CLOCK_RATE;
28ad9d40acSPeng Fan RPC_U32(&msg, 0U) = *(u32 *)rate;
29ad9d40acSPeng Fan RPC_U16(&msg, 4U) = (u16)resource;
30ad9d40acSPeng Fan RPC_U8(&msg, 6U) = (u8)clk;
31ad9d40acSPeng Fan RPC_SIZE(&msg) = 3U;
32ad9d40acSPeng Fan
33ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
34ad9d40acSPeng Fan if (ret)
35ad9d40acSPeng Fan printf("%s: rate:%u resource:%u: clk:%u res:%d\n",
36ad9d40acSPeng Fan __func__, *rate, resource, clk, RPC_R8(&msg));
37ad9d40acSPeng Fan
38ad9d40acSPeng Fan *rate = RPC_U32(&msg, 0U);
39ad9d40acSPeng Fan
40ad9d40acSPeng Fan return ret;
41ad9d40acSPeng Fan }
42ad9d40acSPeng Fan
sc_pm_get_clock_rate(sc_ipc_t ipc,sc_rsrc_t resource,sc_pm_clk_t clk,sc_pm_clock_rate_t * rate)43ad9d40acSPeng Fan int sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
44ad9d40acSPeng Fan sc_pm_clock_rate_t *rate)
45ad9d40acSPeng Fan {
46ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
47ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
48ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
49ad9d40acSPeng Fan int ret;
50ad9d40acSPeng Fan
51ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
52ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
53ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)PM_FUNC_GET_CLOCK_RATE;
54ad9d40acSPeng Fan RPC_U16(&msg, 0U) = (u16)resource;
55ad9d40acSPeng Fan RPC_U8(&msg, 2U) = (u8)clk;
56ad9d40acSPeng Fan RPC_SIZE(&msg) = 2U;
57ad9d40acSPeng Fan
58ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
59ad9d40acSPeng Fan if (ret) {
60ad9d40acSPeng Fan printf("%s: resource:%d clk:%d: res:%d\n",
61ad9d40acSPeng Fan __func__, resource, clk, RPC_R8(&msg));
62ad9d40acSPeng Fan return ret;
63ad9d40acSPeng Fan }
64ad9d40acSPeng Fan
65ad9d40acSPeng Fan if (rate)
66ad9d40acSPeng Fan *rate = RPC_U32(&msg, 0U);
67ad9d40acSPeng Fan
68ad9d40acSPeng Fan return 0;
69ad9d40acSPeng Fan }
70ad9d40acSPeng Fan
sc_pm_clock_enable(sc_ipc_t ipc,sc_rsrc_t resource,sc_pm_clk_t clk,sc_bool_t enable,sc_bool_t autog)71ad9d40acSPeng Fan int sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
72ad9d40acSPeng Fan sc_bool_t enable, sc_bool_t autog)
73ad9d40acSPeng Fan {
74ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
75ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
76ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
77ad9d40acSPeng Fan int ret;
78ad9d40acSPeng Fan
79ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
80ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
81ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)PM_FUNC_CLOCK_ENABLE;
82ad9d40acSPeng Fan RPC_U16(&msg, 0U) = (u16)resource;
83ad9d40acSPeng Fan RPC_U8(&msg, 2U) = (u8)clk;
84ad9d40acSPeng Fan RPC_U8(&msg, 3U) = (u8)enable;
85ad9d40acSPeng Fan RPC_U8(&msg, 4U) = (u8)autog;
86ad9d40acSPeng Fan RPC_SIZE(&msg) = 3U;
87ad9d40acSPeng Fan
88ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
89ad9d40acSPeng Fan if (ret)
90ad9d40acSPeng Fan printf("%s: resource:%d clk:%d: enable:%d autog: %d, res:%d\n",
91ad9d40acSPeng Fan __func__, resource, clk, enable, autog, RPC_R8(&msg));
92ad9d40acSPeng Fan
93ad9d40acSPeng Fan return ret;
94ad9d40acSPeng Fan }
95ad9d40acSPeng Fan
sc_pm_set_resource_power_mode(sc_ipc_t ipc,sc_rsrc_t resource,sc_pm_power_mode_t mode)96ad9d40acSPeng Fan int sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
97ad9d40acSPeng Fan sc_pm_power_mode_t mode)
98ad9d40acSPeng Fan {
99ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
100ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
101ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
102ad9d40acSPeng Fan int ret;
103ad9d40acSPeng Fan
104ad9d40acSPeng Fan if (!dev)
105ad9d40acSPeng Fan hang();
106ad9d40acSPeng Fan
107ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
108ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_PM;
109ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)PM_FUNC_SET_RESOURCE_POWER_MODE;
110ad9d40acSPeng Fan RPC_U16(&msg, 0U) = (u16)resource;
111ad9d40acSPeng Fan RPC_U8(&msg, 2U) = (u8)mode;
112ad9d40acSPeng Fan RPC_SIZE(&msg) = 2U;
113ad9d40acSPeng Fan
114ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
115ad9d40acSPeng Fan if (ret)
116ad9d40acSPeng Fan printf("%s: resource:%d mode:%d: res:%d\n",
117ad9d40acSPeng Fan __func__, resource, mode, RPC_R8(&msg));
118ad9d40acSPeng Fan
119ad9d40acSPeng Fan return ret;
120ad9d40acSPeng Fan }
121ad9d40acSPeng Fan
122ad9d40acSPeng Fan /* PAD */
sc_pad_set(sc_ipc_t ipc,sc_pad_t pad,u32 val)123ad9d40acSPeng Fan int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val)
124ad9d40acSPeng Fan {
125ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
126ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
127ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
128ad9d40acSPeng Fan int ret;
129ad9d40acSPeng Fan
130ad9d40acSPeng Fan if (!dev)
131ad9d40acSPeng Fan hang();
132ad9d40acSPeng Fan
133ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
134ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_PAD;
135ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)PAD_FUNC_SET;
136ad9d40acSPeng Fan RPC_U32(&msg, 0U) = (u32)val;
137ad9d40acSPeng Fan RPC_U16(&msg, 4U) = (u16)pad;
138ad9d40acSPeng Fan RPC_SIZE(&msg) = 3U;
139ad9d40acSPeng Fan
140ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
141ad9d40acSPeng Fan if (ret)
142ad9d40acSPeng Fan printf("%s: val:%d pad:%d: res:%d\n",
143ad9d40acSPeng Fan __func__, val, pad, RPC_R8(&msg));
144ad9d40acSPeng Fan
145ad9d40acSPeng Fan return ret;
146ad9d40acSPeng Fan }
147ad9d40acSPeng Fan
148ad9d40acSPeng Fan /* MISC */
sc_misc_get_control(sc_ipc_t ipc,sc_rsrc_t resource,sc_ctrl_t ctrl,u32 * val)149ad9d40acSPeng Fan int sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl,
150ad9d40acSPeng Fan u32 *val)
151ad9d40acSPeng Fan {
152ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
153ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
154ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
155ad9d40acSPeng Fan int ret;
156ad9d40acSPeng Fan
157ad9d40acSPeng Fan if (!dev)
158ad9d40acSPeng Fan hang();
159ad9d40acSPeng Fan
160ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
161ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
162ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_CONTROL;
163ad9d40acSPeng Fan RPC_U32(&msg, 0U) = (u32)ctrl;
164ad9d40acSPeng Fan RPC_U16(&msg, 4U) = (u16)resource;
165ad9d40acSPeng Fan RPC_SIZE(&msg) = 3U;
166ad9d40acSPeng Fan
167ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
168ad9d40acSPeng Fan if (ret)
169ad9d40acSPeng Fan printf("%s: ctrl:%d resource:%d: res:%d\n",
170ad9d40acSPeng Fan __func__, ctrl, resource, RPC_R8(&msg));
171ad9d40acSPeng Fan
172*ecab65e4SPeng Fan if (val)
173ad9d40acSPeng Fan *val = RPC_U32(&msg, 0U);
174ad9d40acSPeng Fan
175ad9d40acSPeng Fan return ret;
176ad9d40acSPeng Fan }
177ad9d40acSPeng Fan
sc_misc_get_boot_dev(sc_ipc_t ipc,sc_rsrc_t * boot_dev)178ad9d40acSPeng Fan void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *boot_dev)
179ad9d40acSPeng Fan {
180ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
181ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
182ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
183ad9d40acSPeng Fan int ret;
184ad9d40acSPeng Fan
185ad9d40acSPeng Fan if (!dev)
186ad9d40acSPeng Fan hang();
187ad9d40acSPeng Fan
188ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
189ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
190ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)MISC_FUNC_GET_BOOT_DEV;
191ad9d40acSPeng Fan RPC_SIZE(&msg) = 1U;
192ad9d40acSPeng Fan
193ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
194ad9d40acSPeng Fan if (ret)
195ad9d40acSPeng Fan printf("%s: res:%d\n", __func__, RPC_R8(&msg));
196ad9d40acSPeng Fan
197*ecab65e4SPeng Fan if (boot_dev)
198ad9d40acSPeng Fan *boot_dev = RPC_U16(&msg, 0U);
199ad9d40acSPeng Fan }
200ad9d40acSPeng Fan
sc_misc_boot_status(sc_ipc_t ipc,sc_misc_boot_status_t status)201ad9d40acSPeng Fan void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status)
202ad9d40acSPeng Fan {
203ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
204ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
205ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
206ad9d40acSPeng Fan int ret;
207ad9d40acSPeng Fan
208ad9d40acSPeng Fan if (!dev)
209ad9d40acSPeng Fan hang();
210ad9d40acSPeng Fan
211ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
212ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_MISC;
213ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)MISC_FUNC_BOOT_STATUS;
214ad9d40acSPeng Fan RPC_U8(&msg, 0U) = (u8)status;
215ad9d40acSPeng Fan RPC_SIZE(&msg) = 2U;
216ad9d40acSPeng Fan
217ad9d40acSPeng Fan ret = misc_call(dev, SC_TRUE, &msg, size, &msg, size);
218ad9d40acSPeng Fan if (ret)
219ad9d40acSPeng Fan printf("%s: status:%d res:%d\n",
220ad9d40acSPeng Fan __func__, status, RPC_R8(&msg));
221ad9d40acSPeng Fan }
222ad9d40acSPeng Fan
sc_misc_build_info(sc_ipc_t ipc,u32 * build,u32 * commit)223ad9d40acSPeng Fan void sc_misc_build_info(sc_ipc_t ipc, u32 *build, u32 *commit)
224ad9d40acSPeng Fan {
225ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
226ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
227ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
228ad9d40acSPeng Fan int ret;
229ad9d40acSPeng Fan
230ad9d40acSPeng Fan if (!dev)
231ad9d40acSPeng Fan hang();
232ad9d40acSPeng Fan
233ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
234ad9d40acSPeng Fan RPC_SVC(&msg) = SC_RPC_SVC_MISC;
235ad9d40acSPeng Fan RPC_FUNC(&msg) = MISC_FUNC_BUILD_INFO;
236ad9d40acSPeng Fan RPC_SIZE(&msg) = 1;
237ad9d40acSPeng Fan
238ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
239ad9d40acSPeng Fan if (ret < 0) {
240ad9d40acSPeng Fan printf("%s: err: %d\n", __func__, ret);
241ad9d40acSPeng Fan return;
242ad9d40acSPeng Fan }
243ad9d40acSPeng Fan
244ad9d40acSPeng Fan if (build)
245ad9d40acSPeng Fan *build = RPC_U32(&msg, 0);
246ad9d40acSPeng Fan if (commit)
247ad9d40acSPeng Fan *commit = RPC_U32(&msg, 4);
248ad9d40acSPeng Fan }
249ad9d40acSPeng Fan
sc_misc_otp_fuse_read(sc_ipc_t ipc,u32 word,u32 * val)250ad9d40acSPeng Fan int sc_misc_otp_fuse_read(sc_ipc_t ipc, u32 word, u32 *val)
251ad9d40acSPeng Fan {
252ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
253ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
254ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
255ad9d40acSPeng Fan int ret;
256ad9d40acSPeng Fan
257ad9d40acSPeng Fan if (!dev)
258ad9d40acSPeng Fan hang();
259ad9d40acSPeng Fan
260ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
261ad9d40acSPeng Fan RPC_SVC(&msg) = SC_RPC_SVC_MISC;
262ad9d40acSPeng Fan RPC_FUNC(&msg) = MISC_FUNC_OTP_FUSE_READ;
263ad9d40acSPeng Fan RPC_U32(&msg, 0) = word;
264ad9d40acSPeng Fan RPC_SIZE(&msg) = 2;
265ad9d40acSPeng Fan
266ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
267ad9d40acSPeng Fan if (ret < 0)
268ad9d40acSPeng Fan return ret;
269ad9d40acSPeng Fan
270ad9d40acSPeng Fan if (val)
271ad9d40acSPeng Fan *val = RPC_U32(&msg, 0U);
272ad9d40acSPeng Fan
273ad9d40acSPeng Fan return 0;
274ad9d40acSPeng Fan }
275ad9d40acSPeng Fan
276ad9d40acSPeng Fan /* RM */
sc_rm_is_memreg_owned(sc_ipc_t ipc,sc_rm_mr_t mr)277ad9d40acSPeng Fan sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr)
278ad9d40acSPeng Fan {
279ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
280ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
281ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
282ad9d40acSPeng Fan int ret;
283ad9d40acSPeng Fan sc_err_t result;
284ad9d40acSPeng Fan
285ad9d40acSPeng Fan if (!dev)
286ad9d40acSPeng Fan hang();
287ad9d40acSPeng Fan
288ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
289ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
290ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)RM_FUNC_IS_MEMREG_OWNED;
291ad9d40acSPeng Fan RPC_U8(&msg, 0U) = (u8)mr;
292ad9d40acSPeng Fan RPC_SIZE(&msg) = 2U;
293ad9d40acSPeng Fan
294ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
295ad9d40acSPeng Fan result = RPC_R8(&msg);
296ad9d40acSPeng Fan
297ad9d40acSPeng Fan if (result != 0 && result != 1) {
298ad9d40acSPeng Fan printf("%s: mr:%d res:%d\n", __func__, mr, RPC_R8(&msg));
299ad9d40acSPeng Fan if (ret)
300ad9d40acSPeng Fan printf("%s: mr:%d res:%d\n", __func__, mr,
301ad9d40acSPeng Fan RPC_R8(&msg));
302ad9d40acSPeng Fan }
303ad9d40acSPeng Fan
304ad9d40acSPeng Fan return (sc_bool_t)result;
305ad9d40acSPeng Fan }
306ad9d40acSPeng Fan
sc_rm_get_memreg_info(sc_ipc_t ipc,sc_rm_mr_t mr,sc_faddr_t * addr_start,sc_faddr_t * addr_end)307ad9d40acSPeng Fan int sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, sc_faddr_t *addr_start,
308ad9d40acSPeng Fan sc_faddr_t *addr_end)
309ad9d40acSPeng Fan {
310ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
311ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
312ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
313ad9d40acSPeng Fan int ret;
314ad9d40acSPeng Fan
315ad9d40acSPeng Fan if (!dev)
316ad9d40acSPeng Fan hang();
317ad9d40acSPeng Fan
318ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
319ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
320ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)RM_FUNC_GET_MEMREG_INFO;
321ad9d40acSPeng Fan RPC_U8(&msg, 0U) = (u8)mr;
322ad9d40acSPeng Fan RPC_SIZE(&msg) = 2U;
323ad9d40acSPeng Fan
324ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
325ad9d40acSPeng Fan if (ret)
326ad9d40acSPeng Fan printf("%s: mr:%d res:%d\n", __func__, mr, RPC_R8(&msg));
327ad9d40acSPeng Fan
328ad9d40acSPeng Fan if (addr_start)
329ad9d40acSPeng Fan *addr_start = ((u64)RPC_U32(&msg, 0U) << 32U) |
330ad9d40acSPeng Fan RPC_U32(&msg, 4U);
331ad9d40acSPeng Fan
332ad9d40acSPeng Fan if (addr_end)
333ad9d40acSPeng Fan *addr_end = ((u64)RPC_U32(&msg, 8U) << 32U) |
334ad9d40acSPeng Fan RPC_U32(&msg, 12U);
335ad9d40acSPeng Fan
336ad9d40acSPeng Fan return ret;
337ad9d40acSPeng Fan }
338ad9d40acSPeng Fan
sc_rm_is_resource_owned(sc_ipc_t ipc,sc_rsrc_t resource)339ad9d40acSPeng Fan sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource)
340ad9d40acSPeng Fan {
341ad9d40acSPeng Fan struct udevice *dev = gd->arch.scu_dev;
342ad9d40acSPeng Fan int size = sizeof(struct sc_rpc_msg_s);
343ad9d40acSPeng Fan struct sc_rpc_msg_s msg;
344ad9d40acSPeng Fan int ret;
345ad9d40acSPeng Fan u8 result;
346ad9d40acSPeng Fan
347ad9d40acSPeng Fan if (!dev)
348ad9d40acSPeng Fan hang();
349ad9d40acSPeng Fan
350ad9d40acSPeng Fan RPC_VER(&msg) = SC_RPC_VERSION;
351ad9d40acSPeng Fan RPC_SVC(&msg) = (u8)SC_RPC_SVC_RM;
352ad9d40acSPeng Fan RPC_FUNC(&msg) = (u8)RM_FUNC_IS_RESOURCE_OWNED;
353ad9d40acSPeng Fan RPC_U16(&msg, 0U) = (u16)resource;
354ad9d40acSPeng Fan RPC_SIZE(&msg) = 2U;
355ad9d40acSPeng Fan
356ad9d40acSPeng Fan ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
357ad9d40acSPeng Fan result = RPC_R8(&msg);
358ad9d40acSPeng Fan if (result != 0 && result != 1) {
359ad9d40acSPeng Fan printf("%s: resource:%d res:%d\n",
360ad9d40acSPeng Fan __func__, resource, RPC_R8(&msg));
361ad9d40acSPeng Fan if (ret)
362ad9d40acSPeng Fan printf("%s: res:%d res:%d\n", __func__, resource,
363ad9d40acSPeng Fan RPC_R8(&msg));
364ad9d40acSPeng Fan }
365ad9d40acSPeng Fan
366ad9d40acSPeng Fan return !!result;
367ad9d40acSPeng Fan }
368