xref: /onnv-gate/usr/src/uts/common/io/nxge/npi/npi_zcp.c (revision 6929:a596171cbf16)
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*6929Smisaki  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
233859Sml29623  * Use is subject to license terms.
243859Sml29623  */
253859Sml29623 
263859Sml29623 #pragma ident	"%Z%%M%	%I%	%E% SMI"
273859Sml29623 
283859Sml29623 #include <npi_zcp.h>
293859Sml29623 
303859Sml29623 static int zcp_mem_read(npi_handle_t, uint16_t, uint8_t,
313859Sml29623 	uint16_t, zcp_ram_unit_t *);
323859Sml29623 static int zcp_mem_write(npi_handle_t, uint16_t, uint8_t,
333859Sml29623 	uint32_t, uint16_t, zcp_ram_unit_t *);
343859Sml29623 
353859Sml29623 npi_status_t
npi_zcp_config(npi_handle_t handle,config_op_t op,zcp_config_t config)363859Sml29623 npi_zcp_config(npi_handle_t handle, config_op_t op, zcp_config_t config)
373859Sml29623 {
383859Sml29623 	uint64_t val = 0;
393859Sml29623 
403859Sml29623 	switch (op) {
413859Sml29623 	case ENABLE:
423859Sml29623 	case DISABLE:
433859Sml29623 		if ((config == 0) || (config & ~CFG_ZCP_ALL) != 0) {
443859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
45*6929Smisaki 			    " npi_zcp_config"
46*6929Smisaki 			    " Invalid Input: config <0x%x>",
47*6929Smisaki 			    config));
483859Sml29623 			return (NPI_FAILURE | NPI_ZCP_CONFIG_INVALID);
493859Sml29623 		}
503859Sml29623 
513859Sml29623 		NXGE_REG_RD64(handle, ZCP_CONFIG_REG, &val);
523859Sml29623 		if (op == ENABLE) {
533859Sml29623 			if (config & CFG_ZCP)
543859Sml29623 				val |= ZC_ENABLE;
553859Sml29623 			if (config & CFG_ZCP_ECC_CHK)
563859Sml29623 				val &= ~ECC_CHK_DIS;
573859Sml29623 			if (config & CFG_ZCP_PAR_CHK)
583859Sml29623 				val &= ~PAR_CHK_DIS;
593859Sml29623 			if (config & CFG_ZCP_BUF_RESP)
603859Sml29623 				val &= ~DIS_BUFF_RN;
613859Sml29623 			if (config & CFG_ZCP_BUF_REQ)
623859Sml29623 				val &= ~DIS_BUFF_RQ_IF;
633859Sml29623 		} else {
643859Sml29623 			if (config & CFG_ZCP)
653859Sml29623 				val &= ~ZC_ENABLE;
663859Sml29623 			if (config & CFG_ZCP_ECC_CHK)
673859Sml29623 				val |= ECC_CHK_DIS;
683859Sml29623 			if (config & CFG_ZCP_PAR_CHK)
693859Sml29623 				val |= PAR_CHK_DIS;
703859Sml29623 			if (config & CFG_ZCP_BUF_RESP)
713859Sml29623 				val |= DIS_BUFF_RN;
723859Sml29623 			if (config & CFG_ZCP_BUF_REQ)
733859Sml29623 				val |= DIS_BUFF_RQ_IF;
743859Sml29623 		}
753859Sml29623 		NXGE_REG_WR64(handle, ZCP_CONFIG_REG, val);
763859Sml29623 
773859Sml29623 		break;
783859Sml29623 	case INIT:
793859Sml29623 		NXGE_REG_RD64(handle, ZCP_CONFIG_REG, &val);
803859Sml29623 		val &= ((ZCP_DEBUG_SEL_MASK) | (RDMA_TH_MASK));
813859Sml29623 		if (config & CFG_ZCP)
823859Sml29623 			val |= ZC_ENABLE;
833859Sml29623 		else
843859Sml29623 			val &= ~ZC_ENABLE;
853859Sml29623 		if (config & CFG_ZCP_ECC_CHK)
863859Sml29623 			val &= ~ECC_CHK_DIS;
873859Sml29623 		else
883859Sml29623 			val |= ECC_CHK_DIS;
893859Sml29623 		if (config & CFG_ZCP_PAR_CHK)
903859Sml29623 			val &= ~PAR_CHK_DIS;
913859Sml29623 		else
923859Sml29623 			val |= PAR_CHK_DIS;
933859Sml29623 		if (config & CFG_ZCP_BUF_RESP)
943859Sml29623 			val &= ~DIS_BUFF_RN;
953859Sml29623 		else
963859Sml29623 			val |= DIS_BUFF_RN;
973859Sml29623 		if (config & CFG_ZCP_BUF_REQ)
983859Sml29623 			val &= DIS_BUFF_RQ_IF;
993859Sml29623 		else
1003859Sml29623 			val |= DIS_BUFF_RQ_IF;
1013859Sml29623 		NXGE_REG_WR64(handle, ZCP_CONFIG_REG, val);
1023859Sml29623 
1033859Sml29623 		break;
1043859Sml29623 	default:
1053859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
106*6929Smisaki 		    " npi_zcp_config"
107*6929Smisaki 		    " Invalid Input: config <0x%x>",
108*6929Smisaki 		    config));
1093859Sml29623 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
1103859Sml29623 	}
1113859Sml29623 
1123859Sml29623 	return (NPI_SUCCESS);
1133859Sml29623 }
1143859Sml29623 
1153859Sml29623 npi_status_t
npi_zcp_iconfig(npi_handle_t handle,config_op_t op,zcp_iconfig_t iconfig)1163859Sml29623 npi_zcp_iconfig(npi_handle_t handle, config_op_t op, zcp_iconfig_t iconfig)
1173859Sml29623 {
1183859Sml29623 	uint64_t val = 0;
1193859Sml29623 
1203859Sml29623 	switch (op) {
1213859Sml29623 	case ENABLE:
1223859Sml29623 	case DISABLE:
1233859Sml29623 		if ((iconfig == 0) || (iconfig & ~ICFG_ZCP_ALL) != 0) {
1243859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
125*6929Smisaki 			    " npi_zcp_iconfig"
126*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
127*6929Smisaki 			    iconfig));
1283859Sml29623 			return (NPI_FAILURE | NPI_ZCP_CONFIG_INVALID);
1293859Sml29623 		}
1303859Sml29623 
1313859Sml29623 		NXGE_REG_RD64(handle, ZCP_INT_MASK_REG, &val);
1323859Sml29623 		if (op == ENABLE)
1333859Sml29623 			val |= iconfig;
1343859Sml29623 		else
1353859Sml29623 			val &= ~iconfig;
1363859Sml29623 		NXGE_REG_WR64(handle, ZCP_INT_MASK_REG, val);
1373859Sml29623 
1383859Sml29623 		break;
1393859Sml29623 
1403859Sml29623 	case INIT:
1413859Sml29623 		if ((iconfig & ~ICFG_ZCP_ALL) != 0) {
1423859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
143*6929Smisaki 			    " npi_zcp_iconfig"
144*6929Smisaki 			    " Invalid Input: iconfig <0x%x>",
145*6929Smisaki 			    iconfig));
1463859Sml29623 			return (NPI_FAILURE | NPI_ZCP_CONFIG_INVALID);
1473859Sml29623 		}
1483859Sml29623 		val = (uint64_t)iconfig;
1493859Sml29623 		NXGE_REG_WR64(handle, ZCP_INT_MASK_REG, val);
1503859Sml29623 
1513859Sml29623 		break;
1523859Sml29623 	default:
1533859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
154*6929Smisaki 		    " npi_zcp_iconfig"
155*6929Smisaki 		    " Invalid Input: iconfig <0x%x>",
156*6929Smisaki 		    iconfig));
1573859Sml29623 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
1583859Sml29623 	}
1593859Sml29623 
1603859Sml29623 	return (NPI_SUCCESS);
1613859Sml29623 }
1623859Sml29623 
1633859Sml29623 npi_status_t
npi_zcp_get_istatus(npi_handle_t handle,zcp_iconfig_t * istatus)1643859Sml29623 npi_zcp_get_istatus(npi_handle_t handle, zcp_iconfig_t *istatus)
1653859Sml29623 {
1663859Sml29623 	uint64_t val;
1673859Sml29623 
1683859Sml29623 	NXGE_REG_RD64(handle, ZCP_INT_STAT_REG, &val);
1693859Sml29623 	*istatus = (uint32_t)val;
1703859Sml29623 
1713859Sml29623 	return (NPI_SUCCESS);
1723859Sml29623 }
1733859Sml29623 
1743859Sml29623 npi_status_t
npi_zcp_clear_istatus(npi_handle_t handle)1753859Sml29623 npi_zcp_clear_istatus(npi_handle_t handle)
1763859Sml29623 {
1773859Sml29623 	uint64_t val;
1783859Sml29623 
1793859Sml29623 	val = (uint64_t)0xffff;
1803859Sml29623 	NXGE_REG_WR64(handle, ZCP_INT_STAT_REG, val);
1813859Sml29623 	return (NPI_SUCCESS);
1823859Sml29623 }
1833859Sml29623 
1843859Sml29623 
1853859Sml29623 npi_status_t
npi_zcp_set_dma_thresh(npi_handle_t handle,uint16_t dma_thres)1863859Sml29623 npi_zcp_set_dma_thresh(npi_handle_t handle, uint16_t dma_thres)
1873859Sml29623 {
1883859Sml29623 	uint64_t val = 0;
1893859Sml29623 
1903859Sml29623 	if ((dma_thres & ~RDMA_TH_BITS) != 0) {
1913859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
192*6929Smisaki 		    " npi_zcp_set_dma_thresh"
193*6929Smisaki 		    " Invalid Input: dma_thres <0x%x>",
194*6929Smisaki 		    dma_thres));
1953859Sml29623 		return (NPI_FAILURE | NPI_ZCP_DMA_THRES_INVALID);
1963859Sml29623 	}
1973859Sml29623 
1983859Sml29623 	NXGE_REG_RD64(handle, ZCP_CONFIG_REG, &val);
1993859Sml29623 
2003859Sml29623 	val &= ~RDMA_TH_MASK;
2013859Sml29623 	val |= (dma_thres << RDMA_TH_SHIFT);
2023859Sml29623 
2033859Sml29623 	NXGE_REG_WR64(handle, ZCP_CONFIG_REG, val);
2043859Sml29623 
2053859Sml29623 	return (NPI_SUCCESS);
2063859Sml29623 }
2073859Sml29623 
2083859Sml29623 npi_status_t
npi_zcp_set_bam_region(npi_handle_t handle,zcp_buf_region_t region,zcp_bam_region_reg_t * region_attr)2093859Sml29623 npi_zcp_set_bam_region(npi_handle_t handle, zcp_buf_region_t region,
2103859Sml29623 			zcp_bam_region_reg_t *region_attr)
2113859Sml29623 {
2123859Sml29623 
2133859Sml29623 	ASSERT(IS_VALID_BAM_REGION(region));
2143859Sml29623 	if (!IS_VALID_BAM_REGION(region)) {
2153859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
216*6929Smisaki 		    " npi_zcp_set_bam_region"
217*6929Smisaki 		    " Invalid Input: region <0x%x>",
218*6929Smisaki 		    region));
2193859Sml29623 		return (NPI_FAILURE | ZCP_BAM_REGION_INVALID);
2203859Sml29623 	}
2213859Sml29623 
2223859Sml29623 	switch (region) {
2233859Sml29623 	case BAM_4BUF:
2243859Sml29623 		NXGE_REG_WR64(handle, ZCP_BAM4_RE_CTL_REG, region_attr->value);
2253859Sml29623 		break;
2263859Sml29623 	case BAM_8BUF:
2273859Sml29623 		NXGE_REG_WR64(handle, ZCP_BAM8_RE_CTL_REG, region_attr->value);
2283859Sml29623 		break;
2293859Sml29623 	case BAM_16BUF:
2303859Sml29623 		NXGE_REG_WR64(handle, ZCP_BAM16_RE_CTL_REG, region_attr->value);
2313859Sml29623 		break;
2323859Sml29623 	case BAM_32BUF:
2333859Sml29623 		NXGE_REG_WR64(handle, ZCP_BAM32_RE_CTL_REG, region_attr->value);
2343859Sml29623 		break;
2353859Sml29623 	}
2363859Sml29623 
2373859Sml29623 	return (NPI_SUCCESS);
2383859Sml29623 }
2393859Sml29623 
2403859Sml29623 npi_status_t
npi_zcp_set_dst_region(npi_handle_t handle,zcp_buf_region_t region,uint16_t row_idx)2413859Sml29623 npi_zcp_set_dst_region(npi_handle_t handle, zcp_buf_region_t region,
2423859Sml29623 				uint16_t row_idx)
2433859Sml29623 {
2443859Sml29623 	uint64_t val = 0;
2453859Sml29623 
2463859Sml29623 	ASSERT(IS_VALID_BAM_REGION(region));
2473859Sml29623 	if (!IS_VALID_BAM_REGION(region)) {
2483859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
249*6929Smisaki 		    " npi_zcp_set_dst_region"
250*6929Smisaki 		    " Invalid Input: region <0x%x>",
251*6929Smisaki 		    region));
2523859Sml29623 		return (NPI_FAILURE | NPI_ZCP_BAM_REGION_INVALID);
2533859Sml29623 	}
2543859Sml29623 
2553859Sml29623 	if ((row_idx & ~0x3FF) != 0) {
2563859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
257*6929Smisaki 		    " npi_zcp_set_dst_region"
258*6929Smisaki 		    " Invalid Input: row_idx", row_idx));
2593859Sml29623 		return (NPI_FAILURE | NPI_ZCP_ROW_INDEX_INVALID);
2603859Sml29623 	}
2613859Sml29623 
2623859Sml29623 	val = (uint64_t)row_idx;
2633859Sml29623 
2643859Sml29623 	switch (region) {
2653859Sml29623 	case BAM_4BUF:
2663859Sml29623 		NXGE_REG_WR64(handle, ZCP_DST4_RE_CTL_REG, val);
2673859Sml29623 		break;
2683859Sml29623 	case BAM_8BUF:
2693859Sml29623 		NXGE_REG_WR64(handle, ZCP_DST8_RE_CTL_REG, val);
2703859Sml29623 		break;
2713859Sml29623 	case BAM_16BUF:
2723859Sml29623 		NXGE_REG_WR64(handle, ZCP_DST16_RE_CTL_REG, val);
2733859Sml29623 		break;
2743859Sml29623 	case BAM_32BUF:
2753859Sml29623 		NXGE_REG_WR64(handle, ZCP_DST32_RE_CTL_REG, val);
2763859Sml29623 		break;
2773859Sml29623 	}
2783859Sml29623 
2793859Sml29623 	return (NPI_SUCCESS);
2803859Sml29623 }
2813859Sml29623 
2823859Sml29623 npi_status_t
npi_zcp_tt_static_entry(npi_handle_t handle,io_op_t op,uint16_t flow_id,tte_sflow_attr_mask_t mask,tte_sflow_attr_t * sflow)2833859Sml29623 npi_zcp_tt_static_entry(npi_handle_t handle, io_op_t op, uint16_t flow_id,
2843859Sml29623 			tte_sflow_attr_mask_t mask, tte_sflow_attr_t *sflow)
2853859Sml29623 {
2863859Sml29623 	uint32_t		byte_en = 0;
2873859Sml29623 	tte_sflow_attr_t	val;
2883859Sml29623 
2893859Sml29623 	if ((op != OP_SET) && (op != OP_GET)) {
2903859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
291*6929Smisaki 		    " npi_zcp_tt_static_entry"
292*6929Smisaki 		    " Invalid Input: op <0x%x>",
293*6929Smisaki 		    op));
2943859Sml29623 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
2953859Sml29623 	}
2963859Sml29623 
2973859Sml29623 	if ((mask & TTE_SFLOW_ATTR_ALL) == 0) {
2983859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
299*6929Smisaki 		    " npi_zcp_tt_static_entry"
300*6929Smisaki 		    " Invalid Input: mask <0x%x>",
301*6929Smisaki 		    mask));
3023859Sml29623 		return (NPI_FAILURE | NPI_ZCP_SFLOW_ATTR_INVALID);
3033859Sml29623 	}
3043859Sml29623 
3053859Sml29623 	if ((flow_id & ~0x0FFF) != 0) {
3063859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
307*6929Smisaki 		    " npi_zcp_tt_static_entry"
308*6929Smisaki 		    " Invalid Input: flow_id<0x%x>",
309*6929Smisaki 		    flow_id));
3103859Sml29623 		return (NPI_FAILURE | NPI_ZCP_FLOW_ID_INVALID);
3113859Sml29623 	}
3123859Sml29623 
3133859Sml29623 	if (zcp_mem_read(handle, flow_id, ZCP_RAM_SEL_TT_STATIC, NULL,
314*6929Smisaki 	    (zcp_ram_unit_t *)&val) != 0) {
3153859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
316*6929Smisaki 		    " npi_zcp_tt_static_entry"
317*6929Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
318*6929Smisaki 		    NULL));
3193859Sml29623 		return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
3203859Sml29623 	}
3213859Sml29623 
3223859Sml29623 	if (op == OP_SET) {
3233859Sml29623 		if (mask & TTE_RDC_TBL_OFF) {
3243859Sml29623 			val.qw0.bits.ldw.rdc_tbl_offset =
325*6929Smisaki 			    sflow->qw0.bits.ldw.rdc_tbl_offset;
3263859Sml29623 			byte_en |= TTE_RDC_TBL_SFLOW_BITS_EN;
3273859Sml29623 		}
3283859Sml29623 		if (mask & TTE_BUF_SIZE) {
3293859Sml29623 			val.qw0.bits.ldw.buf_size =
330*6929Smisaki 			    sflow->qw0.bits.ldw.buf_size;
3313859Sml29623 			byte_en |= TTE_BUF_SIZE_BITS_EN;
3323859Sml29623 		}
3333859Sml29623 		if (mask & TTE_NUM_BUF) {
3343859Sml29623 			val.qw0.bits.ldw.num_buf = sflow->qw0.bits.ldw.num_buf;
3353859Sml29623 			byte_en |= TTE_NUM_BUF_BITS_EN;
3363859Sml29623 		}
3373859Sml29623 		if (mask & TTE_ULP_END) {
3383859Sml29623 			val.qw0.bits.ldw.ulp_end = sflow->qw0.bits.ldw.ulp_end;
3393859Sml29623 			byte_en |=  TTE_ULP_END_BITS_EN;
3403859Sml29623 		}
3413859Sml29623 		if (mask & TTE_ULP_END) {
3423859Sml29623 			val.qw1.bits.ldw.ulp_end = sflow->qw1.bits.ldw.ulp_end;
3433859Sml29623 			byte_en |= TTE_ULP_END_BITS_EN;
3443859Sml29623 		}
3453859Sml29623 		if (mask & TTE_ULP_END_EN) {
3463859Sml29623 			val.qw1.bits.ldw.ulp_end_en =
347*6929Smisaki 			    sflow->qw1.bits.ldw.ulp_end_en;
3483859Sml29623 			byte_en |= TTE_ULP_END_EN_BITS_EN;
3493859Sml29623 		}
3503859Sml29623 		if (mask & TTE_UNMAP_ALL_EN) {
3513859Sml29623 			val.qw1.bits.ldw.unmap_all_en =
352*6929Smisaki 			    sflow->qw1.bits.ldw.unmap_all_en;
3533859Sml29623 			byte_en |= TTE_UNMAP_ALL_EN;
3543859Sml29623 		}
3553859Sml29623 		if (mask & TTE_TMODE) {
3563859Sml29623 			val.qw1.bits.ldw.tmode = sflow->qw1.bits.ldw.tmode;
3573859Sml29623 			byte_en |= TTE_TMODE_BITS_EN;
3583859Sml29623 		}
3593859Sml29623 		if (mask & TTE_SKIP) {
3603859Sml29623 			val.qw1.bits.ldw.skip = sflow->qw1.bits.ldw.skip;
3613859Sml29623 			byte_en |= TTE_SKIP_BITS_EN;
3623859Sml29623 		}
3633859Sml29623 		if (mask & TTE_HBM_RING_BASE_ADDR) {
3643859Sml29623 			val.qw1.bits.ldw.ring_base =
365*6929Smisaki 			    sflow->qw1.bits.ldw.ring_base;
3663859Sml29623 			byte_en |= TTE_RING_BASE_ADDR_BITS_EN;
3673859Sml29623 		}
3683859Sml29623 		if (mask & TTE_HBM_RING_BASE_ADDR) {
3693859Sml29623 			val.qw2.bits.ldw.ring_base =
370*6929Smisaki 			    sflow->qw2.bits.ldw.ring_base;
3713859Sml29623 			byte_en |= TTE_RING_BASE_ADDR_BITS_EN;
3723859Sml29623 		}
3733859Sml29623 		if (mask & TTE_HBM_RING_SIZE) {
3743859Sml29623 			val.qw2.bits.ldw.ring_size =
375*6929Smisaki 			    sflow->qw2.bits.ldw.ring_size;
3763859Sml29623 			byte_en |= TTE_RING_SIZE_BITS_EN;
3773859Sml29623 		}
3783859Sml29623 		if (mask & TTE_HBM_BUSY) {
3793859Sml29623 			val.qw2.bits.ldw.busy = sflow->qw2.bits.ldw.busy;
3803859Sml29623 			byte_en |= TTE_BUSY_BITS_EN;
3813859Sml29623 		}
3823859Sml29623 		if (mask & TTE_HBM_TOQ) {
3833859Sml29623 			val.qw3.bits.ldw.toq = sflow->qw3.bits.ldw.toq;
3843859Sml29623 			byte_en |= TTE_TOQ_BITS_EN;
3853859Sml29623 		}
3863859Sml29623 
3873859Sml29623 		if (zcp_mem_write(handle, flow_id, ZCP_RAM_SEL_TT_STATIC,
388*6929Smisaki 		    byte_en, NULL,
389*6929Smisaki 		    (zcp_ram_unit_t *)&val) != 0) {
3903859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
391*6929Smisaki 			    " npi_zcp_tt_static_entry"
392*6929Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
393*6929Smisaki 			    NULL));
3943859Sml29623 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
3953859Sml29623 		}
3963859Sml29623 	} else {
3973859Sml29623 		sflow->qw0.value = val.qw0.value;
3983859Sml29623 		sflow->qw1.value = val.qw1.value;
3993859Sml29623 		sflow->qw2.value = val.qw2.value;
4003859Sml29623 		sflow->qw3.value = val.qw3.value;
4013859Sml29623 		sflow->qw4.value = val.qw4.value;
4023859Sml29623 	}
4033859Sml29623 
4043859Sml29623 	return (NPI_SUCCESS);
4053859Sml29623 }
4063859Sml29623 
4073859Sml29623 npi_status_t
npi_zcp_tt_dynamic_entry(npi_handle_t handle,io_op_t op,uint16_t flow_id,tte_dflow_attr_mask_t mask,tte_dflow_attr_t * dflow)4083859Sml29623 npi_zcp_tt_dynamic_entry(npi_handle_t handle, io_op_t op, uint16_t flow_id,
4093859Sml29623 			tte_dflow_attr_mask_t mask, tte_dflow_attr_t *dflow)
4103859Sml29623 {
4113859Sml29623 	uint32_t		byte_en = 0;
4123859Sml29623 	tte_dflow_attr_t	val;
4133859Sml29623 
4143859Sml29623 	if ((op != OP_SET) && (op != OP_GET)) {
4153859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
416*6929Smisaki 		    " npi_zcp_tt_dynamic_entry"
417*6929Smisaki 		    " Invalid Input: op <0x%x>", op));
4183859Sml29623 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
4193859Sml29623 	}
4203859Sml29623 
4213859Sml29623 	if ((mask & TTE_DFLOW_ATTR_ALL) == 0) {
4223859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
423*6929Smisaki 		    " npi_zcp_tt_dynamic_entry"
424*6929Smisaki 		    " Invalid Input: mask <0x%x>",
425*6929Smisaki 		    mask));
4263859Sml29623 		return (NPI_FAILURE | NPI_ZCP_DFLOW_ATTR_INVALID);
4273859Sml29623 	}
4283859Sml29623 
4293859Sml29623 	if ((flow_id & ~0x0FFF) != 0) {
4303859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
431*6929Smisaki 		    " npi_zcp_tt_dynamic_entry"
432*6929Smisaki 		    " Invalid Input: flow_id <0x%x>",
433*6929Smisaki 		    flow_id));
4343859Sml29623 		return (NPI_FAILURE | NPI_ZCP_FLOW_ID_INVALID);
4353859Sml29623 	}
4363859Sml29623 
4373859Sml29623 	if (zcp_mem_read(handle, flow_id, ZCP_RAM_SEL_TT_DYNAMIC, NULL,
438*6929Smisaki 	    (zcp_ram_unit_t *)&val) != 0) {
4393859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
440*6929Smisaki 		    " npi_zcp_tt_dynamic_entry"
441*6929Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
442*6929Smisaki 		    NULL));
4433859Sml29623 		return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
4443859Sml29623 	}
4453859Sml29623 
4463859Sml29623 	if (op == OP_SET) {
4473859Sml29623 
4483859Sml29623 		/* Get data read */
4493859Sml29623 		if (mask & TTE_MAPPED_IN) {
4503859Sml29623 			val.qw0.bits.ldw.mapped_in =
451*6929Smisaki 			    dflow->qw0.bits.ldw.mapped_in;
4523859Sml29623 			byte_en |= TTE_MAPPED_IN_BITS_EN;
4533859Sml29623 		}
4543859Sml29623 		if (mask & TTE_ANCHOR_SEQ) {
4553859Sml29623 			val.qw1.bits.ldw.anchor_seq =
456*6929Smisaki 			    dflow->qw1.bits.ldw.anchor_seq;
4573859Sml29623 			byte_en |= TTE_ANCHOR_SEQ_BITS_EN;
4583859Sml29623 		}
4593859Sml29623 		if (mask & TTE_ANCHOR_OFFSET) {
4603859Sml29623 			val.qw2.bits.ldw.anchor_offset =
461*6929Smisaki 			    dflow->qw2.bits.ldw.anchor_offset;
4623859Sml29623 			byte_en |= TTE_ANCHOR_OFFSET_BITS_EN;
4633859Sml29623 		}
4643859Sml29623 		if (mask & TTE_ANCHOR_BUFFER) {
4653859Sml29623 			val.qw2.bits.ldw.anchor_buf =
466*6929Smisaki 			    dflow->qw2.bits.ldw.anchor_buf;
4673859Sml29623 			byte_en |= TTE_ANCHOR_BUFFER_BITS_EN;
4683859Sml29623 		}
4693859Sml29623 		if (mask & TTE_ANCHOR_BUF_FLAG) {
4703859Sml29623 			val.qw2.bits.ldw.anchor_buf_flag =
471*6929Smisaki 			    dflow->qw2.bits.ldw.anchor_buf_flag;
4723859Sml29623 			byte_en |= TTE_ANCHOR_BUF_FLAG_BITS_EN;
4733859Sml29623 		}
4743859Sml29623 		if (mask & TTE_UNMAP_ON_LEFT) {
4753859Sml29623 			val.qw2.bits.ldw.unmap_on_left =
476*6929Smisaki 			    dflow->qw2.bits.ldw.unmap_on_left;
4773859Sml29623 			byte_en |= TTE_UNMAP_ON_LEFT_BITS_EN;
4783859Sml29623 		}
4793859Sml29623 		if (mask & TTE_ULP_END_REACHED) {
4803859Sml29623 			val.qw2.bits.ldw.ulp_end_reached =
481*6929Smisaki 			    dflow->qw2.bits.ldw.ulp_end_reached;
4823859Sml29623 			byte_en |= TTE_ULP_END_REACHED_BITS_EN;
4833859Sml29623 		}
4843859Sml29623 		if (mask & TTE_ERR_STAT) {
4853859Sml29623 			val.qw3.bits.ldw.err_stat =
486*6929Smisaki 			    dflow->qw3.bits.ldw.err_stat;
4873859Sml29623 			byte_en |= TTE_ERR_STAT_BITS_EN;
4883859Sml29623 		}
4893859Sml29623 		if (mask & TTE_HBM_WR_PTR) {
4903859Sml29623 			val.qw3.bits.ldw.wr_ptr = dflow->qw3.bits.ldw.wr_ptr;
4913859Sml29623 			byte_en |= TTE_WR_PTR_BITS_EN;
4923859Sml29623 		}
4933859Sml29623 		if (mask & TTE_HBM_HOQ) {
4943859Sml29623 			val.qw3.bits.ldw.hoq = dflow->qw3.bits.ldw.hoq;
4953859Sml29623 			byte_en |= TTE_HOQ_BITS_EN;
4963859Sml29623 		}
4973859Sml29623 		if (mask & TTE_HBM_PREFETCH_ON) {
4983859Sml29623 			val.qw3.bits.ldw.prefetch_on =
499*6929Smisaki 			    dflow->qw3.bits.ldw.prefetch_on;
5003859Sml29623 			byte_en |= TTE_PREFETCH_ON_BITS_EN;
5013859Sml29623 		}
5023859Sml29623 
5033859Sml29623 		if (zcp_mem_write(handle, flow_id, ZCP_RAM_SEL_TT_DYNAMIC,
504*6929Smisaki 		    byte_en, NULL,
505*6929Smisaki 		    (zcp_ram_unit_t *)&val) != 0) {
5063859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
507*6929Smisaki 			    " npi_zcp_tt_dynamic_entry"
508*6929Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
509*6929Smisaki 			    NULL));
5103859Sml29623 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
5113859Sml29623 		}
5123859Sml29623 	} else {
5133859Sml29623 		dflow->qw0.value = val.qw0.value;
5143859Sml29623 		dflow->qw1.value = val.qw1.value;
5153859Sml29623 		dflow->qw2.value = val.qw2.value;
5163859Sml29623 		dflow->qw3.value = val.qw3.value;
5173859Sml29623 		dflow->qw4.value = val.qw4.value;
5183859Sml29623 	}
5193859Sml29623 
5203859Sml29623 	return (NPI_SUCCESS);
5213859Sml29623 }
5223859Sml29623 
5233859Sml29623 npi_status_t
npi_zcp_tt_bam_entry(npi_handle_t handle,io_op_t op,uint16_t flow_id,uint8_t bankn,uint8_t word_en,zcp_ram_unit_t * data)5243859Sml29623 npi_zcp_tt_bam_entry(npi_handle_t handle, io_op_t op, uint16_t flow_id,
5253859Sml29623 			uint8_t bankn, uint8_t word_en, zcp_ram_unit_t *data)
5263859Sml29623 {
5273859Sml29623 	zcp_ram_unit_t val;
5283859Sml29623 
5293859Sml29623 	if ((op != OP_SET) && (op != OP_GET)) {
5303859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
531*6929Smisaki 		    " npi_zcp_tt_bam_entry"
532*6929Smisaki 		    " Invalid Input: op <0x%x>", op));
5333859Sml29623 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
5343859Sml29623 	}
5353859Sml29623 
5363859Sml29623 	if ((flow_id & ~0x0FFF) != 0) {
5373859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
538*6929Smisaki 		    " npi_zcp_tt_dynamic_entry"
539*6929Smisaki 		    " Invalid Input: flow_id <0x%x>",
540*6929Smisaki 		    flow_id));
5413859Sml29623 		return (NPI_FAILURE | NPI_ZCP_FLOW_ID_INVALID);
5423859Sml29623 	}
5433859Sml29623 
5443859Sml29623 	if (bankn >= MAX_BAM_BANKS) {
5453859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
546*6929Smisaki 		    " npi_zcp_tt_bam_entry"
547*6929Smisaki 		    " Invalid Input: bankn <0x%x>",
548*6929Smisaki 		    bankn));
5493859Sml29623 		return (NPI_FAILURE | NPI_ZCP_BAM_BANK_INVALID);
5503859Sml29623 	}
5513859Sml29623 
5523859Sml29623 	if ((word_en & ~0xF) != 0) {
5533859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
554*6929Smisaki 		    " npi_zcp_tt_bam_entry"
555*6929Smisaki 		    " Invalid Input: word_en <0x%x>",
556*6929Smisaki 		    word_en));
5573859Sml29623 		return (NPI_FAILURE | NPI_ZCP_BAM_WORD_EN_INVALID);
5583859Sml29623 	}
5593859Sml29623 
5603859Sml29623 	if (zcp_mem_read(handle, flow_id, ZCP_RAM_SEL_BAM0 + bankn, NULL,
561*6929Smisaki 	    (zcp_ram_unit_t *)&val) != 0) {
5623859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
563*6929Smisaki 		    " npi_zcp_tt_bam_entry"
564*6929Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
565*6929Smisaki 		    NULL));
5663859Sml29623 		return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
5673859Sml29623 	}
5683859Sml29623 
5693859Sml29623 	if (op == OP_SET) {
5703859Sml29623 		if (zcp_mem_write(handle, flow_id, ZCP_RAM_SEL_BAM0 + bankn,
571*6929Smisaki 		    word_en, NULL,
572*6929Smisaki 		    (zcp_ram_unit_t *)&val) != 0) {
5733859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
574*6929Smisaki 			    " npi_zcp_tt_bam_entry"
575*6929Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
576*6929Smisaki 			    NULL));
5773859Sml29623 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
5783859Sml29623 		}
5793859Sml29623 	} else {
5803859Sml29623 		data->w0 = val.w0;
5813859Sml29623 		data->w1 = val.w1;
5823859Sml29623 		data->w2 = val.w2;
5833859Sml29623 		data->w3 = val.w3;
5843859Sml29623 	}
5853859Sml29623 
5863859Sml29623 	return (NPI_SUCCESS);
5873859Sml29623 }
5883859Sml29623 
5893859Sml29623 npi_status_t
npi_zcp_tt_cfifo_entry(npi_handle_t handle,io_op_t op,uint8_t portn,uint16_t entryn,zcp_ram_unit_t * data)5903859Sml29623 npi_zcp_tt_cfifo_entry(npi_handle_t handle, io_op_t op, uint8_t portn,
5913859Sml29623 			uint16_t entryn, zcp_ram_unit_t *data)
5923859Sml29623 {
5933859Sml29623 	if ((op != OP_SET) && (op != OP_GET)) {
5943859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
595*6929Smisaki 		    " npi_zcp_tt_cfifo_entry"
596*6929Smisaki 		    " Invalid Input: op <0x%x>", op));
5973859Sml29623 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
5983859Sml29623 	}
5993859Sml29623 
6003859Sml29623 	if (portn > 3) {
6013859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
602*6929Smisaki 		    " npi_zcp_tt_cfifo_entry"
603*6929Smisaki 		    " Invalid Input: portn <%d>", portn));
6043859Sml29623 		return (NPI_FAILURE | NPI_ZCP_PORT_INVALID(portn));
6053859Sml29623 	}
6063859Sml29623 
6073859Sml29623 	if (op == OP_SET) {
6083859Sml29623 		if (zcp_mem_write(handle, NULL, ZCP_RAM_SEL_CFIFO0 + portn,
609*6929Smisaki 		    0x1ffff, entryn, data) != 0) {
6103859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
611*6929Smisaki 			    " npi_zcp_tt_cfifo_entry"
612*6929Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
613*6929Smisaki 			    NULL));
6143859Sml29623 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
6153859Sml29623 		}
6163859Sml29623 	} else {
6173859Sml29623 		if (zcp_mem_read(handle, NULL, ZCP_RAM_SEL_CFIFO0 + portn,
618*6929Smisaki 		    entryn, data) != 0) {
6193859Sml29623 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
620*6929Smisaki 			    " npi_zcp_tt_cfifo_entry"
621*6929Smisaki 			    " HW Error: ZCP_RAM_ACC  <0x%x>",
622*6929Smisaki 			    NULL));
6233859Sml29623 			return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
6243859Sml29623 		}
6253859Sml29623 	}
6263859Sml29623 
6273859Sml29623 	return (NPI_SUCCESS);
6283859Sml29623 }
6293859Sml29623 
6303859Sml29623 npi_status_t
npi_zcp_rest_cfifo_port(npi_handle_t handle,uint8_t port)6313859Sml29623 npi_zcp_rest_cfifo_port(npi_handle_t handle, uint8_t port)
6323859Sml29623 {
6333859Sml29623 	uint64_t offset = ZCP_RESET_CFIFO_REG;
6343859Sml29623 	zcp_reset_cfifo_t cfifo_reg;
6353859Sml29623 	NXGE_REG_RD64(handle, offset, &cfifo_reg.value);
6363859Sml29623 	cfifo_reg.value &= ZCP_RESET_CFIFO_MASK;
6373859Sml29623 
6383859Sml29623 	switch (port) {
6393859Sml29623 		case 0:
6403859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo0 = 1;
6413859Sml29623 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
6423859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo0 = 0;
6433859Sml29623 
6443859Sml29623 			break;
6453859Sml29623 		case 1:
6463859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo1 = 1;
6473859Sml29623 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
6483859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo1 = 0;
6493859Sml29623 			break;
6503859Sml29623 		case 2:
6513859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo2 = 1;
6523859Sml29623 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
6533859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo2 = 0;
6543859Sml29623 			break;
6553859Sml29623 		case 3:
6563859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo3 = 1;
6573859Sml29623 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
6583859Sml29623 			cfifo_reg.bits.ldw.reset_cfifo3 = 0;
6593859Sml29623 			break;
6603859Sml29623 		default:
6613859Sml29623 			break;
6623859Sml29623 	}
6633859Sml29623 
6643859Sml29623 	NXGE_DELAY(ZCP_CFIFIO_RESET_WAIT);
6653859Sml29623 	NXGE_REG_WR64(handle, offset, cfifo_reg.value);
6663859Sml29623 
6673859Sml29623 	return (NPI_SUCCESS);
6683859Sml29623 }
6693859Sml29623 
6703859Sml29623 npi_status_t
npi_zcp_rest_cfifo_all(npi_handle_t handle)6713859Sml29623 npi_zcp_rest_cfifo_all(npi_handle_t handle)
6723859Sml29623 {
6733859Sml29623 	uint64_t offset = ZCP_RESET_CFIFO_REG;
6743859Sml29623 	zcp_reset_cfifo_t cfifo_reg;
6753859Sml29623 
6763859Sml29623 	cfifo_reg.value = ZCP_RESET_CFIFO_MASK;
6773859Sml29623 	NXGE_REG_WR64(handle, offset, cfifo_reg.value);
6783859Sml29623 	cfifo_reg.value = 0;
6793859Sml29623 	NXGE_DELAY(ZCP_CFIFIO_RESET_WAIT);
6803859Sml29623 	NXGE_REG_WR64(handle, offset, cfifo_reg.value);
6813859Sml29623 	return (NPI_SUCCESS);
6823859Sml29623 }
6833859Sml29623 
6843859Sml29623 static int
zcp_mem_read(npi_handle_t handle,uint16_t flow_id,uint8_t ram_sel,uint16_t cfifo_entryn,zcp_ram_unit_t * val)6853859Sml29623 zcp_mem_read(npi_handle_t handle, uint16_t flow_id, uint8_t ram_sel,
6863859Sml29623 		uint16_t cfifo_entryn, zcp_ram_unit_t *val)
6873859Sml29623 {
6883859Sml29623 	zcp_ram_access_t ram_ctl;
6893859Sml29623 
6903859Sml29623 	ram_ctl.value = 0;
6913859Sml29623 	ram_ctl.bits.ldw.ram_sel = ram_sel;
6923859Sml29623 	ram_ctl.bits.ldw.zcfid = flow_id;
6933859Sml29623 	ram_ctl.bits.ldw.rdwr = ZCP_RAM_RD;
6943859Sml29623 	ram_ctl.bits.ldw.cfifo = cfifo_entryn;
6953859Sml29623 
6963859Sml29623 	/* Wait for RAM ready to be read */
6973859Sml29623 	ZCP_WAIT_RAM_READY(handle, ram_ctl.value);
6983859Sml29623 	if (ram_ctl.bits.ldw.busy != 0) {
6993859Sml29623 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
700*6929Smisaki 		    " npi_zcp_tt_static_entry"
701*6929Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
702*6929Smisaki 		    ram_ctl.value));
7033859Sml29623 		return (-1);
7043859Sml29623 	}
7053859Sml29623 
7063859Sml29623 	/* Read from RAM */
7073859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_ACC_REG, ram_ctl.value);
7083859Sml29623 
7093859Sml29623 	/* Wait for RAM read done */
7103859Sml29623 	ZCP_WAIT_RAM_READY(handle, ram_ctl.value);
7113859Sml29623 	if (ram_ctl.bits.ldw.busy != 0)
7123859Sml29623 		return (-1);
7133859Sml29623 
7143859Sml29623 	/* Get data */
7153859Sml29623 	NXGE_REG_RD64(handle, ZCP_RAM_DATA0_REG, &val->w0);
7163859Sml29623 	NXGE_REG_RD64(handle, ZCP_RAM_DATA1_REG, &val->w1);
7173859Sml29623 	NXGE_REG_RD64(handle, ZCP_RAM_DATA2_REG, &val->w2);
7183859Sml29623 	NXGE_REG_RD64(handle, ZCP_RAM_DATA3_REG, &val->w3);
7193859Sml29623 	NXGE_REG_RD64(handle, ZCP_RAM_DATA4_REG, &val->w4);
7203859Sml29623 
7213859Sml29623 	return (0);
7223859Sml29623 }
7233859Sml29623 
7243859Sml29623 static int
zcp_mem_write(npi_handle_t handle,uint16_t flow_id,uint8_t ram_sel,uint32_t byte_en,uint16_t cfifo_entryn,zcp_ram_unit_t * val)7253859Sml29623 zcp_mem_write(npi_handle_t handle, uint16_t flow_id, uint8_t ram_sel,
7263859Sml29623 		uint32_t byte_en, uint16_t cfifo_entryn, zcp_ram_unit_t *val)
7273859Sml29623 {
7283859Sml29623 	zcp_ram_access_t	ram_ctl;
7293859Sml29623 	zcp_ram_benable_t	ram_en;
7303859Sml29623 
7313859Sml29623 	ram_ctl.value = 0;
7323859Sml29623 	ram_ctl.bits.ldw.ram_sel = ram_sel;
7333859Sml29623 	ram_ctl.bits.ldw.zcfid = flow_id;
7343859Sml29623 	ram_ctl.bits.ldw.rdwr = ZCP_RAM_WR;
7353859Sml29623 	ram_en.bits.ldw.be = byte_en;
7363859Sml29623 	ram_ctl.bits.ldw.cfifo = cfifo_entryn;
7373859Sml29623 
7383859Sml29623 	/* Setup data */
7393859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_DATA0_REG, val->w0);
7403859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_DATA1_REG, val->w1);
7413859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_DATA2_REG, val->w2);
7423859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_DATA3_REG, val->w3);
7433859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_DATA4_REG, val->w4);
7443859Sml29623 
7453859Sml29623 	/* Set byte mask */
7463859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_BE_REG, ram_en.value);
7473859Sml29623 
7483859Sml29623 	/* Write to RAM */
7493859Sml29623 	NXGE_REG_WR64(handle, ZCP_RAM_ACC_REG, ram_ctl.value);
7503859Sml29623 
7513859Sml29623 	/* Wait for RAM write complete */
7523859Sml29623 	ZCP_WAIT_RAM_READY(handle, ram_ctl.value);
7533859Sml29623 	if (ram_ctl.bits.ldw.busy != 0)
7543859Sml29623 		return (-1);
7553859Sml29623 
7563859Sml29623 	return (0);
7573859Sml29623 }
758