/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_BOFI_H
#define	_SYS_BOFI_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

/*
 * header file for bus_ops fault injector
 */

#ifdef __cplusplus
extern "C" {
#endif

#include <sys/feature_tests.h>

/*
 * ioctl command values
 */
#define	BOFI_ADD_DEF 0
#define	BOFI_DEL_DEF 1
#define	BOFI_START 2
#define	BOFI_STOP 3
#define	BOFI_CHK_STATE 8
#define	BOFI_CHK_STATE_W 9
#define	BOFI_BROADCAST 10
#define	BOFI_CLEAR_ACC_CHK 11
#define	BOFI_CLEAR_ERRORS 12
#define	BOFI_CLEAR_ERRDEFS 13
#define	BOFI_GET_HANDLES 16
#define	BOFI_GET_HANDLE_INFO 17

#define	NAMESIZE 256
#define	ERRMSGSIZE 256

struct  acc_log_elem {
    hrtime_t	access_time;	/* timestamp */
    uint_t	access_type;	/* the type of access */
    uint_t	_pad;		/* pad struct to multiple of 8 bytes for x86 */
    offset_t 	offset;		/* the offset into handle */
    uint64_t	value;		/* the value being read or written */
    uint32_t 	size;		/* the size (in bytes) of the transaction */
    uint32_t  	repcount;	/* repcount parameter of a ddi_repX routine */
};

/* Access logging flags */
#define	BOFI_LOG_REPIO	0x1	/* log ddi_repX as multiple accesses */
#define	BOFI_LOG_WRAP	0x2	/* do continuous logging of accesses */
#define	BOFI_LOG_FULL	0x4	/* lets callers know if the log has wrapped */
#define	BOFI_LOG_TIMESTAMP	0x8 /* timestamp each log entry */

struct  acc_log {
    uint32_t	logsize;	/* length of the logbase array */
    uint32_t	entries;	/* number of valid log elements */
    uint_t	flags;		/* access logging flags */
    uint_t	wrapcnt;	/* wrap cnt */
    hrtime_t	start_time;	/* activation time */
    hrtime_t	stop_time;	/* deactivation time (or time when full) */
    caddr_t	logbase;	/* pointer to acc_log_elem struct */
};
#if defined(_SYSCALL32)

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif

struct  acc_log32 {
    uint32_t	logsize;	/* length of the logbase array */
    uint32_t	entries;	/* number of valid log elements */
    uint_t	flags;		/* access logging flags */
    uint_t	wrapcnt;	/* wrap cnt */
    hrtime_t	start_time;	/* activation time */
    hrtime_t	stop_time;	/* deactivation time (or time when full) */
    caddr32_t	logbase;	/* pointer to acc_log_elem struct */
};

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif

#endif /* _SYSCALL32 */

struct bofi_errdef {
    uint_t 	namesize;
    char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
				/* pointer to char */
    int 	instance;	/* as returned by ddi_get_instance() */
    int		rnumber;	/* as used by ddi_regs_map_setup() */
    offset_t 	offset;		/* as used by ddi_regs_map_setup() */
    offset_t 	len;		/* as used by ddi_regs_map_setup() */
    uint_t	access_type;
    uint_t	access_count;
    uint_t	fail_count;
    uint_t	acc_chk;
    uint_t	optype;
    uint64_t	operand;
    struct acc_log log;
    uint64_t 	errdef_handle;	/* pointer to void */
};
#if defined(_SYSCALL32)

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif

struct bofi_errdef32 {
    uint_t 	namesize;
    char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
				/* pointer to char */
    int 	instance;	/* as returned by ddi_get_instance() */
    int		rnumber;	/* as used by ddi_regs_map_setup() */
    offset_t 	offset;		/* as used by ddi_regs_map_setup() */
    offset_t 	len;		/* as used by ddi_regs_map_setup() */
    uint_t	access_type;
    uint_t	access_count;
    uint_t	fail_count;
    uint_t	acc_chk;
    uint_t	optype;
    uint64_t	operand;
    struct acc_log32 log;
    uint64_t 	errdef_handle;	/* pointer to void */
};

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif

#endif /* _SYSCALL32 */

struct bofi_errctl {
    uint_t 	namesize;
    char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
    int 	instance;	/* as returned by ddi_get_instance() */
};

struct bofi_get_handles {
    uint_t 	namesize;
    char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
    int 	instance;	/* as returned by ddi_get_instance() */
    int 	count;
    caddr_t 	buffer;
};
#if defined(_SYSCALL32)
struct bofi_get_handles32 {
    uint_t 	namesize;
    char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
    int 	instance;	/* as returned by ddi_get_instance() */
    int 	count;
    caddr32_t 	buffer;
};
#endif /* _SYSCALL32 */

struct handle_info {
    int 	instance;
    uint_t 	access_type;
    int 	rnumber;
    int		_pad;		/* pad to 8 bytes for x86 */
    offset_t 	len;
    offset_t 	offset;
    uint64_t 	addr_cookie;
};

struct bofi_get_hdl_info {
    uint_t 	namesize;
    char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
    int 	count;		/* number of handle_info structures */
    caddr_t 	hdli;		/* pointer to struct handle_info */
};
#if defined(_SYSCALL32)
struct bofi_get_hdl_info32 {
    uint_t 	namesize;
    char 	name[NAMESIZE];		/* as returned by ddi_get_name() */
    int 	count;		/* number of handle_info structures */
    caddr32_t 	hdli;		/* pointer to struct handle_info */
};
#endif /* _SYSCALL32 */

/*
 * values for optype
 */
#define	BOFI_EQUAL 0
#define	BOFI_AND 1
#define	BOFI_OR 2
#define	BOFI_XOR 3
#define	BOFI_NO_TRANSFER 4
#define	BOFI_DELAY_INTR 5
#define	BOFI_LOSE_INTR 6
#define	BOFI_EXTRA_INTR 7
#define	BOFI_NOP 16
/*
 * values for access_type
 */
#define	BOFI_PIO_R 1
#define	BOFI_PIO_W 2
#define	BOFI_PIO_RW (BOFI_PIO_R|BOFI_PIO_W)
#define	BOFI_DMA_R 4
#define	BOFI_DMA_W 8
#define	BOFI_DMA_RW (BOFI_DMA_R|BOFI_DMA_W)
#define	BOFI_INTR 64
#define	BOFI_LOG 128

struct bofi_errstate {
    hrtime_t	fail_time;	/* time that count went to zero */
    hrtime_t	msg_time;	/* time that ddi_report_error was called */
    uint_t	access_count;
    uint_t	fail_count;
    uint_t	acc_chk;
    uint_t 	errmsg_count;
    char 	buffer[ERRMSGSIZE];
    ddi_fault_impact_t severity;
    struct acc_log log;
    uint64_t 	errdef_handle;
};
#if defined(_SYSCALL32)

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack(4)
#endif

struct bofi_errstate32 {
    hrtime_t	fail_time;	/* time that count went to zero */
    hrtime_t	msg_time;	/* time that ddi_report_error was called */
    uint_t	access_count;
    uint_t	fail_count;
    uint_t	acc_chk;
    uint_t 	errmsg_count;
    char 	buffer[ERRMSGSIZE];
    ddi_fault_impact_t severity;
    struct acc_log32 log;
    uint64_t 	errdef_handle;
};

#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
#pragma pack()
#endif

#endif /* _SYSCALL32 */

#ifdef __cplusplus
}
#endif

#endif	/* _SYS_BOFI_H */