xref: /onnv-gate/usr/src/uts/common/io/nxge/npi/npi_txdma.h (revision 6495:1a95fa8c7c94)
13859Sml29623 /*
23859Sml29623  * CDDL HEADER START
33859Sml29623  *
43859Sml29623  * The contents of this file are subject to the terms of the
53859Sml29623  * Common Development and Distribution License (the "License").
63859Sml29623  * You may not use this file except in compliance with the License.
73859Sml29623  *
83859Sml29623  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
93859Sml29623  * or http://www.opensolaris.org/os/licensing.
103859Sml29623  * See the License for the specific language governing permissions
113859Sml29623  * and limitations under the License.
123859Sml29623  *
133859Sml29623  * When distributing Covered Code, include this CDDL HEADER in each
143859Sml29623  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
153859Sml29623  * If applicable, add the following below this CDDL HEADER, with the
163859Sml29623  * fields enclosed by brackets "[]" replaced with your own identifying
173859Sml29623  * information: Portions Copyright [yyyy] [name of copyright owner]
183859Sml29623  *
193859Sml29623  * CDDL HEADER END
203859Sml29623  */
213859Sml29623 /*
22*6495Sspeer  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
233859Sml29623  * Use is subject to license terms.
243859Sml29623  */
253859Sml29623 
263859Sml29623 #ifndef _NPI_TXDMA_H
273859Sml29623 #define	_NPI_TXDMA_H
283859Sml29623 
293859Sml29623 #pragma ident	"%Z%%M%	%I%	%E% SMI"
303859Sml29623 
313859Sml29623 #ifdef	__cplusplus
323859Sml29623 extern "C" {
333859Sml29623 #endif
343859Sml29623 
353859Sml29623 #include <npi.h>
363859Sml29623 #include <nxge_txdma_hw.h>
373859Sml29623 
383859Sml29623 #define	DMA_LOG_PAGE_FN_VALIDATE(cn, pn, fn, status)	\
393859Sml29623 {									\
403859Sml29623 	status = NPI_SUCCESS;						\
413859Sml29623 	if (!TXDMA_CHANNEL_VALID(channel)) {				\
423859Sml29623 		status = (NPI_FAILURE | NPI_TXDMA_CHANNEL_INVALID(cn));	\
433859Sml29623 	} else if (!TXDMA_PAGE_VALID(pn)) {			\
443859Sml29623 		status =  (NPI_FAILURE | NPI_TXDMA_PAGE_INVALID(pn));	\
453859Sml29623 	} else if (!TXDMA_FUNC_VALID(fn)) {			\
463859Sml29623 		status =  (NPI_FAILURE | NPI_TXDMA_FUNC_INVALID(fn));	\
473859Sml29623 	} \
483859Sml29623 }
493859Sml29623 
503859Sml29623 #define	DMA_LOG_PAGE_VALIDATE(cn, pn, status)	\
513859Sml29623 {									\
523859Sml29623 	status = NPI_SUCCESS;						\
533859Sml29623 	if (!TXDMA_CHANNEL_VALID(channel)) {				\
543859Sml29623 		status = (NPI_FAILURE | NPI_TXDMA_CHANNEL_INVALID(cn));	\
553859Sml29623 	} else if (!TXDMA_PAGE_VALID(pn)) {			\
563859Sml29623 		status =  (NPI_FAILURE | NPI_TXDMA_PAGE_INVALID(pn));	\
573859Sml29623 	} \
583859Sml29623 }
593859Sml29623 
603859Sml29623 typedef	enum _txdma_cs_cntl_e {
613859Sml29623 	TXDMA_INIT_RESET	= 0x1,
623859Sml29623 	TXDMA_INIT_START	= 0x2,
633859Sml29623 	TXDMA_START		= 0x3,
643859Sml29623 	TXDMA_RESET		= 0x4,
653859Sml29623 	TXDMA_STOP		= 0x5,
663859Sml29623 	TXDMA_RESUME		= 0x6,
673859Sml29623 	TXDMA_CLEAR_MMK		= 0x7,
683859Sml29623 	TXDMA_MBOX_ENABLE	= 0x8
693859Sml29623 } txdma_cs_cntl_t;
703859Sml29623 
713859Sml29623 typedef	enum _txdma_log_cfg_e {
723859Sml29623 	TXDMA_LOG_PAGE_MASK	= 0x01,
733859Sml29623 	TXDMA_LOG_PAGE_VALUE	= 0x02,
743859Sml29623 	TXDMA_LOG_PAGE_RELOC	= 0x04,
753859Sml29623 	TXDMA_LOG_PAGE_VALID	= 0x08,
763859Sml29623 	TXDMA_LOG_PAGE_ALL	= (TXDMA_LOG_PAGE_MASK | TXDMA_LOG_PAGE_VALUE |
773859Sml29623 				TXDMA_LOG_PAGE_RELOC | TXDMA_LOG_PAGE_VALID)
783859Sml29623 } txdma_log_cfg_t;
793859Sml29623 
803859Sml29623 typedef	enum _txdma_ent_msk_cfg_e {
813859Sml29623 	CFG_TXDMA_PKT_PRT_MASK		= TX_ENT_MSK_PKT_PRT_ERR_MASK,
823859Sml29623 	CFG_TXDMA_CONF_PART_MASK	= TX_ENT_MSK_CONF_PART_ERR_MASK,
833859Sml29623 	CFG_TXDMA_NACK_PKT_RD_MASK	= TX_ENT_MSK_NACK_PKT_RD_MASK,
843859Sml29623 	CFG_TXDMA_NACK_PREF_MASK	= TX_ENT_MSK_NACK_PREF_MASK,
853859Sml29623 	CFG_TXDMA_PREF_BUF_ECC_ERR_MASK	= TX_ENT_MSK_PREF_BUF_ECC_ERR_MASK,
863859Sml29623 	CFG_TXDMA_TX_RING_OFLOW_MASK	= TX_ENT_MSK_TX_RING_OFLOW_MASK,
873859Sml29623 	CFG_TXDMA_PKT_SIZE_ERR_MASK	= TX_ENT_MSK_PKT_SIZE_ERR_MASK,
883859Sml29623 	CFG_TXDMA_MBOX_ERR_MASK		= TX_ENT_MSK_MBOX_ERR_MASK,
893859Sml29623 	CFG_TXDMA_MK_MASK		= TX_ENT_MSK_MK_MASK,
903859Sml29623 	CFG_TXDMA_MASK_ALL		= (TX_ENT_MSK_PKT_PRT_ERR_MASK |
913859Sml29623 					TX_ENT_MSK_CONF_PART_ERR_MASK |
923859Sml29623 					TX_ENT_MSK_NACK_PKT_RD_MASK |
933859Sml29623 					TX_ENT_MSK_NACK_PREF_MASK |
943859Sml29623 					TX_ENT_MSK_PREF_BUF_ECC_ERR_MASK |
953859Sml29623 					TX_ENT_MSK_TX_RING_OFLOW_MASK |
963859Sml29623 					TX_ENT_MSK_PKT_SIZE_ERR_MASK |
973859Sml29623 					TX_ENT_MSK_MBOX_ERR_MASK |
983859Sml29623 					TX_ENT_MSK_MK_MASK)
993859Sml29623 } txdma_ent_msk_cfg_t;
1003859Sml29623 
1013859Sml29623 
1023859Sml29623 typedef	struct _txdma_ring_errlog {
1033859Sml29623 	tx_rng_err_logl_t	logl;
1043859Sml29623 	tx_rng_err_logh_t	logh;
1053859Sml29623 } txdma_ring_errlog_t, *p_txdma_ring_errlog_t;
1063859Sml29623 
1073859Sml29623 /*
1083859Sml29623  * Register offset (0x200 bytes for each channel) for logical pages registers.
1093859Sml29623  */
1103859Sml29623 #define	NXGE_TXLOG_OFFSET(x, channel) (x + TX_LOG_DMA_OFFSET(channel))
1113859Sml29623 
1123859Sml29623 /*
1133859Sml29623  * Register offset (0x200 bytes for each channel) for transmit ring registers.
1143859Sml29623  * (Ring configuration, kick register, event mask, control and status,
1153859Sml29623  *  mailbox, prefetch, ring errors).
1163859Sml29623  */
1173859Sml29623 #define	NXGE_TXDMA_OFFSET(x, v, channel) (x + \
1183859Sml29623 		(!v ? DMC_OFFSET(channel) : TDMC_PIOVADDR_OFFSET(channel)))
1193859Sml29623 /*
1203859Sml29623  * Register offset (0x8 bytes for each port) for transmit mapping registers.
1213859Sml29623  */
1223859Sml29623 #define	NXGE_TXDMA_MAP_OFFSET(x, port) (x + TX_DMA_MAP_PORT_OFFSET(port))
1233859Sml29623 
1243859Sml29623 /*
1253859Sml29623  * Register offset (0x10 bytes for each channel) for transmit DRR and ring
1263859Sml29623  * usage registers.
1273859Sml29623  */
1283859Sml29623 #define	NXGE_TXDMA_DRR_OFFSET(x, channel) (x + \
1293859Sml29623 			TXDMA_DRR_RNG_USE_OFFSET(channel))
1303859Sml29623 
1313859Sml29623 /*
1323859Sml29623  * PIO macros to read and write the transmit registers.
1333859Sml29623  */
1343859Sml29623 #define	TX_LOG_REG_READ64(handle, reg, channel, val_p)	\
1353859Sml29623 	NXGE_REG_RD64(handle, NXGE_TXLOG_OFFSET(reg, channel), val_p)
1363859Sml29623 
1373859Sml29623 #define	TX_LOG_REG_WRITE64(handle, reg, channel, data)	\
1383859Sml29623 	NXGE_REG_WR64(handle, NXGE_TXLOG_OFFSET(reg, channel), data)
1393859Sml29623 
1403859Sml29623 /*
1413859Sml29623  * Transmit Descriptor Definitions.
1423859Sml29623  */
1433859Sml29623 #define	TXDMA_DESC_SIZE			(sizeof (tx_desc_t))
1443859Sml29623 
1453859Sml29623 #define	NPI_TXDMA_GATHER_INDEX(index)	\
1463859Sml29623 	((index <= TX_MAX_GATHER_POINTERS)) ? NPI_SUCCESS : \
1473859Sml29623 				(NPI_TXDMA_GATHER_INVALID)
1483859Sml29623 
1493859Sml29623 /*
1503859Sml29623  * Transmit NPI error codes
1513859Sml29623  */
1523859Sml29623 #define	TXDMA_ER_ST			(TXDMA_BLK_ID << NPI_BLOCK_ID_SHIFT)
1533859Sml29623 #define	TXDMA_ID_SHIFT(n)		(n << NPI_PORT_CHAN_SHIFT)
1543859Sml29623 
1553859Sml29623 #define	TXDMA_HW_STOP_FAILED		(NPI_BK_HW_ER_START | 0x1)
1563859Sml29623 #define	TXDMA_HW_RESUME_FAILED		(NPI_BK_HW_ER_START | 0x2)
1573859Sml29623 
1583859Sml29623 #define	TXDMA_GATHER_INVALID		(NPI_BK_ERROR_START | 0x1)
1593859Sml29623 #define	TXDMA_XFER_LEN_INVALID		(NPI_BK_ERROR_START | 0x2)
1603859Sml29623 
1613859Sml29623 #define	NPI_TXDMA_OPCODE_INVALID(n)	(TXDMA_ID_SHIFT(n) |	\
1623859Sml29623 					TXDMA_ER_ST | OPCODE_INVALID)
1633859Sml29623 
1643859Sml29623 #define	NPI_TXDMA_FUNC_INVALID(n)	(TXDMA_ID_SHIFT(n) |	\
1653859Sml29623 					TXDMA_ER_ST | PORT_INVALID)
1663859Sml29623 #define	NPI_TXDMA_CHANNEL_INVALID(n)	(TXDMA_ID_SHIFT(n) |	\
1673859Sml29623 					TXDMA_ER_ST | CHANNEL_INVALID)
1683859Sml29623 
1693859Sml29623 #define	NPI_TXDMA_PAGE_INVALID(n)	(TXDMA_ID_SHIFT(n) |	\
1703859Sml29623 					TXDMA_ER_ST | LOGICAL_PAGE_INVALID)
1713859Sml29623 
1723859Sml29623 #define	NPI_TXDMA_REGISTER_INVALID	(TXDMA_ER_ST | REGISTER_INVALID)
1733859Sml29623 #define	NPI_TXDMA_COUNTER_INVALID	(TXDMA_ER_ST | COUNTER_INVALID)
1743859Sml29623 #define	NPI_TXDMA_CONFIG_INVALID	(TXDMA_ER_ST | CONFIG_INVALID)
1753859Sml29623 
1763859Sml29623 
1773859Sml29623 #define	NPI_TXDMA_GATHER_INVALID	(TXDMA_ER_ST | TXDMA_GATHER_INVALID)
1783859Sml29623 #define	NPI_TXDMA_XFER_LEN_INVALID	(TXDMA_ER_ST | TXDMA_XFER_LEN_INVALID)
1793859Sml29623 
1803859Sml29623 #define	NPI_TXDMA_RESET_FAILED		(TXDMA_ER_ST | RESET_FAILED)
1813859Sml29623 #define	NPI_TXDMA_STOP_FAILED		(TXDMA_ER_ST | TXDMA_HW_STOP_FAILED)
1823859Sml29623 #define	NPI_TXDMA_RESUME_FAILED		(TXDMA_ER_ST | TXDMA_HW_RESUME_FAILED)
1833859Sml29623 
1843859Sml29623 /*
1853859Sml29623  * Transmit DMA Channel NPI Prototypes.
1863859Sml29623  */
1873859Sml29623 npi_status_t npi_txdma_mode32_set(npi_handle_t, boolean_t);
1883859Sml29623 npi_status_t npi_txdma_log_page_set(npi_handle_t, uint8_t,
1893859Sml29623 		p_dma_log_page_t);
1903859Sml29623 npi_status_t npi_txdma_log_page_get(npi_handle_t, uint8_t,
1913859Sml29623 		p_dma_log_page_t);
1923859Sml29623 npi_status_t npi_txdma_log_page_handle_set(npi_handle_t, uint8_t,
1933859Sml29623 		p_log_page_hdl_t);
1943859Sml29623 npi_status_t npi_txdma_log_page_config(npi_handle_t, io_op_t,
1953859Sml29623 		txdma_log_cfg_t, uint8_t, p_dma_log_page_t);
1963859Sml29623 npi_status_t npi_txdma_log_page_vld_config(npi_handle_t, io_op_t,
1973859Sml29623 		uint8_t, p_log_page_vld_t);
1983859Sml29623 npi_status_t npi_txdma_drr_weight_set(npi_handle_t, uint8_t,
1993859Sml29623 		uint32_t);
2003859Sml29623 npi_status_t npi_txdma_channel_reset(npi_handle_t, uint8_t);
2013859Sml29623 npi_status_t npi_txdma_channel_init_enable(npi_handle_t,
2023859Sml29623 		uint8_t);
2033859Sml29623 npi_status_t npi_txdma_channel_enable(npi_handle_t, uint8_t);
2043859Sml29623 npi_status_t npi_txdma_channel_disable(npi_handle_t, uint8_t);
2053859Sml29623 npi_status_t npi_txdma_channel_resume(npi_handle_t, uint8_t);
2063859Sml29623 npi_status_t npi_txdma_channel_mmk_clear(npi_handle_t, uint8_t);
2073859Sml29623 npi_status_t npi_txdma_channel_mbox_enable(npi_handle_t, uint8_t);
2083859Sml29623 npi_status_t npi_txdma_channel_control(npi_handle_t,
2093859Sml29623 		txdma_cs_cntl_t, uint8_t);
2103859Sml29623 npi_status_t npi_txdma_control_status(npi_handle_t, io_op_t,
2113859Sml29623 		uint8_t, p_tx_cs_t);
2123859Sml29623 
2133859Sml29623 npi_status_t npi_txdma_event_mask(npi_handle_t, io_op_t,
2143859Sml29623 		uint8_t, p_tx_dma_ent_msk_t);
2153859Sml29623 npi_status_t npi_txdma_event_mask_config(npi_handle_t, io_op_t,
2163859Sml29623 		uint8_t, txdma_ent_msk_cfg_t *);
2173859Sml29623 npi_status_t npi_txdma_event_mask_mk_out(npi_handle_t, uint8_t);
2183859Sml29623 npi_status_t npi_txdma_event_mask_mk_in(npi_handle_t, uint8_t);
2193859Sml29623 
2203859Sml29623 npi_status_t npi_txdma_ring_addr_set(npi_handle_t, uint8_t,
2213859Sml29623 		uint64_t, uint32_t);
2223859Sml29623 npi_status_t npi_txdma_ring_config(npi_handle_t, io_op_t,
2233859Sml29623 		uint8_t, uint64_t *);
2243859Sml29623 npi_status_t npi_txdma_mbox_config(npi_handle_t, io_op_t,
2253859Sml29623 		uint8_t, uint64_t *);
2263859Sml29623 npi_status_t npi_txdma_desc_gather_set(npi_handle_t,
2273859Sml29623 		p_tx_desc_t, uint8_t,
2283859Sml29623 		boolean_t, uint8_t,
2293859Sml29623 		uint64_t, uint32_t);
2303859Sml29623 
2313859Sml29623 npi_status_t npi_txdma_desc_gather_sop_set(npi_handle_t,
2323859Sml29623 		p_tx_desc_t, boolean_t, uint8_t);
2333859Sml29623 
2343859Sml29623 npi_status_t npi_txdma_desc_gather_sop_set_1(npi_handle_t,
2353859Sml29623 		p_tx_desc_t, boolean_t, uint8_t,
2363859Sml29623 		uint32_t);
2373859Sml29623 
2383859Sml29623 npi_status_t npi_txdma_desc_set_xfer_len(npi_handle_t,
2393859Sml29623 		p_tx_desc_t, uint32_t);
2403859Sml29623 
2413859Sml29623 npi_status_t npi_txdma_desc_set_zero(npi_handle_t, uint16_t);
2423859Sml29623 npi_status_t npi_txdma_desc_mem_get(npi_handle_t, uint16_t,
2433859Sml29623 		p_tx_desc_t);
2443859Sml29623 npi_status_t npi_txdma_desc_kick_reg_set(npi_handle_t, uint8_t,
2453859Sml29623 		uint16_t, boolean_t);
2463859Sml29623 npi_status_t npi_txdma_desc_kick_reg_get(npi_handle_t, uint8_t,
2473859Sml29623 		p_tx_ring_kick_t);
2483859Sml29623 npi_status_t npi_txdma_ring_head_get(npi_handle_t, uint8_t,
2493859Sml29623 		p_tx_ring_hdl_t);
2503859Sml29623 npi_status_t npi_txdma_channel_mbox_get(npi_handle_t, uint8_t,
2513859Sml29623 		p_txdma_mailbox_t);
2523859Sml29623 npi_status_t npi_txdma_channel_pre_state_get(npi_handle_t,
2533859Sml29623 		uint8_t, p_tx_dma_pre_st_t);
2543859Sml29623 npi_status_t npi_txdma_ring_error_get(npi_handle_t,
2553859Sml29623 		uint8_t, p_txdma_ring_errlog_t);
2563859Sml29623 npi_status_t npi_txdma_inj_par_error_clear(npi_handle_t);
2573859Sml29623 npi_status_t npi_txdma_inj_par_error_set(npi_handle_t,
2583859Sml29623 		uint32_t);
2593859Sml29623 npi_status_t npi_txdma_inj_par_error_update(npi_handle_t,
2603859Sml29623 		uint32_t);
2613859Sml29623 npi_status_t npi_txdma_inj_par_error_get(npi_handle_t,
2623859Sml29623 		uint32_t *);
2633859Sml29623 npi_status_t npi_txdma_dbg_sel_set(npi_handle_t, uint8_t);
2643859Sml29623 npi_status_t npi_txdma_training_vector_set(npi_handle_t,
2653859Sml29623 		uint32_t);
2663859Sml29623 void npi_txdma_dump_desc_one(npi_handle_t, p_tx_desc_t,
2673859Sml29623 	int);
2683859Sml29623 npi_status_t npi_txdma_dump_tdc_regs(npi_handle_t, uint8_t);
2693859Sml29623 npi_status_t npi_txdma_dump_fzc_regs(npi_handle_t);
2703859Sml29623 npi_status_t npi_txdma_inj_int_error_set(npi_handle_t, uint8_t,
2713859Sml29623 	p_tdmc_intr_dbg_t);
2723859Sml29623 #ifdef	__cplusplus
2733859Sml29623 }
2743859Sml29623 #endif
2753859Sml29623 
2763859Sml29623 #endif	/* _NPI_TXDMA_H */
277