xref: /aosp_15_r20/external/gsc-utils/include/tpm_registers.h (revision 4f2df630800bdcf1d4f0decf95d8a1cb87344f5f)
1*4f2df630SAndroid Build Coastguard Worker /* Copyright 2015 The ChromiumOS Authors
2*4f2df630SAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*4f2df630SAndroid Build Coastguard Worker  * found in the LICENSE file.
4*4f2df630SAndroid Build Coastguard Worker  */
5*4f2df630SAndroid Build Coastguard Worker 
6*4f2df630SAndroid Build Coastguard Worker /*
7*4f2df630SAndroid Build Coastguard Worker  * This defines the interface functions for TPM SPI Hardware Protocol. The SPI
8*4f2df630SAndroid Build Coastguard Worker  * controller reads or writes between 1 and 64 bytes to a register designated by
9*4f2df630SAndroid Build Coastguard Worker  * a 24-bit address. There is no provision for error reporting at this level.
10*4f2df630SAndroid Build Coastguard Worker  */
11*4f2df630SAndroid Build Coastguard Worker 
12*4f2df630SAndroid Build Coastguard Worker #ifndef __CROS_EC_TPM_REGISTERS_H
13*4f2df630SAndroid Build Coastguard Worker #define __CROS_EC_TPM_REGISTERS_H
14*4f2df630SAndroid Build Coastguard Worker 
15*4f2df630SAndroid Build Coastguard Worker #include <stdint.h>
16*4f2df630SAndroid Build Coastguard Worker 
17*4f2df630SAndroid Build Coastguard Worker #include "common.h"
18*4f2df630SAndroid Build Coastguard Worker 
19*4f2df630SAndroid Build Coastguard Worker /* The SPI controller is writing data into a TPM register. */
20*4f2df630SAndroid Build Coastguard Worker void tpm_register_put(uint32_t regaddr, const uint8_t *data,
21*4f2df630SAndroid Build Coastguard Worker 		      uint32_t data_size);
22*4f2df630SAndroid Build Coastguard Worker 
23*4f2df630SAndroid Build Coastguard Worker /* The SPI controller is reading data from a TPM register. */
24*4f2df630SAndroid Build Coastguard Worker void tpm_register_get(uint32_t regaddr, uint8_t *dest, uint32_t data_size);
25*4f2df630SAndroid Build Coastguard Worker 
26*4f2df630SAndroid Build Coastguard Worker /* Get the current value of the burst size field of the status register. */
27*4f2df630SAndroid Build Coastguard Worker size_t tpm_get_burst_size(void);
28*4f2df630SAndroid Build Coastguard Worker 
29*4f2df630SAndroid Build Coastguard Worker /*
30*4f2df630SAndroid Build Coastguard Worker  * Register functions to start and stop TPM communications layer. The
31*4f2df630SAndroid Build Coastguard Worker  * communications layer should be kept down while TPM is being reset.
32*4f2df630SAndroid Build Coastguard Worker  */
33*4f2df630SAndroid Build Coastguard Worker typedef void (*interface_control_func)(void);
34*4f2df630SAndroid Build Coastguard Worker void tpm_register_interface(interface_control_func interface_start,
35*4f2df630SAndroid Build Coastguard Worker 			    interface_control_func interface_stop);
36*4f2df630SAndroid Build Coastguard Worker 
37*4f2df630SAndroid Build Coastguard Worker /*
38*4f2df630SAndroid Build Coastguard Worker  * This requests the TPM task to reset itself.
39*4f2df630SAndroid Build Coastguard Worker  *
40*4f2df630SAndroid Build Coastguard Worker  * If wait_until_done is false, it returns EC_SUCCESS immediately. Otherwise it
41*4f2df630SAndroid Build Coastguard Worker  * returns EC_SUCCESS after the reset has completed, or an error code on
42*4f2df630SAndroid Build Coastguard Worker  * failure.
43*4f2df630SAndroid Build Coastguard Worker  *
44*4f2df630SAndroid Build Coastguard Worker  * If wipe_nvmem_first is true, the caller is expected to keep the rest of the
45*4f2df630SAndroid Build Coastguard Worker  * system in reset until TPM wipeout is completed.
46*4f2df630SAndroid Build Coastguard Worker  */
47*4f2df630SAndroid Build Coastguard Worker int tpm_reset_request(int wait_until_done, int wipe_nvmem_first);
48*4f2df630SAndroid Build Coastguard Worker 
49*4f2df630SAndroid Build Coastguard Worker /* Returns True if successive TPM_RST_L pulses are being debounced. */
50*4f2df630SAndroid Build Coastguard Worker int tpm_reset_in_progress(void);
51*4f2df630SAndroid Build Coastguard Worker 
52*4f2df630SAndroid Build Coastguard Worker /*
53*4f2df630SAndroid Build Coastguard Worker  * Tell the TPM task to re-enable nvmem commits.
54*4f2df630SAndroid Build Coastguard Worker  *
55*4f2df630SAndroid Build Coastguard Worker  * NOTE: This function is NOT to be used freely, but only meant to be used in
56*4f2df630SAndroid Build Coastguard Worker  * exceptional cases such as unlocking the console following a TPM wipe.
57*4f2df630SAndroid Build Coastguard Worker  */
58*4f2df630SAndroid Build Coastguard Worker void tpm_reinstate_nvmem_commits(void);
59*4f2df630SAndroid Build Coastguard Worker 
60*4f2df630SAndroid Build Coastguard Worker /*
61*4f2df630SAndroid Build Coastguard Worker  * To be called by functions running on the TPM task context. Returns
62*4f2df630SAndroid Build Coastguard Worker  * EC_SUCCESS on successful reset.
63*4f2df630SAndroid Build Coastguard Worker  */
64*4f2df630SAndroid Build Coastguard Worker int tpm_sync_reset(int wipe_first);
65*4f2df630SAndroid Build Coastguard Worker 
66*4f2df630SAndroid Build Coastguard Worker /*
67*4f2df630SAndroid Build Coastguard Worker  * It shuts down the tpm interface, until next tpm reset event.
68*4f2df630SAndroid Build Coastguard Worker  */
69*4f2df630SAndroid Build Coastguard Worker void tpm_stop(void);
70*4f2df630SAndroid Build Coastguard Worker 
71*4f2df630SAndroid Build Coastguard Worker /*
72*4f2df630SAndroid Build Coastguard Worker  * This structure describes the header of all commands and responses sent and
73*4f2df630SAndroid Build Coastguard Worker  * received over TPM FIFO.
74*4f2df630SAndroid Build Coastguard Worker  *
75*4f2df630SAndroid Build Coastguard Worker  * Note that all fields are stored in the network (big endian) byte order.
76*4f2df630SAndroid Build Coastguard Worker  */
77*4f2df630SAndroid Build Coastguard Worker 
78*4f2df630SAndroid Build Coastguard Worker struct tpm_cmd_header {
79*4f2df630SAndroid Build Coastguard Worker 	uint16_t tag;
80*4f2df630SAndroid Build Coastguard Worker 	uint32_t size;
81*4f2df630SAndroid Build Coastguard Worker 	uint32_t command_code;
82*4f2df630SAndroid Build Coastguard Worker 	uint16_t subcommand_code; /* Not a standard field. */
83*4f2df630SAndroid Build Coastguard Worker } __packed;
84*4f2df630SAndroid Build Coastguard Worker 
85*4f2df630SAndroid Build Coastguard Worker /*
86*4f2df630SAndroid Build Coastguard Worker  * This function allows to process a TPM command coming from elsewhere, not
87*4f2df630SAndroid Build Coastguard Worker  * from the communications interface.
88*4f2df630SAndroid Build Coastguard Worker  *
89*4f2df630SAndroid Build Coastguard Worker  * A common use case would be making cryptographic calculation on task
90*4f2df630SAndroid Build Coastguard Worker  * contexts where stack the size is not large enough, for instance console
91*4f2df630SAndroid Build Coastguard Worker  * commands. This function will block to let the TPM task a chance to run to
92*4f2df630SAndroid Build Coastguard Worker  * execute the command and return the result in the same buffer.
93*4f2df630SAndroid Build Coastguard Worker  *
94*4f2df630SAndroid Build Coastguard Worker  * @param tpmh pointer to a buffer containing a marshalled TPM command, if it
95*4f2df630SAndroid Build Coastguard Worker  *             arrived over the communications channel. One of the header
96*4f2df630SAndroid Build Coastguard Worker  *             fields defines the command size.
97*4f2df630SAndroid Build Coastguard Worker  *
98*4f2df630SAndroid Build Coastguard Worker  * @param buffer_size the size of the buffer pointed to by tpmh - tells the
99*4f2df630SAndroid Build Coastguard Worker  *             TPM task how much room there is to store the response.
100*4f2df630SAndroid Build Coastguard Worker  *
101*4f2df630SAndroid Build Coastguard Worker  * Command execution result is reported in the response body.
102*4f2df630SAndroid Build Coastguard Worker  *
103*4f2df630SAndroid Build Coastguard Worker  * The extension command handler will consider all these commands to come from
104*4f2df630SAndroid Build Coastguard Worker  * the USB interface, since the only current users for this are console
105*4f2df630SAndroid Build Coastguard Worker  * commands.
106*4f2df630SAndroid Build Coastguard Worker  */
107*4f2df630SAndroid Build Coastguard Worker void tpm_alt_extension(struct tpm_cmd_header *tpmh, size_t buffer_size);
108*4f2df630SAndroid Build Coastguard Worker 
109*4f2df630SAndroid Build Coastguard Worker /*
110*4f2df630SAndroid Build Coastguard Worker  * The only TPM2 commands we care about on the driver level, see
111*4f2df630SAndroid Build Coastguard Worker  * crosbug.com/p/55667 for detals.
112*4f2df630SAndroid Build Coastguard Worker  */
113*4f2df630SAndroid Build Coastguard Worker #define TPM2_PCR_Extend 0x00000182
114*4f2df630SAndroid Build Coastguard Worker #define TPM2_PCR_Read	0x0000017e
115*4f2df630SAndroid Build Coastguard Worker #define TPM2_Startup	0x00000144
116*4f2df630SAndroid Build Coastguard Worker 
117*4f2df630SAndroid Build Coastguard Worker /* TPM mode */
118*4f2df630SAndroid Build Coastguard Worker enum tpm_modes {
119*4f2df630SAndroid Build Coastguard Worker 	TPM_MODE_ENABLED_TENTATIVE = 0,
120*4f2df630SAndroid Build Coastguard Worker 	TPM_MODE_ENABLED = 1,
121*4f2df630SAndroid Build Coastguard Worker 	TPM_MODE_DISABLED = 2,
122*4f2df630SAndroid Build Coastguard Worker 	TPM_MODE_MAX,
123*4f2df630SAndroid Build Coastguard Worker };
124*4f2df630SAndroid Build Coastguard Worker 
125*4f2df630SAndroid Build Coastguard Worker /*
126*4f2df630SAndroid Build Coastguard Worker  * This function returns the current TPM_MODE value.
127*4f2df630SAndroid Build Coastguard Worker  */
128*4f2df630SAndroid Build Coastguard Worker enum tpm_modes get_tpm_mode(void);
129*4f2df630SAndroid Build Coastguard Worker 
130*4f2df630SAndroid Build Coastguard Worker #endif /* __CROS_EC_TPM_REGISTERS_H */
131