OpenSolaris_b135/uts/sun/sys/socalreg.h

Compare this file to the similar file:
Show the results in this format:

/*
 * 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 1998 Sun Microsystems, Inc. All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_SOCALREG_H
#define	_SYS_SOCALREG_H

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

#ifdef __cplusplus
extern "C" {
#endif

/*
 * socalreg.h:
 *
 * 	SOC+ Register Definitions, Interface Adaptor to Fiber Channel
 */

#define	N_SOCAL_NPORTS	2

/*
 * Define the SOC+ configuration register bits.
 */
typedef union socal_cr_register {
	struct cr {
		uint_t	aaa:5;
		uint_t	ramsel:3;	/* Ram bank select. */
		uint_t	bbb:6;
		uint_t	eepromsel:2;	/* Eeprom bank select. */
		uint_t	ccc:5;
		uint_t	burst64:3;	/* Sbus Burst size, 64 bit mode. */
		uint_t	ddd:2;
		uint_t	parenable:1;	/* Partity test enable. */
		uint_t	parsbus:1;	/* Sbus Parity checking. */
		uint_t	sbusmode:1;	/* Enhanced Sbus mode. */
		uint_t	sbusburst:3;	/* Sbus burst size. */
	} reg;
	uint32_t	w;
} socal_cr_reg_t;

/*
 * Define Configuration register bits.
 */

#define	SOCAL_CR_SBUS_BURST_SIZE_MASK		0x007
#define	SOCAL_CR_SBUS_BURST_SIZE_64BIT_MASK	0x700
#define	SOCAL_CR_SBUS_BURST_SIZE_64BIT(a)	\
	(((a) & SOCAL_CR_SBUS_BURST_SIZE_64BIT_MASK) >> 8)

#define	SOCAL_CR_BURST_4		0x0
#define	SOCAL_CR_BURST_8		0x3
#define	SOCAL_CR_BURST_16		0x4
#define	SOCAL_CR_BURST_32		0x5
#define	SOCAL_CR_BURST_64		0x6
#define	SOCAL_CR_BURST_128		0x7

#define	SOCAL_CR_SBUS_ENHANCED		0x08
#define	SOCAL_CR_SBUS_PARITY_CHK	0x10
#define	SOCAL_CR_SBUS_PARITY_TEST	0x20

#define	SOCAL_CR_EEPROM_BANK_MASK	0x30000
#define	SOCAL_CR_EEPROM_BANK(a)	(((a) & SOCAL_CR_EEPROM_BANK_MASK) >> 16)

#define	SOCAL_CR_EXTERNAL_RAM_BANK_MASK	0x7000000
#define	SOCAL_CR_EXTERNAL_RAM_BANK(a) \
	(((a) & SOCAL_CR_EXTERNAL_RAM_BANK_MASK) >> 24)

/*
 * Define SOC+ Slave Access Register.
 */
typedef union socal_sae_register {
	struct sae {
		uint_t	aaa:29;			/* Reserved. */
		uint_t	alignment_err:1;	/* Soc Alignment Error. */
		uint_t	bad_size_err:1;		/* Bad Size error. */
		uint_t	parity_err:1;		/* Parity Error. */
	} reg;
	uint32_t	w;
} socal_sae_reg_t;

/*
 * Define the Slave Access Regsiter Bits.
 */

#define	SOCAL_SAE_PARITY_ERROR		0x01
#define	SOCAL_SAE_UNSUPPORTED_TRANSFER	0x02
#define	SOCAL_SAE_ALIGNMENT_ERROR	0x04

/*
 * Define SOC+ Command and Status Register.
 */
typedef union socal_csr_register {
	struct csr {
		uint_t	comm_param:8;	/* Communication Parameters. */
		uint_t	aaa:4;
		uint_t	socal_to_host:4;	/* Soc to host attention. */
		uint_t	bbb:4;
		uint_t	host_to_socal:4;	/* Host to soc+ attention. */
		uint_t	sae:1;		/* Slave access error indicator. */
		uint_t	ccc:3;
		uint_t	int_pending:1;	/* Interrupt Pending. */
		uint_t	nqcmd:1;	/* Non queued command */
		uint_t	idle:1;		/* SOC+ idle indicator. */
		uint_t	reset:1;	/* Software Reset. */
	} reg;
	uint32_t	w;
} socal_csr_reg_t;


/*
 * Define SOC+ CSR Register Macros.
 */
#define	SOCAL_CSR_ZEROS		0x00000070
#define	SOCAL_CSR_SOCAL_TO_HOST	0x000f0000
#define	SOCAL_CSR_HOST_TO_SOCAL	0x00000f00
#define	SOCAL_CSR_SLV_ACC_ERR	0x00000080
#define	SOCAL_CSR_INT_PENDING	0x00000008
#define	SOCAL_CSR_NON_Q_CMD	0x00000004
#define	SOCAL_CSR_IDLE		0x00000002
#define	SOCAL_CSR_SOFT_RESET	0x00000001

#define	SOCAL_CSR_1ST_S_TO_H	0x00010000
#define	SOCAL_CSR_1ST_H_TO_S	0x00000100

#define	SOCAL_CSR_RSP_QUE_0	SOCAL_CSR_1ST_S_TO_H
#define	SOCAL_CSR_RSP_QUE_1	0x00020000
#define	SOCAL_CSR_RSP_QUE_2	0x00040000
#define	SOCAL_CSR_RSP_QUE_3	0x00080000

#define	SOCAL_CSR_REQ_QUE_0	SOCAL_CSR_1ST_H_TO_S
#define	SOCAL_CSR_REQ_QUE_1	0x00000200
#define	SOCAL_CSR_REQ_QUE_2	0x00000400
#define	SOCAL_CSR_REQ_QUE_3	0x00000800

