xref: /openbmc/qemu/include/sysemu/tpm_backend.h (revision a1a62ced)
1dccfcd0eSPaolo Bonzini /*
2dccfcd0eSPaolo Bonzini  * QEMU TPM Backend
3dccfcd0eSPaolo Bonzini  *
4dccfcd0eSPaolo Bonzini  * Copyright IBM, Corp. 2013
5dccfcd0eSPaolo Bonzini  *
6dccfcd0eSPaolo Bonzini  * Authors:
7dccfcd0eSPaolo Bonzini  *  Stefan Berger  <stefanb@us.ibm.com>
8dccfcd0eSPaolo Bonzini  *
9dccfcd0eSPaolo Bonzini  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10dccfcd0eSPaolo Bonzini  * See the COPYING file in the top-level directory.
11dccfcd0eSPaolo Bonzini  */
12dccfcd0eSPaolo Bonzini 
13121d0712SMarkus Armbruster #ifndef TPM_BACKEND_H
14121d0712SMarkus Armbruster #define TPM_BACKEND_H
15dccfcd0eSPaolo Bonzini 
16dccfcd0eSPaolo Bonzini #include "qom/object.h"
17dccfcd0eSPaolo Bonzini #include "qemu/option.h"
18dccfcd0eSPaolo Bonzini #include "sysemu/tpm.h"
196a8a2354SMarc-André Lureau #include "qapi/error.h"
20dccfcd0eSPaolo Bonzini 
21e542b718SStefan Berger #ifdef CONFIG_TPM
22e542b718SStefan Berger 
23dccfcd0eSPaolo Bonzini #define TYPE_TPM_BACKEND "tpm-backend"
24c821774aSEduardo Habkost OBJECT_DECLARE_TYPE(TPMBackend, TPMBackendClass,
2530b5707cSEduardo Habkost                     TPM_BACKEND)
26dccfcd0eSPaolo Bonzini 
27d31076baSMarc-André Lureau 
280e43b7e6SMarc-André Lureau typedef struct TPMBackendCmd {
290e43b7e6SMarc-André Lureau     uint8_t locty;
300e43b7e6SMarc-André Lureau     const uint8_t *in;
310e43b7e6SMarc-André Lureau     uint32_t in_len;
320e43b7e6SMarc-André Lureau     uint8_t *out;
330e43b7e6SMarc-André Lureau     uint32_t out_len;
340e43b7e6SMarc-André Lureau     bool selftest_done;
350e43b7e6SMarc-André Lureau } TPMBackendCmd;
36dccfcd0eSPaolo Bonzini 
37dccfcd0eSPaolo Bonzini struct TPMBackend {
38dccfcd0eSPaolo Bonzini     Object parent;
39dccfcd0eSPaolo Bonzini 
40dccfcd0eSPaolo Bonzini     /*< protected >*/
418a89c9acSMarc-André Lureau     TPMIf *tpmif;
42dccfcd0eSPaolo Bonzini     bool opened;
4393330cf5SAmarnath Valluri     bool had_startup_error;
44c4fb8561SMarc-André Lureau     TPMBackendCmd *cmd;
45dccfcd0eSPaolo Bonzini 
46f59864baSAmarnath Valluri     /* <public> */
47dccfcd0eSPaolo Bonzini     char *id;
48dccfcd0eSPaolo Bonzini 
49dccfcd0eSPaolo Bonzini     QLIST_ENTRY(TPMBackend) list;
50dccfcd0eSPaolo Bonzini };
51dccfcd0eSPaolo Bonzini 
52b19a5eeaSAmarnath Valluri struct TPMBackendClass {
53b19a5eeaSAmarnath Valluri     ObjectClass parent_class;
54b19a5eeaSAmarnath Valluri 
55dccfcd0eSPaolo Bonzini     enum TpmType type;
56bb716238SStefan Berger     const QemuOptDesc *opts;
57dccfcd0eSPaolo Bonzini     /* get a descriptive text of the backend to display to the user */
5893330cf5SAmarnath Valluri     const char *desc;
59dccfcd0eSPaolo Bonzini 
609f7c0ef2SMarc-André Lureau     TPMBackend *(*create)(QemuOpts *opts);
61dccfcd0eSPaolo Bonzini 
62ebca2df7SMarc-André Lureau     /* start up the TPM on the backend - optional */
639375c44fSStefan Berger     int (*startup_tpm)(TPMBackend *t, size_t buffersize);
64dccfcd0eSPaolo Bonzini 
65ebca2df7SMarc-André Lureau     /* optional */
66dccfcd0eSPaolo Bonzini     void (*reset)(TPMBackend *t);
67dccfcd0eSPaolo Bonzini 
68dccfcd0eSPaolo Bonzini     void (*cancel_cmd)(TPMBackend *t);
69dccfcd0eSPaolo Bonzini 
70ebca2df7SMarc-André Lureau     /* optional */
71dccfcd0eSPaolo Bonzini     bool (*get_tpm_established_flag)(TPMBackend *t);
72116694c3SStefan Berger 
73ebca2df7SMarc-André Lureau     /* optional */
74116694c3SStefan Berger     int (*reset_tpm_established_flag)(TPMBackend *t, uint8_t locty);
75116694c3SStefan Berger 
76116694c3SStefan Berger     TPMVersion (*get_tpm_version)(TPMBackend *t);
77f59864baSAmarnath Valluri 
78b21e6aafSStefan Berger     size_t (*get_buffer_size)(TPMBackend *t);
79b21e6aafSStefan Berger 
80f59864baSAmarnath Valluri     TpmTypeOptions *(*get_tpm_options)(TPMBackend *t);
81dccfcd0eSPaolo Bonzini 
826a8a2354SMarc-André Lureau     void (*handle_request)(TPMBackend *s, TPMBackendCmd *cmd, Error **errp);
83d31076baSMarc-André Lureau };
84dccfcd0eSPaolo Bonzini 
85dccfcd0eSPaolo Bonzini /**
86dccfcd0eSPaolo Bonzini  * tpm_backend_get_type:
87dccfcd0eSPaolo Bonzini  * @s: the backend
88dccfcd0eSPaolo Bonzini  *
89dccfcd0eSPaolo Bonzini  * Returns the TpmType of the backend.
90dccfcd0eSPaolo Bonzini  */
91dccfcd0eSPaolo Bonzini enum TpmType tpm_backend_get_type(TPMBackend *s);
92dccfcd0eSPaolo Bonzini 
93dccfcd0eSPaolo Bonzini /**
94dccfcd0eSPaolo Bonzini  * tpm_backend_init:
95dccfcd0eSPaolo Bonzini  * @s: the backend to initialized
968a89c9acSMarc-André Lureau  * @tpmif: TPM interface
97dccfcd0eSPaolo Bonzini  * @datacb: callback for sending data to frontend
980bd6c8a9SMarc-André Lureau  * @errp: a pointer to return the #Error object if an error occurs.
99dccfcd0eSPaolo Bonzini  *
100dccfcd0eSPaolo Bonzini  * Initialize the backend with the given variables.
101dccfcd0eSPaolo Bonzini  *
102dccfcd0eSPaolo Bonzini  * Returns 0 on success.
103dccfcd0eSPaolo Bonzini  */
1040bd6c8a9SMarc-André Lureau int tpm_backend_init(TPMBackend *s, TPMIf *tpmif, Error **errp);
105dccfcd0eSPaolo Bonzini 
106dccfcd0eSPaolo Bonzini /**
107dccfcd0eSPaolo Bonzini  * tpm_backend_startup_tpm:
108dccfcd0eSPaolo Bonzini  * @s: the backend whose TPM support is to be started
1099375c44fSStefan Berger  * @buffersize: the buffer size the TPM is supposed to use,
1109375c44fSStefan Berger  *              0 to leave it as-is
111dccfcd0eSPaolo Bonzini  *
112dccfcd0eSPaolo Bonzini  * Returns 0 on success.
113dccfcd0eSPaolo Bonzini  */
1149375c44fSStefan Berger int tpm_backend_startup_tpm(TPMBackend *s, size_t buffersize);
115dccfcd0eSPaolo Bonzini 
116dccfcd0eSPaolo Bonzini /**
117dccfcd0eSPaolo Bonzini  * tpm_backend_had_startup_error:
118*a1a62cedSMichael Tokarev  * @s: the backend to query for a startup error
119dccfcd0eSPaolo Bonzini  *
120dccfcd0eSPaolo Bonzini  * Check whether the backend had an error during startup. Returns
121dccfcd0eSPaolo Bonzini  * false if no error occurred and the backend can be used, true
122dccfcd0eSPaolo Bonzini  * otherwise.
123dccfcd0eSPaolo Bonzini  */
124dccfcd0eSPaolo Bonzini bool tpm_backend_had_startup_error(TPMBackend *s);
125dccfcd0eSPaolo Bonzini 
126dccfcd0eSPaolo Bonzini /**
127dccfcd0eSPaolo Bonzini  * tpm_backend_deliver_request:
128dccfcd0eSPaolo Bonzini  * @s: the backend to send the request to
1290e43b7e6SMarc-André Lureau  * @cmd: the command to deliver
130dccfcd0eSPaolo Bonzini  *
131dccfcd0eSPaolo Bonzini  * Send a request to the backend. The backend will then send the request
132dccfcd0eSPaolo Bonzini  * to the TPM implementation.
133dccfcd0eSPaolo Bonzini  */
1340e43b7e6SMarc-André Lureau void tpm_backend_deliver_request(TPMBackend *s, TPMBackendCmd *cmd);
135dccfcd0eSPaolo Bonzini 
136dccfcd0eSPaolo Bonzini /**
137dccfcd0eSPaolo Bonzini  * tpm_backend_reset:
138dccfcd0eSPaolo Bonzini  * @s: the backend to reset
139dccfcd0eSPaolo Bonzini  *
140dccfcd0eSPaolo Bonzini  * Reset the backend into a well defined state with all previous errors
141dccfcd0eSPaolo Bonzini  * reset.
142dccfcd0eSPaolo Bonzini  */
143dccfcd0eSPaolo Bonzini void tpm_backend_reset(TPMBackend *s);
144dccfcd0eSPaolo Bonzini 
145dccfcd0eSPaolo Bonzini /**
146dccfcd0eSPaolo Bonzini  * tpm_backend_cancel_cmd:
147dccfcd0eSPaolo Bonzini  * @s: the backend
148dccfcd0eSPaolo Bonzini  *
149dccfcd0eSPaolo Bonzini  * Cancel any ongoing command being processed by the TPM implementation
150dccfcd0eSPaolo Bonzini  * on behalf of the QEMU guest.
151dccfcd0eSPaolo Bonzini  */
152dccfcd0eSPaolo Bonzini void tpm_backend_cancel_cmd(TPMBackend *s);
153dccfcd0eSPaolo Bonzini 
154dccfcd0eSPaolo Bonzini /**
155dccfcd0eSPaolo Bonzini  * tpm_backend_get_tpm_established_flag:
156dccfcd0eSPaolo Bonzini  * @s: the backend
157dccfcd0eSPaolo Bonzini  *
158dccfcd0eSPaolo Bonzini  * Get the TPM establishment flag. This function may be called very
159dccfcd0eSPaolo Bonzini  * frequently by the frontend since for example in the TIS implementation
160dccfcd0eSPaolo Bonzini  * this flag is part of a register.
161dccfcd0eSPaolo Bonzini  */
162dccfcd0eSPaolo Bonzini bool tpm_backend_get_tpm_established_flag(TPMBackend *s);
163dccfcd0eSPaolo Bonzini 
164dccfcd0eSPaolo Bonzini /**
165116694c3SStefan Berger  * tpm_backend_reset_tpm_established_flag:
166116694c3SStefan Berger  * @s: the backend
167116694c3SStefan Berger  * @locty: the locality number
168116694c3SStefan Berger  *
169116694c3SStefan Berger  * Reset the TPM establishment flag.
170116694c3SStefan Berger  */
171116694c3SStefan Berger int tpm_backend_reset_tpm_established_flag(TPMBackend *s, uint8_t locty);
172116694c3SStefan Berger 
173116694c3SStefan Berger /**
174116694c3SStefan Berger  * tpm_backend_get_tpm_version:
175116694c3SStefan Berger  * @s: the backend to call into
176116694c3SStefan Berger  *
177116694c3SStefan Berger  * Get the TPM Version that is emulated at the backend.
178116694c3SStefan Berger  *
179116694c3SStefan Berger  * Returns TPMVersion.
180116694c3SStefan Berger  */
181116694c3SStefan Berger TPMVersion tpm_backend_get_tpm_version(TPMBackend *s);
182116694c3SStefan Berger 
183f59864baSAmarnath Valluri /**
184b21e6aafSStefan Berger  * tpm_backend_get_buffer_size:
185b21e6aafSStefan Berger  * @s: the backend to call into
186b21e6aafSStefan Berger  *
187b21e6aafSStefan Berger  * Get the TPM's buffer size.
188b21e6aafSStefan Berger  *
189b21e6aafSStefan Berger  * Returns buffer size.
190b21e6aafSStefan Berger  */
191b21e6aafSStefan Berger size_t tpm_backend_get_buffer_size(TPMBackend *s);
192b21e6aafSStefan Berger 
193b21e6aafSStefan Berger /**
194c4fb8561SMarc-André Lureau  * tpm_backend_finish_sync:
195c4fb8561SMarc-André Lureau  * @s: the backend to call into
196c4fb8561SMarc-André Lureau  *
197c4fb8561SMarc-André Lureau  * Finish the pending command synchronously (this will call aio_poll()
198c4fb8561SMarc-André Lureau  * on qemu main AIOContext until it ends)
199c4fb8561SMarc-André Lureau  */
200c4fb8561SMarc-André Lureau void tpm_backend_finish_sync(TPMBackend *s);
201c4fb8561SMarc-André Lureau 
202c4fb8561SMarc-André Lureau /**
203f59864baSAmarnath Valluri  * tpm_backend_query_tpm:
204f59864baSAmarnath Valluri  * @s: the backend
205f59864baSAmarnath Valluri  *
206f59864baSAmarnath Valluri  * Query backend tpm info
207f59864baSAmarnath Valluri  *
208f59864baSAmarnath Valluri  * Returns newly allocated TPMInfo
209f59864baSAmarnath Valluri  */
210f59864baSAmarnath Valluri TPMInfo *tpm_backend_query_tpm(TPMBackend *s);
211f59864baSAmarnath Valluri 
212d36e7db1SMarc-André Lureau TPMBackend *qemu_find_tpm_be(const char *id);
213dccfcd0eSPaolo Bonzini 
214e542b718SStefan Berger #endif /* CONFIG_TPM */
215e542b718SStefan Berger 
216e542b718SStefan Berger #endif /* TPM_BACKEND_H */
217