1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * AMD Platform Security Processor (PSP) interface driver |
4 | * |
5 | * Copyright (C) 2017-2019 Advanced Micro Devices, Inc. |
6 | * |
7 | * Author: Brijesh Singh <brijesh.singh@amd.com> |
8 | */ |
9 | |
10 | #ifndef __PSP_DEV_H__ |
11 | #define __PSP_DEV_H__ |
12 | |
13 | #include <linux/device.h> |
14 | #include <linux/list.h> |
15 | #include <linux/bits.h> |
16 | #include <linux/interrupt.h> |
17 | #include <linux/mutex.h> |
18 | #include <linux/psp.h> |
19 | #include <linux/psp-platform-access.h> |
20 | |
21 | #include "sp-dev.h" |
22 | |
23 | #define MAX_PSP_NAME_LEN 16 |
24 | |
25 | extern struct psp_device *psp_master; |
26 | |
27 | typedef void (*psp_irq_handler_t)(int, void *, unsigned int); |
28 | |
29 | struct psp_device { |
30 | struct list_head entry; |
31 | |
32 | struct psp_vdata *vdata; |
33 | char name[MAX_PSP_NAME_LEN]; |
34 | |
35 | struct device *dev; |
36 | struct sp_device *sp; |
37 | |
38 | void __iomem *io_regs; |
39 | struct mutex mailbox_mutex; |
40 | |
41 | psp_irq_handler_t sev_irq_handler; |
42 | void *sev_irq_data; |
43 | |
44 | void *sev_data; |
45 | void *tee_data; |
46 | void *platform_access_data; |
47 | void *dbc_data; |
48 | |
49 | unsigned int capability; |
50 | }; |
51 | |
52 | void psp_set_sev_irq_handler(struct psp_device *psp, psp_irq_handler_t handler, |
53 | void *data); |
54 | void psp_clear_sev_irq_handler(struct psp_device *psp); |
55 | |
56 | struct psp_device *psp_get_master_device(void); |
57 | |
58 | #define PSP_CAPABILITY_SEV BIT(0) |
59 | #define PSP_CAPABILITY_TEE BIT(1) |
60 | #define PSP_CAPABILITY_DBC_THRU_EXT BIT(2) |
61 | #define PSP_CAPABILITY_PSP_SECURITY_REPORTING BIT(7) |
62 | |
63 | #define PSP_CAPABILITY_PSP_SECURITY_OFFSET 8 |
64 | /* |
65 | * The PSP doesn't directly store these bits in the capability register |
66 | * but instead copies them from the results of query command. |
67 | * |
68 | * The offsets from the query command are below, and shifted when used. |
69 | */ |
70 | #define PSP_SECURITY_FUSED_PART BIT(0) |
71 | #define PSP_SECURITY_DEBUG_LOCK_ON BIT(2) |
72 | #define PSP_SECURITY_TSME_STATUS BIT(5) |
73 | #define PSP_SECURITY_ANTI_ROLLBACK_STATUS BIT(7) |
74 | #define PSP_SECURITY_RPMC_PRODUCTION_ENABLED BIT(8) |
75 | #define PSP_SECURITY_RPMC_SPIROM_AVAILABLE BIT(9) |
76 | #define PSP_SECURITY_HSP_TPM_AVAILABLE BIT(10) |
77 | #define PSP_SECURITY_ROM_ARMOR_ENFORCED BIT(11) |
78 | |
79 | /** |
80 | * enum psp_cmd - PSP mailbox commands |
81 | * @PSP_CMD_TEE_RING_INIT: Initialize TEE ring buffer |
82 | * @PSP_CMD_TEE_RING_DESTROY: Destroy TEE ring buffer |
83 | * @PSP_CMD_TEE_EXTENDED_CMD: Extended command |
84 | * @PSP_CMD_MAX: Maximum command id |
85 | */ |
86 | enum psp_cmd { |
87 | PSP_CMD_TEE_RING_INIT = 1, |
88 | PSP_CMD_TEE_RING_DESTROY = 2, |
89 | PSP_CMD_TEE_EXTENDED_CMD = 14, |
90 | PSP_CMD_MAX = 15, |
91 | }; |
92 | |
93 | int psp_mailbox_command(struct psp_device *psp, enum psp_cmd cmd, void *cmdbuff, |
94 | unsigned int timeout_msecs, unsigned int *cmdresp); |
95 | |
96 | /** |
97 | * struct psp_ext_req_buffer_hdr - Structure of the extended command header |
98 | * @payload_size: total payload size |
99 | * @sub_cmd_id: extended command ID |
100 | * @status: status of command execution (out) |
101 | */ |
102 | struct psp_ext_req_buffer_hdr { |
103 | u32 payload_size; |
104 | u32 sub_cmd_id; |
105 | u32 status; |
106 | } __packed; |
107 | |
108 | struct psp_ext_request { |
109 | struct psp_ext_req_buffer_hdr ; |
110 | void *buf; |
111 | } __packed; |
112 | |
113 | /** |
114 | * enum psp_sub_cmd - PSP mailbox sub commands |
115 | * @PSP_SUB_CMD_DBC_GET_NONCE: Get nonce from DBC |
116 | * @PSP_SUB_CMD_DBC_SET_UID: Set UID for DBC |
117 | * @PSP_SUB_CMD_DBC_GET_PARAMETER: Get parameter from DBC |
118 | * @PSP_SUB_CMD_DBC_SET_PARAMETER: Set parameter for DBC |
119 | */ |
120 | enum psp_sub_cmd { |
121 | PSP_SUB_CMD_DBC_GET_NONCE = PSP_DYNAMIC_BOOST_GET_NONCE, |
122 | PSP_SUB_CMD_DBC_SET_UID = PSP_DYNAMIC_BOOST_SET_UID, |
123 | PSP_SUB_CMD_DBC_GET_PARAMETER = PSP_DYNAMIC_BOOST_GET_PARAMETER, |
124 | PSP_SUB_CMD_DBC_SET_PARAMETER = PSP_DYNAMIC_BOOST_SET_PARAMETER, |
125 | }; |
126 | |
127 | int psp_extended_mailbox_cmd(struct psp_device *psp, unsigned int timeout_msecs, |
128 | struct psp_ext_request *req); |
129 | #endif /* __PSP_DEV_H */ |
130 | |