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