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