The AMD-TEE driver should check if TEE is available before registering itself with TEE subsystem. This ensures that there is an TEE which the driver can talk to before proceeding with tee device node allocation.
Cc: Jens Wiklander jens.wiklander@linaro.org Cc: Ard Biesheuvel ard.biesheuvel@linaro.org Cc: Tom Lendacky thomas.lendacky@amd.com Co-developed-by: Devaraj Rangasamy Devaraj.Rangasamy@amd.com Signed-off-by: Devaraj Rangasamy Devaraj.Rangasamy@amd.com Signed-off-by: Rijo Thomas Rijo-john.Thomas@amd.com --- drivers/crypto/ccp/tee-dev.c | 11 +++++++++++ drivers/tee/amdtee/core.c | 6 ++++++ include/linux/psp-tee.h | 18 ++++++++++++++++++ 3 files changed, 35 insertions(+)
diff --git a/drivers/crypto/ccp/tee-dev.c b/drivers/crypto/ccp/tee-dev.c index 555c8a7..5e697a9 100644 --- a/drivers/crypto/ccp/tee-dev.c +++ b/drivers/crypto/ccp/tee-dev.c @@ -362,3 +362,14 @@ int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf, size_t len, return 0; } EXPORT_SYMBOL(psp_tee_process_cmd); + +int psp_check_tee_status(void) +{ + struct psp_device *psp = psp_get_master_device(); + + if (!psp || !psp->tee_data) + return -ENODEV; + + return 0; +} +EXPORT_SYMBOL(psp_check_tee_status); diff --git a/drivers/tee/amdtee/core.c b/drivers/tee/amdtee/core.c index dd360f3..9d0cee1 100644 --- a/drivers/tee/amdtee/core.c +++ b/drivers/tee/amdtee/core.c @@ -16,6 +16,7 @@ #include <linux/firmware.h> #include "amdtee_private.h" #include "../tee_private.h" +#include <linux/psp-tee.h>
static struct amdtee_driver_data *drv_data; static DEFINE_MUTEX(session_list_mutex); @@ -438,6 +439,10 @@ static int __init amdtee_driver_init(void) struct tee_shm_pool *pool = ERR_PTR(-EINVAL); int rc;
+ rc = psp_check_tee_status(); + if (rc) + goto err_fail; + drv_data = kzalloc(sizeof(*drv_data), GFP_KERNEL); if (IS_ERR(drv_data)) return -ENOMEM; @@ -485,6 +490,7 @@ static int __init amdtee_driver_init(void) kfree(drv_data); drv_data = NULL;
+err_fail: pr_err("amd-tee driver initialization failed\n"); return rc; } diff --git a/include/linux/psp-tee.h b/include/linux/psp-tee.h index 63bb221..cb0c95d 100644 --- a/include/linux/psp-tee.h +++ b/include/linux/psp-tee.h @@ -62,6 +62,19 @@ enum tee_cmd_id { int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf, size_t len, u32 *status);
+/** + * psp_check_tee_status() - Checks whether there is a TEE which a driver can + * talk to. + * + * This function can be used by AMD-TEE driver to query if there is TEE with + * which it can communicate. + * + * Returns: + * 0 if the device has TEE + * -%ENODEV if there is no TEE available + */ +int psp_check_tee_status(void); + #else /* !CONFIG_CRYPTO_DEV_SP_PSP */
static inline int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf, @@ -69,5 +82,10 @@ static inline int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf, { return -ENODEV; } + +static inline int psp_check_tee_status(void) +{ + return -ENODEV; +} #endif /* CONFIG_CRYPTO_DEV_SP_PSP */ #endif /* __PSP_TEE_H_ */