xref: /aosp_15_r20/trusty/kernel/lib/arm_trng/arm_trng.h (revision 344aa361028b423587d4ef3fa52a23d194628137)
1*344aa361SAndroid Build Coastguard Worker /*
2*344aa361SAndroid Build Coastguard Worker  * Copyright (c) 2022 Google Inc. All rights reserved
3*344aa361SAndroid Build Coastguard Worker  *
4*344aa361SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining
5*344aa361SAndroid Build Coastguard Worker  * a copy of this software and associated documentation files
6*344aa361SAndroid Build Coastguard Worker  * (the "Software"), to deal in the Software without restriction,
7*344aa361SAndroid Build Coastguard Worker  * including without limitation the rights to use, copy, modify, merge,
8*344aa361SAndroid Build Coastguard Worker  * publish, distribute, sublicense, and/or sell copies of the Software,
9*344aa361SAndroid Build Coastguard Worker  * and to permit persons to whom the Software is furnished to do so,
10*344aa361SAndroid Build Coastguard Worker  * subject to the following conditions:
11*344aa361SAndroid Build Coastguard Worker  *
12*344aa361SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be
13*344aa361SAndroid Build Coastguard Worker  * included in all copies or substantial portions of the Software.
14*344aa361SAndroid Build Coastguard Worker  *
15*344aa361SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16*344aa361SAndroid Build Coastguard Worker  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17*344aa361SAndroid Build Coastguard Worker  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18*344aa361SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19*344aa361SAndroid Build Coastguard Worker  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20*344aa361SAndroid Build Coastguard Worker  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21*344aa361SAndroid Build Coastguard Worker  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22*344aa361SAndroid Build Coastguard Worker  */
23*344aa361SAndroid Build Coastguard Worker 
24*344aa361SAndroid Build Coastguard Worker #pragma once
25*344aa361SAndroid Build Coastguard Worker 
26*344aa361SAndroid Build Coastguard Worker /*
27*344aa361SAndroid Build Coastguard Worker  * ARM True Random Number Generator Firmware Interface
28*344aa361SAndroid Build Coastguard Worker  * (https://developer.arm.com/documentation/den0098/latest).
29*344aa361SAndroid Build Coastguard Worker  */
30*344aa361SAndroid Build Coastguard Worker 
31*344aa361SAndroid Build Coastguard Worker #include <lib/sm/smcall.h>
32*344aa361SAndroid Build Coastguard Worker 
33*344aa361SAndroid Build Coastguard Worker #define SMC_TRNG_CURRENT_MAJOR_VERSION 1
34*344aa361SAndroid Build Coastguard Worker 
35*344aa361SAndroid Build Coastguard Worker /**
36*344aa361SAndroid Build Coastguard Worker  * enum trng_error - TRNG error code
37*344aa361SAndroid Build Coastguard Worker  * @TRNG_ERROR_NOT_SUPPORTED:
38*344aa361SAndroid Build Coastguard Worker  *         Operation is not supported by the current implementation.
39*344aa361SAndroid Build Coastguard Worker  * @TRNG_ERROR_INVALID_PARAMETER:
40*344aa361SAndroid Build Coastguard Worker  *         Invalid parameter. Conditions function specific.
41*344aa361SAndroid Build Coastguard Worker  * @TRNG_ERROR_NO_ENTROPY:
42*344aa361SAndroid Build Coastguard Worker  *         No entropy.
43*344aa361SAndroid Build Coastguard Worker  */
44*344aa361SAndroid Build Coastguard Worker enum trng_error {
45*344aa361SAndroid Build Coastguard Worker     TRNG_ERROR_NOT_SUPPORTED = -1,
46*344aa361SAndroid Build Coastguard Worker     TRNG_ERROR_INVALID_PARAMETER = -2,
47*344aa361SAndroid Build Coastguard Worker     TRNG_ERROR_NO_ENTROPY = -3,
48*344aa361SAndroid Build Coastguard Worker };
49*344aa361SAndroid Build Coastguard Worker 
50*344aa361SAndroid Build Coastguard Worker /**
51*344aa361SAndroid Build Coastguard Worker  * SMC_FC_TRNG_VERSION - SMC opcode to return supported TRNG version
52*344aa361SAndroid Build Coastguard Worker  *
53*344aa361SAndroid Build Coastguard Worker  * Register arguments:
54*344aa361SAndroid Build Coastguard Worker  *
55*344aa361SAndroid Build Coastguard Worker  * * w1-w7:  Must be 0.
56*344aa361SAndroid Build Coastguard Worker  *
57*344aa361SAndroid Build Coastguard Worker  * Return:
58*344aa361SAndroid Build Coastguard Worker  * * w0:     Major version bit[30:16], minor version in bit[15:0], bit[31] must
59*344aa361SAndroid Build Coastguard Worker  *           be 0.
60*344aa361SAndroid Build Coastguard Worker  * * w1-w3:  Must be 0.
61*344aa361SAndroid Build Coastguard Worker  *
62*344aa361SAndroid Build Coastguard Worker  * or
63*344aa361SAndroid Build Coastguard Worker  *
64*344aa361SAndroid Build Coastguard Worker  * * w0:     %TRNG_ERROR_NOT_SUPPORTED.
65*344aa361SAndroid Build Coastguard Worker  */
66*344aa361SAndroid Build Coastguard Worker #define SMC_FC_TRNG_VERSION SMC_FASTCALL_NR(SMC_ENTITY_STD, 0x50)
67*344aa361SAndroid Build Coastguard Worker 
68*344aa361SAndroid Build Coastguard Worker /**
69*344aa361SAndroid Build Coastguard Worker  * SMC_FC_TRNG_FEATURES - SMC opcode to check optional feature support
70*344aa361SAndroid Build Coastguard Worker  *
71*344aa361SAndroid Build Coastguard Worker  * Register arguments:
72*344aa361SAndroid Build Coastguard Worker  *
73*344aa361SAndroid Build Coastguard Worker  * * w1:     TRNG function ID
74*344aa361SAndroid Build Coastguard Worker  * * w2-w7:  Must be 0.
75*344aa361SAndroid Build Coastguard Worker  *
76*344aa361SAndroid Build Coastguard Worker  * Return:
77*344aa361SAndroid Build Coastguard Worker  * * w0:     Function-specific features if the function is implemented.
78*344aa361SAndroid Build Coastguard Worker  *
79*344aa361SAndroid Build Coastguard Worker  * or
80*344aa361SAndroid Build Coastguard Worker  *
81*344aa361SAndroid Build Coastguard Worker  * * w0:     %TRNG_ERROR_NOT_SUPPORTED.
82*344aa361SAndroid Build Coastguard Worker  */
83*344aa361SAndroid Build Coastguard Worker #define SMC_FC_TRNG_FEATURES SMC_FASTCALL_NR(SMC_ENTITY_STD, 0x51)
84*344aa361SAndroid Build Coastguard Worker 
85*344aa361SAndroid Build Coastguard Worker /**
86*344aa361SAndroid Build Coastguard Worker  * SMC_FC_GET_UUID - SMC opcode to retrieve the UUID of the TRNG back end.
87*344aa361SAndroid Build Coastguard Worker  *
88*344aa361SAndroid Build Coastguard Worker  * Register arguments:
89*344aa361SAndroid Build Coastguard Worker  *
90*344aa361SAndroid Build Coastguard Worker  * * w1-w7:  Must be 0.
91*344aa361SAndroid Build Coastguard Worker  *
92*344aa361SAndroid Build Coastguard Worker  * Return:
93*344aa361SAndroid Build Coastguard Worker  * * w0:     UUID[31:0].
94*344aa361SAndroid Build Coastguard Worker  * * w1:     UUID[63:32].
95*344aa361SAndroid Build Coastguard Worker  * * w2:     UUID[95:64].
96*344aa361SAndroid Build Coastguard Worker  * * w3:     UUID[127:96].
97*344aa361SAndroid Build Coastguard Worker  *
98*344aa361SAndroid Build Coastguard Worker  * or
99*344aa361SAndroid Build Coastguard Worker  *
100*344aa361SAndroid Build Coastguard Worker  * * w0:     %TRNG_ERROR_NOT_SUPPORTED.
101*344aa361SAndroid Build Coastguard Worker  */
102*344aa361SAndroid Build Coastguard Worker #define SMC_FC_TRNG_GET_UUID SMC_FASTCALL_NR(SMC_ENTITY_STD, 0x52)
103*344aa361SAndroid Build Coastguard Worker 
104*344aa361SAndroid Build Coastguard Worker /**
105*344aa361SAndroid Build Coastguard Worker  * SMC_FC_TRNG_RND - SMC opcode to request N bits of entropy.
106*344aa361SAndroid Build Coastguard Worker  *
107*344aa361SAndroid Build Coastguard Worker  * Register arguments:
108*344aa361SAndroid Build Coastguard Worker  *
109*344aa361SAndroid Build Coastguard Worker  * * w1:     Bits of entropy requested, between 1 and 96.
110*344aa361SAndroid Build Coastguard Worker  * * w2-w7:  Must be 0.
111*344aa361SAndroid Build Coastguard Worker  *
112*344aa361SAndroid Build Coastguard Worker  * Return:
113*344aa361SAndroid Build Coastguard Worker  * * w0:     Must be 0.
114*344aa361SAndroid Build Coastguard Worker  * * w1:     Entropy[95:64].
115*344aa361SAndroid Build Coastguard Worker  * * w2:     Entropy[63:32].
116*344aa361SAndroid Build Coastguard Worker  * * w3:     Entropy[31:0].
117*344aa361SAndroid Build Coastguard Worker  *
118*344aa361SAndroid Build Coastguard Worker  * or
119*344aa361SAndroid Build Coastguard Worker  *
120*344aa361SAndroid Build Coastguard Worker  * * w0:     One of &enum trng_error.
121*344aa361SAndroid Build Coastguard Worker  * * w1-w3:  Must be 0.
122*344aa361SAndroid Build Coastguard Worker  */
123*344aa361SAndroid Build Coastguard Worker #define SMC_FC_TRNG_RND SMC_FASTCALL_NR(SMC_ENTITY_STD, 0x53)
124*344aa361SAndroid Build Coastguard Worker 
125*344aa361SAndroid Build Coastguard Worker /**
126*344aa361SAndroid Build Coastguard Worker  * SMC_FC64_TRNG_RND - SMC opcode to request N bits of entropy.
127*344aa361SAndroid Build Coastguard Worker  *
128*344aa361SAndroid Build Coastguard Worker  * Register arguments:
129*344aa361SAndroid Build Coastguard Worker  *
130*344aa361SAndroid Build Coastguard Worker  * * x1:     Bits of entropy requested, between 1 and 192.
131*344aa361SAndroid Build Coastguard Worker  * * x2-x7:  Must be 0.
132*344aa361SAndroid Build Coastguard Worker  *
133*344aa361SAndroid Build Coastguard Worker  * Return:
134*344aa361SAndroid Build Coastguard Worker  * * x0:     Must be 0.
135*344aa361SAndroid Build Coastguard Worker  * * x1:     Entropy[191:128].
136*344aa361SAndroid Build Coastguard Worker  * * x2:     Entropy[127:64].
137*344aa361SAndroid Build Coastguard Worker  * * x3:     Entropy[63:0].
138*344aa361SAndroid Build Coastguard Worker  *
139*344aa361SAndroid Build Coastguard Worker  * or
140*344aa361SAndroid Build Coastguard Worker  *
141*344aa361SAndroid Build Coastguard Worker  * * x0:     One of &enum trng_error.
142*344aa361SAndroid Build Coastguard Worker  * * x1-x3:  Must be 0.
143*344aa361SAndroid Build Coastguard Worker  */
144*344aa361SAndroid Build Coastguard Worker #define SMC_FC64_TRNG_RND SMC_FASTCALL64_NR(SMC_ENTITY_STD, 0x53)
145