/*
 * Define SOC Interrupt Mask Register Bits.
 */

#define	SOCAL_IMR_NON_QUEUED_STATE	0x04
#define	SOCAL_IMR_SLAVE_ACCESS_ERROR	0x80

#define	SOCAL_IMR_REQUEST_QUEUE_0	0x100
#define	SOCAL_IMR_REQUEST_QUEUE_1	0x200
#define	SOCAL_IMR_REQUEST_QUEUE_2	0x400
#define	SOCAL_IMR_REQUEST_QUEUE_3	0x800

#define	SOCAL_IMR_RESPONSE_QUEUE_0	0x10000
#define	SOCAL_IMR_RESPONSE_QUEUE_1	0x20000
#define	SOCAL_IMR_RESPONSE_QUEUE_2	0x40000
#define	SOCAL_IMR_RESPONSE_QUEUE_3	0x80000

/*
 * Define SOC+ Request Queue Index Register
 */
typedef union socal_reqp_register {
	struct reqp {
		uint_t	reqq0_index:8;
		uint_t	reqq1_index:8;
		uint_t	reqq2_index:8;
		uint_t	reqq3_index:8;
	} reg;
	uint32_t	w;
} socal_reqp_reg_t;

#define	SOCAL_REQUESTQ0_MASK	0xff000000
#define	SOCAL_REQUESTQ1_MASK	0x00ff0000
#define	SOCAL_REQUESTQ2_MASK	0x0000ff00
#define	SOCAL_REQUESTQ3_MASK	0x000000ff

#define	SOCAL_REQUESTQ0_INDEX(a) (((a) & SOCAL_REQUESTQ0_MASK) >> 24)
#define	SOCAL_REQUESTQ1_INDEX(a) (((a) & SOCAL_REQUESTQ1_MASK) >> 16)
#define	SOCAL_REQUESTQ2_INDEX(a) (((a) & SOCAL_REQUESTQ2_MASK) >> 8)
#define	SOCAL_REQUESTQ3_INDEX(a) ((a) & SOCAL_REQUESTQ3_MASK)

#define	SOCAL_REQUESTQ_INDEX(a, b) ((b)>>((3-(a))<<3) & 0xff)

/*
 * Define SOC+ Response Queue Index Register
 */
typedef union socal_rspp_register {
	struct rspp {
		uint_t	rspq0_index:8;
		uint_t	rspq1_index:8;
		uint_t	rspq2_index:8;
		uint_t	rspq3_index:8;
	} reg;
	uint32_t	w;
} socal_rspp_reg_t;

#define	SOCAL_RESPONSEQ0_MASK	0xff000000
#define	SOCAL_RESPONSEQ1_MASK	0x00ff0000
#define	SOCAL_RESPONSEQ2_MASK	0x0000ff00
#define	SOCAL_RESPONSEQ3_MASK	0x000000ff

#define	SOCAL_RESPONSEQ0_INDEX(a) (((a) & SOCAL_RESPONSEQ0_MASK) >> 24)
#define	SOCAL_RESPONSEQ1_INDEX(a) (((a) & SOCAL_RESPONSEQ1_MASK) >> 16)
#define	SOCAL_RESPONSEQ2_INDEX(a) (((a) & SOCAL_RESPONSEQ2_MASK) >> 8)
#define	SOCAL_RESPONSEQ3_INDEX(a) ((a) & SOCAL_RESPONSEQ3_MASK)

#define	SOCAL_RESPONSEQ_INDEX(a, b) ((b)>>((3-(a))<<3) & 0xff)

typedef struct _socalreg_ {
	socal_cr_reg_t		socal_cr;	/* Configuration reg */
	socal_sae_reg_t		socal_sae;	/* Slave access error reg */
	socal_csr_reg_t		socal_csr;	/* Command Status reg */
	uint32_t		socal_imr;	/* Interrupt Mask reg */
	socal_reqp_reg_t	socal_reqp;	/* request queue index reg */
	socal_rspp_reg_t	socal_rspp;	/* response queue index reg */
} socal_reg_t;

/*
 * Device Address Space Offsets.
 */

#define	SOCAL_XRAM_OFFSET	0x10000
#define	SOCAL_XRAM_SIZE		0x10000

#define	SOCAL_MAX_XCHG		1024

#define	SOCAL_REG_OFFSET	(SOCAL_XRAM_OFFSET + SOCAL_XRAM_SIZE)

#define	SOCAL_CQ_REQUEST_OFFSET (SOCAL_XRAM_OFFSET + 0x200)
#define	SOCAL_CQ_RESPONSE_OFFSET (SOCAL_XRAM_OFFSET + 0x220)


#define	SOCAL_INTR_CAUSE(socalp, csr) \
	(((csr) & SOCAL_CSR_SOCAL_TO_HOST) | \
	((~csr) & (SOCAL_CSR_HOST_TO_SOCAL))) & socalp->socal_k_imr

/*
 * Bus dma burst sizes
 */
#ifndef BURSTSIZE
#define	BURSTSIZE
#define	BURST1			0x01
#define	BURST2			0x02
#define	BURST4			0x04
#define	BURST8			0x08
#define	BURST16			0x10
#define	BURST32			0x20
#define	BURST64			0x40
#define	BURST128		0x80
#define	BURSTSIZE_MASK		0xff
#define	DEFAULT_BURSTSIZE	BURST16|BURST8|BURST4|BURST2|BURST1
#endif  /* BURSTSIZE */

#ifdef __cplusplus
}
#endif

#endif /* !_SYS_SOCALREG_H */