47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * CDDL HEADER START
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * The contents of this file are subject to the terms of the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Common Development and Distribution License (the "License").
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * You may not use this file except in compliance with the License.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * or http://www.opensolaris.org/os/licensing.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * See the License for the specific language governing permissions
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * and limitations under the License.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * When distributing Covered Code, include this CDDL HEADER in each
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * If applicable, add the following below this CDDL HEADER, with the
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * fields enclosed by brackets "[]" replaced with your own identifying
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * information: Portions Copyright [yyyy] [name of copyright owner]
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll *
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * CDDL HEADER END
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Use is subject to license terms.
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#ifndef _TPM_DDI_H
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#define _TPM_DDI_H
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/* Duration index is SHORT, MEDIUM, LONG, UNDEFINED */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#define TPM_DURATION_MAX_IDX 3
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * IO buffer size: this seems sufficient, but feel free to modify
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * This should be at minimum 765
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#define TPM_IO_BUF_SIZE 4096
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#define TPM_IO_TIMEOUT 10000000
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * Flags to keep track of for the allocated resources
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * so we know what to deallocate later on
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollenum tpm_ddi_resources_flags {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_OPENED = 0x001,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DIDMINOR = 0x002,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DIDREGSMAP = 0x004,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DIDINTMUTEX = 0x008,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DIDINTCV = 0x010,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DID_IO_ALLOC = 0x100,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DID_IO_MUTEX = 0x200,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DID_IO_CV = 0x400,
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_DID_MUTEX = 0x800,
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll TPM_DID_SOFT_STATE = 0x1000,
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll#ifdef sun4v
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll TPM_HSVC_REGISTERED = 0x2000
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll#endif
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll};
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersolltypedef struct tpm_state tpm_state_t;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll/* TPM specific data structure */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersollstruct tpm_state {
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* TPM specific */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll TPM_CAP_VERSION_INFO vers_info;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* OS specific */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll int instance;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll dev_info_t *dip;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ddi_acc_handle_t handle;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll kmutex_t dev_lock;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint8_t dev_held;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * For read/write
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint8_t *iobuf;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll size_t bufsize;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint8_t iobuf_inuse;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll kmutex_t iobuf_lock;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll kcondvar_t iobuf_cv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /*
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll * For supporting the interrupt
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint8_t intr_enabled;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ddi_intr_handle_t *h_array;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint_t intr_pri;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll unsigned int state;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint8_t *addr; /* where TPM is mapped to */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll char locality; /* keep track of the locality */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint32_t flags; /* flags to keep track of what is allocated */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll clock_t duration[4]; /* short,medium,long,undefined */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll clock_t timeout_a;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll clock_t timeout_b;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll clock_t timeout_c;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll clock_t timeout_d;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll clock_t timeout_poll;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll ddi_device_acc_attr_t accattr;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll /* For power management. */
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll kmutex_t pm_mutex;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll kcondvar_t suspend_cv;
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll uint32_t suspended;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll#ifdef KCF_TPM_RNG_PROVIDER
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll /* For RNG */
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll crypto_kcf_provider_handle_t n_prov;
8d26100c1d185652ac4e12e1b6c2337446ad0746Wyllys Ingersoll#endif
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll};
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll
47e946e784719ae402ace34695f67b0e6e76ae5cWyllys Ingersoll#endif /* _TPM_DDI_H */