summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4u/starcat/sys/iosramvar.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/sun4u/starcat/sys/iosramvar.h')
-rw-r--r--usr/src/uts/sun4u/starcat/sys/iosramvar.h327
1 files changed, 327 insertions, 0 deletions
diff --git a/usr/src/uts/sun4u/starcat/sys/iosramvar.h b/usr/src/uts/sun4u/starcat/sys/iosramvar.h
new file mode 100644
index 0000000000..bada4f50d7
--- /dev/null
+++ b/usr/src/uts/sun4u/starcat/sys/iosramvar.h
@@ -0,0 +1,327 @@
+/*
+ * 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 2000 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_IOSRAMVAR_H
+#define _SYS_IOSRAMVAR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Data sizes used by the original author
+ */
+#ifndef UINT32SZ
+#define UINT32SZ sizeof (uint32_t)
+#define UINT64SZ sizeof (uint64_t)
+#endif
+
+/*
+ * Values used for tunnel switching
+ */
+#define OBP_TSWITCH_REQREPLY 0 /* request reply from SSC */
+#define OBP_TSWITCH_NOREPLY 1 /* don't wait for reply */
+#define IOSRAM_TSWITCH_RETRY 20 /* # of times to wait for */
+ /* current tunnel switch to */
+ /* end when starting a new */
+ /* one */
+/*
+ * When performing back-to-back tunnel switches, we have to make sure that
+ * HWAD (the SC-side implementation) has time to find the new tunnel from
+ * one switch before we invalidate it for the next switch. To ensure that,
+ * we make sure that the time between consecutive tunnel switches is at
+ * least twice the polling rate HWAD uses to detect the new tunnel.
+ */
+#define IOSRAM_TSWITCH_DELAY_US 100000
+
+/*
+ * Values used for hash table maintenance
+ */
+#define IOSRAM_HASHSZ 0x20 /* # hash entries */
+#define IOSRAM_HASH(key) ((((key) >> 24) ^ ((key) >> 16) ^\
+ ((key) >> 9) ^ (key)) & (IOSRAM_HASHSZ - 1))
+
+/*
+ * A pair of flags is associated with each IOSRAM chunk in the IOSRAM TOC.
+ * These flags are stored sequentially in the "SC Domain Communication Data"
+ * ('SDCD') IOSRAM chunk. The data-valid/int-pending flags are one byte each
+ * and stored sequentially with data-valid flag being the first. The following
+ * macros define the offset of the flags for each IOSRAM chunk based upon its
+ * location (index) in the IOSRAM TOC.
+ */
+#define IOSRAM_DATAVALID_FLAGOFF(index) (2 * (index))
+#define IOSRAM_INTPENDING_FLAGOFF(index) (2 * (index) + 1)
+
+/*
+ * IOSRAM node properties (per IOSRAM node)
+ */
+#define IOSRAM_REG_PROP "reg"
+#define IOSRAM_TUNNELOK_PROP "tunnel-capable"
+
+/*
+ * Other IOSRAM properties (on chosen node and parent hierarchy)
+ */
+#define IOSRAM_CHOSEN_PROP "iosram"
+#define IOSRAM_PORTID_PROP "portid"
+
+/*
+ * Interrupt priority (PIL) used for IOSRAM interrupts. The value 5 was
+ * chosen somewhat arbitrarily based on the fact that it is higher than
+ * disks and lower than networks.
+ */
+#define IOSRAM_PIL 5
+
+/*
+ * IOSRAM header structure, located at the beginning of IOSRAM.
+ *
+ * NOTE - New fields may be appended to this structure, but no existing fields
+ * may be altered in any way!!!
+ */
+typedef struct {
+ uint32_t status;
+ uint32_t version;
+ uint32_t toc_offset;
+ uint32_t sms_mbox_version;
+ uint32_t os_mbox_version;
+ uint32_t obp_mbox_version;
+ uint32_t sms_change_mask;
+ uint32_t os_change_mask;
+} iosram_hdr_t;
+
+/*
+ * Values for the status field
+ */
+#define IOSRAM_INVALID 0x494e5644 /* 'INVD' */
+#define IOSRAM_VALID 0x56414c44 /* 'VALD' */
+#define IOSRAM_INTRANSIT 0x494e5452 /* 'INTR' */
+
+/*
+ * Maximum IOSRAM Protocol version understood by this implementation
+ */
+#define IOSRAM_MAX_PROTOCOL_VERSION 1
+
+/*
+ * Bit definitions for *_change_mask fields
+ */
+#define IOSRAM_HDRFIELD_SMS_MBOX_VER 0x00000001
+#define IOSRAM_HDRFIELD_OS_MBOX_VER 0x00000002
+#define IOSRAM_HDRFIELD_TOC_INDEX 0x00000004
+
+/*
+ * Macros used to access fields in the header
+ */
+#define IOSRAM_GET_HDRFIELD32(softp, field) \
+ (ddi_get32((softp)->handle, &((iosram_hdr_t *)(softp)->iosramp)->field))
+#define IOSRAM_SET_HDRFIELD32(softp, field, val) \
+ (ddi_put32((softp)->handle, &((iosram_hdr_t *)(softp)->iosramp)->field,\
+ (val)))
+
+/*
+ * IOSRAM contains various data chunks and the key, location and size of
+ * each IOSRAM chunk is communicated to the IOSRAM driver in the form of a
+ * Table of Contents. This structre contains one entry for each IOSRAM
+ * chunk, as well as an initial index entry. Each entry has the following
+ * structure.
+ *
+ * NOTE - Although the unused field may be renamed for some use in the future,
+ * no other modification to this structure is allowed!!!
+ */
+
+typedef struct {
+ uint32_t key; /* IOSRAM chunk key */
+ uint32_t off; /* IOSRAM chunk starting offset */
+ uint32_t len; /* IOSRAM chunk length */
+ uint32_t unused; /* currently unused */
+} iosram_toc_entry_t;
+
+/*
+ * Special values used in some TOC entries
+ */
+#define IOSRAM_FLAGS_KEY 0x53444344 /* 'SDCD' - flags chunk key */
+#define IOSRAM_INDEX_KEY 0x494e4458 /* 'INDX' - index entry key */
+#define IOSRAM_INDEX_OFF 0xFFFFFFFF /* index entry offset */
+
+
+/*
+ * IOSRAM flags structure. An array of these - one for every IOSRAM chunk - is
+ * stored in the SDCD chunk.
+ */
+typedef struct {
+ uint8_t data_valid;
+ uint8_t int_pending;
+} iosram_flags_t;
+
+/*
+ * IOSRAM callback data structure
+ */
+typedef struct {
+ uchar_t busy; /* cback handler is active/busy */
+ uchar_t unregister; /* delayed callback unregistration */
+ void (*handler)(); /* cback handler */
+ void *arg; /* cback handler arg */
+} iosram_cback_t;
+
+
+/*
+ * IOSRAM per chunk state
+ */
+typedef struct iosram_chunk {
+ iosram_toc_entry_t toc_data; /* Data from TOC entry */
+ iosram_cback_t cback; /* callback info */
+ uint8_t *basep; /* kvaddr for this IOSRAM chunk */
+ iosram_flags_t *flagsp;
+ struct iosram_chunk *hash; /* next entry in the hash list */
+} iosram_chunk_t;
+
+
+/*
+ * IOSRAM per instance state
+ */
+
+typedef struct iosramsoft {
+ struct iosramsoft *prev; /* ptr for linked list */
+ struct iosramsoft *next; /* ptr for linked list */
+
+ boolean_t suspended; /* TRUE if driver suspended */
+ int instance; /* driver instance number */
+ dev_info_t *dip; /* device information */
+
+ uchar_t *iosramp; /* IOSRAM mapped vaddr */
+ int iosramlen; /* IOSRAM length */
+ int nchunks; /* # IOSRAM chunks */
+ iosram_chunk_t *chunks; /* ptr to iosram_chunk array */
+ iosram_chunk_t *flags_chunk; /* ptr to flags chunk */
+ ddi_acc_handle_t handle; /* IOSRAM map handle */
+
+ ddi_iblock_cookie_t real_iblk; /* real intr iblock cookie */
+ ddi_iblock_cookie_t soft_iblk; /* soft intr iblock cookie */
+ ddi_softintr_t softintr_id; /* soft interrupt ID */
+ ushort_t intr_busy; /* softintr handler busy */
+ ushort_t intr_pending; /* interrupt pending */
+
+ int state; /* IOSRAM state (see below) */
+ int portid; /* Card port ID for tswitch */
+ uint32_t tswitch_ok; /* # successful tunnel switch */
+ uint32_t tswitch_fail; /* # failed tunnel switch */
+
+ ddi_acc_handle_t sbbc_handle; /* SBBC regs map handle */
+ iosram_sbbc_region_t *sbbc_region; /* region of SBBC registers */
+ uint32_t int_enable_sav; /* save int enable reg. on suspend */
+ kmutex_t intr_mutex; /* real interrupt handler mutex */
+} iosramsoft_t;
+
+
+/* IOSRAM state value */
+#define IOSRAM_STATE_INIT 0x0001 /* initialization */
+#define IOSRAM_STATE_SLAVE 0x0002 /* SLAVE IOSRAM */
+#define IOSRAM_STATE_MASTER 0x0004 /* MASTER IOSRAM */
+#define IOSRAM_STATE_MAPPED 0x0008 /* IOSRAM mapped */
+
+#define IOSRAM_STATE_TSWITCH 0x0010 /* tunnel switch source/target */
+#define IOSRAM_STATE_DETACH 0x0020 /* IOSRAM instance being detached */
+
+
+#if DEBUG
+#define IOSRAM_STATS 1 /* enable IOSRAM statistics */
+#define IOSRAM_LOG 1 /* enable IOSRAM logging */
+#endif
+
+#if IOSRAM_STATS
+
+/*
+ * IOSRAM statistics
+ */
+struct iosram_stat {
+ uint32_t read; /* calls to iosram_read */
+ uint32_t write; /* calls to iosram_{force_}write */
+ uint32_t getflag; /* calls to iosram_getflag */
+ uint32_t setflag; /* calls to iosram_getflag */
+ uint32_t tswitch; /* # tunnel switch */
+ uint32_t callbacks; /* # callbacks invoked */
+ uint32_t intr_recv; /* # interrupts received */
+ uint32_t sintr_recv; /* # softintr received */
+ uint32_t intr_send; /* # interrupts sent */
+ uint64_t bread; /* # bytes read */
+ uint64_t bwrite; /* # bytes written */
+};
+
+#define IOSRAM_STAT(field) iosram_stats.field++
+#define IOSRAM_STAT_ADD(field, amount) iosram_stats.field += (uint64_t)amount
+#define IOSRAM_STAT_SET(field, count) iosram_stats.field = (uint64_t)count
+
+#else /* !IOSRAM_STATS */
+
+#define IOSRAM_STAT(field)
+#define IOSRAM_STAT_ADD(field, amount)
+#define IOSRAM_STAT_SET(field, count)
+
+#endif /* !IOSRAM_STATS */
+
+
+#if IOSRAM_LOG
+
+/*
+ * IOSRAM log related structures and extern declarations
+ */
+
+#define IOSRAM_MAXLOG 64
+
+typedef struct {
+ uint32_t seq; /* logseg# */
+ clock_t tstamp; /* time stamp */
+ caddr_t fmt; /* format ptr */
+ intptr_t arg1; /* first arg */
+ intptr_t arg2; /* second arg */
+ intptr_t arg3; /* third arg */
+ intptr_t arg4; /* fourth arg */
+} iosram_log_t;
+
+#define IOSRAMLOG(level, fmt, a1, a2, a3, a4) \
+ if (iosram_log_level >= level) { \
+ iosram_log(fmt, (intptr_t)a1, (intptr_t)a2, \
+ (intptr_t)a3, (intptr_t)a4); \
+ }
+
+extern int iosram_log_level;
+extern uint32_t iosram_logseq;
+extern iosram_log_t iosram_logbuf[IOSRAM_MAXLOG];
+extern void iosram_log(caddr_t, intptr_t, intptr_t, intptr_t, intptr_t);
+
+#else /* !IOSRAM_LOG */
+
+#define IOSRAMLOG(level, fmt, a1, a2, a3, a4)
+
+#endif /* !IOSRAM_LOG */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_IOSRAMVAR_H */