xref: /illumos-gate/usr/src/uts/common/io/nxge/nxge_fzc.c (revision 86ef0a63)
144961713Sgirish /*
244961713Sgirish  * CDDL HEADER START
344961713Sgirish  *
444961713Sgirish  * The contents of this file are subject to the terms of the
544961713Sgirish  * Common Development and Distribution License (the "License").
644961713Sgirish  * You may not use this file except in compliance with the License.
744961713Sgirish  *
844961713Sgirish  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
944961713Sgirish  * or http://www.opensolaris.org/os/licensing.
1044961713Sgirish  * See the License for the specific language governing permissions
1144961713Sgirish  * and limitations under the License.
1244961713Sgirish  *
1344961713Sgirish  * When distributing Covered Code, include this CDDL HEADER in each
1444961713Sgirish  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1544961713Sgirish  * If applicable, add the following below this CDDL HEADER, with the
1644961713Sgirish  * fields enclosed by brackets "[]" replaced with your own identifying
1744961713Sgirish  * information: Portions Copyright [yyyy] [name of copyright owner]
1844961713Sgirish  *
1944961713Sgirish  * CDDL HEADER END
2044961713Sgirish  */
214ba491f5SMichael Speer 
2244961713Sgirish /*
234ba491f5SMichael Speer  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
2444961713Sgirish  * Use is subject to license terms.
2544961713Sgirish  */
2644961713Sgirish 
2744961713Sgirish #include	<nxge_impl.h>
2844961713Sgirish #include	<npi_mac.h>
2944961713Sgirish #include	<npi_rxdma.h>
30678453a8Sspeer #include	<nxge_hio.h>
3144961713Sgirish 
3244961713Sgirish #if	defined(sun4v) && defined(NIU_LP_WORKAROUND)
3344961713Sgirish static int	nxge_herr2kerr(uint64_t);
344df55fdeSJanie Lu static uint64_t nxge_init_hv_fzc_lp_op(p_nxge_t, uint64_t,
354df55fdeSJanie Lu     uint64_t, uint64_t, uint64_t, uint64_t);
3644961713Sgirish #endif
3744961713Sgirish 
38678453a8Sspeer static nxge_status_t nxge_init_fzc_rdc_pages(p_nxge_t,
39678453a8Sspeer     uint16_t, dma_log_page_t *, dma_log_page_t *);
40678453a8Sspeer 
41678453a8Sspeer static nxge_status_t nxge_init_fzc_tdc_pages(p_nxge_t,
42678453a8Sspeer     uint16_t, dma_log_page_t *, dma_log_page_t *);
43678453a8Sspeer 
4444961713Sgirish /*
4544961713Sgirish  * The following interfaces are controlled by the
4644961713Sgirish  * function control registers. Some global registers
4744961713Sgirish  * are to be initialized by only byt one of the 2/4 functions.
4844961713Sgirish  * Use the test and set register.
4944961713Sgirish  */
5044961713Sgirish /*ARGSUSED*/
5144961713Sgirish nxge_status_t
nxge_test_and_set(p_nxge_t nxgep,uint8_t tas)5244961713Sgirish nxge_test_and_set(p_nxge_t nxgep, uint8_t tas)
5344961713Sgirish {
5444961713Sgirish 	npi_handle_t		handle;
5544961713Sgirish 	npi_status_t		rs = NPI_SUCCESS;
5644961713Sgirish 
5744961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
5844961713Sgirish 	if ((rs = npi_dev_func_sr_sr_get_set_clear(handle, tas))
5952ccf843Smisaki 	    != NPI_SUCCESS) {
6044961713Sgirish 		return (NXGE_ERROR | rs);
6144961713Sgirish 	}
6244961713Sgirish 
6344961713Sgirish 	return (NXGE_OK);
6444961713Sgirish }
6544961713Sgirish 
6644961713Sgirish nxge_status_t
nxge_set_fzc_multi_part_ctl(p_nxge_t nxgep,boolean_t mpc)6744961713Sgirish nxge_set_fzc_multi_part_ctl(p_nxge_t nxgep, boolean_t mpc)
6844961713Sgirish {
6944961713Sgirish 	npi_handle_t		handle;
7044961713Sgirish 	npi_status_t		rs = NPI_SUCCESS;
7144961713Sgirish 
7244961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "==> nxge_set_fzc_multi_part_ctl"));
7344961713Sgirish 
7444961713Sgirish 	/*
7544961713Sgirish 	 * In multi-partitioning, the partition manager
7644961713Sgirish 	 * who owns function zero should set this multi-partition
7744961713Sgirish 	 * control bit.
7844961713Sgirish 	 */
7944961713Sgirish 	if (nxgep->use_partition && nxgep->function_num) {
8044961713Sgirish 		return (NXGE_ERROR);
8144961713Sgirish 	}
8244961713Sgirish 
8344961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
8444961713Sgirish 	if ((rs = npi_fzc_mpc_set(handle, mpc)) != NPI_SUCCESS) {
8544961713Sgirish 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
8652ccf843Smisaki 		    "<== nxge_set_fzc_multi_part_ctl"));
8744961713Sgirish 		return (NXGE_ERROR | rs);
8844961713Sgirish 	}
8944961713Sgirish 
9044961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "<== nxge_set_fzc_multi_part_ctl"));
9144961713Sgirish 
9244961713Sgirish 	return (NXGE_OK);
9344961713Sgirish }
9444961713Sgirish 
9544961713Sgirish nxge_status_t
nxge_get_fzc_multi_part_ctl(p_nxge_t nxgep,boolean_t * mpc_p)9644961713Sgirish nxge_get_fzc_multi_part_ctl(p_nxge_t nxgep, boolean_t *mpc_p)
9744961713Sgirish {
9844961713Sgirish 	npi_handle_t		handle;
9944961713Sgirish 	npi_status_t		rs = NPI_SUCCESS;
10044961713Sgirish 
10144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "<== nxge_get_fzc_multi_part_ctl"));
10244961713Sgirish 
10344961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
10444961713Sgirish 	if ((rs = npi_fzc_mpc_get(handle, mpc_p)) != NPI_SUCCESS) {
10544961713Sgirish 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
10652ccf843Smisaki 		    "<== nxge_set_fzc_multi_part_ctl"));
10744961713Sgirish 		return (NXGE_ERROR | rs);
10844961713Sgirish 	}
10944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "<== nxge_get_fzc_multi_part_ctl"));
11044961713Sgirish 
11144961713Sgirish 	return (NXGE_OK);
11244961713Sgirish }
11344961713Sgirish 
11444961713Sgirish /*
11544961713Sgirish  * System interrupt registers that are under function zero
11644961713Sgirish  * management.
11744961713Sgirish  */
11844961713Sgirish nxge_status_t
nxge_fzc_intr_init(p_nxge_t nxgep)11944961713Sgirish nxge_fzc_intr_init(p_nxge_t nxgep)
12044961713Sgirish {
12144961713Sgirish 	nxge_status_t	status = NXGE_OK;
12244961713Sgirish 
12344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_fzc_intr_init"));
12444961713Sgirish 
12544961713Sgirish 	/* Configure the initial timer resolution */
12644961713Sgirish 	if ((status = nxge_fzc_intr_tmres_set(nxgep)) != NXGE_OK) {
12744961713Sgirish 		return (status);
12844961713Sgirish 	}
12944961713Sgirish 
1302e59129aSraghus 	if (NXGE_IS_VALID_NEPTUNE_TYPE(nxgep)) {
13144961713Sgirish 		/*
13244961713Sgirish 		 * Set up the logical device group's logical devices that
13344961713Sgirish 		 * the group owns.
13444961713Sgirish 		 */
13559ac0c16Sdavemq 		if ((status = nxge_fzc_intr_ldg_num_set(nxgep)) != NXGE_OK)
13659ac0c16Sdavemq 			goto fzc_intr_init_exit;
13744961713Sgirish 
13844961713Sgirish 		/* Configure the system interrupt data */
13959ac0c16Sdavemq 		if ((status = nxge_fzc_intr_sid_set(nxgep)) != NXGE_OK)
14059ac0c16Sdavemq 			goto fzc_intr_init_exit;
14144961713Sgirish 	}
14244961713Sgirish 
14359ac0c16Sdavemq fzc_intr_init_exit:
14459ac0c16Sdavemq 
14544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_fzc_intr_init"));
14644961713Sgirish 
14744961713Sgirish 	return (status);
14844961713Sgirish }
14944961713Sgirish 
15044961713Sgirish nxge_status_t
nxge_fzc_intr_ldg_num_set(p_nxge_t nxgep)15144961713Sgirish nxge_fzc_intr_ldg_num_set(p_nxge_t nxgep)
15244961713Sgirish {
15344961713Sgirish 	p_nxge_ldg_t	ldgp;
15444961713Sgirish 	p_nxge_ldv_t	ldvp;
15544961713Sgirish 	npi_handle_t	handle;
15644961713Sgirish 	int		i, j;
15744961713Sgirish 	npi_status_t	rs = NPI_SUCCESS;
15844961713Sgirish 
15944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_fzc_intr_ldg_num_set"));
16044961713Sgirish 
16144961713Sgirish 	if (nxgep->ldgvp == NULL) {
16244961713Sgirish 		return (NXGE_ERROR);
16344961713Sgirish 	}
16444961713Sgirish 
16544961713Sgirish 	ldgp = nxgep->ldgvp->ldgp;
16644961713Sgirish 	ldvp = nxgep->ldgvp->ldvp;
16744961713Sgirish 	if (ldgp == NULL || ldvp == NULL) {
16844961713Sgirish 		return (NXGE_ERROR);
16944961713Sgirish 	}
17044961713Sgirish 
17144961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
17244961713Sgirish 
17344961713Sgirish 	for (i = 0; i < nxgep->ldgvp->ldg_intrs; i++, ldgp++) {
17444961713Sgirish 		NXGE_DEBUG_MSG((nxgep, INT_CTL,
17552ccf843Smisaki 		    "==> nxge_fzc_intr_ldg_num_set "
17652ccf843Smisaki 		    "<== nxge_f(Neptune): # ldv %d "
17752ccf843Smisaki 		    "in group %d", ldgp->nldvs, ldgp->ldg));
17844961713Sgirish 
17944961713Sgirish 		for (j = 0; j < ldgp->nldvs; j++, ldvp++) {
18044961713Sgirish 			rs = npi_fzc_ldg_num_set(handle, ldvp->ldv,
18152ccf843Smisaki 			    ldvp->ldg_assigned);
18244961713Sgirish 			if (rs != NPI_SUCCESS) {
18344961713Sgirish 				NXGE_DEBUG_MSG((nxgep, INT_CTL,
18452ccf843Smisaki 				    "<== nxge_fzc_intr_ldg_num_set failed "
18552ccf843Smisaki 				    " rs 0x%x ldv %d ldg %d",
18652ccf843Smisaki 				    rs, ldvp->ldv, ldvp->ldg_assigned));
18744961713Sgirish 				return (NXGE_ERROR | rs);
18844961713Sgirish 			}
18944961713Sgirish 			NXGE_DEBUG_MSG((nxgep, INT_CTL,
19052ccf843Smisaki 			    "<== nxge_fzc_intr_ldg_num_set OK "
19152ccf843Smisaki 			    " ldv %d ldg %d",
19252ccf843Smisaki 			    ldvp->ldv, ldvp->ldg_assigned));
19344961713Sgirish 		}
19444961713Sgirish 	}
19544961713Sgirish 
19644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_fzc_intr_ldg_num_set"));
19744961713Sgirish 
19844961713Sgirish 	return (NXGE_OK);
19944961713Sgirish }
20044961713Sgirish 
20144961713Sgirish nxge_status_t
nxge_fzc_intr_tmres_set(p_nxge_t nxgep)20244961713Sgirish nxge_fzc_intr_tmres_set(p_nxge_t nxgep)
20344961713Sgirish {
20444961713Sgirish 	npi_handle_t	handle;
20544961713Sgirish 	npi_status_t	rs = NPI_SUCCESS;
20644961713Sgirish 
20744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_fzc_intr_tmrese_set"));
20844961713Sgirish 	if (nxgep->ldgvp == NULL) {
20944961713Sgirish 		return (NXGE_ERROR);
21044961713Sgirish 	}
21144961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
21244961713Sgirish 	if ((rs = npi_fzc_ldg_timer_res_set(handle, nxgep->ldgvp->tmres))) {
21344961713Sgirish 		return (NXGE_ERROR | rs);
21444961713Sgirish 	}
21544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_fzc_intr_tmrese_set"));
21644961713Sgirish 
21744961713Sgirish 	return (NXGE_OK);
21844961713Sgirish }
21944961713Sgirish 
22044961713Sgirish nxge_status_t
nxge_fzc_intr_sid_set(p_nxge_t nxgep)22144961713Sgirish nxge_fzc_intr_sid_set(p_nxge_t nxgep)
22244961713Sgirish {
22344961713Sgirish 	npi_handle_t	handle;
22444961713Sgirish 	p_nxge_ldg_t	ldgp;
22544961713Sgirish 	fzc_sid_t	sid;
22644961713Sgirish 	int		i;
22744961713Sgirish 	npi_status_t	rs = NPI_SUCCESS;
22844961713Sgirish 
22944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "==> nxge_fzc_intr_sid_set"));
23044961713Sgirish 	if (nxgep->ldgvp == NULL) {
23144961713Sgirish 		NXGE_DEBUG_MSG((nxgep, INT_CTL,
23252ccf843Smisaki 		    "<== nxge_fzc_intr_sid_set: no ldg"));
23344961713Sgirish 		return (NXGE_ERROR);
23444961713Sgirish 	}
23544961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
23644961713Sgirish 	ldgp = nxgep->ldgvp->ldgp;
23744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL,
23852ccf843Smisaki 	    "==> nxge_fzc_intr_sid_set: #int %d", nxgep->ldgvp->ldg_intrs));
23944961713Sgirish 	for (i = 0; i < nxgep->ldgvp->ldg_intrs; i++, ldgp++) {
24044961713Sgirish 		sid.ldg = ldgp->ldg;
24144961713Sgirish 		sid.niu = B_FALSE;
24244961713Sgirish 		sid.func = ldgp->func;
24344961713Sgirish 		sid.vector = ldgp->vector;
24444961713Sgirish 		NXGE_DEBUG_MSG((nxgep, INT_CTL,
24552ccf843Smisaki 		    "==> nxge_fzc_intr_sid_set(%d): func %d group %d "
24652ccf843Smisaki 		    "vector %d",
24752ccf843Smisaki 		    i, sid.func, sid.ldg, sid.vector));
24844961713Sgirish 		rs = npi_fzc_sid_set(handle, sid);
24944961713Sgirish 		if (rs != NPI_SUCCESS) {
25044961713Sgirish 			NXGE_DEBUG_MSG((nxgep, INT_CTL,
25152ccf843Smisaki 			    "<== nxge_fzc_intr_sid_set:failed 0x%x",
25252ccf843Smisaki 			    rs));
25344961713Sgirish 			return (NXGE_ERROR | rs);
25444961713Sgirish 		}
25544961713Sgirish 	}
25644961713Sgirish 
25744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, INT_CTL, "<== nxge_fzc_intr_sid_set"));
25844961713Sgirish 
25944961713Sgirish 	return (NXGE_OK);
26044961713Sgirish 
26144961713Sgirish }
26244961713Sgirish 
26344961713Sgirish /*
264678453a8Sspeer  * nxge_init_fzc_rdc
265678453a8Sspeer  *
266678453a8Sspeer  *	Initialize all of a RDC's FZC_DMC registers.
267678453a8Sspeer  *	This is executed by the service domain, on behalf of a
268678453a8Sspeer  *	guest domain, who cannot access these registers.
269678453a8Sspeer  *
270678453a8Sspeer  * Arguments:
271*86ef0a63SRichard Lowe  *	nxgep
272*86ef0a63SRichard Lowe  *	channel		The channel to initialize.
273678453a8Sspeer  *
274678453a8Sspeer  * NPI_NXGE function calls:
275678453a8Sspeer  *	nxge_init_fzc_rdc_pages()
276678453a8Sspeer  *
277678453a8Sspeer  * Context:
278678453a8Sspeer  *	Service Domain
27944961713Sgirish  */
28044961713Sgirish /*ARGSUSED*/
28144961713Sgirish nxge_status_t
nxge_init_fzc_rdc(p_nxge_t nxgep,uint16_t channel)282678453a8Sspeer nxge_init_fzc_rdc(p_nxge_t nxgep, uint16_t channel)
28344961713Sgirish {
28444961713Sgirish 	nxge_status_t	status = NXGE_OK;
285678453a8Sspeer 
286678453a8Sspeer 	dma_log_page_t	page1, page2;
287678453a8Sspeer 	npi_handle_t	handle;
288678453a8Sspeer 	rdc_red_para_t	red;
289678453a8Sspeer 
290678453a8Sspeer 	/*
291678453a8Sspeer 	 * Initialize the RxDMA channel-specific FZC control
292678453a8Sspeer 	 * registers.
293678453a8Sspeer 	 */
294678453a8Sspeer 
295678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "==> nxge_init_fzc_tdc"));
296678453a8Sspeer 
297678453a8Sspeer 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
298678453a8Sspeer 
299678453a8Sspeer 	/* Reset RXDMA channel */
300678453a8Sspeer 	status = npi_rxdma_cfg_rdc_reset(handle, channel);
301678453a8Sspeer 	if (status != NPI_SUCCESS) {
302678453a8Sspeer 		NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
303678453a8Sspeer 		    "==> nxge_init_fzc_rdc: npi_rxdma_cfg_rdc_reset(%d) "
304678453a8Sspeer 		    "returned 0x%08x", channel, status));
305678453a8Sspeer 		return (NXGE_ERROR | status);
306678453a8Sspeer 	}
307678453a8Sspeer 
308678453a8Sspeer 	/*
309678453a8Sspeer 	 * These values have been copied from
310678453a8Sspeer 	 * nxge_txdma.c:nxge_map_txdma_channel_cfg_ring().
311678453a8Sspeer 	 */
312678453a8Sspeer 	page1.page_num = 0;
313678453a8Sspeer 	page1.valid = 1;
314678453a8Sspeer 	page1.func_num = nxgep->function_num;
315678453a8Sspeer 	page1.mask = 0;
316678453a8Sspeer 	page1.value = 0;
317678453a8Sspeer 	page1.reloc = 0;
318678453a8Sspeer 
319678453a8Sspeer 	page2.page_num = 1;
320678453a8Sspeer 	page2.valid = 1;
321678453a8Sspeer 	page2.func_num = nxgep->function_num;
322678453a8Sspeer 	page2.mask = 0;
323678453a8Sspeer 	page2.value = 0;
324678453a8Sspeer 	page2.reloc = 0;
325678453a8Sspeer 
326678453a8Sspeer 	if (nxgep->niu_type == N2_NIU) {
327678453a8Sspeer #if !defined(NIU_HV_WORKAROUND)
328678453a8Sspeer 		status = NXGE_OK;
329678453a8Sspeer #else
330678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, RX_CTL,
331678453a8Sspeer 		    "==> nxge_init_fzc_rxdma_channel: N2_NIU - NEED to "
332678453a8Sspeer 		    "set up logical pages"));
333678453a8Sspeer 		/* Initialize the RXDMA logical pages */
334678453a8Sspeer 		status = nxge_init_fzc_rdc_pages(nxgep, channel,
335678453a8Sspeer 		    &page1, &page2);
336678453a8Sspeer 		if (status != NXGE_OK) {
337678453a8Sspeer 			return (status);
338678453a8Sspeer 		}
339678453a8Sspeer #endif
340678453a8Sspeer 	} else if (NXGE_IS_VALID_NEPTUNE_TYPE(nxgep)) {
341678453a8Sspeer 		/* Initialize the RXDMA logical pages */
342678453a8Sspeer 		status = nxge_init_fzc_rdc_pages(nxgep, channel,
343678453a8Sspeer 		    &page1, &page2);
344678453a8Sspeer 		if (status != NXGE_OK) {
345678453a8Sspeer 			return (status);
346678453a8Sspeer 		}
347678453a8Sspeer 	} else {
348678453a8Sspeer 		return (NXGE_ERROR);
349678453a8Sspeer 	}
350678453a8Sspeer 
351678453a8Sspeer 	/*
352678453a8Sspeer 	 * Configure RED parameters
353678453a8Sspeer 	 */
354678453a8Sspeer 	red.value = 0;
355678453a8Sspeer 	red.bits.ldw.win = RXDMA_RED_WINDOW_DEFAULT;
356678453a8Sspeer 	red.bits.ldw.thre =
357678453a8Sspeer 	    (nxgep->nxge_port_rcr_size - RXDMA_RED_LESS_ENTRIES);
358678453a8Sspeer 	red.bits.ldw.win_syn = RXDMA_RED_WINDOW_DEFAULT;
359678453a8Sspeer 	red.bits.ldw.thre_sync =
360678453a8Sspeer 	    (nxgep->nxge_port_rcr_size - RXDMA_RED_LESS_ENTRIES);
361678453a8Sspeer 
362678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
36352ccf843Smisaki 	    "==> nxge_init_fzc_rxdma_channel_red(thre_sync %d(%x))",
36452ccf843Smisaki 	    red.bits.ldw.thre_sync,
36552ccf843Smisaki 	    red.bits.ldw.thre_sync));
366678453a8Sspeer 
367678453a8Sspeer 	status |= npi_rxdma_cfg_wred_param(handle, channel, &red);
368678453a8Sspeer 
369678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "<== nxge_init_fzc_rdc"));
370678453a8Sspeer 
371678453a8Sspeer 	return (status);
372678453a8Sspeer }
373678453a8Sspeer 
374678453a8Sspeer /*
375678453a8Sspeer  * nxge_init_fzc_rxdma_channel
376678453a8Sspeer  *
377678453a8Sspeer  *	Initialize all per-channel FZC_DMC registers.
378678453a8Sspeer  *
379678453a8Sspeer  * Arguments:
380*86ef0a63SRichard Lowe  *	nxgep
381*86ef0a63SRichard Lowe  *	channel		The channel to start
382678453a8Sspeer  *
383678453a8Sspeer  * NPI_NXGE function calls:
384678453a8Sspeer  *	nxge_init_hv_fzc_rxdma_channel_pages()
385678453a8Sspeer  *	nxge_init_fzc_rxdma_channel_pages()
386678453a8Sspeer  *	nxge_init_fzc_rxdma_channel_red()
387678453a8Sspeer  *
388678453a8Sspeer  * Context:
389678453a8Sspeer  *	Service Domain
390678453a8Sspeer  */
391678453a8Sspeer /*ARGSUSED*/
392678453a8Sspeer nxge_status_t
nxge_init_fzc_rxdma_channel(p_nxge_t nxgep,uint16_t channel)393678453a8Sspeer nxge_init_fzc_rxdma_channel(p_nxge_t nxgep, uint16_t channel)
394678453a8Sspeer {
395678453a8Sspeer 	rx_rbr_ring_t		*rbr_ring;
396678453a8Sspeer 	rx_rcr_ring_t		*rcr_ring;
397678453a8Sspeer 
398678453a8Sspeer 	nxge_status_t		status = NXGE_OK;
399678453a8Sspeer 
40044961713Sgirish 	NXGE_DEBUG_MSG((nxgep, RX_CTL, "==> nxge_init_fzc_rxdma_channel"));
40144961713Sgirish 
402678453a8Sspeer 	rbr_ring = nxgep->rx_rbr_rings->rbr_rings[channel];
403678453a8Sspeer 	rcr_ring = nxgep->rx_rcr_rings->rcr_rings[channel];
404678453a8Sspeer 
40559ac0c16Sdavemq 	if (nxgep->niu_type == N2_NIU) {
40644961713Sgirish #ifndef	NIU_HV_WORKAROUND
40744961713Sgirish #if	defined(sun4v) && defined(NIU_LP_WORKAROUND)
40844961713Sgirish 		NXGE_DEBUG_MSG((nxgep, RX_CTL,
40959ac0c16Sdavemq 		    "==> nxge_init_fzc_rxdma_channel: N2_NIU - call HV "
41059ac0c16Sdavemq 		    "set up logical pages"));
41144961713Sgirish 		/* Initialize the RXDMA logical pages */
41244961713Sgirish 		status = nxge_init_hv_fzc_rxdma_channel_pages(nxgep, channel,
413678453a8Sspeer 		    rbr_ring);
41444961713Sgirish 		if (status != NXGE_OK) {
41544961713Sgirish 			return (status);
41644961713Sgirish 		}
41744961713Sgirish #endif
41859ac0c16Sdavemq 		status = NXGE_OK;
41944961713Sgirish #else
42044961713Sgirish 		NXGE_DEBUG_MSG((nxgep, RX_CTL,
42159ac0c16Sdavemq 		    "==> nxge_init_fzc_rxdma_channel: N2_NIU - NEED to "
42259ac0c16Sdavemq 		    "set up logical pages"));
42344961713Sgirish 		/* Initialize the RXDMA logical pages */
42444961713Sgirish 		status = nxge_init_fzc_rxdma_channel_pages(nxgep, channel,
425678453a8Sspeer 		    rbr_ring);
42644961713Sgirish 		if (status != NXGE_OK) {
42744961713Sgirish 			return (status);
42844961713Sgirish 		}
42944961713Sgirish #endif
4302e59129aSraghus 	} else if (NXGE_IS_VALID_NEPTUNE_TYPE(nxgep)) {
43159ac0c16Sdavemq 		/* Initialize the RXDMA logical pages */
43259ac0c16Sdavemq 		status = nxge_init_fzc_rxdma_channel_pages(nxgep,
433678453a8Sspeer 		    channel, rbr_ring);
43459ac0c16Sdavemq 		if (status != NXGE_OK) {
43559ac0c16Sdavemq 			return (status);
43659ac0c16Sdavemq 		}
43759ac0c16Sdavemq 	} else {
43859ac0c16Sdavemq 		return (NXGE_ERROR);
43944961713Sgirish 	}
44044961713Sgirish 
44144961713Sgirish 	/* Configure RED parameters */
442678453a8Sspeer 	status = nxge_init_fzc_rxdma_channel_red(nxgep, channel, rcr_ring);
44344961713Sgirish 
44444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, RX_CTL, "<== nxge_init_fzc_rxdma_channel"));
44544961713Sgirish 	return (status);
44644961713Sgirish }
44744961713Sgirish 
448678453a8Sspeer /*
449678453a8Sspeer  * nxge_init_fzc_rdc_pages
450678453a8Sspeer  *
451678453a8Sspeer  *	Configure a TDC's logical pages.
452678453a8Sspeer  *
453678453a8Sspeer  *	This function is executed by the service domain, on behalf of
454678453a8Sspeer  *	a guest domain, to whom this RDC has been loaned.
455678453a8Sspeer  *
456678453a8Sspeer  * Arguments:
457*86ef0a63SRichard Lowe  *	nxgep
458*86ef0a63SRichard Lowe  *	channel		The channel to initialize.
459*86ef0a63SRichard Lowe  *	page0		Logical page 0 definition.
460*86ef0a63SRichard Lowe  *	page1		Logical page 1 definition.
461678453a8Sspeer  *
462678453a8Sspeer  * Notes:
463678453a8Sspeer  *	I think that this function can be called from any
464678453a8Sspeer  *	domain, but I need to check.
465678453a8Sspeer  *
466678453a8Sspeer  * NPI/NXGE function calls:
467678453a8Sspeer  *	hv_niu_tx_logical_page_conf()
468678453a8Sspeer  *	hv_niu_tx_logical_page_info()
469678453a8Sspeer  *
470678453a8Sspeer  * Context:
471678453a8Sspeer  *	Any domain
472678453a8Sspeer  */
473678453a8Sspeer nxge_status_t
nxge_init_fzc_rdc_pages(p_nxge_t nxgep,uint16_t channel,dma_log_page_t * page0,dma_log_page_t * page1)474678453a8Sspeer nxge_init_fzc_rdc_pages(
475678453a8Sspeer 	p_nxge_t nxgep,
476678453a8Sspeer 	uint16_t channel,
477678453a8Sspeer 	dma_log_page_t *page0,
478678453a8Sspeer 	dma_log_page_t *page1)
479678453a8Sspeer {
480678453a8Sspeer 	npi_handle_t handle;
481678453a8Sspeer 	npi_status_t rs;
482678453a8Sspeer 
483678453a8Sspeer 	uint64_t page_handle;
484678453a8Sspeer 
485678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
48652ccf843Smisaki 	    "==> nxge_init_fzc_txdma_channel_pages"));
487678453a8Sspeer 
488678453a8Sspeer #ifndef	NIU_HV_WORKAROUND
489678453a8Sspeer 	if (nxgep->niu_type == N2_NIU) {
490678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
49152ccf843Smisaki 		    "<== nxge_init_fzc_rdc_pages: "
49252ccf843Smisaki 		    "N2_NIU: no need to set rxdma logical pages"));
493678453a8Sspeer 		return (NXGE_OK);
494678453a8Sspeer 	}
495678453a8Sspeer #else
496678453a8Sspeer 	if (nxgep->niu_type == N2_NIU) {
497678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
49852ccf843Smisaki 		    "<== nxge_init_fzc_rdc_pages: "
49952ccf843Smisaki 		    "N2_NIU: NEED to set rxdma logical pages"));
500678453a8Sspeer 	}
501678453a8Sspeer #endif
502678453a8Sspeer 
503678453a8Sspeer 	/*
504678453a8Sspeer 	 * Initialize logical page 1.
505678453a8Sspeer 	 */
506678453a8Sspeer 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
507678453a8Sspeer 	if ((rs = npi_rxdma_cfg_logical_page(handle, channel, page0))
508678453a8Sspeer 	    != NPI_SUCCESS)
509678453a8Sspeer 		return (NXGE_ERROR | rs);
510678453a8Sspeer 
511678453a8Sspeer 	/*
512678453a8Sspeer 	 * Initialize logical page 2.
513678453a8Sspeer 	 */
514678453a8Sspeer 	if ((rs = npi_rxdma_cfg_logical_page(handle, channel, page1))
515678453a8Sspeer 	    != NPI_SUCCESS)
516678453a8Sspeer 		return (NXGE_ERROR | rs);
517678453a8Sspeer 
518678453a8Sspeer 	/*
519678453a8Sspeer 	 * Initialize the page handle.
520678453a8Sspeer 	 * (In the current driver, this is always set to 0.)
521678453a8Sspeer 	 */
522678453a8Sspeer 	page_handle = 0;
523678453a8Sspeer 	rs = npi_rxdma_cfg_logical_page_handle(handle, channel, page_handle);
524678453a8Sspeer 	if (rs == NPI_SUCCESS) {
525678453a8Sspeer 		return (NXGE_OK);
526678453a8Sspeer 	} else {
527678453a8Sspeer 		return (NXGE_ERROR | rs);
528678453a8Sspeer 	}
529678453a8Sspeer }
530678453a8Sspeer 
53144961713Sgirish /*ARGSUSED*/
53244961713Sgirish nxge_status_t
nxge_init_fzc_rxdma_channel_pages(p_nxge_t nxgep,uint16_t channel,p_rx_rbr_ring_t rbrp)53344961713Sgirish nxge_init_fzc_rxdma_channel_pages(p_nxge_t nxgep,
534*86ef0a63SRichard Lowe     uint16_t channel, p_rx_rbr_ring_t rbrp)
53544961713Sgirish {
53644961713Sgirish 	npi_handle_t		handle;
53744961713Sgirish 	dma_log_page_t		cfg;
53844961713Sgirish 	npi_status_t		rs = NPI_SUCCESS;
53944961713Sgirish 
54044961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
54152ccf843Smisaki 	    "==> nxge_init_fzc_rxdma_channel_pages"));
54244961713Sgirish 
54344961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
54444961713Sgirish 	/*
54544961713Sgirish 	 * Initialize logical page 1.
54644961713Sgirish 	 */
54744961713Sgirish 	cfg.func_num = nxgep->function_num;
54844961713Sgirish 	cfg.page_num = 0;
54944961713Sgirish 	cfg.valid = rbrp->page_valid.bits.ldw.page0;
55044961713Sgirish 	cfg.value = rbrp->page_value_1.value;
55144961713Sgirish 	cfg.mask = rbrp->page_mask_1.value;
55244961713Sgirish 	cfg.reloc = rbrp->page_reloc_1.value;
55344961713Sgirish 	rs = npi_rxdma_cfg_logical_page(handle, channel,
55452ccf843Smisaki 	    (p_dma_log_page_t)&cfg);
55544961713Sgirish 	if (rs != NPI_SUCCESS) {
55644961713Sgirish 		return (NXGE_ERROR | rs);
55744961713Sgirish 	}
55844961713Sgirish 
55944961713Sgirish 	/*
56044961713Sgirish 	 * Initialize logical page 2.
56144961713Sgirish 	 */
56244961713Sgirish 	cfg.page_num = 1;
56344961713Sgirish 	cfg.valid = rbrp->page_valid.bits.ldw.page1;
56444961713Sgirish 	cfg.value = rbrp->page_value_2.value;
56544961713Sgirish 	cfg.mask = rbrp->page_mask_2.value;
56644961713Sgirish 	cfg.reloc = rbrp->page_reloc_2.value;
56744961713Sgirish 
56844961713Sgirish 	rs = npi_rxdma_cfg_logical_page(handle, channel, &cfg);
56944961713Sgirish 	if (rs != NPI_SUCCESS) {
57044961713Sgirish 		return (NXGE_ERROR | rs);
57144961713Sgirish 	}
57244961713Sgirish 
57344961713Sgirish 	/* Initialize the page handle */
57444961713Sgirish 	rs = npi_rxdma_cfg_logical_page_handle(handle, channel,
57552ccf843Smisaki 	    rbrp->page_hdl.bits.ldw.handle);
57644961713Sgirish 
57744961713Sgirish 	if (rs != NPI_SUCCESS) {
57844961713Sgirish 		return (NXGE_ERROR | rs);
57944961713Sgirish 	}
58044961713Sgirish 
58144961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
58252ccf843Smisaki 	    "<== nxge_init_fzc_rxdma_channel_pages"));
58344961713Sgirish 
58444961713Sgirish 	return (NXGE_OK);
58544961713Sgirish }
58644961713Sgirish 
58744961713Sgirish /*ARGSUSED*/
58844961713Sgirish nxge_status_t
nxge_init_fzc_rxdma_channel_red(p_nxge_t nxgep,uint16_t channel,p_rx_rcr_ring_t rcr_p)58944961713Sgirish nxge_init_fzc_rxdma_channel_red(p_nxge_t nxgep,
590*86ef0a63SRichard Lowe     uint16_t channel, p_rx_rcr_ring_t rcr_p)
59144961713Sgirish {
59244961713Sgirish 	npi_handle_t		handle;
59344961713Sgirish 	rdc_red_para_t		red;
59444961713Sgirish 	npi_status_t		rs = NPI_SUCCESS;
59544961713Sgirish 
59644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "==> nxge_init_fzc_rxdma_channel_red"));
59744961713Sgirish 
59844961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
59944961713Sgirish 	red.value = 0;
60044961713Sgirish 	red.bits.ldw.win = RXDMA_RED_WINDOW_DEFAULT;
60144961713Sgirish 	red.bits.ldw.thre = (rcr_p->comp_size - RXDMA_RED_LESS_ENTRIES);
60244961713Sgirish 	red.bits.ldw.win_syn = RXDMA_RED_WINDOW_DEFAULT;
60344961713Sgirish 	red.bits.ldw.thre_sync = (rcr_p->comp_size - RXDMA_RED_LESS_ENTRIES);
60444961713Sgirish 
60544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
60652ccf843Smisaki 	    "==> nxge_init_fzc_rxdma_channel_red(thre_sync %d(%x))",
60752ccf843Smisaki 	    red.bits.ldw.thre_sync,
60852ccf843Smisaki 	    red.bits.ldw.thre_sync));
60944961713Sgirish 
61044961713Sgirish 	rs = npi_rxdma_cfg_wred_param(handle, channel, &red);
61144961713Sgirish 	if (rs != NPI_SUCCESS) {
61244961713Sgirish 		return (NXGE_ERROR | rs);
61344961713Sgirish 	}
61444961713Sgirish 
61544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
61652ccf843Smisaki 	    "<== nxge_init_fzc_rxdma_channel_red"));
61744961713Sgirish 
61844961713Sgirish 	return (NXGE_OK);
61944961713Sgirish }
62044961713Sgirish 
621678453a8Sspeer /*
622678453a8Sspeer  * nxge_init_fzc_tdc
623678453a8Sspeer  *
624678453a8Sspeer  *	Initialize all of a TDC's FZC_DMC registers.
625678453a8Sspeer  *	This is executed by the service domain, on behalf of a
626678453a8Sspeer  *	guest domain, who cannot access these registers.
627678453a8Sspeer  *
628678453a8Sspeer  * Arguments:
629*86ef0a63SRichard Lowe  *	nxgep
630*86ef0a63SRichard Lowe  *	channel		The channel to initialize.
631678453a8Sspeer  *
632678453a8Sspeer  * NPI_NXGE function calls:
633678453a8Sspeer  *	nxge_init_fzc_tdc_pages()
634678453a8Sspeer  *	npi_txc_dma_max_burst_set()
635678453a8Sspeer  *
636678453a8Sspeer  * Registers accessed:
637678453a8Sspeer  *	TXC_DMA_MAX_BURST
638678453a8Sspeer  *
639678453a8Sspeer  * Context:
640678453a8Sspeer  *	Service Domain
641678453a8Sspeer  */
642678453a8Sspeer /*ARGSUSED*/
643678453a8Sspeer nxge_status_t
nxge_init_fzc_tdc(p_nxge_t nxgep,uint16_t channel)644678453a8Sspeer nxge_init_fzc_tdc(p_nxge_t nxgep, uint16_t channel)
645678453a8Sspeer {
646678453a8Sspeer 	nxge_status_t	status = NXGE_OK;
647678453a8Sspeer 
648678453a8Sspeer 	dma_log_page_t	page1, page2;
649678453a8Sspeer 	npi_handle_t	handle;
650678453a8Sspeer 
651678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "==> nxge_init_fzc_tdc"));
652678453a8Sspeer 
653678453a8Sspeer 	/*
654678453a8Sspeer 	 * These values have been copied from
655678453a8Sspeer 	 * nxge_txdma.c:nxge_map_txdma_channel_cfg_ring().
656678453a8Sspeer 	 */
657678453a8Sspeer 	page1.page_num = 0;
658678453a8Sspeer 	page1.valid = 1;
659678453a8Sspeer 	page1.func_num = nxgep->function_num;
660678453a8Sspeer 	page1.mask = 0;
661678453a8Sspeer 	page1.value = 0;
662678453a8Sspeer 	page1.reloc = 0;
663678453a8Sspeer 
664678453a8Sspeer 	page1.page_num = 1;
665678453a8Sspeer 	page1.valid = 1;
666678453a8Sspeer 	page1.func_num = nxgep->function_num;
667678453a8Sspeer 	page1.mask = 0;
668678453a8Sspeer 	page1.value = 0;
669678453a8Sspeer 	page1.reloc = 0;
670678453a8Sspeer 
671678453a8Sspeer #ifdef	NIU_HV_WORKAROUND
672678453a8Sspeer 	if (nxgep->niu_type == N2_NIU) {
673678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
674678453a8Sspeer 		    "==> nxge_init_fzc_txdma_channel "
675678453a8Sspeer 		    "N2_NIU: NEED to set up txdma logical pages"));
676678453a8Sspeer 		/* Initialize the TXDMA logical pages */
677678453a8Sspeer 		(void) nxge_init_fzc_tdc_pages(nxgep, channel,
678678453a8Sspeer 		    &page1, &page2);
679678453a8Sspeer 	}
680678453a8Sspeer #endif
681678453a8Sspeer 	if (nxgep->niu_type != N2_NIU) {
682678453a8Sspeer 		if (NXGE_IS_VALID_NEPTUNE_TYPE(nxgep)) {
683678453a8Sspeer 			/* Initialize the TXDMA logical pages */
684678453a8Sspeer 			(void) nxge_init_fzc_tdc_pages(nxgep, channel,
685678453a8Sspeer 			    &page1, &page2);
686678453a8Sspeer 		} else
687678453a8Sspeer 			return (NXGE_ERROR);
688678453a8Sspeer 	}
689678453a8Sspeer 
690678453a8Sspeer 	/*
691678453a8Sspeer 	 * Configure the TXC DMA Max Burst value.
692678453a8Sspeer 	 *
693678453a8Sspeer 	 * PRM.13.5
694678453a8Sspeer 	 *
695678453a8Sspeer 	 * TXC DMA Max Burst. TXC_DMA_MAX (FZC_TXC + 0000016)
696678453a8Sspeer 	 * 19:0		dma_max_burst		RW
697678453a8Sspeer 	 * Max burst value associated with DMA. Used by DRR engine
698678453a8Sspeer 	 * for computing when DMA has gone into deficit.
699678453a8Sspeer 	 */
700678453a8Sspeer 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
701678453a8Sspeer 	(void) npi_txc_dma_max_burst_set(
70252ccf843Smisaki 	    handle, channel, TXC_DMA_MAX_BURST_DEFAULT);
703678453a8Sspeer 
704678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "<== nxge_init_fzc_tdc"));
705678453a8Sspeer 
706678453a8Sspeer 	return (status);
707678453a8Sspeer }
708678453a8Sspeer 
70944961713Sgirish /*ARGSUSED*/
71044961713Sgirish nxge_status_t
nxge_init_fzc_txdma_channel(p_nxge_t nxgep,uint16_t channel,p_tx_ring_t tx_ring_p,p_tx_mbox_t mbox_p)71144961713Sgirish nxge_init_fzc_txdma_channel(p_nxge_t nxgep, uint16_t channel,
712*86ef0a63SRichard Lowe     p_tx_ring_t tx_ring_p, p_tx_mbox_t mbox_p)
71344961713Sgirish {
71444961713Sgirish 	nxge_status_t	status = NXGE_OK;
71544961713Sgirish 
71644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
71752ccf843Smisaki 	    "==> nxge_init_fzc_txdma_channel"));
71844961713Sgirish 
71959ac0c16Sdavemq 	if (nxgep->niu_type == N2_NIU) {
72044961713Sgirish #ifndef	NIU_HV_WORKAROUND
72144961713Sgirish #if	defined(sun4v) && defined(NIU_LP_WORKAROUND)
72244961713Sgirish 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
72359ac0c16Sdavemq 		    "==> nxge_init_fzc_txdma_channel "
72459ac0c16Sdavemq 		    "N2_NIU: call HV to set up txdma logical pages"));
72544961713Sgirish 		status = nxge_init_hv_fzc_txdma_channel_pages(nxgep, channel,
72659ac0c16Sdavemq 		    tx_ring_p);
72744961713Sgirish 		if (status != NXGE_OK) {
72844961713Sgirish 			return (status);
72944961713Sgirish 		}
73044961713Sgirish #endif
73159ac0c16Sdavemq 		status = NXGE_OK;
73244961713Sgirish #else
73344961713Sgirish 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
73459ac0c16Sdavemq 		    "==> nxge_init_fzc_txdma_channel "
73559ac0c16Sdavemq 		    "N2_NIU: NEED to set up txdma logical pages"));
73644961713Sgirish 		/* Initialize the TXDMA logical pages */
73744961713Sgirish 		(void) nxge_init_fzc_txdma_channel_pages(nxgep, channel,
73859ac0c16Sdavemq 		    tx_ring_p);
73944961713Sgirish #endif
7402e59129aSraghus 	} else if (NXGE_IS_VALID_NEPTUNE_TYPE(nxgep)) {
74159ac0c16Sdavemq 		/* Initialize the TXDMA logical pages */
74259ac0c16Sdavemq 		(void) nxge_init_fzc_txdma_channel_pages(nxgep,
74359ac0c16Sdavemq 		    channel, tx_ring_p);
74459ac0c16Sdavemq 	} else {
74559ac0c16Sdavemq 		return (NXGE_ERROR);
74644961713Sgirish 	}
74744961713Sgirish 
74844961713Sgirish 	/*
74944961713Sgirish 	 * Configure Transmit DRR Weight parameters
75044961713Sgirish 	 * (It actually programs the TXC max burst register).
75144961713Sgirish 	 */
75244961713Sgirish 	(void) nxge_init_fzc_txdma_channel_drr(nxgep, channel, tx_ring_p);
75344961713Sgirish 
75444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
75552ccf843Smisaki 	    "<== nxge_init_fzc_txdma_channel"));
75644961713Sgirish 	return (status);
75744961713Sgirish }
75844961713Sgirish 
75944961713Sgirish 
76044961713Sgirish nxge_status_t
nxge_init_fzc_rx_common(p_nxge_t nxgep)76144961713Sgirish nxge_init_fzc_rx_common(p_nxge_t nxgep)
76244961713Sgirish {
76344961713Sgirish 	npi_handle_t	handle;
76444961713Sgirish 	npi_status_t	rs = NPI_SUCCESS;
76544961713Sgirish 	nxge_status_t	status = NXGE_OK;
7664ba491f5SMichael Speer 	nxge_rdc_grp_t	*rdc_grp_p;
76744961713Sgirish 	clock_t		lbolt;
768678453a8Sspeer 	int		table;
769678453a8Sspeer 
770678453a8Sspeer 	nxge_hw_pt_cfg_t *hardware;
77144961713Sgirish 
77244961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "==> nxge_init_fzc_rx_common"));
77344961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
77444961713Sgirish 	if (!handle.regp) {
77544961713Sgirish 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
77652ccf843Smisaki 		    "==> nxge_init_fzc_rx_common null ptr"));
77744961713Sgirish 		return (NXGE_ERROR);
77844961713Sgirish 	}
77944961713Sgirish 
78044961713Sgirish 	/*
78144961713Sgirish 	 * Configure the rxdma clock divider
78244961713Sgirish 	 * This is the granularity counter based on
78344961713Sgirish 	 * the hardware system clock (i.e. 300 Mhz) and
78444961713Sgirish 	 * it is running around 3 nanoseconds.
78544961713Sgirish 	 * So, set the clock divider counter to 1000 to get
78644961713Sgirish 	 * microsecond granularity.
78744961713Sgirish 	 * For example, for a 3 microsecond timeout, the timeout
78844961713Sgirish 	 * will be set to 1.
78944961713Sgirish 	 */
79044961713Sgirish 	rs = npi_rxdma_cfg_clock_div_set(handle, RXDMA_CK_DIV_DEFAULT);
79144961713Sgirish 	if (rs != NPI_SUCCESS)
79244961713Sgirish 		return (NXGE_ERROR | rs);
79344961713Sgirish 
79444961713Sgirish 
79544961713Sgirish 	/*
79644961713Sgirish 	 * Enable WRED and program an initial value.
79744961713Sgirish 	 * Use time to set the initial random number.
79844961713Sgirish 	 */
79944961713Sgirish 	(void) drv_getparm(LBOLT, &lbolt);
80044961713Sgirish 	rs = npi_rxdma_cfg_red_rand_init(handle, (uint16_t)lbolt);
80144961713Sgirish 	if (rs != NPI_SUCCESS)
80244961713Sgirish 		return (NXGE_ERROR | rs);
80344961713Sgirish 
804678453a8Sspeer 	hardware = &nxgep->pt_config.hw_config;
805678453a8Sspeer 	for (table = 0; table < NXGE_MAX_RDC_GRPS; table++) {
806678453a8Sspeer 		/* Does this table belong to <nxgep>? */
8074ba491f5SMichael Speer 		if (hardware->grpids[table] == (nxgep->function_num + 256)) {
8084ba491f5SMichael Speer 			rdc_grp_p = &nxgep->pt_config.rdc_grps[table];
8094ba491f5SMichael Speer 			status = nxge_init_fzc_rdc_tbl(nxgep, rdc_grp_p, table);
8104ba491f5SMichael Speer 		}
811678453a8Sspeer 	}
81244961713Sgirish 
81344961713Sgirish 	/* Ethernet Timeout Counter (?) */
81444961713Sgirish 
81544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
81652ccf843Smisaki 	    "<== nxge_init_fzc_rx_common:status 0x%08x", status));
81744961713Sgirish 
81844961713Sgirish 	return (status);
81944961713Sgirish }
82044961713Sgirish 
82144961713Sgirish nxge_status_t
nxge_init_fzc_rdc_tbl(p_nxge_t nxge,nxge_rdc_grp_t * group,int rdc_tbl)8224ba491f5SMichael Speer nxge_init_fzc_rdc_tbl(p_nxge_t nxge, nxge_rdc_grp_t *group, int rdc_tbl)
82344961713Sgirish {
824678453a8Sspeer 	nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
825678453a8Sspeer 	nx_rdc_tbl_t	*table;
826678453a8Sspeer 	npi_handle_t	handle;
82744961713Sgirish 
828678453a8Sspeer 	npi_status_t	rs = NPI_SUCCESS;
829678453a8Sspeer 	nxge_status_t	status = NXGE_OK;
83044961713Sgirish 
831678453a8Sspeer 	NXGE_DEBUG_MSG((nxge, DMA_CTL, "==> nxge_init_fzc_rdc_tbl(%d)", table));
832678453a8Sspeer 
833678453a8Sspeer 	/* This RDC table must have been previously bound to <nxge>. */
834678453a8Sspeer 	MUTEX_ENTER(&nhd->lock);
835678453a8Sspeer 	table = &nhd->rdc_tbl[rdc_tbl];
836678453a8Sspeer 	if (table->nxge != (uintptr_t)nxge) {
837678453a8Sspeer 		MUTEX_EXIT(&nhd->lock);
838678453a8Sspeer 		NXGE_ERROR_MSG((nxge, DMA_CTL,
839678453a8Sspeer 		    "nxge_init_fzc_rdc_tbl(%d): not owner", table));
840678453a8Sspeer 		return (NXGE_ERROR);
841678453a8Sspeer 	} else {
842678453a8Sspeer 		table->map = group->map;
843678453a8Sspeer 	}
844678453a8Sspeer 	MUTEX_EXIT(&nhd->lock);
845678453a8Sspeer 
846678453a8Sspeer 	handle = NXGE_DEV_NPI_HANDLE(nxge);
847678453a8Sspeer 
848678453a8Sspeer 	rs = npi_rxdma_rdc_table_config(handle, rdc_tbl,
849678453a8Sspeer 	    group->map, group->max_rdcs);
850678453a8Sspeer 
851678453a8Sspeer 	if (rs != NPI_SUCCESS) {
852678453a8Sspeer 		status = NXGE_ERROR | rs;
85344961713Sgirish 	}
85444961713Sgirish 
855678453a8Sspeer 	NXGE_DEBUG_MSG((nxge, DMA_CTL, "<== nxge_init_fzc_rdc_tbl(%d)", table));
85644961713Sgirish 	return (status);
85744961713Sgirish }
85844961713Sgirish 
859678453a8Sspeer static
860678453a8Sspeer int
rdc_tbl_bind(p_nxge_t nxge,int rdc_tbl)861678453a8Sspeer rdc_tbl_bind(p_nxge_t nxge, int rdc_tbl)
862678453a8Sspeer {
863678453a8Sspeer 	nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
864678453a8Sspeer 	nx_rdc_tbl_t *table;
865678453a8Sspeer 	int i;
866678453a8Sspeer 
867678453a8Sspeer 	NXGE_DEBUG_MSG((nxge, DMA_CTL, "==> nxge_fzc_rdc_tbl_bind"));
868678453a8Sspeer 
869678453a8Sspeer 	MUTEX_ENTER(&nhd->lock);
870678453a8Sspeer 	/* is the caller asking for a particular table? */
871678453a8Sspeer 	if (rdc_tbl >= 0 && rdc_tbl < NXGE_MAX_RDC_GROUPS) {
872678453a8Sspeer 		table = &nhd->rdc_tbl[rdc_tbl];
873678453a8Sspeer 		if (table->nxge == 0) {
874678453a8Sspeer 			table->nxge = (uintptr_t)nxge; /* It is now bound. */
875678453a8Sspeer 			NXGE_DEBUG_MSG((nxge, DMA_CTL,
876678453a8Sspeer 			    "<== nxge_fzc_rdc_tbl_bind(%d)", rdc_tbl));
877678453a8Sspeer 			MUTEX_EXIT(&nhd->lock);
878678453a8Sspeer 			return (rdc_tbl);
879678453a8Sspeer 		}
880678453a8Sspeer 	} else {	/* The caller will take any old RDC table. */
881678453a8Sspeer 		for (i = 0; i < NXGE_MAX_RDC_GROUPS; i++) {
882678453a8Sspeer 			nx_rdc_tbl_t *table = &nhd->rdc_tbl[i];
883678453a8Sspeer 			if (table->nxge == 0) {
884678453a8Sspeer 				table->nxge = (uintptr_t)nxge;
885678453a8Sspeer 				/* It is now bound. */
886678453a8Sspeer 				MUTEX_EXIT(&nhd->lock);
887678453a8Sspeer 				NXGE_DEBUG_MSG((nxge, DMA_CTL,
888678453a8Sspeer 				    "<== nxge_fzc_rdc_tbl_bind: %d", i));
889678453a8Sspeer 				return (i);
890678453a8Sspeer 			}
891678453a8Sspeer 		}
892678453a8Sspeer 	}
893678453a8Sspeer 	MUTEX_EXIT(&nhd->lock);
894678453a8Sspeer 
895678453a8Sspeer 	NXGE_DEBUG_MSG((nxge, HIO_CTL, "<== nxge_fzc_rdc_tbl_bind"));
896678453a8Sspeer 
897678453a8Sspeer 	return (-EBUSY);	/* RDC tables are bound. */
898678453a8Sspeer }
899678453a8Sspeer 
900678453a8Sspeer int
nxge_fzc_rdc_tbl_bind(nxge_t * nxge,int grp_index,int acceptNoSubstitutes)901678453a8Sspeer nxge_fzc_rdc_tbl_bind(
902678453a8Sspeer 	nxge_t *nxge,
903678453a8Sspeer 	int grp_index,
904678453a8Sspeer 	int acceptNoSubstitutes)
905678453a8Sspeer {
906678453a8Sspeer 	nxge_hw_pt_cfg_t *hardware;
907678453a8Sspeer 	int index;
908678453a8Sspeer 
909678453a8Sspeer 	hardware = &nxge->pt_config.hw_config;
910678453a8Sspeer 
911678453a8Sspeer 	if ((index = rdc_tbl_bind(nxge, grp_index)) < 0) {
912678453a8Sspeer 		if (acceptNoSubstitutes)
913678453a8Sspeer 			return (index);
914678453a8Sspeer 		index = rdc_tbl_bind(nxge, grp_index);
915678453a8Sspeer 		if (index < 0) {
916678453a8Sspeer 			NXGE_ERROR_MSG((nxge, OBP_CTL,
917678453a8Sspeer 			    "nxge_fzc_rdc_tbl_init: "
918678453a8Sspeer 			    "there are no free RDC tables!"));
919678453a8Sspeer 			return (index);
920678453a8Sspeer 		}
921678453a8Sspeer 	}
922678453a8Sspeer 
923678453a8Sspeer 	hardware->grpids[index] = nxge->function_num + 256;
924678453a8Sspeer 
925678453a8Sspeer 	return (index);
926678453a8Sspeer }
927678453a8Sspeer 
928678453a8Sspeer int
nxge_fzc_rdc_tbl_unbind(p_nxge_t nxge,int rdc_tbl)929678453a8Sspeer nxge_fzc_rdc_tbl_unbind(p_nxge_t nxge, int rdc_tbl)
930678453a8Sspeer {
931678453a8Sspeer 	nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxge->nxge_hw_p->hio;
932678453a8Sspeer 	nx_rdc_tbl_t *table;
933678453a8Sspeer 
9348838ec3aSMichael Speer 	if (nhd == NULL)
9358838ec3aSMichael Speer 		return (0);
9368838ec3aSMichael Speer 
937678453a8Sspeer 	NXGE_DEBUG_MSG((nxge, DMA_CTL, "==> nxge_fzc_rdc_tbl_unbind(%d)",
938678453a8Sspeer 	    rdc_tbl));
939678453a8Sspeer 
940da14cebeSEric Cheng 	MUTEX_ENTER(&nhd->lock);
941678453a8Sspeer 	table = &nhd->rdc_tbl[rdc_tbl];
942678453a8Sspeer 	if (table->nxge != (uintptr_t)nxge) {
943678453a8Sspeer 		NXGE_ERROR_MSG((nxge, DMA_CTL,
944678453a8Sspeer 		    "nxge_fzc_rdc_tbl_unbind(%d): func%d not owner",
945678453a8Sspeer 		    nxge->function_num, rdc_tbl));
946da14cebeSEric Cheng 		MUTEX_EXIT(&nhd->lock);
947678453a8Sspeer 		return (EINVAL);
948678453a8Sspeer 	} else {
949678453a8Sspeer 		bzero(table, sizeof (*table));
950678453a8Sspeer 	}
951da14cebeSEric Cheng 	MUTEX_EXIT(&nhd->lock);
952678453a8Sspeer 
953678453a8Sspeer 	NXGE_DEBUG_MSG((nxge, DMA_CTL, "<== nxge_fzc_rdc_tbl_unbind(%d)",
954678453a8Sspeer 	    rdc_tbl));
955678453a8Sspeer 
956678453a8Sspeer 	return (0);
957678453a8Sspeer }
958678453a8Sspeer 
95944961713Sgirish nxge_status_t
nxge_init_fzc_rxdma_port(p_nxge_t nxgep)96044961713Sgirish nxge_init_fzc_rxdma_port(p_nxge_t nxgep)
96144961713Sgirish {
96244961713Sgirish 	npi_handle_t		handle;
96344961713Sgirish 	p_nxge_dma_pt_cfg_t	p_all_cfgp;
96444961713Sgirish 	p_nxge_hw_pt_cfg_t	p_cfgp;
965*86ef0a63SRichard Lowe 	hostinfo_t		hostinfo;
96644961713Sgirish 	int			i;
96744961713Sgirish 	npi_status_t		rs = NPI_SUCCESS;
968*86ef0a63SRichard Lowe 	p_nxge_class_pt_cfg_t	p_class_cfgp;
96944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL, "==> nxge_init_fzc_rxdma_port"));
97044961713Sgirish 
97144961713Sgirish 	p_all_cfgp = (p_nxge_dma_pt_cfg_t)&nxgep->pt_config;
97244961713Sgirish 	p_cfgp = (p_nxge_hw_pt_cfg_t)&p_all_cfgp->hw_config;
97344961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
97444961713Sgirish 	/*
97544961713Sgirish 	 * Initialize the port scheduler DRR weight.
97644961713Sgirish 	 * npi_rxdma_cfg_port_ddr_weight();
97744961713Sgirish 	 */
97844961713Sgirish 
9792e59129aSraghus 	if ((nxgep->mac.portmode == PORT_1G_COPPER) ||
9802e59129aSraghus 	    (nxgep->mac.portmode == PORT_1G_FIBER) ||
98100161856Syc 	    (nxgep->mac.portmode == PORT_1G_TN1010) ||
9822e59129aSraghus 	    (nxgep->mac.portmode == PORT_1G_SERDES)) {
9832e59129aSraghus 		rs = npi_rxdma_cfg_port_ddr_weight(handle,
9842e59129aSraghus 		    nxgep->function_num, NXGE_RX_DRR_WT_1G);
9852e59129aSraghus 		if (rs != NPI_SUCCESS) {
9862e59129aSraghus 			return (NXGE_ERROR | rs);
98744961713Sgirish 		}
98844961713Sgirish 	}
98944961713Sgirish 
99044961713Sgirish 	/* Program the default RDC of a port */
99144961713Sgirish 	rs = npi_rxdma_cfg_default_port_rdc(handle, nxgep->function_num,
992678453a8Sspeer 	    p_cfgp->def_rdc);
99344961713Sgirish 	if (rs != NPI_SUCCESS) {
99444961713Sgirish 		return (NXGE_ERROR | rs);
99544961713Sgirish 	}
99644961713Sgirish 
99744961713Sgirish 	/*
99844961713Sgirish 	 * Configure the MAC host info table with RDC tables
99944961713Sgirish 	 */
100044961713Sgirish 	hostinfo.value = 0;
100144961713Sgirish 	p_class_cfgp = (p_nxge_class_pt_cfg_t)&nxgep->class_config;
100244961713Sgirish 	for (i = 0; i < p_cfgp->max_macs; i++) {
1003678453a8Sspeer 		hostinfo.bits.w0.rdc_tbl_num = p_cfgp->def_mac_rxdma_grpid;
100444961713Sgirish 		hostinfo.bits.w0.mac_pref = p_cfgp->mac_pref;
100544961713Sgirish 		if (p_class_cfgp->mac_host_info[i].flag) {
100644961713Sgirish 			hostinfo.bits.w0.rdc_tbl_num =
100752ccf843Smisaki 			    p_class_cfgp->mac_host_info[i].rdctbl;
100844961713Sgirish 			hostinfo.bits.w0.mac_pref =
100952ccf843Smisaki 			    p_class_cfgp->mac_host_info[i].mpr_npr;
101044961713Sgirish 		}
101144961713Sgirish 
101244961713Sgirish 		rs = npi_mac_hostinfo_entry(handle, OP_SET,
101352ccf843Smisaki 		    nxgep->function_num, i, &hostinfo);
101444961713Sgirish 		if (rs != NPI_SUCCESS)
101544961713Sgirish 			return (NXGE_ERROR | rs);
101644961713Sgirish 	}
101744961713Sgirish 
101844961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
101952ccf843Smisaki 	    "<== nxge_init_fzc_rxdma_port rs 0x%08x", rs));
102044961713Sgirish 
102144961713Sgirish 	return (NXGE_OK);
102244961713Sgirish 
102344961713Sgirish }
102444961713Sgirish 
102544961713Sgirish nxge_status_t
nxge_fzc_dmc_def_port_rdc(p_nxge_t nxgep,uint8_t port,uint16_t rdc)102644961713Sgirish nxge_fzc_dmc_def_port_rdc(p_nxge_t nxgep, uint8_t port, uint16_t rdc)
102744961713Sgirish {
102844961713Sgirish 	npi_status_t rs = NPI_SUCCESS;
102944961713Sgirish 	rs = npi_rxdma_cfg_default_port_rdc(nxgep->npi_reg_handle,
103052ccf843Smisaki 	    port, rdc);
103144961713Sgirish 	if (rs & NPI_FAILURE)
103244961713Sgirish 		return (NXGE_ERROR | rs);
103344961713Sgirish 	return (NXGE_OK);
103444961713Sgirish }
103544961713Sgirish 
1036678453a8Sspeer /*
1037678453a8Sspeer  * nxge_init_fzc_tdc_pages
1038678453a8Sspeer  *
1039678453a8Sspeer  *	Configure a TDC's logical pages.
1040678453a8Sspeer  *
1041678453a8Sspeer  *	This function is executed by the service domain, on behalf of
1042678453a8Sspeer  *	a guest domain, to whom this TDC has been loaned.
1043678453a8Sspeer  *
1044678453a8Sspeer  * Arguments:
1045*86ef0a63SRichard Lowe  *	nxgep
1046*86ef0a63SRichard Lowe  *	channel		The channel to initialize.
1047*86ef0a63SRichard Lowe  *	page0		Logical page 0 definition.
1048*86ef0a63SRichard Lowe  *	page1		Logical page 1 definition.
1049678453a8Sspeer  *
1050678453a8Sspeer  * Notes:
1051678453a8Sspeer  *	I think that this function can be called from any
1052678453a8Sspeer  *	domain, but I need to check.
1053678453a8Sspeer  *
1054678453a8Sspeer  * NPI/NXGE function calls:
1055678453a8Sspeer  *	hv_niu_tx_logical_page_conf()
1056678453a8Sspeer  *	hv_niu_tx_logical_page_info()
1057678453a8Sspeer  *
1058678453a8Sspeer  * Context:
1059678453a8Sspeer  *	Any domain
1060678453a8Sspeer  */
1061678453a8Sspeer nxge_status_t
nxge_init_fzc_tdc_pages(p_nxge_t nxgep,uint16_t channel,dma_log_page_t * page0,dma_log_page_t * page1)1062678453a8Sspeer nxge_init_fzc_tdc_pages(
1063678453a8Sspeer 	p_nxge_t nxgep,
1064678453a8Sspeer 	uint16_t channel,
1065678453a8Sspeer 	dma_log_page_t *page0,
1066678453a8Sspeer 	dma_log_page_t *page1)
1067678453a8Sspeer {
1068678453a8Sspeer 	npi_handle_t handle;
1069678453a8Sspeer 	npi_status_t rs;
1070678453a8Sspeer 
1071678453a8Sspeer 	log_page_hdl_t page_handle;
1072678453a8Sspeer 
1073678453a8Sspeer 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
107452ccf843Smisaki 	    "==> nxge_init_fzc_txdma_channel_pages"));
1075678453a8Sspeer 
1076678453a8Sspeer #ifndef	NIU_HV_WORKAROUND
1077678453a8Sspeer 	if (nxgep->niu_type == N2_NIU) {
1078678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
107952ccf843Smisaki 		    "<== nxge_init_fzc_tdc_pages: "
108052ccf843Smisaki 		    "N2_NIU: no need to set txdma logical pages"));
1081678453a8Sspeer 		return (NXGE_OK);
1082678453a8Sspeer 	}
1083678453a8Sspeer #else
1084678453a8Sspeer 	if (nxgep->niu_type == N2_NIU) {
1085678453a8Sspeer 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
108652ccf843Smisaki 		    "<== nxge_init_fzc_tdc_pages: "
108752ccf843Smisaki 		    "N2_NIU: NEED to set txdma logical pages"));
1088678453a8Sspeer 	}
1089678453a8Sspeer #endif
1090678453a8Sspeer 
1091678453a8Sspeer 	/*
1092678453a8Sspeer 	 * Initialize logical page 1.
1093678453a8Sspeer 	 */
1094678453a8Sspeer 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
1095678453a8Sspeer 	if ((rs = npi_txdma_log_page_set(handle, channel, page0))
1096678453a8Sspeer 	    != NPI_SUCCESS)
1097678453a8Sspeer 		return (NXGE_ERROR | rs);
1098678453a8Sspeer 
1099678453a8Sspeer 	/*
1100678453a8Sspeer 	 * Initialize logical page 2.
1101678453a8Sspeer 	 */
1102678453a8Sspeer 	if ((rs = npi_txdma_log_page_set(handle, channel, page1))
1103678453a8Sspeer 	    != NPI_SUCCESS)
1104678453a8Sspeer 		return (NXGE_ERROR | rs);
1105678453a8Sspeer 
1106678453a8Sspeer 	/*
1107678453a8Sspeer 	 * Initialize the page handle.
1108678453a8Sspeer 	 * (In the current driver, this is always set to 0.)
1109678453a8Sspeer 	 */
1110678453a8Sspeer 	page_handle.value = 0;
1111678453a8Sspeer 	rs = npi_txdma_log_page_handle_set(handle, channel, &page_handle);
1112678453a8Sspeer 	if (rs == NPI_SUCCESS) {
1113678453a8Sspeer 		return (NXGE_OK);
1114678453a8Sspeer 	} else {
1115678453a8Sspeer 		return (NXGE_ERROR | rs);
1116678453a8Sspeer 	}
1117678453a8Sspeer }
1118678453a8Sspeer 
111944961713Sgirish nxge_status_t
nxge_init_fzc_txdma_channel_pages(p_nxge_t nxgep,uint16_t channel,p_tx_ring_t tx_ring_p)112044961713Sgirish nxge_init_fzc_txdma_channel_pages(p_nxge_t nxgep, uint16_t channel,
1121*86ef0a63SRichard Lowe     p_tx_ring_t tx_ring_p)
112244961713Sgirish {
112344961713Sgirish 	npi_handle_t		handle;
112444961713Sgirish 	dma_log_page_t		cfg;
112544961713Sgirish 	npi_status_t		rs = NPI_SUCCESS;
112644961713Sgirish 
112744961713Sgirish 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
112852ccf843Smisaki 	    "==> nxge_init_fzc_txdma_channel_pages"));
112944961713Sgirish 
113044961713Sgirish #ifndef	NIU_HV_WORKAROUND
113144961713Sgirish 	if (nxgep->niu_type == N2_NIU) {
113244961713Sgirish 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
113352ccf843Smisaki 		    "<== nxge_init_fzc_txdma_channel_pages: "
113452ccf843Smisaki 		    "N2_NIU: no need to set txdma logical pages"));
113544961713Sgirish 		return (NXGE_OK);
113644961713Sgirish 	}
113744961713Sgirish #else
113844961713Sgirish 	if (nxgep->niu_type == N2_NIU) {
113944961713Sgirish 		NXGE_DEBUG_MSG((nxgep, DMA_CTL,
114052ccf843Smisaki 		    "<== nxge_init_fzc_txdma_channel_pages: "
114152ccf843Smisaki 		    "N2_NIU: NEED to set txdma logical pages"));
114244961713Sgirish 	}
114344961713Sgirish #endif
114444961713Sgirish 
114544961713Sgirish 	/*
114644961713Sgirish 	 * Initialize logical page 1.
114744961713Sgirish 	 */
114844961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
114944961713Sgirish 	cfg.func_num = nxgep->function_num;
115044961713Sgirish 	cfg.page_num = 0;
115144961713Sgirish 	cfg.valid = tx_ring_p->page_valid.bits.ldw.page0;
115244961713Sgirish 	cfg.value = tx_ring_p->page_value_1.value;
115344961713Sgirish 	cfg.mask = tx_ring_p->page_mask_1.value;
115444961713Sgirish 	cfg.reloc = tx_ring_p->page_reloc_1.value;
115544961713Sgirish 
115644961713Sgirish 	rs = npi_txdma_log_page_set(handle, channel,
115752ccf843Smisaki 	    (p_dma_log_page_t)&cfg);
115844961713Sgirish 	if (rs != NPI_SUCCESS) {
115944961713Sgirish 		return (NXGE_ERROR | rs);
116044961713Sgirish 	}
116144961713Sgirish 
116244961713Sgirish 	/*
116344961713Sgirish 	 * Initialize logical page 2.
116444961713Sgirish 	 */
116544961713Sgirish 	cfg.page_num = 1;
116644961713Sgirish 	cfg.valid = tx_ring_p->page_valid.bits.ldw.page1;
116744961713Sgirish 	cfg.value = tx_ring_p->page_value_2.value;
116844961713Sgirish 	cfg.mask = tx_ring_p->page_mask_2.value;
116944961713Sgirish 	cfg.reloc = tx_ring_p->page_reloc_2.value;
117044961713Sgirish 
117144961713Sgirish 	rs = npi_txdma_log_page_set(handle, channel, &cfg);
117244961713Sgirish 	if (rs != NPI_SUCCESS) {
117344961713Sgirish 		return (NXGE_ERROR | rs);
117444961713Sgirish 	}
117544961713Sgirish 
117644961713Sgirish 	/* Initialize the page handle */
117744961713Sgirish 	rs = npi_txdma_log_page_handle_set(handle, channel,
117852ccf843Smisaki 	    &tx_ring_p->page_hdl);
117944961713Sgirish 
118044961713Sgirish 	if (rs == NPI_SUCCESS) {
118144961713Sgirish 		return (NXGE_OK);
118244961713Sgirish 	} else {
118344961713Sgirish 		return (NXGE_ERROR | rs);
118444961713Sgirish 	}
118544961713Sgirish }
118644961713Sgirish 
118744961713Sgirish 
118844961713Sgirish nxge_status_t
nxge_init_fzc_txdma_channel_drr(p_nxge_t nxgep,uint16_t channel,p_tx_ring_t tx_ring_p)118944961713Sgirish nxge_init_fzc_txdma_channel_drr(p_nxge_t nxgep, uint16_t channel,
1190*86ef0a63SRichard Lowe     p_tx_ring_t tx_ring_p)
119144961713Sgirish {
119244961713Sgirish 	npi_status_t	rs = NPI_SUCCESS;
119344961713Sgirish 	npi_handle_t	handle;
119444961713Sgirish 
119544961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
119644961713Sgirish 	rs = npi_txc_dma_max_burst_set(handle, channel,
119752ccf843Smisaki 	    tx_ring_p->max_burst.value);
119844961713Sgirish 	if (rs == NPI_SUCCESS) {
119944961713Sgirish 		return (NXGE_OK);
120044961713Sgirish 	} else {
120144961713Sgirish 		return (NXGE_ERROR | rs);
120244961713Sgirish 	}
120344961713Sgirish }
120444961713Sgirish 
120544961713Sgirish nxge_status_t
nxge_fzc_sys_err_mask_set(p_nxge_t nxgep,uint64_t mask)120644961713Sgirish nxge_fzc_sys_err_mask_set(p_nxge_t nxgep, uint64_t mask)
120744961713Sgirish {
120844961713Sgirish 	npi_status_t	rs = NPI_SUCCESS;
120944961713Sgirish 	npi_handle_t	handle;
121044961713Sgirish 
121144961713Sgirish 	handle = NXGE_DEV_NPI_HANDLE(nxgep);
121244961713Sgirish 	rs = npi_fzc_sys_err_mask_set(handle, mask);
121344961713Sgirish 	if (rs == NPI_SUCCESS) {
121444961713Sgirish 		return (NXGE_OK);
121544961713Sgirish 	} else {
121644961713Sgirish 		return (NXGE_ERROR | rs);
121744961713Sgirish 	}
121844961713Sgirish }
121944961713Sgirish 
1220678453a8Sspeer /*
1221678453a8Sspeer  * nxge_init_hv_fzc_txdma_channel_pages
1222678453a8Sspeer  *
1223678453a8Sspeer  *	Configure a TDC's logical pages.
1224678453a8Sspeer  *
1225678453a8Sspeer  * Arguments:
1226*86ef0a63SRichard Lowe  *	nxgep
1227*86ef0a63SRichard Lowe  *	channel		The channel to initialize.
1228*86ef0a63SRichard Lowe  *	tx_ring_p	The transmit ring.
1229678453a8Sspeer  *
1230678453a8Sspeer  * Notes:
1231678453a8Sspeer  *	I think that this function can be called from any
1232678453a8Sspeer  *	domain, but I need to check.
1233678453a8Sspeer  *
1234678453a8Sspeer  * NPI/NXGE function calls:
1235678453a8Sspeer  *	hv_niu_tx_logical_page_conf()
1236678453a8Sspeer  *	hv_niu_tx_logical_page_info()
1237678453a8Sspeer  *
1238678453a8Sspeer  * Context:
1239678453a8Sspeer  *	Any domain
1240678453a8Sspeer  */
1241678453a8Sspeer #if defined(sun4v) && defined(NIU_LP_WORKAROUND)
124244961713Sgirish nxge_status_t
nxge_init_hv_fzc_txdma_channel_pages(p_nxge_t nxgep,uint16_t channel,p_tx_ring_t tx_ring_p)124344961713Sgirish nxge_init_hv_fzc_txdma_channel_pages(p_nxge_t nxgep, uint16_t channel,
1244*86ef0a63SRichard Lowe     p_tx_ring_t tx_ring_p)
124544961713Sgirish {
124644961713Sgirish 	int			err;
124744961713Sgirish 	uint64_t		hverr;
124844961713Sgirish #ifdef	DEBUG
124944961713Sgirish 	uint64_t		ra, size;
125044961713Sgirish #endif
125144961713Sgirish 
125244961713Sgirish 	NXGE_DEBUG_MSG((nxgep, TX_CTL,
125352ccf843Smisaki 	    "==> nxge_init_hv_fzc_txdma_channel_pages"));
125444961713Sgirish 
125544961713Sgirish 	if (tx_ring_p->hv_set) {
125644961713Sgirish 		return (NXGE_OK);
125744961713Sgirish 	}
125844961713Sgirish 
125944961713Sgirish 	/*
126044961713Sgirish 	 * Initialize logical page 1 for data buffers.
126144961713Sgirish 	 */
12624df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
12634df55fdeSJanie Lu 	    (uint64_t)0, N2NIU_TX_LP_CONF,
126452ccf843Smisaki 	    tx_ring_p->hv_tx_buf_base_ioaddr_pp,
126552ccf843Smisaki 	    tx_ring_p->hv_tx_buf_ioaddr_size);
126644961713Sgirish 
126744961713Sgirish 	err = (nxge_status_t)nxge_herr2kerr(hverr);
126844961713Sgirish 	if (err != 0) {
126944961713Sgirish 		NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
127052ccf843Smisaki 		    "<== nxge_init_hv_fzc_txdma_channel_pages: channel %d "
127152ccf843Smisaki 		    "error status 0x%x "
127252ccf843Smisaki 		    "(page 0 data buf) hverr 0x%llx "
127352ccf843Smisaki 		    "ioaddr_pp $%p "
127452ccf843Smisaki 		    "size 0x%llx ",
127552ccf843Smisaki 		    channel,
127652ccf843Smisaki 		    err,
127752ccf843Smisaki 		    hverr,
127852ccf843Smisaki 		    tx_ring_p->hv_tx_buf_base_ioaddr_pp,
127952ccf843Smisaki 		    tx_ring_p->hv_tx_buf_ioaddr_size));
128044961713Sgirish 		return (NXGE_ERROR | err);
128144961713Sgirish 	}
128244961713Sgirish 
128344961713Sgirish #ifdef	DEBUG
128444961713Sgirish 	ra = size = 0;
12854df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
12864df55fdeSJanie Lu 	    (uint64_t)0, N2NIU_TX_LP_INFO,
12874df55fdeSJanie Lu 	    (uint64_t)&ra, (uint64_t)&size);
128844961713Sgirish 
128944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, TX_CTL,
129052ccf843Smisaki 	    "==> nxge_init_hv_fzc_txdma_channel_pages: channel %d "
129152ccf843Smisaki 	    "ok status 0x%x "
129252ccf843Smisaki 	    "(page 0 data buf) hverr 0x%llx "
129352ccf843Smisaki 	    "set ioaddr_pp $%p "
129452ccf843Smisaki 	    "set size 0x%llx "
129552ccf843Smisaki 	    "get ra ioaddr_pp $%p "
129652ccf843Smisaki 	    "get size 0x%llx ",
129752ccf843Smisaki 	    channel,
129852ccf843Smisaki 	    err,
129952ccf843Smisaki 	    hverr,
130052ccf843Smisaki 	    tx_ring_p->hv_tx_buf_base_ioaddr_pp,
130152ccf843Smisaki 	    tx_ring_p->hv_tx_buf_ioaddr_size,
130252ccf843Smisaki 	    ra,
130352ccf843Smisaki 	    size));
130444961713Sgirish #endif
130544961713Sgirish 
130644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, TX_CTL,
130752ccf843Smisaki 	    "==> nxge_init_hv_fzc_txdma_channel_pages: channel %d "
130852ccf843Smisaki 	    "(page 0 data buf) hverr 0x%llx "
130952ccf843Smisaki 	    "ioaddr_pp $%p "
131052ccf843Smisaki 	    "size 0x%llx ",
131152ccf843Smisaki 	    channel,
131252ccf843Smisaki 	    hverr,
131352ccf843Smisaki 	    tx_ring_p->hv_tx_buf_base_ioaddr_pp,
131452ccf843Smisaki 	    tx_ring_p->hv_tx_buf_ioaddr_size));
131544961713Sgirish 
131644961713Sgirish 	/*
131744961713Sgirish 	 * Initialize logical page 2 for control buffers.
131844961713Sgirish 	 */
13194df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
13204df55fdeSJanie Lu 	    (uint64_t)1, N2NIU_TX_LP_CONF,
132152ccf843Smisaki 	    tx_ring_p->hv_tx_cntl_base_ioaddr_pp,
132252ccf843Smisaki 	    tx_ring_p->hv_tx_cntl_ioaddr_size);
132344961713Sgirish 
132444961713Sgirish 	err = (nxge_status_t)nxge_herr2kerr(hverr);
132544961713Sgirish 
132644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, TX_CTL,
132752ccf843Smisaki 	    "==> nxge_init_hv_fzc_txdma_channel_pages: channel %d"
132852ccf843Smisaki 	    "ok status 0x%x "
132952ccf843Smisaki 	    "(page 1 cntl buf) hverr 0x%llx "
133052ccf843Smisaki 	    "ioaddr_pp $%p "
133152ccf843Smisaki 	    "size 0x%llx ",
133252ccf843Smisaki 	    channel,
133352ccf843Smisaki 	    err,
133452ccf843Smisaki 	    hverr,
133552ccf843Smisaki 	    tx_ring_p->hv_tx_cntl_base_ioaddr_pp,
133652ccf843Smisaki 	    tx_ring_p->hv_tx_cntl_ioaddr_size));
133744961713Sgirish 
133844961713Sgirish 	if (err != 0) {
133944961713Sgirish 		NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
134052ccf843Smisaki 		    "<== nxge_init_hv_fzc_txdma_channel_pages: channel %d"
134152ccf843Smisaki 		    "error status 0x%x "
134252ccf843Smisaki 		    "(page 1 cntl buf) hverr 0x%llx "
134352ccf843Smisaki 		    "ioaddr_pp $%p "
134452ccf843Smisaki 		    "size 0x%llx ",
134552ccf843Smisaki 		    channel,
134652ccf843Smisaki 		    err,
134752ccf843Smisaki 		    hverr,
134852ccf843Smisaki 		    tx_ring_p->hv_tx_cntl_base_ioaddr_pp,
134952ccf843Smisaki 		    tx_ring_p->hv_tx_cntl_ioaddr_size));
135044961713Sgirish 		return (NXGE_ERROR | err);
135144961713Sgirish 	}
135244961713Sgirish 
135344961713Sgirish #ifdef	DEBUG
135444961713Sgirish 	ra = size = 0;
13554df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
13564df55fdeSJanie Lu 	    (uint64_t)1, N2NIU_TX_LP_INFO,
13574df55fdeSJanie Lu 	    (uint64_t)&ra, (uint64_t)&size);
135844961713Sgirish 
135944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, TX_CTL,
136052ccf843Smisaki 	    "==> nxge_init_hv_fzc_txdma_channel_pages: channel %d "
136152ccf843Smisaki 	    "(page 1 cntl buf) hverr 0x%llx "
136252ccf843Smisaki 	    "set ioaddr_pp $%p "
136352ccf843Smisaki 	    "set size 0x%llx "
136452ccf843Smisaki 	    "get ra ioaddr_pp $%p "
136552ccf843Smisaki 	    "get size 0x%llx ",
136652ccf843Smisaki 	    channel,
136752ccf843Smisaki 	    hverr,
136852ccf843Smisaki 	    tx_ring_p->hv_tx_cntl_base_ioaddr_pp,
136952ccf843Smisaki 	    tx_ring_p->hv_tx_cntl_ioaddr_size,
137052ccf843Smisaki 	    ra,
137152ccf843Smisaki 	    size));
137244961713Sgirish #endif
137344961713Sgirish 
137444961713Sgirish 	tx_ring_p->hv_set = B_TRUE;
137544961713Sgirish 
137644961713Sgirish 	NXGE_DEBUG_MSG((nxgep, TX_CTL,
137752ccf843Smisaki 	    "<== nxge_init_hv_fzc_txdma_channel_pages"));
137844961713Sgirish 
137944961713Sgirish 	return (NXGE_OK);
138044961713Sgirish }
138144961713Sgirish 
138244961713Sgirish /*ARGSUSED*/
138344961713Sgirish nxge_status_t
nxge_init_hv_fzc_rxdma_channel_pages(p_nxge_t nxgep,uint16_t channel,p_rx_rbr_ring_t rbrp)138444961713Sgirish nxge_init_hv_fzc_rxdma_channel_pages(p_nxge_t nxgep,
1385*86ef0a63SRichard Lowe     uint16_t channel, p_rx_rbr_ring_t rbrp)
138644961713Sgirish {
138744961713Sgirish 	int			err;
138844961713Sgirish 	uint64_t		hverr;
138944961713Sgirish #ifdef	DEBUG
139044961713Sgirish 	uint64_t		ra, size;
139144961713Sgirish #endif
139244961713Sgirish 
139344961713Sgirish 	NXGE_DEBUG_MSG((nxgep, RX_CTL,
139452ccf843Smisaki 	    "==> nxge_init_hv_fzc_rxdma_channel_pages"));
139544961713Sgirish 
139644961713Sgirish 	if (rbrp->hv_set) {
139744961713Sgirish 		return (NXGE_OK);
139844961713Sgirish 	}
139944961713Sgirish 
140044961713Sgirish 	/* Initialize data buffers for page 0 */
14014df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
14024df55fdeSJanie Lu 	    (uint64_t)0, N2NIU_RX_LP_CONF,
140352ccf843Smisaki 	    rbrp->hv_rx_buf_base_ioaddr_pp,
140452ccf843Smisaki 	    rbrp->hv_rx_buf_ioaddr_size);
14054df55fdeSJanie Lu 
140644961713Sgirish 	err = (nxge_status_t)nxge_herr2kerr(hverr);
140744961713Sgirish 	if (err != 0) {
140844961713Sgirish 		NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
140952ccf843Smisaki 		    "<== nxge_init_hv_fzc_rxdma_channel_pages: channel %d"
141052ccf843Smisaki 		    "error status 0x%x "
141152ccf843Smisaki 		    "(page 0 data buf) hverr 0x%llx "
141252ccf843Smisaki 		    "ioaddr_pp $%p "
141352ccf843Smisaki 		    "size 0x%llx ",
141452ccf843Smisaki 		    channel,
141552ccf843Smisaki 		    err,
141652ccf843Smisaki 		    hverr,
141752ccf843Smisaki 		    rbrp->hv_rx_buf_base_ioaddr_pp,
141852ccf843Smisaki 		    rbrp->hv_rx_buf_ioaddr_size));
141944961713Sgirish 
142044961713Sgirish 		return (NXGE_ERROR | err);
142144961713Sgirish 	}
142244961713Sgirish 
142344961713Sgirish #ifdef	DEBUG
142444961713Sgirish 	ra = size = 0;
14254df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
14264df55fdeSJanie Lu 	    (uint64_t)0, N2NIU_RX_LP_INFO,
14274df55fdeSJanie Lu 	    (uint64_t)&ra, (uint64_t)&size);
142844961713Sgirish 
142944961713Sgirish 	NXGE_DEBUG_MSG((nxgep, RX_CTL,
143052ccf843Smisaki 	    "==> nxge_init_hv_fzc_rxdma_channel_pages: channel %d "
143152ccf843Smisaki 	    "ok status 0x%x "
143252ccf843Smisaki 	    "(page 0 data buf) hverr 0x%llx "
143352ccf843Smisaki 	    "set databuf ioaddr_pp $%p "
143452ccf843Smisaki 	    "set databuf size 0x%llx "
143552ccf843Smisaki 	    "get databuf ra ioaddr_pp %p "
143652ccf843Smisaki 	    "get databuf size 0x%llx",
143752ccf843Smisaki 	    channel,
143852ccf843Smisaki 	    err,
143952ccf843Smisaki 	    hverr,
144052ccf843Smisaki 	    rbrp->hv_rx_buf_base_ioaddr_pp,
144152ccf843Smisaki 	    rbrp->hv_rx_buf_ioaddr_size,
144252ccf843Smisaki 	    ra,
144352ccf843Smisaki 	    size));
144444961713Sgirish #endif
144544961713Sgirish 
144644961713Sgirish 	/* Initialize control buffers for logical page 1.  */
14474df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
14484df55fdeSJanie Lu 	    (uint64_t)1, N2NIU_RX_LP_CONF,
144952ccf843Smisaki 	    rbrp->hv_rx_cntl_base_ioaddr_pp,
145052ccf843Smisaki 	    rbrp->hv_rx_cntl_ioaddr_size);
145144961713Sgirish 
145244961713Sgirish 	err = (nxge_status_t)nxge_herr2kerr(hverr);
145344961713Sgirish 	if (err != 0) {
145444961713Sgirish 		NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
145552ccf843Smisaki 		    "<== nxge_init_hv_fzc_rxdma_channel_pages: channel %d"
145652ccf843Smisaki 		    "error status 0x%x "
145752ccf843Smisaki 		    "(page 1 cntl buf) hverr 0x%llx "
145852ccf843Smisaki 		    "ioaddr_pp $%p "
145952ccf843Smisaki 		    "size 0x%llx ",
146052ccf843Smisaki 		    channel,
146152ccf843Smisaki 		    err,
146252ccf843Smisaki 		    hverr,
146352ccf843Smisaki 		    rbrp->hv_rx_buf_base_ioaddr_pp,
146452ccf843Smisaki 		    rbrp->hv_rx_buf_ioaddr_size));
146544961713Sgirish 
146644961713Sgirish 		return (NXGE_ERROR | err);
146744961713Sgirish 	}
146844961713Sgirish 
146944961713Sgirish #ifdef	DEBUG
147044961713Sgirish 	ra = size = 0;
14714df55fdeSJanie Lu 	hverr = nxge_init_hv_fzc_lp_op(nxgep, (uint64_t)channel,
14724df55fdeSJanie Lu 	    (uint64_t)1, N2NIU_RX_LP_INFO,
14734df55fdeSJanie Lu 	    (uint64_t)&ra, (uint64_t)&size);
147444961713Sgirish 
147544961713Sgirish 	NXGE_DEBUG_MSG((nxgep, RX_CTL,
147652ccf843Smisaki 	    "==> nxge_init_hv_fzc_rxdma_channel_pages: channel %d "
147752ccf843Smisaki 	    "error status 0x%x "
147852ccf843Smisaki 	    "(page 1 cntl buf) hverr 0x%llx "
147952ccf843Smisaki 	    "set cntl ioaddr_pp $%p "
148052ccf843Smisaki 	    "set cntl size 0x%llx "
148152ccf843Smisaki 	    "get cntl ioaddr_pp $%p "
148252ccf843Smisaki 	    "get cntl size 0x%llx ",
148352ccf843Smisaki 	    channel,
148452ccf843Smisaki 	    err,
148552ccf843Smisaki 	    hverr,
148652ccf843Smisaki 	    rbrp->hv_rx_cntl_base_ioaddr_pp,
148752ccf843Smisaki 	    rbrp->hv_rx_cntl_ioaddr_size,
148852ccf843Smisaki 	    ra,
148952ccf843Smisaki 	    size));
149044961713Sgirish #endif
149144961713Sgirish 
149244961713Sgirish 	rbrp->hv_set = B_FALSE;
149344961713Sgirish 
149444961713Sgirish 	NXGE_DEBUG_MSG((nxgep, RX_CTL,
149552ccf843Smisaki 	    "<== nxge_init_hv_fzc_rxdma_channel_pages"));
149644961713Sgirish 
149744961713Sgirish 	return (NXGE_OK);
149844961713Sgirish }
149944961713Sgirish 
150044961713Sgirish /*
150144961713Sgirish  * Map hypervisor error code to errno. Only
150244961713Sgirish  * H_ENORADDR, H_EBADALIGN and H_EINVAL are meaningful
150344961713Sgirish  * for niu driver. Any other error codes are mapped to EINVAL.
150444961713Sgirish  */
150544961713Sgirish static int
nxge_herr2kerr(uint64_t hv_errcode)150644961713Sgirish nxge_herr2kerr(uint64_t hv_errcode)
150744961713Sgirish {
150844961713Sgirish 	int	s_errcode;
150944961713Sgirish 
151044961713Sgirish 	switch (hv_errcode) {
151144961713Sgirish 	case H_ENORADDR:
151244961713Sgirish 	case H_EBADALIGN:
151344961713Sgirish 		s_errcode = EFAULT;
151444961713Sgirish 		break;
151544961713Sgirish 	case H_EOK:
151644961713Sgirish 		s_errcode = 0;
151744961713Sgirish 		break;
151844961713Sgirish 	default:
151944961713Sgirish 		s_errcode = EINVAL;
152044961713Sgirish 		break;
152144961713Sgirish 	}
152244961713Sgirish 	return (s_errcode);
152344961713Sgirish }
152444961713Sgirish 
15254df55fdeSJanie Lu uint64_t
nxge_init_hv_fzc_lp_op(p_nxge_t nxgep,uint64_t channel,uint64_t page_no,uint64_t op_type,uint64_t ioaddr_pp,uint64_t ioaddr_size)15264df55fdeSJanie Lu nxge_init_hv_fzc_lp_op(p_nxge_t nxgep, uint64_t channel,
15274df55fdeSJanie Lu     uint64_t page_no, uint64_t op_type,
15284df55fdeSJanie Lu     uint64_t ioaddr_pp, uint64_t ioaddr_size)
15294df55fdeSJanie Lu {
15304df55fdeSJanie Lu 	uint64_t		hverr;
15314df55fdeSJanie Lu 	uint64_t		major;
15324df55fdeSJanie Lu 	nxge_hio_data_t *nhd = (nxge_hio_data_t *)nxgep->nxge_hw_p->hio;
15334df55fdeSJanie Lu 	nxhv_dc_fp_t		*io_fp;
15344df55fdeSJanie Lu 
15354df55fdeSJanie Lu 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
15364df55fdeSJanie Lu 	    "==> nxge_init_hv_fzc_lp_op"));
15374df55fdeSJanie Lu 
15384df55fdeSJanie Lu 	major = nxgep->niu_hsvc.hsvc_major;
15394df55fdeSJanie Lu 	NXGE_DEBUG_MSG((nxgep, NXGE_ERR_CTL,
15404df55fdeSJanie Lu 	    "==> nxge_init_hv_fzc_lp_op (major %d): channel %d op_type 0x%x "
15414df55fdeSJanie Lu 	    "page_no %d ioaddr_pp $%p ioaddr_size 0x%llx",
15424df55fdeSJanie Lu 	    major, channel, op_type, page_no, ioaddr_pp, ioaddr_size));
15434df55fdeSJanie Lu 
15444df55fdeSJanie Lu 	/* Call the transmit conf function. */
15454df55fdeSJanie Lu 	switch (major) {
15464df55fdeSJanie Lu 	case NIU_MAJOR_VER: /* 1 */
15474df55fdeSJanie Lu 		switch (op_type) {
15484df55fdeSJanie Lu 		case N2NIU_TX_LP_CONF:
15494df55fdeSJanie Lu 			io_fp = &nhd->hio.tx;
15504df55fdeSJanie Lu 			hverr = (*io_fp->lp_conf)((uint64_t)channel,
15514df55fdeSJanie Lu 			    (uint64_t)page_no,
15524df55fdeSJanie Lu 			    (uint64_t)ioaddr_pp,
15534df55fdeSJanie Lu 			    (uint64_t)ioaddr_size);
15544df55fdeSJanie Lu 			NXGE_DEBUG_MSG((nxgep, DMA_CTL,
15554df55fdeSJanie Lu 			    "==> nxge_init_hv_fzc_lp_op(tx_conf): major %d "
15564df55fdeSJanie Lu 			    "op 0x%x hverr 0x%x", major, op_type, hverr));
15574df55fdeSJanie Lu 			break;
15584df55fdeSJanie Lu 
15594df55fdeSJanie Lu 		case N2NIU_TX_LP_INFO:
15604df55fdeSJanie Lu 			io_fp = &nhd->hio.tx;
15614df55fdeSJanie Lu 			hverr = (*io_fp->lp_info)((uint64_t)channel,
15624df55fdeSJanie Lu 			    (uint64_t)page_no,
15634df55fdeSJanie Lu 			    (uint64_t *)ioaddr_pp,
15644df55fdeSJanie Lu 			    (uint64_t *)ioaddr_size);
15654df55fdeSJanie Lu 			break;
15664df55fdeSJanie Lu 
15674df55fdeSJanie Lu 		case N2NIU_RX_LP_CONF:
15684df55fdeSJanie Lu 			io_fp = &nhd->hio.rx;
15694df55fdeSJanie Lu 			hverr = (*io_fp->lp_conf)((uint64_t)channel,
15704df55fdeSJanie Lu 			    (uint64_t)page_no,
15714df55fdeSJanie Lu 			    (uint64_t)ioaddr_pp,
15724df55fdeSJanie Lu 			    (uint64_t)ioaddr_size);
15734df55fdeSJanie Lu 			break;
15744df55fdeSJanie Lu 
15754df55fdeSJanie Lu 		case N2NIU_RX_LP_INFO:
15764df55fdeSJanie Lu 			io_fp = &nhd->hio.rx;
15774df55fdeSJanie Lu 			hverr = (*io_fp->lp_info)((uint64_t)channel,
15784df55fdeSJanie Lu 			    (uint64_t)page_no,
15794df55fdeSJanie Lu 			    (uint64_t *)ioaddr_pp,
15804df55fdeSJanie Lu 			    (uint64_t *)ioaddr_size);
15814df55fdeSJanie Lu 			NXGE_DEBUG_MSG((nxgep, DMA_CTL,
15824df55fdeSJanie Lu 			    "==> nxge_init_hv_fzc_lp_op(rx_conf): major %d "
15834df55fdeSJanie Lu 			    "op 0x%x hverr 0x%x", major, op_type, hverr));
15844df55fdeSJanie Lu 			break;
15854df55fdeSJanie Lu 
15864df55fdeSJanie Lu 		default:
15874df55fdeSJanie Lu 			hverr = EINVAL;
15884df55fdeSJanie Lu 			NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
15894df55fdeSJanie Lu 			    "==> nxge_init_hv_fzc_lp_op(rx_conf): major %d "
15904df55fdeSJanie Lu 			    "invalid op 0x%x hverr 0x%x", major,
15914df55fdeSJanie Lu 			    op_type, hverr));
15924df55fdeSJanie Lu 			break;
15934df55fdeSJanie Lu 		}
15944df55fdeSJanie Lu 
15954df55fdeSJanie Lu 		break;
15964df55fdeSJanie Lu 
15974df55fdeSJanie Lu 	case NIU_MAJOR_VER_2: /* 2 */
15984df55fdeSJanie Lu 		switch (op_type) {
15994df55fdeSJanie Lu 		case N2NIU_TX_LP_CONF:
16004df55fdeSJanie Lu 			io_fp = &nhd->hio.tx;
16014df55fdeSJanie Lu 			hverr = (*io_fp->lp_cfgh_conf)(nxgep->niu_cfg_hdl,
16024df55fdeSJanie Lu 			    (uint64_t)channel,
16034df55fdeSJanie Lu 			    (uint64_t)page_no, ioaddr_pp, ioaddr_size);
16044df55fdeSJanie Lu 
16054df55fdeSJanie Lu 			NXGE_DEBUG_MSG((nxgep, DMA_CTL,
16064df55fdeSJanie Lu 			    "==> nxge_init_hv_fzc_lp_op(tx_conf): major %d "
16074df55fdeSJanie Lu 			    "op 0x%x hverr 0x%x", major, op_type, hverr));
16084df55fdeSJanie Lu 			break;
16094df55fdeSJanie Lu 
16104df55fdeSJanie Lu 		case N2NIU_TX_LP_INFO:
16114df55fdeSJanie Lu 			io_fp = &nhd->hio.tx;
16124df55fdeSJanie Lu 			hverr = (*io_fp->lp_cfgh_info)(nxgep->niu_cfg_hdl,
16134df55fdeSJanie Lu 			    (uint64_t)channel,
16144df55fdeSJanie Lu 			    (uint64_t)page_no,
16154df55fdeSJanie Lu 			    (uint64_t *)ioaddr_pp,
16164df55fdeSJanie Lu 			    (uint64_t *)ioaddr_size);
16174df55fdeSJanie Lu 			break;
16184df55fdeSJanie Lu 
16194df55fdeSJanie Lu 		case N2NIU_RX_LP_CONF:
16204df55fdeSJanie Lu 			io_fp = &nhd->hio.rx;
16214df55fdeSJanie Lu 			hverr = (*io_fp->lp_cfgh_conf)(nxgep->niu_cfg_hdl,
16224df55fdeSJanie Lu 			    (uint64_t)channel,
16234df55fdeSJanie Lu 			    (uint64_t)page_no,
16244df55fdeSJanie Lu 			    (uint64_t)ioaddr_pp,
16254df55fdeSJanie Lu 			    (uint64_t)ioaddr_size);
16264df55fdeSJanie Lu 			NXGE_DEBUG_MSG((nxgep, DMA_CTL,
16274df55fdeSJanie Lu 			    "==> nxge_init_hv_fzc_lp_op(rx_conf): major %d "
16284df55fdeSJanie Lu 			    "hverr 0x%x", major, hverr));
16294df55fdeSJanie Lu 			break;
16304df55fdeSJanie Lu 
16314df55fdeSJanie Lu 		case N2NIU_RX_LP_INFO:
16324df55fdeSJanie Lu 			io_fp = &nhd->hio.rx;
16334df55fdeSJanie Lu 			hverr = (*io_fp->lp_cfgh_info)(nxgep->niu_cfg_hdl,
16344df55fdeSJanie Lu 			    (uint64_t)channel,
16354df55fdeSJanie Lu 			    (uint64_t)page_no,
16364df55fdeSJanie Lu 			    (uint64_t *)ioaddr_pp,
16374df55fdeSJanie Lu 			    (uint64_t *)ioaddr_size);
16384df55fdeSJanie Lu 			break;
16394df55fdeSJanie Lu 
16404df55fdeSJanie Lu 		default:
16414df55fdeSJanie Lu 			hverr = EINVAL;
16424df55fdeSJanie Lu 			NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
16434df55fdeSJanie Lu 			    "==> nxge_init_hv_fzc_lp_op(rx_conf): major %d "
16444df55fdeSJanie Lu 			    "invalid op 0x%x hverr 0x%x", major,
16454df55fdeSJanie Lu 			    op_type, hverr));
16464df55fdeSJanie Lu 			break;
16474df55fdeSJanie Lu 		}
16484df55fdeSJanie Lu 
16494df55fdeSJanie Lu 		break;
16504df55fdeSJanie Lu 
16514df55fdeSJanie Lu 	default:
16524df55fdeSJanie Lu 		hverr = EINVAL;
16534df55fdeSJanie Lu 		NXGE_ERROR_MSG((nxgep, NXGE_ERR_CTL,
16544df55fdeSJanie Lu 		    "==> nxge_init_hv_fzc_lp_op(rx_conf): invalid major %d "
16554df55fdeSJanie Lu 		    "op 0x%x hverr 0x%x", major, op_type, hverr));
16564df55fdeSJanie Lu 		break;
16574df55fdeSJanie Lu 	}
16584df55fdeSJanie Lu 
16594df55fdeSJanie Lu 	NXGE_DEBUG_MSG((nxgep, DMA_CTL,
16604df55fdeSJanie Lu 	    "<== nxge_init_hv_fzc_lp_op: 0x%x", hverr));
16614df55fdeSJanie Lu 
16624df55fdeSJanie Lu 	return (hverr);
16634df55fdeSJanie Lu }
16644df55fdeSJanie Lu 
166544961713Sgirish #endif	/* sun4v and NIU_LP_WORKAROUND */
1666