1*b22e6898SYi Chou /* 2*b22e6898SYi Chou * Copyright (c) 2024, The ChromiumOS Authors. All rights reserved. 3*b22e6898SYi Chou * 4*b22e6898SYi Chou * SPDX-License-Identifier: BSD-3-Clause 5*b22e6898SYi Chou */ 6*b22e6898SYi Chou 7*b22e6898SYi Chou #ifndef CROS_WIDEVINE_SMC_HANDLERS_H 8*b22e6898SYi Chou #define CROS_WIDEVINE_SMC_HANDLERS_H 9*b22e6898SYi Chou 10*b22e6898SYi Chou #include <lib/smccc.h> 11*b22e6898SYi Chou 12*b22e6898SYi Chou /******************************************************************************* 13*b22e6898SYi Chou * Defines for CrOS OEM Service queries 14*b22e6898SYi Chou ******************************************************************************/ 15*b22e6898SYi Chou 16*b22e6898SYi Chou /* 0xC300C050 - 0xC300C05F are CrOS OEM service calls */ 17*b22e6898SYi Chou #define CROS_OEM_SMC_ID 0xC050 18*b22e6898SYi Chou #define CROS_OEM_SMC_CALL_ID(func_num) \ 19*b22e6898SYi Chou ((SMC_TYPE_FAST << FUNCID_TYPE_SHIFT) | \ 20*b22e6898SYi Chou ((SMC_64) << FUNCID_CC_SHIFT) | (OEN_OEM_START << FUNCID_OEN_SHIFT) | \ 21*b22e6898SYi Chou (CROS_OEM_SMC_ID) | ((func_num) & FUNCID_NUM_MASK)) 22*b22e6898SYi Chou 23*b22e6898SYi Chou enum cros_drm_set { 24*b22e6898SYi Chou CROS_DRM_SET_TPM_AUTH_PUB = 0U, 25*b22e6898SYi Chou CROS_DRM_SET_HARDWARE_UNIQUE_KEY = 1U, 26*b22e6898SYi Chou CROS_DRM_SET_ROOT_OF_TRUST = 2U, 27*b22e6898SYi Chou }; 28*b22e6898SYi Chou 29*b22e6898SYi Chou /******************************************************************************* 30*b22e6898SYi Chou * Defines for runtime services func ids 31*b22e6898SYi Chou ******************************************************************************/ 32*b22e6898SYi Chou 33*b22e6898SYi Chou /* Sets the TPM auth public key. The maximum size is 128 bytes. 34*b22e6898SYi Chou * |x1| is the length of the data, |x2| is the physical address of the data. 35*b22e6898SYi Chou */ 36*b22e6898SYi Chou #define CROS_OEM_SMC_DRM_SET_TPM_AUTH_PUB_FUNC_ID \ 37*b22e6898SYi Chou CROS_OEM_SMC_CALL_ID(CROS_DRM_SET_TPM_AUTH_PUB) 38*b22e6898SYi Chou 39*b22e6898SYi Chou /* Sets the hardware unique key. The maximum size is 32 bytes. 40*b22e6898SYi Chou * |x1| is the length of the data, |x2| is the physical address of the data. 41*b22e6898SYi Chou */ 42*b22e6898SYi Chou #define CROS_OEM_SMC_DRM_SET_HARDWARE_UNIQUE_KEY_FUNC_ID \ 43*b22e6898SYi Chou CROS_OEM_SMC_CALL_ID(CROS_DRM_SET_HARDWARE_UNIQUE_KEY) 44*b22e6898SYi Chou 45*b22e6898SYi Chou /* Sets the widevine root of trust. The maximum size is 32 bytes. 46*b22e6898SYi Chou * |x1| is the length of the data, |x2| is the physical address of the data. 47*b22e6898SYi Chou */ 48*b22e6898SYi Chou #define CROS_OEM_SMC_DRM_SET_ROOT_OF_TRUST_FUNC_ID \ 49*b22e6898SYi Chou CROS_OEM_SMC_CALL_ID(CROS_DRM_SET_ROOT_OF_TRUST) 50*b22e6898SYi Chou 51*b22e6898SYi Chou #define is_cros_oem_smc(_call_id) (((_call_id) & 0xFFF0U) == CROS_OEM_SMC_ID) 52*b22e6898SYi Chou 53*b22e6898SYi Chou struct cros_oem_data { 54*b22e6898SYi Chou uint8_t *buffer; 55*b22e6898SYi Chou const uint32_t max_length; 56*b22e6898SYi Chou uint32_t length; 57*b22e6898SYi Chou }; 58*b22e6898SYi Chou 59*b22e6898SYi Chou extern struct cros_oem_data cros_oem_tpm_auth_pk; 60*b22e6898SYi Chou 61*b22e6898SYi Chou extern struct cros_oem_data cros_oem_huk; 62*b22e6898SYi Chou 63*b22e6898SYi Chou extern struct cros_oem_data cros_oem_rot; 64*b22e6898SYi Chou 65*b22e6898SYi Chou #endif /* CROS_WIDEVINE_SMC_HANDLERS_H */ 66