1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (c) 2024 9elements GmbH
4 */
5
6 #include <cpu.h>
7 #include <init.h>
8 #include <log.h>
9 #include <linux/arm-smccc.h>
10
11 #define SMC_SIP_FUNCTION_ID(n) (0xC2000000 | (n))
12
13 #define SIP_SVC_VERSION SMC_SIP_FUNCTION_ID(1)
14 #define SIP_SVC_GET_GIC SMC_SIP_FUNCTION_ID(100)
15 #define SIP_SVC_GET_GIC_ITS SMC_SIP_FUNCTION_ID(101)
16 #define SIP_SVC_GET_CPU_COUNT SMC_SIP_FUNCTION_ID(200)
17 #define SIP_SVC_GET_CPU_NODE SMC_SIP_FUNCTION_ID(201)
18 #define SIP_SVC_GET_MEMORY_NODE_COUNT SMC_SIP_FUNCTION_ID(300)
19 #define SIP_SVC_GET_MEMORY_NODE SMC_SIP_FUNCTION_ID(301)
20
smc_get_mpidr(unsigned long id,u64 * mpidr)21 int smc_get_mpidr(unsigned long id, u64 *mpidr)
22 {
23 struct arm_smccc_res res;
24
25 res.a0 = ~0;
26 arm_smccc_smc(SIP_SVC_GET_CPU_NODE, id, 0, 0, 0, 0, 0, 0, &res);
27
28 if (!res.a0)
29 *mpidr = res.a2;
30
31 return res.a0;
32 }
33
smc_get_gic_dist_base(u64 * base)34 int smc_get_gic_dist_base(u64 *base)
35 {
36 struct arm_smccc_res res;
37
38 res.a0 = ~0;
39 arm_smccc_smc(SIP_SVC_GET_GIC, 0, 0, 0, 0, 0, 0, 0, &res);
40
41 if (!res.a0)
42 *base = res.a1;
43
44 return res.a0;
45 }
46
smc_get_gic_redist_base(u64 * base)47 int smc_get_gic_redist_base(u64 *base)
48 {
49 struct arm_smccc_res res;
50
51 res.a0 = ~0;
52 arm_smccc_smc(SIP_SVC_GET_GIC, 0, 0, 0, 0, 0, 0, 0, &res);
53
54 if (!res.a0)
55 *base = res.a2;
56
57 return res.a0;
58 }
59
smc_get_gic_its_base(u64 * base)60 int smc_get_gic_its_base(u64 *base)
61 {
62 struct arm_smccc_res res;
63
64 res.a0 = ~0;
65 arm_smccc_smc(SIP_SVC_GET_GIC_ITS, 0, 0, 0, 0, 0, 0, 0, &res);
66
67 if (!res.a0)
68 *base = res.a1;
69
70 return res.a0;
71 }
72