#define TPM_BACKEND_H
#include "qom/object.h"
-#include "qemu-common.h"
-#include "qapi-types.h"
#include "qemu/option.h"
#include "sysemu/tpm.h"
+#include "qapi/error.h"
+
+#ifdef CONFIG_TPM
#define TYPE_TPM_BACKEND "tpm-backend"
-#define TPM_BACKEND(obj) \
- OBJECT_CHECK(TPMBackend, (obj), TYPE_TPM_BACKEND)
-#define TPM_BACKEND_GET_CLASS(obj) \
- OBJECT_GET_CLASS(TPMBackendClass, (obj), TYPE_TPM_BACKEND)
-#define TPM_BACKEND_CLASS(klass) \
- OBJECT_CLASS_CHECK(TPMBackendClass, (klass), TYPE_TPM_BACKEND)
-
-typedef struct TPMBackendClass TPMBackendClass;
-typedef struct TPMBackend TPMBackend;
-typedef struct TPMDriverOps TPMDriverOps;
-typedef void (TPMRecvDataCB)(TPMState *, uint8_t locty, bool selftest_done);
-
-typedef enum TPMBackendCmd {
- TPM_BACKEND_CMD_INIT = 1,
- TPM_BACKEND_CMD_PROCESS_CMD,
- TPM_BACKEND_CMD_END,
- TPM_BACKEND_CMD_TPM_RESET,
+OBJECT_DECLARE_TYPE(TPMBackend, TPMBackendClass,
+ TPM_BACKEND)
+
+
+typedef struct TPMBackendCmd {
+ uint8_t locty;
+ const uint8_t *in;
+ uint32_t in_len;
+ uint8_t *out;
+ uint32_t out_len;
+ bool selftest_done;
} TPMBackendCmd;
struct TPMBackend {
Object parent;
/*< protected >*/
+ TPMIf *tpmif;
bool opened;
- TPMState *tpm_state;
- GThreadPool *thread_pool;
- TPMRecvDataCB *recv_data_callback;
bool had_startup_error;
+ TPMBackendCmd *cmd;
/* <public> */
char *id;
- enum TpmModel fe_model;
QLIST_ENTRY(TPMBackend) list;
};
struct TPMBackendClass {
ObjectClass parent_class;
- const TPMDriverOps *ops;
-
- void (*opened)(TPMBackend *s, Error **errp);
-
- void (*handle_request)(TPMBackend *s, TPMBackendCmd cmd);
-};
-
-typedef struct TPMSizedBuffer {
- uint32_t size;
- uint8_t *buffer;
-} TPMSizedBuffer;
-
-struct TPMDriverOps {
enum TpmType type;
const QemuOptDesc *opts;
/* get a descriptive text of the backend to display to the user */
const char *desc;
- TPMBackend *(*create)(QemuOpts *opts, const char *id);
+ TPMBackend *(*create)(QemuOpts *opts);
- /* initialize the backend */
- int (*init)(TPMBackend *t);
- /* start up the TPM on the backend */
- int (*startup_tpm)(TPMBackend *t);
+ /* start up the TPM on the backend - optional */
+ int (*startup_tpm)(TPMBackend *t, size_t buffersize);
+ /* optional */
void (*reset)(TPMBackend *t);
void (*cancel_cmd)(TPMBackend *t);
+ /* optional */
bool (*get_tpm_established_flag)(TPMBackend *t);
+ /* optional */
int (*reset_tpm_established_flag)(TPMBackend *t, uint8_t locty);
TPMVersion (*get_tpm_version)(TPMBackend *t);
+ size_t (*get_buffer_size)(TPMBackend *t);
+
TpmTypeOptions *(*get_tpm_options)(TPMBackend *t);
-};
+ void (*handle_request)(TPMBackend *s, TPMBackendCmd *cmd, Error **errp);
+};
/**
* tpm_backend_get_type:
/**
* tpm_backend_init:
* @s: the backend to initialized
- * @state: TPMState
+ * @tpmif: TPM interface
* @datacb: callback for sending data to frontend
+ * @errp: a pointer to return the #Error object if an error occurs.
*
* Initialize the backend with the given variables.
*
* Returns 0 on success.
*/
-int tpm_backend_init(TPMBackend *s, TPMState *state,
- TPMRecvDataCB *datacb);
+int tpm_backend_init(TPMBackend *s, TPMIf *tpmif, Error **errp);
/**
* tpm_backend_startup_tpm:
* @s: the backend whose TPM support is to be started
+ * @buffersize: the buffer size the TPM is supposed to use,
+ * 0 to leave it as-is
*
* Returns 0 on success.
*/
-int tpm_backend_startup_tpm(TPMBackend *s);
+int tpm_backend_startup_tpm(TPMBackend *s, size_t buffersize);
/**
* tpm_backend_had_startup_error:
/**
* tpm_backend_deliver_request:
* @s: the backend to send the request to
+ * @cmd: the command to deliver
*
* Send a request to the backend. The backend will then send the request
* to the TPM implementation.
*/
-void tpm_backend_deliver_request(TPMBackend *s);
+void tpm_backend_deliver_request(TPMBackend *s, TPMBackendCmd *cmd);
/**
* tpm_backend_reset:
*/
int tpm_backend_reset_tpm_established_flag(TPMBackend *s, uint8_t locty);
-/**
- * tpm_backend_open:
- * @s: the backend to open
- * @errp: a pointer to return the #Error object if an error occurs.
- *
- * This function will open the backend if it is not already open. Calling this
- * function on an already opened backend will not result in an error.
- */
-void tpm_backend_open(TPMBackend *s, Error **errp);
-
/**
* tpm_backend_get_tpm_version:
* @s: the backend to call into
*/
TPMVersion tpm_backend_get_tpm_version(TPMBackend *s);
+/**
+ * tpm_backend_get_buffer_size:
+ * @s: the backend to call into
+ *
+ * Get the TPM's buffer size.
+ *
+ * Returns buffer size.
+ */
+size_t tpm_backend_get_buffer_size(TPMBackend *s);
+
+/**
+ * tpm_backend_finish_sync:
+ * @s: the backend to call into
+ *
+ * Finish the pending command synchronously (this will call aio_poll()
+ * on qemu main AIOContext until it ends)
+ */
+void tpm_backend_finish_sync(TPMBackend *s);
+
/**
* tpm_backend_query_tpm:
* @s: the backend
*/
TPMInfo *tpm_backend_query_tpm(TPMBackend *s);
-TPMBackend *qemu_find_tpm(const char *id);
+TPMBackend *qemu_find_tpm_be(const char *id);
-const TPMDriverOps *tpm_get_backend_driver(const char *type);
-void tpm_register_model(enum TpmModel model);
-void tpm_register_driver(const TPMDriverOps *tdo);
+#endif /* CONFIG_TPM */
-#endif
+#endif /* TPM_BACKEND_H */