/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_TPM_DDI_H
#define	_TPM_DDI_H

/* Duration index is SHORT, MEDIUM, LONG, UNDEFINED */
#define	TPM_DURATION_MAX_IDX	3

/*
 * IO buffer size: this seems sufficient, but feel free to modify
 * This should be at minimum 765
 */
#define	TPM_IO_BUF_SIZE		4096

#define	TPM_IO_TIMEOUT		10000000

/*
 * Flags to keep track of for the allocated resources
 * so we know what to deallocate later on
 */
enum tpm_ddi_resources_flags {
	TPM_OPENED = 0x001,
	TPM_DIDMINOR = 0x002,
	TPM_DIDREGSMAP = 0x004,
	TPM_DIDINTMUTEX = 0x008,
	TPM_DIDINTCV = 0x010,
	TPM_DID_IO_ALLOC = 0x100,
	TPM_DID_IO_MUTEX = 0x200,
	TPM_DID_IO_CV = 0x400,
	TPM_DID_MUTEX = 0x800,
	TPM_DID_SOFT_STATE = 0x1000,
#ifdef sun4v
	TPM_HSVC_REGISTERED = 0x2000
#endif
};

typedef struct tpm_state tpm_state_t;

/* TPM specific data structure */
struct tpm_state {
	/* TPM specific */
	TPM_CAP_VERSION_INFO vers_info;

	/* OS specific */
	int 		instance;
	dev_info_t 	*dip;
	ddi_acc_handle_t handle;

	kmutex_t	dev_lock;
	uint8_t		dev_held;

	/*
	 * For read/write
	 */
	uint8_t		*iobuf;
	size_t		bufsize;
	uint8_t		iobuf_inuse;
	kmutex_t	iobuf_lock;
	kcondvar_t	iobuf_cv;

	/*
	 * For supporting the interrupt
	 */
	uint8_t			intr_enabled;
	ddi_intr_handle_t	*h_array;
	uint_t			intr_pri;
	unsigned int		state;

	uint8_t		*addr;		/* where TPM is mapped to */
	char		locality;	/* keep track of the locality */

	uint32_t flags;		/* flags to keep track of what is allocated */
	clock_t duration[4];	/* short,medium,long,undefined */
	clock_t timeout_a;
	clock_t timeout_b;
	clock_t timeout_c;
	clock_t timeout_d;
	clock_t timeout_poll;

	ddi_device_acc_attr_t accattr;

	/* For power management. */
	kmutex_t	pm_mutex;
	kcondvar_t	suspend_cv;
	uint32_t	suspended;

#ifdef KCF_TPM_RNG_PROVIDER
	/* For RNG */
	crypto_kcf_provider_handle_t	n_prov;
#endif
};

#endif	/* _TPM_DDI_H */