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

#ifndef	_SYS_HXGE_HXGE_DEFS_H
#define	_SYS_HXGE_HXGE_DEFS_H

#ifdef	__cplusplus
extern "C" {
#endif

#if	!defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN) && \
		!defined(__BIG_ENDIAN) && !defined(__LITTLE_ENDIAN)
#error	Host endianness not defined
#endif

#if	!defined(_BIT_FIELDS_HTOL) && !defined(_BIT_FIELDS_LTOH) && \
		!defined(__BIT_FIELDS_HTOL) && !defined(__BIT_FIELDS_LTOH)
#error	Bit ordering not defined
#endif

/* RDC/TDC CSR size */
#define	DMA_CSR_SIZE		2048

/*
 * Define the Default RBR, RCR
 */
#define	RBR_DEFAULT_MAX_BLKS	4096	/* each entry (16 blockaddr/64B) */
#define	RBR_NBLK_PER_LINE	16	/* 16 block addresses per 64 B line */
#define	RBR_DEFAULT_MAX_LEN	65472	/* 2^16 - 64 */
#define	RBR_DEFAULT_MIN_LEN	64	/* multiple of 64 */

#define	SW_OFFSET_NO_OFFSET	0
#define	SW_OFFSET_64		1	/* 64 bytes */
#define	SW_OFFSET_128		2	/* 128 bytes */
#define	SW_OFFSET_INVALID	3

/*
 * RBR block descriptor is 32 bits (bits [43:12]
 */
#define	RBR_BKADDR_SHIFT	12
#define	RCR_DEFAULT_MAX_BLKS	4096	/* each entry (8 blockaddr/64B) */
#define	RCR_NBLK_PER_LINE	8	/* 8 block addresses per 64 B line */
#define	RCR_DEFAULT_MAX_LEN	(RCR_DEFAULT_MAX_BLKS)
#define	RCR_DEFAULT_MIN_LEN	32

/*  DMA Channels.  */
#define	HXGE_MAX_DMCS		(HXGE_MAX_RDCS + HXGE_MAX_TDCS)
#define	HXGE_MAX_RDCS		4
#define	HXGE_MAX_TDCS		4

#define	VLAN_ETHERTYPE			(0x8100)

/* 256 total, each blade gets 42 */
#define	TCAM_HXGE_TCAM_MAX_ENTRY	42

/*
 * Locate the DMA channel start offset (PIO_VADDR)
 * (DMA virtual address space of the PIO block)
 */
/* TX_RNG_CFIG is not used since we are not using VADDR. */
#define	TX_RNG_CFIG			0x1000000
#define	TDMC_PIOVADDR_OFFSET(channel)	(2 * DMA_CSR_SIZE * channel)
#define	RDMC_PIOVADDR_OFFSET(channel)	(TDMC_OFFSET(channel) + DMA_CSR_SIZE)

/*
 * PIO access using the DMC block directly (DMC)
 */
#define	DMC_OFFSET(channel)		(DMA_CSR_SIZE * channel)
#define	TDMC_OFFSET(channel)		(TX_RNG_CFIG + DMA_CSR_SIZE * channel)

#ifdef	SOLARIS
#ifndef	i386
#define	_BIT_FIELDS_BIG_ENDIAN		_BIT_FIELDS_HTOL
#else
#define	_BIT_FIELDS_LITTLE_ENDIAN	_BIT_FIELDS_LTOH
#endif
#else
#define	_BIT_FIELDS_LITTLE_ENDIAN	_LITTLE_ENDIAN_BITFIELD
#endif

/*
 * The following macros expect unsigned input values.
 */
#define	TXDMA_CHANNEL_VALID(cn)		(cn < HXGE_MAX_TDCS)

/*
 * Logical device definitions.
 */
#define	HXGE_INT_MAX_LD		32
#define	HXGE_INT_MAX_LDG	32

#define	HXGE_RDMA_LD_START	0	/* 0 - 3 with 4 - 7 reserved */
#define	HXGE_TDMA_LD_START	8	/* 8 - 11 with 12 - 15 reserved */
#define	HXGE_VMAC_LD		16
#define	HXGE_PFC_LD		17
#define	HXGE_NMAC_LD		18
#define	HXGE_MBOX_LD_START	20	/* 20 - 23  for SW Mbox */
#define	HXGE_SYS_ERROR_LD	31

#define	LDG_VALID(n)		(n < HXGE_INT_MAX_LDG)
#define	LD_VALID(n)		(n < HXGE_INT_MAX_LD)
#define	LD_RXDMA_LD_VALID(n)	(n < HXGE_MAX_RDCS)
#define	LD_TXDMA_LD_VALID(n)	(n >= HXGE_MAX_RDCS && \
					((n - HXGE_MAX_RDCS) < HXGE_MAX_TDCS)))

#define	LD_TIMER_MAX		0x3f
#define	LD_INTTIMER_VALID(n)	(n <= LD_TIMER_MAX)

/* System Interrupt Data */
#define	SID_VECTOR_MAX		0x1f
#define	SID_VECTOR_VALID(n)	(n <= SID_VECTOR_MAX)

#define	LD_IM_MASK		0x00000003ULL
#define	LDGTITMRES_RES_MASK	0x000FFFFFULL

#define	MIN_FRAME_SIZE		106	/* 68 byte min MTU + 38 byte header */
#define	MAX_FRAME_SIZE		9216
#define	STD_FRAME_SIZE		1522	/* 1518 + 4 = 5EE + 4 */
#define	HXGE_DEFAULT_MTU	1500
/*
 * sizeof (struct ether_header) + ETHERFCSL + 4 + TX_PKT_HEADER_SIZE
 * 12 + 6 + 4 + 16
 */
#define	MTU_TO_FRAME_SIZE	38

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_HXGE_HXGE_DEFS_H */