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