xref: /openbmc/qemu/hw/tpm/tpm_tis.h (revision b55e4b9c0525560577384adfc6d30eb0daa8d7be)
1ac90053dSEric Auger /*
2ac90053dSEric Auger  * tpm_tis.h - QEMU's TPM TIS common header
3ac90053dSEric Auger  *
4ac90053dSEric Auger  * Copyright (C) 2006,2010-2013 IBM Corporation
5ac90053dSEric Auger  *
6ac90053dSEric Auger  * Authors:
7ac90053dSEric Auger  *  Stefan Berger <stefanb@us.ibm.com>
8ac90053dSEric Auger  *  David Safford <safford@us.ibm.com>
9ac90053dSEric Auger  *
10ac90053dSEric Auger  * Xen 4 support: Andrease Niederl <andreas.niederl@iaik.tugraz.at>
11ac90053dSEric Auger  *
12ac90053dSEric Auger  * This work is licensed under the terms of the GNU GPL, version 2 or later.
13ac90053dSEric Auger  * See the COPYING file in the top-level directory.
14ac90053dSEric Auger  *
15ac90053dSEric Auger  * Implementation of the TIS interface according to specs found at
16ac90053dSEric Auger  * http://www.trustedcomputinggroup.org. This implementation currently
17ac90053dSEric Auger  * supports version 1.3, 21 March 2013
18ac90053dSEric Auger  * In the developers menu choose the PC Client section then find the TIS
19ac90053dSEric Auger  * specification.
20ac90053dSEric Auger  *
21ac90053dSEric Auger  * TPM TIS for TPM 2 implementation following TCG PC Client Platform
22*6eedbb5bSMichael Tokarev  * TPM Profile (PTP) Specification, Family 2.0, Revision 00.43
23ac90053dSEric Auger  */
24ac90053dSEric Auger #ifndef TPM_TPM_TIS_H
25ac90053dSEric Auger #define TPM_TPM_TIS_H
26ac90053dSEric Auger 
27ac90053dSEric Auger #include "sysemu/tpm_backend.h"
28ac90053dSEric Auger #include "tpm_ppi.h"
29ac90053dSEric Auger 
30ac90053dSEric Auger #define TPM_TIS_NUM_LOCALITIES      5     /* per spec */
31ac90053dSEric Auger #define TPM_TIS_LOCALITY_SHIFT      12
32ac90053dSEric Auger #define TPM_TIS_NO_LOCALITY         0xff
33ac90053dSEric Auger 
34ac90053dSEric Auger #define TPM_TIS_IS_VALID_LOCTY(x)   ((x) < TPM_TIS_NUM_LOCALITIES)
35ac90053dSEric Auger 
36ac90053dSEric Auger #define TPM_TIS_BUFFER_MAX          4096
37ac90053dSEric Auger 
38ac90053dSEric Auger typedef enum {
39ac90053dSEric Auger     TPM_TIS_STATE_IDLE = 0,
40ac90053dSEric Auger     TPM_TIS_STATE_READY,
41ac90053dSEric Auger     TPM_TIS_STATE_COMPLETION,
42ac90053dSEric Auger     TPM_TIS_STATE_EXECUTION,
43ac90053dSEric Auger     TPM_TIS_STATE_RECEPTION,
44ac90053dSEric Auger } TPMTISState;
45ac90053dSEric Auger 
46ac90053dSEric Auger /* locality data  -- all fields are persisted */
47ac90053dSEric Auger typedef struct TPMLocality {
48ac90053dSEric Auger     TPMTISState state;
49ac90053dSEric Auger     uint8_t access;
50ac90053dSEric Auger     uint32_t sts;
51ac90053dSEric Auger     uint32_t iface_id;
52ac90053dSEric Auger     uint32_t inte;
53ac90053dSEric Auger     uint32_t ints;
54ac90053dSEric Auger } TPMLocality;
55ac90053dSEric Auger 
56ac90053dSEric Auger typedef struct TPMState {
57ac90053dSEric Auger     MemoryRegion mmio;
58ac90053dSEric Auger 
59ac90053dSEric Auger     unsigned char buffer[TPM_TIS_BUFFER_MAX];
60ac90053dSEric Auger     uint16_t rw_offset;
61ac90053dSEric Auger 
62ac90053dSEric Auger     uint8_t active_locty;
63ac90053dSEric Auger     uint8_t aborting_locty;
64ac90053dSEric Auger     uint8_t next_locty;
65ac90053dSEric Auger 
66ac90053dSEric Auger     TPMLocality loc[TPM_TIS_NUM_LOCALITIES];
67ac90053dSEric Auger 
68ac90053dSEric Auger     qemu_irq irq;
69ac90053dSEric Auger     uint32_t irq_num;
70ac90053dSEric Auger 
71ac90053dSEric Auger     TPMBackendCmd cmd;
72ac90053dSEric Auger 
73ac90053dSEric Auger     TPMBackend *be_driver;
74ac90053dSEric Auger     TPMVersion be_tpm_version;
75ac90053dSEric Auger 
76ac90053dSEric Auger     size_t be_buffer_size;
77ac90053dSEric Auger 
78ac90053dSEric Auger     bool ppi_enabled;
79ac90053dSEric Auger     TPMPPI ppi;
80ac90053dSEric Auger } TPMState;
81ac90053dSEric Auger 
82ac90053dSEric Auger extern const VMStateDescription vmstate_locty;
83ac90053dSEric Auger extern const MemoryRegionOps tpm_tis_memory_ops;
84ac90053dSEric Auger 
85ac90053dSEric Auger int tpm_tis_pre_save(TPMState *s);
86ac90053dSEric Auger void tpm_tis_reset(TPMState *s);
87ac90053dSEric Auger enum TPMVersion tpm_tis_get_tpm_version(TPMState *s);
88ac90053dSEric Auger void tpm_tis_request_completed(TPMState *s, int ret);
89bbadfb2eSNinad Palsule uint32_t tpm_tis_read_data(TPMState *s, hwaddr addr, unsigned size);
90bbadfb2eSNinad Palsule void tpm_tis_write_data(TPMState *s, hwaddr addr, uint64_t val, uint32_t size);
91bbadfb2eSNinad Palsule uint16_t tpm_tis_get_checksum(TPMState *s);
92ac90053dSEric Auger 
93ac90053dSEric Auger #endif /* TPM_TPM_TIS_H */
94