summaryrefslogtreecommitdiffstats
path: root/src/drivers/tpm/tpm_ppi.h
blob: 4d468ba84dcbb2a8d2bdca9ded78364b15f505e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/* SPDX-License-Identifier: GPL-2.0-only */

#ifndef _TPM_PPI_H_
#define _TPM_PPI_H_

#include <device/device.h>
#include <boot/coreboot_tables.h>

#if CONFIG(HAVE_ACPI_TABLES)
void tpm_ppi_acpi_fill_ssdt(const struct device *dev);
#else
static inline void tpm_ppi_acpi_fill_ssdt(const struct device *dev)
{
}
#endif

/* Return codes */
/* Function 2 */
#define PPI2_RET_SUCCESS 0
#define PPI2_RET_NOT_SUPPORTED 1
#define PPI2_RET_GENERAL_FAILURE 2

/* Function 3 */
#define PPI3_RET_SUCCESS 0
#define PPI3_RET_GENERAL_FAILURE 1

/* Function 4 */
#define PPI4_RET_NONE 0
#define PPI4_RET_SHUTDOWN 1
#define PPI4_RET_REBOOT 2
#define PPI4_RET_OS_VENDOR_SPECIFIC 3

/* Function 5 */
#define PPI5_RET_SUCCESS 0
#define PPI5_RET_GENERAL_FAILURE 1

/* Function 6 */
#define PPI6_RET_NOT_IMPLEMENTED 3

/* Function 7 */
#define PPI7_RET_SUCCESS 0
#define PPI7_RET_NOT_IMPLEMENTED 1
#define PPI7_RET_GENERAL_FAILURE 2
#define PPI7_RET_BLOCKED_BY_FIRMWARE 3

/* Function 8 */
#define PPI8_RET_NOT_IMPLEMENTED 0
#define PPI8_RET_FIRMWARE_ONLY 1
#define PPI8_RET_BLOCKED_FOR_OS_BY_FW 2
#define PPI8_RET_ALLOWED_WITH_PP 3
#define PPI8_RET_ALLOWED 4

/* TCG Physical Presence Interface */
#define TPM_PPI_UUID   "3dddfaa6-361b-4eb4-a424-8d10089d1653"
/* TCG Memory Clear Interface */
#define TPM_MCI_UUID   "376054ed-cc13-4675-901c-4756d7f2d45d"

/*
 * Physical Presence Interface Specification Version 1.30 Revision 00.52
 * Table 1 Physical Presence Interface Operation Summary for TPM 1.2
 */
#define TPM_NOOP 0
#define TPM_ENABLE 1
#define TPM_DISABLE 2
#define TPM_ACTIVATE 3
#define TPM_DEACTIVATE 4
#define TPM_CLEAR 5
#define TPM_ENABLE_ACTIVATE 6
#define TPM_DEACTIVATE_DISABLE 7
#define TPM_SETOWNERINSTALL_TRUE 8
#define TPM_SETOWNERINSTALL_FALSE 9
#define TPM_ENABLE_ACTIVATE_SETOWNERINSTALL_TRUE 10
#define TPM_SETOWNERINSTALL_FALSE_DEACTIVATE_DISABLE 11
#define TPM_CLEAR_ENABLE_ACTIVATE 14
#define TPM_SET_NOPPIPROVISION_FALSE 15
#define TPM_SET_NOPPIPROVISION_TRUE 16
#define TPM_SET_NOPPICLEAR_FALSE 17
#define TPM_SET_NOPPICLEAR_TRUE 18
#define TPM_SET_NOPPIMAINTAINANCE_FALSE 19
#define TPM_SET_NOPPIMAINTAINANCE_TRUE 20
#define TPM_ENABLE_ACTIVE_CLEAR 21
#define TPM_ENABLE_ACTIVE_CLEAR_ENABLE_ACTIVE 22

/*
 * Physical Presence Interface Specification Version 1.30 Revision 00.52
 * Table 2 Physical Presence Interface Operation Summary for TPM 2.0
 */
#define TPM2_NOOP 0
#define TPM2_ENABLE 1
#define TPM2_DISABLE 2
#define TPM2_CLEAR 5
#define TPM2_CLEAR_ENABLE_ACTIVE 14
#define TPM2_SET_PP_REQUIRED_FOR_CLEAR_TRUE 17
#define TPM2_SET_PP_REQUIRED_FOR_CLEAR_FALSE 18
#define TPM2_ENABLE_CLEAR 21
#define TPM2_ENABLE_CLEAR2 22
#define TPM2_SET_PCR_BANKS 23
#define TPM2_CHANGE_EPS 24
#define TPM2_SET_PP_REQUIRED_FOR_CHANGE_PCRS_FALSE 25
#define TPM2_SET_PP_REQUIRED_FOR_CHANGE_PCRS_TRUE 26
#define TPM2_SET_PP_REQUIRED_FOR_TURN_ON_FALSE 27
#define TPM2_SET_PP_REQUIRED_FOR_TURN_ON_TRUE 28
#define TPM2_SET_PP_REQUIRED_FOR_TURN_OFF_FALSE 29
#define TPM2_SET_PP_REQUIRED_FOR_TURN_OFF_TRUE 30
#define TPM2_SET_PP_REQUIRED_FOR_CHANGE_EPS_FALSE 31
#define TPM2_SET_PP_REQUIRED_FOR_CHANGE_EPS_TRUE 32
#define TPM2_LOG_ALL_DIGEST 33
#define TPM2_DISABLE_ENDORSMENT_ENABLE_STORAGE_HISTORY 34
#define TPM2_ENABLE_BLOCK_SID 96
#define TPM2_DISABLE_BLOCK_SID 97
#define TPM2_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_TRUE 98
#define TPM2_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FALSE 99
#define TPM2_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_TRUE 100
#define TPM2_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FALSE 101

#define VENDOR_SPECIFIC_OFFSET 0x80

 /*
  * The layout of the buffer matches the QEMU virtual memory device that is generated
  * by QEMU. See files 'hw/i386/acpi-build.c' and 'include/hw/acpi/tpm.h' for details.
  */
struct cb_tpm_ppi_payload_handshake {
	uint8_t func[256];	/* Firmware sets values for each supported operation.
				 * See defined values below. */
	uint8_t ppin;		/* SMI interrupt to use. Set by firmware.
				 * Not supported. */
	uint32_t ppip;		/* ACPI function index to pass to SMM code.
				 * Set by ACPI. Not supported. */
	uint32_t pprp;		/* Result of last executed operation.
				 * Set by firmware. See function index 5 for values. */
	uint32_t pprq;		/* Operation request number to execute.
				 * See 'Physical Presence Interface Operation Summary'
				 * tables in specs. Set by ACPI. */
	uint32_t pprm;		/* Operation request optional parameter.
				 * Values depend on operation. Set by ACPI. */
	uint32_t lppr;		/* Last executed operation request number.
				 * Copied from pprq field by firmware. */
	uint32_t fret;		/* Result code from SMM function. Not supported. */
	uint8_t res1[0x040];	/* Reserved */
	uint8_t next_step;	/* Operation to execute after reboot by firmware.
				 * Used by firmware. */
} __packed;

void lb_tpm_ppi(struct lb_header *header);

#endif /* _TPM_PPI_H_ */