xref: /rk3399_ARM-atf/include/drivers/tpm/tpm2.h (revision 7e848540159ba8fbb0577c76e4dc0c5bbc542489)
1 /*
2  * Copyright (c) 2025, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef TPM2_H
8 #define TPM2_H
9 
10 #include <assert.h>
11 #include <endian.h>
12 #include <errno.h>
13 #include <stdint.h>
14 
15 #include <drivers/tpm/tpm2_chip.h>
16 
17 /* Return values */
18 enum tpm_ret_value {
19 	TPM_SUCCESS = 0,
20 	TPM_ERR_RESPONSE = -1,
21 	TPM_INVALID_PARAM = -2,
22 	TPM_ERR_TIMEOUT = -3,
23 	TPM_ERR_TRANSFER = -4,
24 };
25 
26 /*
27  * TPM FIFO register space address offsets
28  */
29 #define TPM_FIFO_REG_ACCESS		0x00
30 #define TPM_FIFO_REG_INTR_ENABLE	0x08
31 #define TPM_FIFO_REG_INTR_VECTOR	0x0C
32 #define TPM_FIFO_REG_INTR_STS		0x10
33 #define TPM_FIFO_REG_INTF_CAPS		0x14
34 #define TPM_FIFO_REG_STATUS		0x18
35 #define TPM_FIFO_REG_BURST_COUNT_LO	0x19
36 #define TPM_FIFO_REG_BURST_COUNT_HI	0x20
37 #define TPM_FIFO_REG_DATA_FIFO		0x24
38 #define TPM_FIFO_REG_VENDID		0xF00
39 #define TPM_FIFO_REG_DEVID		0xF02
40 #define TPM_FIFO_REG_REVID		0xF04
41 
42 #define TPM_ST_NO_SESSIONS		U(0x8001)
43 #define TPM_ST_SESSIONS			U(0x8002)
44 
45 #define TPM_SU_CLEAR			U(0x0000)
46 #define TPM_SU_STATE			U(0x0001)
47 
48 #define TPM_MIN_AUTH_SIZE		9
49 #define TPM_RS_PW			0x40000009
50 #define TPM_ZERO_NONCE_SIZE		0
51 #define TPM_ATTRIBUTES_DISABLE		0
52 #define TPM_ZERO_HMAC_SIZE		0
53 #define TPM_SINGLE_HASH_COUNT		1
54 
55 
56 #define TPM_CMD_STARTUP			U(0x0144)
57 #define TPM_CMD_PCR_READ		U(0x017E)
58 #define TPM_CMD_PCR_EXTEND		U(0x0182)
59 
60 #define TPM_RESPONSE_SUCCESS		U(0x0000)
61 
62 #define TPM_ACCESS_ACTIVE_LOCALITY	U(1 << 5)
63 #define TPM_ACCESS_VALID		U(1 << 7)
64 #define TPM_ACCESS_RELINQUISH_LOCALITY	U(1 << 5)
65 #define TPM_ACCESS_REQUEST_USE		U(1 << 1)
66 #define TPM_ACCESS_REQUEST_PENDING	U(1 << 2)
67 
68 #define TPM_STAT_VALID			U(1 << 7)
69 #define TPM_STAT_COMMAND_READY		U(1 << 6)
70 #define TPM_STAT_GO			U(1 << 5)
71 #define TPM_STAT_AVAIL			U(1 << 4)
72 #define TPM_STAT_EXPECT			U(1 << 3)
73 
74 #define TPM_READ_HEADER -1
75 
76 #define TPM_HEADER_SIZE			10
77 #define MAX_SIZE_CMDBUF			256
78 #define MAX_CMD_DATA			(MAX_SIZE_CMDBUF - TPM_HEADER_SIZE)
79 
80 #pragma pack(1)
81 typedef struct tpm_cmd_hdr {
82 	uint16_t tag;
83 	uint32_t cmd_size;
84 	uint32_t cmd_code;
85 } tpm_cmd_hdr;
86 
87 typedef struct tpm_cmd {
88 	tpm_cmd_hdr header;
89 	uint8_t data[MAX_CMD_DATA];
90 } tpm_cmd;
91 #pragma pack()
92 
93 int tpm_interface_init(struct tpm_chip_data *chip_data, uint8_t locality);
94 
95 int tpm_interface_close(struct tpm_chip_data *chip_data, uint8_t locality);
96 
97 int tpm_startup(struct tpm_chip_data *chip_data, uint16_t mode);
98 
99 int tpm_pcr_extend(struct tpm_chip_data *chip_data, uint32_t index,
100 		   uint16_t algorithm, const uint8_t *digest,
101 		   uint32_t digest_len);
102 
103 #endif /* TPM2_H */
104