1/* SPDX-License-Identifier: MIT */
2/*
3 * AMD Trusted Execution Environment (TEE) interface
4 *
5 * Author: Rijo Thomas <Rijo-john.Thomas@amd.com>
6 *
7 * Copyright 2019 Advanced Micro Devices, Inc.
8 *
9 */
10
11#ifndef __PSP_TEE_H_
12#define __PSP_TEE_H_
13
14#include <linux/types.h>
15#include <linux/errno.h>
16
17/* This file defines the Trusted Execution Environment (TEE) interface commands
18 * and the API exported by AMD Secure Processor driver to communicate with
19 * AMD-TEE Trusted OS.
20 */
21
22/**
23 * enum tee_cmd_id - TEE Interface Command IDs
24 * @TEE_CMD_ID_LOAD_TA:          Load Trusted Application (TA) binary into
25 *                               TEE environment
26 * @TEE_CMD_ID_UNLOAD_TA:        Unload TA binary from TEE environment
27 * @TEE_CMD_ID_OPEN_SESSION:     Open session with loaded TA
28 * @TEE_CMD_ID_CLOSE_SESSION:    Close session with loaded TA
29 * @TEE_CMD_ID_INVOKE_CMD:       Invoke a command with loaded TA
30 * @TEE_CMD_ID_MAP_SHARED_MEM:   Map shared memory
31 * @TEE_CMD_ID_UNMAP_SHARED_MEM: Unmap shared memory
32 */
33enum tee_cmd_id {
34	TEE_CMD_ID_LOAD_TA = 1,
35	TEE_CMD_ID_UNLOAD_TA,
36	TEE_CMD_ID_OPEN_SESSION,
37	TEE_CMD_ID_CLOSE_SESSION,
38	TEE_CMD_ID_INVOKE_CMD,
39	TEE_CMD_ID_MAP_SHARED_MEM,
40	TEE_CMD_ID_UNMAP_SHARED_MEM,
41};
42
43#ifdef CONFIG_CRYPTO_DEV_SP_PSP
44/**
45 * psp_tee_process_cmd() - Process command in Trusted Execution Environment
46 * @cmd_id:     TEE command ID (&enum tee_cmd_id)
47 * @buf:        Command buffer for TEE processing. On success, is updated
48 *              with the response
49 * @len:        Length of command buffer in bytes
50 * @status:     On success, holds the TEE command execution status
51 *
52 * This function submits a command to the Trusted OS for processing in the
53 * TEE environment and waits for a response or until the command times out.
54 *
55 * Returns:
56 * 0 if TEE successfully processed the command
57 * -%ENODEV    if PSP device not available
58 * -%EINVAL    if invalid input
59 * -%ETIMEDOUT if TEE command timed out
60 * -%EBUSY     if PSP device is not responsive
61 */
62int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf, size_t len,
63			u32 *status);
64
65/**
66 * psp_check_tee_status() - Checks whether there is a TEE which a driver can
67 * talk to.
68 *
69 * This function can be used by AMD-TEE driver to query if there is TEE with
70 * which it can communicate.
71 *
72 * Returns:
73 * 0          if the device has TEE
74 * -%ENODEV   if there is no TEE available
75 */
76int psp_check_tee_status(void);
77
78#else /* !CONFIG_CRYPTO_DEV_SP_PSP */
79
80static inline int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf,
81				      size_t len, u32 *status)
82{
83	return -ENODEV;
84}
85
86static inline int psp_check_tee_status(void)
87{
88	return -ENODEV;
89}
90#endif /* CONFIG_CRYPTO_DEV_SP_PSP */
91#endif /* __PSP_TEE_H_ */
92