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