xref: /illumos-gate/usr/src/uts/common/io/nxge/npi/npi_zcp.c (revision b37cc459)
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  */
2144961713Sgirish /*
2252ccf843Smisaki  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
2344961713Sgirish  * Use is subject to license terms.
2444961713Sgirish  */
2544961713Sgirish 
2644961713Sgirish #include <npi_zcp.h>
2744961713Sgirish 
2844961713Sgirish static int zcp_mem_read(npi_handle_t, uint16_t, uint8_t,
29a3c5bd6dSspeer 	uint16_t, zcp_ram_unit_t *);
3044961713Sgirish static int zcp_mem_write(npi_handle_t, uint16_t, uint8_t,
31a3c5bd6dSspeer 	uint32_t, uint16_t, zcp_ram_unit_t *);
3244961713Sgirish 
3344961713Sgirish npi_status_t
npi_zcp_config(npi_handle_t handle,config_op_t op,zcp_config_t config)3444961713Sgirish npi_zcp_config(npi_handle_t handle, config_op_t op, zcp_config_t config)
3544961713Sgirish {
3644961713Sgirish 	uint64_t val = 0;
3744961713Sgirish 
3844961713Sgirish 	switch (op) {
3944961713Sgirish 	case ENABLE:
4044961713Sgirish 	case DISABLE:
4144961713Sgirish 		if ((config == 0) || (config & ~CFG_ZCP_ALL) != 0) {
4244961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
4352ccf843Smisaki 			    " npi_zcp_config"
4452ccf843Smisaki 			    " Invalid Input: config <0x%x>",
4552ccf843Smisaki 			    config));
4644961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_CONFIG_INVALID);
4744961713Sgirish 		}
4844961713Sgirish 
4944961713Sgirish 		NXGE_REG_RD64(handle, ZCP_CONFIG_REG, &val);
5044961713Sgirish 		if (op == ENABLE) {
5144961713Sgirish 			if (config & CFG_ZCP)
5244961713Sgirish 				val |= ZC_ENABLE;
5344961713Sgirish 			if (config & CFG_ZCP_ECC_CHK)
5444961713Sgirish 				val &= ~ECC_CHK_DIS;
5544961713Sgirish 			if (config & CFG_ZCP_PAR_CHK)
5644961713Sgirish 				val &= ~PAR_CHK_DIS;
5744961713Sgirish 			if (config & CFG_ZCP_BUF_RESP)
5844961713Sgirish 				val &= ~DIS_BUFF_RN;
5944961713Sgirish 			if (config & CFG_ZCP_BUF_REQ)
6044961713Sgirish 				val &= ~DIS_BUFF_RQ_IF;
6144961713Sgirish 		} else {
6244961713Sgirish 			if (config & CFG_ZCP)
6344961713Sgirish 				val &= ~ZC_ENABLE;
6444961713Sgirish 			if (config & CFG_ZCP_ECC_CHK)
6544961713Sgirish 				val |= ECC_CHK_DIS;
6644961713Sgirish 			if (config & CFG_ZCP_PAR_CHK)
6744961713Sgirish 				val |= PAR_CHK_DIS;
6844961713Sgirish 			if (config & CFG_ZCP_BUF_RESP)
6944961713Sgirish 				val |= DIS_BUFF_RN;
7044961713Sgirish 			if (config & CFG_ZCP_BUF_REQ)
7144961713Sgirish 				val |= DIS_BUFF_RQ_IF;
7244961713Sgirish 		}
7344961713Sgirish 		NXGE_REG_WR64(handle, ZCP_CONFIG_REG, val);
7444961713Sgirish 
7544961713Sgirish 		break;
7644961713Sgirish 	case INIT:
7744961713Sgirish 		NXGE_REG_RD64(handle, ZCP_CONFIG_REG, &val);
7844961713Sgirish 		val &= ((ZCP_DEBUG_SEL_MASK) | (RDMA_TH_MASK));
7944961713Sgirish 		if (config & CFG_ZCP)
8044961713Sgirish 			val |= ZC_ENABLE;
8144961713Sgirish 		else
8244961713Sgirish 			val &= ~ZC_ENABLE;
8344961713Sgirish 		if (config & CFG_ZCP_ECC_CHK)
8444961713Sgirish 			val &= ~ECC_CHK_DIS;
8544961713Sgirish 		else
8644961713Sgirish 			val |= ECC_CHK_DIS;
8744961713Sgirish 		if (config & CFG_ZCP_PAR_CHK)
8844961713Sgirish 			val &= ~PAR_CHK_DIS;
8944961713Sgirish 		else
9044961713Sgirish 			val |= PAR_CHK_DIS;
9144961713Sgirish 		if (config & CFG_ZCP_BUF_RESP)
9244961713Sgirish 			val &= ~DIS_BUFF_RN;
9344961713Sgirish 		else
9444961713Sgirish 			val |= DIS_BUFF_RN;
9544961713Sgirish 		if (config & CFG_ZCP_BUF_REQ)
9644961713Sgirish 			val &= DIS_BUFF_RQ_IF;
9744961713Sgirish 		else
9844961713Sgirish 			val |= DIS_BUFF_RQ_IF;
9944961713Sgirish 		NXGE_REG_WR64(handle, ZCP_CONFIG_REG, val);
10044961713Sgirish 
10144961713Sgirish 		break;
10244961713Sgirish 	default:
10344961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
10452ccf843Smisaki 		    " npi_zcp_config"
10552ccf843Smisaki 		    " Invalid Input: config <0x%x>",
10652ccf843Smisaki 		    config));
10744961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
10844961713Sgirish 	}
10944961713Sgirish 
11044961713Sgirish 	return (NPI_SUCCESS);
11144961713Sgirish }
11244961713Sgirish 
11344961713Sgirish npi_status_t
npi_zcp_iconfig(npi_handle_t handle,config_op_t op,zcp_iconfig_t iconfig)11444961713Sgirish npi_zcp_iconfig(npi_handle_t handle, config_op_t op, zcp_iconfig_t iconfig)
11544961713Sgirish {
11644961713Sgirish 	uint64_t val = 0;
11744961713Sgirish 
11844961713Sgirish 	switch (op) {
11944961713Sgirish 	case ENABLE:
12044961713Sgirish 	case DISABLE:
12144961713Sgirish 		if ((iconfig == 0) || (iconfig & ~ICFG_ZCP_ALL) != 0) {
12244961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
12352ccf843Smisaki 			    " npi_zcp_iconfig"
12452ccf843Smisaki 			    " Invalid Input: iconfig <0x%x>",
12552ccf843Smisaki 			    iconfig));
12644961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_CONFIG_INVALID);
12744961713Sgirish 		}
12844961713Sgirish 
12944961713Sgirish 		NXGE_REG_RD64(handle, ZCP_INT_MASK_REG, &val);
13044961713Sgirish 		if (op == ENABLE)
13144961713Sgirish 			val |= iconfig;
13244961713Sgirish 		else
13344961713Sgirish 			val &= ~iconfig;
13444961713Sgirish 		NXGE_REG_WR64(handle, ZCP_INT_MASK_REG, val);
13544961713Sgirish 
13644961713Sgirish 		break;
13744961713Sgirish 
13844961713Sgirish 	case INIT:
13944961713Sgirish 		if ((iconfig & ~ICFG_ZCP_ALL) != 0) {
14044961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
14152ccf843Smisaki 			    " npi_zcp_iconfig"
14252ccf843Smisaki 			    " Invalid Input: iconfig <0x%x>",
14352ccf843Smisaki 			    iconfig));
14444961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_CONFIG_INVALID);
14544961713Sgirish 		}
14644961713Sgirish 		val = (uint64_t)iconfig;
14744961713Sgirish 		NXGE_REG_WR64(handle, ZCP_INT_MASK_REG, val);
14844961713Sgirish 
14944961713Sgirish 		break;
15044961713Sgirish 	default:
15144961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
15252ccf843Smisaki 		    " npi_zcp_iconfig"
15352ccf843Smisaki 		    " Invalid Input: iconfig <0x%x>",
15452ccf843Smisaki 		    iconfig));
15544961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
15644961713Sgirish 	}
15744961713Sgirish 
15844961713Sgirish 	return (NPI_SUCCESS);
15944961713Sgirish }
16044961713Sgirish 
16144961713Sgirish npi_status_t
npi_zcp_get_istatus(npi_handle_t handle,zcp_iconfig_t * istatus)16244961713Sgirish npi_zcp_get_istatus(npi_handle_t handle, zcp_iconfig_t *istatus)
16344961713Sgirish {
16444961713Sgirish 	uint64_t val;
16544961713Sgirish 
16644961713Sgirish 	NXGE_REG_RD64(handle, ZCP_INT_STAT_REG, &val);
16744961713Sgirish 	*istatus = (uint32_t)val;
16844961713Sgirish 
16944961713Sgirish 	return (NPI_SUCCESS);
17044961713Sgirish }
17144961713Sgirish 
17244961713Sgirish npi_status_t
npi_zcp_clear_istatus(npi_handle_t handle)17344961713Sgirish npi_zcp_clear_istatus(npi_handle_t handle)
17444961713Sgirish {
17544961713Sgirish 	uint64_t val;
17644961713Sgirish 
17744961713Sgirish 	val = (uint64_t)0xffff;
17844961713Sgirish 	NXGE_REG_WR64(handle, ZCP_INT_STAT_REG, val);
17944961713Sgirish 	return (NPI_SUCCESS);
18044961713Sgirish }
18144961713Sgirish 
18244961713Sgirish 
18344961713Sgirish npi_status_t
npi_zcp_set_dma_thresh(npi_handle_t handle,uint16_t dma_thres)18444961713Sgirish npi_zcp_set_dma_thresh(npi_handle_t handle, uint16_t dma_thres)
18544961713Sgirish {
18644961713Sgirish 	uint64_t val = 0;
18744961713Sgirish 
18844961713Sgirish 	if ((dma_thres & ~RDMA_TH_BITS) != 0) {
18944961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
19052ccf843Smisaki 		    " npi_zcp_set_dma_thresh"
19152ccf843Smisaki 		    " Invalid Input: dma_thres <0x%x>",
19252ccf843Smisaki 		    dma_thres));
19344961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_DMA_THRES_INVALID);
19444961713Sgirish 	}
19544961713Sgirish 
19644961713Sgirish 	NXGE_REG_RD64(handle, ZCP_CONFIG_REG, &val);
19744961713Sgirish 
19844961713Sgirish 	val &= ~RDMA_TH_MASK;
19944961713Sgirish 	val |= (dma_thres << RDMA_TH_SHIFT);
20044961713Sgirish 
20144961713Sgirish 	NXGE_REG_WR64(handle, ZCP_CONFIG_REG, val);
20244961713Sgirish 
20344961713Sgirish 	return (NPI_SUCCESS);
20444961713Sgirish }
20544961713Sgirish 
20644961713Sgirish npi_status_t
npi_zcp_set_bam_region(npi_handle_t handle,zcp_buf_region_t region,zcp_bam_region_reg_t * region_attr)20744961713Sgirish npi_zcp_set_bam_region(npi_handle_t handle, zcp_buf_region_t region,
20844961713Sgirish 			zcp_bam_region_reg_t *region_attr)
20944961713Sgirish {
21044961713Sgirish 
211a3c5bd6dSspeer 	ASSERT(IS_VALID_BAM_REGION(region));
21244961713Sgirish 	if (!IS_VALID_BAM_REGION(region)) {
21344961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
21452ccf843Smisaki 		    " npi_zcp_set_bam_region"
21552ccf843Smisaki 		    " Invalid Input: region <0x%x>",
21652ccf843Smisaki 		    region));
21744961713Sgirish 		return (NPI_FAILURE | ZCP_BAM_REGION_INVALID);
21844961713Sgirish 	}
21944961713Sgirish 
22044961713Sgirish 	switch (region) {
22144961713Sgirish 	case BAM_4BUF:
22244961713Sgirish 		NXGE_REG_WR64(handle, ZCP_BAM4_RE_CTL_REG, region_attr->value);
22344961713Sgirish 		break;
22444961713Sgirish 	case BAM_8BUF:
22544961713Sgirish 		NXGE_REG_WR64(handle, ZCP_BAM8_RE_CTL_REG, region_attr->value);
22644961713Sgirish 		break;
22744961713Sgirish 	case BAM_16BUF:
22844961713Sgirish 		NXGE_REG_WR64(handle, ZCP_BAM16_RE_CTL_REG, region_attr->value);
22944961713Sgirish 		break;
23044961713Sgirish 	case BAM_32BUF:
23144961713Sgirish 		NXGE_REG_WR64(handle, ZCP_BAM32_RE_CTL_REG, region_attr->value);
23244961713Sgirish 		break;
23344961713Sgirish 	}
23444961713Sgirish 
23544961713Sgirish 	return (NPI_SUCCESS);
23644961713Sgirish }
23744961713Sgirish 
23844961713Sgirish npi_status_t
npi_zcp_set_dst_region(npi_handle_t handle,zcp_buf_region_t region,uint16_t row_idx)23944961713Sgirish npi_zcp_set_dst_region(npi_handle_t handle, zcp_buf_region_t region,
24044961713Sgirish 				uint16_t row_idx)
24144961713Sgirish {
24244961713Sgirish 	uint64_t val = 0;
24344961713Sgirish 
244a3c5bd6dSspeer 	ASSERT(IS_VALID_BAM_REGION(region));
24544961713Sgirish 	if (!IS_VALID_BAM_REGION(region)) {
24644961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
24752ccf843Smisaki 		    " npi_zcp_set_dst_region"
24852ccf843Smisaki 		    " Invalid Input: region <0x%x>",
24952ccf843Smisaki 		    region));
25044961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_BAM_REGION_INVALID);
25144961713Sgirish 	}
25244961713Sgirish 
25344961713Sgirish 	if ((row_idx & ~0x3FF) != 0) {
25444961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
25552ccf843Smisaki 		    " npi_zcp_set_dst_region"
25652ccf843Smisaki 		    " Invalid Input: row_idx", row_idx));
25744961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_ROW_INDEX_INVALID);
25844961713Sgirish 	}
25944961713Sgirish 
26044961713Sgirish 	val = (uint64_t)row_idx;
26144961713Sgirish 
26244961713Sgirish 	switch (region) {
26344961713Sgirish 	case BAM_4BUF:
26444961713Sgirish 		NXGE_REG_WR64(handle, ZCP_DST4_RE_CTL_REG, val);
26544961713Sgirish 		break;
26644961713Sgirish 	case BAM_8BUF:
26744961713Sgirish 		NXGE_REG_WR64(handle, ZCP_DST8_RE_CTL_REG, val);
26844961713Sgirish 		break;
26944961713Sgirish 	case BAM_16BUF:
27044961713Sgirish 		NXGE_REG_WR64(handle, ZCP_DST16_RE_CTL_REG, val);
27144961713Sgirish 		break;
27244961713Sgirish 	case BAM_32BUF:
27344961713Sgirish 		NXGE_REG_WR64(handle, ZCP_DST32_RE_CTL_REG, val);
27444961713Sgirish 		break;
27544961713Sgirish 	}
27644961713Sgirish 
27744961713Sgirish 	return (NPI_SUCCESS);
27844961713Sgirish }
27944961713Sgirish 
28044961713Sgirish 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)28144961713Sgirish npi_zcp_tt_static_entry(npi_handle_t handle, io_op_t op, uint16_t flow_id,
28244961713Sgirish 			tte_sflow_attr_mask_t mask, tte_sflow_attr_t *sflow)
28344961713Sgirish {
28444961713Sgirish 	uint32_t		byte_en = 0;
28544961713Sgirish 	tte_sflow_attr_t	val;
28644961713Sgirish 
28744961713Sgirish 	if ((op != OP_SET) && (op != OP_GET)) {
28844961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
28952ccf843Smisaki 		    " npi_zcp_tt_static_entry"
29052ccf843Smisaki 		    " Invalid Input: op <0x%x>",
29152ccf843Smisaki 		    op));
29244961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
29344961713Sgirish 	}
29444961713Sgirish 
29544961713Sgirish 	if ((mask & TTE_SFLOW_ATTR_ALL) == 0) {
29644961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
29752ccf843Smisaki 		    " npi_zcp_tt_static_entry"
29852ccf843Smisaki 		    " Invalid Input: mask <0x%x>",
29952ccf843Smisaki 		    mask));
30044961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_SFLOW_ATTR_INVALID);
30144961713Sgirish 	}
30244961713Sgirish 
30344961713Sgirish 	if ((flow_id & ~0x0FFF) != 0) {
30444961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
30552ccf843Smisaki 		    " npi_zcp_tt_static_entry"
30652ccf843Smisaki 		    " Invalid Input: flow_id<0x%x>",
30752ccf843Smisaki 		    flow_id));
30844961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_FLOW_ID_INVALID);
30944961713Sgirish 	}
31044961713Sgirish 
311*b37cc459SToomas Soome 	if (zcp_mem_read(handle, flow_id, ZCP_RAM_SEL_TT_STATIC, 0,
31252ccf843Smisaki 	    (zcp_ram_unit_t *)&val) != 0) {
31344961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
31452ccf843Smisaki 		    " npi_zcp_tt_static_entry"
31552ccf843Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
31652ccf843Smisaki 		    NULL));
31744961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
31844961713Sgirish 	}
31944961713Sgirish 
32044961713Sgirish 	if (op == OP_SET) {
32144961713Sgirish 		if (mask & TTE_RDC_TBL_OFF) {
32244961713Sgirish 			val.qw0.bits.ldw.rdc_tbl_offset =
32352ccf843Smisaki 			    sflow->qw0.bits.ldw.rdc_tbl_offset;
32444961713Sgirish 			byte_en |= TTE_RDC_TBL_SFLOW_BITS_EN;
32544961713Sgirish 		}
32644961713Sgirish 		if (mask & TTE_BUF_SIZE) {
32744961713Sgirish 			val.qw0.bits.ldw.buf_size =
32852ccf843Smisaki 			    sflow->qw0.bits.ldw.buf_size;
32944961713Sgirish 			byte_en |= TTE_BUF_SIZE_BITS_EN;
33044961713Sgirish 		}
33144961713Sgirish 		if (mask & TTE_NUM_BUF) {
33244961713Sgirish 			val.qw0.bits.ldw.num_buf = sflow->qw0.bits.ldw.num_buf;
33344961713Sgirish 			byte_en |= TTE_NUM_BUF_BITS_EN;
33444961713Sgirish 		}
33544961713Sgirish 		if (mask & TTE_ULP_END) {
33644961713Sgirish 			val.qw0.bits.ldw.ulp_end = sflow->qw0.bits.ldw.ulp_end;
33744961713Sgirish 			byte_en |=  TTE_ULP_END_BITS_EN;
33844961713Sgirish 		}
33944961713Sgirish 		if (mask & TTE_ULP_END) {
34044961713Sgirish 			val.qw1.bits.ldw.ulp_end = sflow->qw1.bits.ldw.ulp_end;
34144961713Sgirish 			byte_en |= TTE_ULP_END_BITS_EN;
34244961713Sgirish 		}
34344961713Sgirish 		if (mask & TTE_ULP_END_EN) {
34444961713Sgirish 			val.qw1.bits.ldw.ulp_end_en =
34552ccf843Smisaki 			    sflow->qw1.bits.ldw.ulp_end_en;
34644961713Sgirish 			byte_en |= TTE_ULP_END_EN_BITS_EN;
34744961713Sgirish 		}
34844961713Sgirish 		if (mask & TTE_UNMAP_ALL_EN) {
34944961713Sgirish 			val.qw1.bits.ldw.unmap_all_en =
35052ccf843Smisaki 			    sflow->qw1.bits.ldw.unmap_all_en;
35144961713Sgirish 			byte_en |= TTE_UNMAP_ALL_EN;
35244961713Sgirish 		}
35344961713Sgirish 		if (mask & TTE_TMODE) {
35444961713Sgirish 			val.qw1.bits.ldw.tmode = sflow->qw1.bits.ldw.tmode;
35544961713Sgirish 			byte_en |= TTE_TMODE_BITS_EN;
35644961713Sgirish 		}
35744961713Sgirish 		if (mask & TTE_SKIP) {
35844961713Sgirish 			val.qw1.bits.ldw.skip = sflow->qw1.bits.ldw.skip;
35944961713Sgirish 			byte_en |= TTE_SKIP_BITS_EN;
36044961713Sgirish 		}
36144961713Sgirish 		if (mask & TTE_HBM_RING_BASE_ADDR) {
36244961713Sgirish 			val.qw1.bits.ldw.ring_base =
36352ccf843Smisaki 			    sflow->qw1.bits.ldw.ring_base;
36444961713Sgirish 			byte_en |= TTE_RING_BASE_ADDR_BITS_EN;
36544961713Sgirish 		}
36644961713Sgirish 		if (mask & TTE_HBM_RING_BASE_ADDR) {
36744961713Sgirish 			val.qw2.bits.ldw.ring_base =
36852ccf843Smisaki 			    sflow->qw2.bits.ldw.ring_base;
36944961713Sgirish 			byte_en |= TTE_RING_BASE_ADDR_BITS_EN;
37044961713Sgirish 		}
37144961713Sgirish 		if (mask & TTE_HBM_RING_SIZE) {
37244961713Sgirish 			val.qw2.bits.ldw.ring_size =
37352ccf843Smisaki 			    sflow->qw2.bits.ldw.ring_size;
37444961713Sgirish 			byte_en |= TTE_RING_SIZE_BITS_EN;
37544961713Sgirish 		}
37644961713Sgirish 		if (mask & TTE_HBM_BUSY) {
37744961713Sgirish 			val.qw2.bits.ldw.busy = sflow->qw2.bits.ldw.busy;
37844961713Sgirish 			byte_en |= TTE_BUSY_BITS_EN;
37944961713Sgirish 		}
38044961713Sgirish 		if (mask & TTE_HBM_TOQ) {
38144961713Sgirish 			val.qw3.bits.ldw.toq = sflow->qw3.bits.ldw.toq;
38244961713Sgirish 			byte_en |= TTE_TOQ_BITS_EN;
38344961713Sgirish 		}
38444961713Sgirish 
38544961713Sgirish 		if (zcp_mem_write(handle, flow_id, ZCP_RAM_SEL_TT_STATIC,
386*b37cc459SToomas Soome 		    byte_en, 0, (zcp_ram_unit_t *)&val) != 0) {
38744961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
38852ccf843Smisaki 			    " npi_zcp_tt_static_entry"
38952ccf843Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
39052ccf843Smisaki 			    NULL));
39144961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
39244961713Sgirish 		}
39344961713Sgirish 	} else {
39444961713Sgirish 		sflow->qw0.value = val.qw0.value;
39544961713Sgirish 		sflow->qw1.value = val.qw1.value;
39644961713Sgirish 		sflow->qw2.value = val.qw2.value;
39744961713Sgirish 		sflow->qw3.value = val.qw3.value;
39844961713Sgirish 		sflow->qw4.value = val.qw4.value;
39944961713Sgirish 	}
40044961713Sgirish 
40144961713Sgirish 	return (NPI_SUCCESS);
40244961713Sgirish }
40344961713Sgirish 
40444961713Sgirish 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)40544961713Sgirish npi_zcp_tt_dynamic_entry(npi_handle_t handle, io_op_t op, uint16_t flow_id,
40644961713Sgirish 			tte_dflow_attr_mask_t mask, tte_dflow_attr_t *dflow)
40744961713Sgirish {
40844961713Sgirish 	uint32_t		byte_en = 0;
40944961713Sgirish 	tte_dflow_attr_t	val;
41044961713Sgirish 
41144961713Sgirish 	if ((op != OP_SET) && (op != OP_GET)) {
41244961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
41352ccf843Smisaki 		    " npi_zcp_tt_dynamic_entry"
41452ccf843Smisaki 		    " Invalid Input: op <0x%x>", op));
41544961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
41644961713Sgirish 	}
41744961713Sgirish 
41844961713Sgirish 	if ((mask & TTE_DFLOW_ATTR_ALL) == 0) {
41944961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
42052ccf843Smisaki 		    " npi_zcp_tt_dynamic_entry"
42152ccf843Smisaki 		    " Invalid Input: mask <0x%x>",
42252ccf843Smisaki 		    mask));
42344961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_DFLOW_ATTR_INVALID);
42444961713Sgirish 	}
42544961713Sgirish 
42644961713Sgirish 	if ((flow_id & ~0x0FFF) != 0) {
42744961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
42852ccf843Smisaki 		    " npi_zcp_tt_dynamic_entry"
42952ccf843Smisaki 		    " Invalid Input: flow_id <0x%x>",
43052ccf843Smisaki 		    flow_id));
43144961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_FLOW_ID_INVALID);
43244961713Sgirish 	}
43344961713Sgirish 
434*b37cc459SToomas Soome 	if (zcp_mem_read(handle, flow_id, ZCP_RAM_SEL_TT_DYNAMIC, 0,
43552ccf843Smisaki 	    (zcp_ram_unit_t *)&val) != 0) {
43644961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
43752ccf843Smisaki 		    " npi_zcp_tt_dynamic_entry"
43852ccf843Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
43952ccf843Smisaki 		    NULL));
44044961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
44144961713Sgirish 	}
44244961713Sgirish 
44344961713Sgirish 	if (op == OP_SET) {
44444961713Sgirish 
44544961713Sgirish 		/* Get data read */
44644961713Sgirish 		if (mask & TTE_MAPPED_IN) {
44744961713Sgirish 			val.qw0.bits.ldw.mapped_in =
44852ccf843Smisaki 			    dflow->qw0.bits.ldw.mapped_in;
44944961713Sgirish 			byte_en |= TTE_MAPPED_IN_BITS_EN;
45044961713Sgirish 		}
45144961713Sgirish 		if (mask & TTE_ANCHOR_SEQ) {
45244961713Sgirish 			val.qw1.bits.ldw.anchor_seq =
45352ccf843Smisaki 			    dflow->qw1.bits.ldw.anchor_seq;
45444961713Sgirish 			byte_en |= TTE_ANCHOR_SEQ_BITS_EN;
45544961713Sgirish 		}
45644961713Sgirish 		if (mask & TTE_ANCHOR_OFFSET) {
45744961713Sgirish 			val.qw2.bits.ldw.anchor_offset =
45852ccf843Smisaki 			    dflow->qw2.bits.ldw.anchor_offset;
45944961713Sgirish 			byte_en |= TTE_ANCHOR_OFFSET_BITS_EN;
46044961713Sgirish 		}
46144961713Sgirish 		if (mask & TTE_ANCHOR_BUFFER) {
46244961713Sgirish 			val.qw2.bits.ldw.anchor_buf =
46352ccf843Smisaki 			    dflow->qw2.bits.ldw.anchor_buf;
46444961713Sgirish 			byte_en |= TTE_ANCHOR_BUFFER_BITS_EN;
46544961713Sgirish 		}
46644961713Sgirish 		if (mask & TTE_ANCHOR_BUF_FLAG) {
46744961713Sgirish 			val.qw2.bits.ldw.anchor_buf_flag =
46852ccf843Smisaki 			    dflow->qw2.bits.ldw.anchor_buf_flag;
46944961713Sgirish 			byte_en |= TTE_ANCHOR_BUF_FLAG_BITS_EN;
47044961713Sgirish 		}
47144961713Sgirish 		if (mask & TTE_UNMAP_ON_LEFT) {
47244961713Sgirish 			val.qw2.bits.ldw.unmap_on_left =
47352ccf843Smisaki 			    dflow->qw2.bits.ldw.unmap_on_left;
47444961713Sgirish 			byte_en |= TTE_UNMAP_ON_LEFT_BITS_EN;
47544961713Sgirish 		}
47644961713Sgirish 		if (mask & TTE_ULP_END_REACHED) {
47744961713Sgirish 			val.qw2.bits.ldw.ulp_end_reached =
47852ccf843Smisaki 			    dflow->qw2.bits.ldw.ulp_end_reached;
47944961713Sgirish 			byte_en |= TTE_ULP_END_REACHED_BITS_EN;
48044961713Sgirish 		}
48144961713Sgirish 		if (mask & TTE_ERR_STAT) {
48244961713Sgirish 			val.qw3.bits.ldw.err_stat =
48352ccf843Smisaki 			    dflow->qw3.bits.ldw.err_stat;
48444961713Sgirish 			byte_en |= TTE_ERR_STAT_BITS_EN;
48544961713Sgirish 		}
48644961713Sgirish 		if (mask & TTE_HBM_WR_PTR) {
48744961713Sgirish 			val.qw3.bits.ldw.wr_ptr = dflow->qw3.bits.ldw.wr_ptr;
48844961713Sgirish 			byte_en |= TTE_WR_PTR_BITS_EN;
48944961713Sgirish 		}
49044961713Sgirish 		if (mask & TTE_HBM_HOQ) {
49144961713Sgirish 			val.qw3.bits.ldw.hoq = dflow->qw3.bits.ldw.hoq;
49244961713Sgirish 			byte_en |= TTE_HOQ_BITS_EN;
49344961713Sgirish 		}
49444961713Sgirish 		if (mask & TTE_HBM_PREFETCH_ON) {
49544961713Sgirish 			val.qw3.bits.ldw.prefetch_on =
49652ccf843Smisaki 			    dflow->qw3.bits.ldw.prefetch_on;
49744961713Sgirish 			byte_en |= TTE_PREFETCH_ON_BITS_EN;
49844961713Sgirish 		}
49944961713Sgirish 
50044961713Sgirish 		if (zcp_mem_write(handle, flow_id, ZCP_RAM_SEL_TT_DYNAMIC,
501*b37cc459SToomas Soome 		    byte_en, 0, (zcp_ram_unit_t *)&val) != 0) {
50244961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
50352ccf843Smisaki 			    " npi_zcp_tt_dynamic_entry"
50452ccf843Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
50552ccf843Smisaki 			    NULL));
50644961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
50744961713Sgirish 		}
50844961713Sgirish 	} else {
50944961713Sgirish 		dflow->qw0.value = val.qw0.value;
51044961713Sgirish 		dflow->qw1.value = val.qw1.value;
51144961713Sgirish 		dflow->qw2.value = val.qw2.value;
51244961713Sgirish 		dflow->qw3.value = val.qw3.value;
51344961713Sgirish 		dflow->qw4.value = val.qw4.value;
51444961713Sgirish 	}
51544961713Sgirish 
51644961713Sgirish 	return (NPI_SUCCESS);
51744961713Sgirish }
51844961713Sgirish 
51944961713Sgirish 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)52044961713Sgirish npi_zcp_tt_bam_entry(npi_handle_t handle, io_op_t op, uint16_t flow_id,
52144961713Sgirish 			uint8_t bankn, uint8_t word_en, zcp_ram_unit_t *data)
52244961713Sgirish {
52344961713Sgirish 	zcp_ram_unit_t val;
52444961713Sgirish 
52544961713Sgirish 	if ((op != OP_SET) && (op != OP_GET)) {
52644961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
52752ccf843Smisaki 		    " npi_zcp_tt_bam_entry"
52852ccf843Smisaki 		    " Invalid Input: op <0x%x>", op));
52944961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
53044961713Sgirish 	}
53144961713Sgirish 
53244961713Sgirish 	if ((flow_id & ~0x0FFF) != 0) {
53344961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
53452ccf843Smisaki 		    " npi_zcp_tt_dynamic_entry"
53552ccf843Smisaki 		    " Invalid Input: flow_id <0x%x>",
53652ccf843Smisaki 		    flow_id));
53744961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_FLOW_ID_INVALID);
53844961713Sgirish 	}
53944961713Sgirish 
54044961713Sgirish 	if (bankn >= MAX_BAM_BANKS) {
54144961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
54252ccf843Smisaki 		    " npi_zcp_tt_bam_entry"
54352ccf843Smisaki 		    " Invalid Input: bankn <0x%x>",
54452ccf843Smisaki 		    bankn));
54544961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_BAM_BANK_INVALID);
54644961713Sgirish 	}
54744961713Sgirish 
54844961713Sgirish 	if ((word_en & ~0xF) != 0) {
54944961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
55052ccf843Smisaki 		    " npi_zcp_tt_bam_entry"
55152ccf843Smisaki 		    " Invalid Input: word_en <0x%x>",
55252ccf843Smisaki 		    word_en));
55344961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_BAM_WORD_EN_INVALID);
55444961713Sgirish 	}
55544961713Sgirish 
556*b37cc459SToomas Soome 	if (zcp_mem_read(handle, flow_id, ZCP_RAM_SEL_BAM0 + bankn, 0,
55752ccf843Smisaki 	    (zcp_ram_unit_t *)&val) != 0) {
55844961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
55952ccf843Smisaki 		    " npi_zcp_tt_bam_entry"
56052ccf843Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
56152ccf843Smisaki 		    NULL));
56244961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
56344961713Sgirish 	}
56444961713Sgirish 
56544961713Sgirish 	if (op == OP_SET) {
56644961713Sgirish 		if (zcp_mem_write(handle, flow_id, ZCP_RAM_SEL_BAM0 + bankn,
567*b37cc459SToomas Soome 		    word_en, 0, (zcp_ram_unit_t *)&val) != 0) {
56844961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
56952ccf843Smisaki 			    " npi_zcp_tt_bam_entry"
57052ccf843Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
57152ccf843Smisaki 			    NULL));
57244961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
57344961713Sgirish 		}
57444961713Sgirish 	} else {
57544961713Sgirish 		data->w0 = val.w0;
57644961713Sgirish 		data->w1 = val.w1;
57744961713Sgirish 		data->w2 = val.w2;
57844961713Sgirish 		data->w3 = val.w3;
57944961713Sgirish 	}
58044961713Sgirish 
58144961713Sgirish 	return (NPI_SUCCESS);
58244961713Sgirish }
58344961713Sgirish 
58444961713Sgirish 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)58544961713Sgirish npi_zcp_tt_cfifo_entry(npi_handle_t handle, io_op_t op, uint8_t portn,
58644961713Sgirish 			uint16_t entryn, zcp_ram_unit_t *data)
58744961713Sgirish {
58844961713Sgirish 	if ((op != OP_SET) && (op != OP_GET)) {
58944961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
59052ccf843Smisaki 		    " npi_zcp_tt_cfifo_entry"
59152ccf843Smisaki 		    " Invalid Input: op <0x%x>", op));
59244961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_OPCODE_INVALID);
59344961713Sgirish 	}
59444961713Sgirish 
59544961713Sgirish 	if (portn > 3) {
59644961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
59752ccf843Smisaki 		    " npi_zcp_tt_cfifo_entry"
59852ccf843Smisaki 		    " Invalid Input: portn <%d>", portn));
59944961713Sgirish 		return (NPI_FAILURE | NPI_ZCP_PORT_INVALID(portn));
60044961713Sgirish 	}
60144961713Sgirish 
60244961713Sgirish 	if (op == OP_SET) {
603*b37cc459SToomas Soome 		if (zcp_mem_write(handle, 0, ZCP_RAM_SEL_CFIFO0 + portn,
60452ccf843Smisaki 		    0x1ffff, entryn, data) != 0) {
60544961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
60652ccf843Smisaki 			    " npi_zcp_tt_cfifo_entry"
60752ccf843Smisaki 			    " HW Error: ZCP_RAM_ACC <0x%x>",
60852ccf843Smisaki 			    NULL));
60944961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_MEM_WRITE_FAILED);
61044961713Sgirish 		}
61144961713Sgirish 	} else {
612*b37cc459SToomas Soome 		if (zcp_mem_read(handle, 0, ZCP_RAM_SEL_CFIFO0 + portn,
61352ccf843Smisaki 		    entryn, data) != 0) {
61444961713Sgirish 			NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
61552ccf843Smisaki 			    " npi_zcp_tt_cfifo_entry"
61652ccf843Smisaki 			    " HW Error: ZCP_RAM_ACC  <0x%x>",
61752ccf843Smisaki 			    NULL));
61844961713Sgirish 			return (NPI_FAILURE | NPI_ZCP_MEM_READ_FAILED);
61944961713Sgirish 		}
62044961713Sgirish 	}
62144961713Sgirish 
62244961713Sgirish 	return (NPI_SUCCESS);
62344961713Sgirish }
62444961713Sgirish 
62544961713Sgirish npi_status_t
npi_zcp_rest_cfifo_port(npi_handle_t handle,uint8_t port)62644961713Sgirish npi_zcp_rest_cfifo_port(npi_handle_t handle, uint8_t port)
62744961713Sgirish {
62844961713Sgirish 	uint64_t offset = ZCP_RESET_CFIFO_REG;
62944961713Sgirish 	zcp_reset_cfifo_t cfifo_reg;
63044961713Sgirish 	NXGE_REG_RD64(handle, offset, &cfifo_reg.value);
63144961713Sgirish 	cfifo_reg.value &= ZCP_RESET_CFIFO_MASK;
63244961713Sgirish 
63344961713Sgirish 	switch (port) {
63444961713Sgirish 		case 0:
63544961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo0 = 1;
63644961713Sgirish 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
63744961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo0 = 0;
63844961713Sgirish 
63944961713Sgirish 			break;
64044961713Sgirish 		case 1:
64144961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo1 = 1;
64244961713Sgirish 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
64344961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo1 = 0;
64444961713Sgirish 			break;
64544961713Sgirish 		case 2:
64644961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo2 = 1;
64744961713Sgirish 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
64844961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo2 = 0;
64944961713Sgirish 			break;
65044961713Sgirish 		case 3:
65144961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo3 = 1;
65244961713Sgirish 			NXGE_REG_WR64(handle, offset, cfifo_reg.value);
65344961713Sgirish 			cfifo_reg.bits.ldw.reset_cfifo3 = 0;
65444961713Sgirish 			break;
65544961713Sgirish 		default:
65644961713Sgirish 			break;
65744961713Sgirish 	}
65844961713Sgirish 
65944961713Sgirish 	NXGE_DELAY(ZCP_CFIFIO_RESET_WAIT);
66044961713Sgirish 	NXGE_REG_WR64(handle, offset, cfifo_reg.value);
66144961713Sgirish 
66244961713Sgirish 	return (NPI_SUCCESS);
66344961713Sgirish }
66444961713Sgirish 
66544961713Sgirish npi_status_t
npi_zcp_rest_cfifo_all(npi_handle_t handle)66644961713Sgirish npi_zcp_rest_cfifo_all(npi_handle_t handle)
66744961713Sgirish {
66844961713Sgirish 	uint64_t offset = ZCP_RESET_CFIFO_REG;
66944961713Sgirish 	zcp_reset_cfifo_t cfifo_reg;
67044961713Sgirish 
67144961713Sgirish 	cfifo_reg.value = ZCP_RESET_CFIFO_MASK;
67244961713Sgirish 	NXGE_REG_WR64(handle, offset, cfifo_reg.value);
67344961713Sgirish 	cfifo_reg.value = 0;
67444961713Sgirish 	NXGE_DELAY(ZCP_CFIFIO_RESET_WAIT);
67544961713Sgirish 	NXGE_REG_WR64(handle, offset, cfifo_reg.value);
67644961713Sgirish 	return (NPI_SUCCESS);
67744961713Sgirish }
67844961713Sgirish 
67944961713Sgirish 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)68044961713Sgirish zcp_mem_read(npi_handle_t handle, uint16_t flow_id, uint8_t ram_sel,
68144961713Sgirish 		uint16_t cfifo_entryn, zcp_ram_unit_t *val)
68244961713Sgirish {
68344961713Sgirish 	zcp_ram_access_t ram_ctl;
68444961713Sgirish 
68544961713Sgirish 	ram_ctl.value = 0;
68644961713Sgirish 	ram_ctl.bits.ldw.ram_sel = ram_sel;
68744961713Sgirish 	ram_ctl.bits.ldw.zcfid = flow_id;
68844961713Sgirish 	ram_ctl.bits.ldw.rdwr = ZCP_RAM_RD;
68944961713Sgirish 	ram_ctl.bits.ldw.cfifo = cfifo_entryn;
69044961713Sgirish 
69144961713Sgirish 	/* Wait for RAM ready to be read */
69244961713Sgirish 	ZCP_WAIT_RAM_READY(handle, ram_ctl.value);
69344961713Sgirish 	if (ram_ctl.bits.ldw.busy != 0) {
69444961713Sgirish 		NPI_ERROR_MSG((handle.function, NPI_ERR_CTL,
69552ccf843Smisaki 		    " npi_zcp_tt_static_entry"
69652ccf843Smisaki 		    " HW Error: ZCP_RAM_ACC <0x%x>",
69752ccf843Smisaki 		    ram_ctl.value));
69844961713Sgirish 		return (-1);
69944961713Sgirish 	}
70044961713Sgirish 
70144961713Sgirish 	/* Read from RAM */
70244961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_ACC_REG, ram_ctl.value);
70344961713Sgirish 
70444961713Sgirish 	/* Wait for RAM read done */
70544961713Sgirish 	ZCP_WAIT_RAM_READY(handle, ram_ctl.value);
70644961713Sgirish 	if (ram_ctl.bits.ldw.busy != 0)
70744961713Sgirish 		return (-1);
70844961713Sgirish 
70944961713Sgirish 	/* Get data */
71044961713Sgirish 	NXGE_REG_RD64(handle, ZCP_RAM_DATA0_REG, &val->w0);
71144961713Sgirish 	NXGE_REG_RD64(handle, ZCP_RAM_DATA1_REG, &val->w1);
71244961713Sgirish 	NXGE_REG_RD64(handle, ZCP_RAM_DATA2_REG, &val->w2);
71344961713Sgirish 	NXGE_REG_RD64(handle, ZCP_RAM_DATA3_REG, &val->w3);
71444961713Sgirish 	NXGE_REG_RD64(handle, ZCP_RAM_DATA4_REG, &val->w4);
71544961713Sgirish 
71644961713Sgirish 	return (0);
71744961713Sgirish }
71844961713Sgirish 
71944961713Sgirish 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)72044961713Sgirish zcp_mem_write(npi_handle_t handle, uint16_t flow_id, uint8_t ram_sel,
72144961713Sgirish 		uint32_t byte_en, uint16_t cfifo_entryn, zcp_ram_unit_t *val)
72244961713Sgirish {
72344961713Sgirish 	zcp_ram_access_t	ram_ctl;
72444961713Sgirish 	zcp_ram_benable_t	ram_en;
72544961713Sgirish 
72644961713Sgirish 	ram_ctl.value = 0;
72744961713Sgirish 	ram_ctl.bits.ldw.ram_sel = ram_sel;
72844961713Sgirish 	ram_ctl.bits.ldw.zcfid = flow_id;
72944961713Sgirish 	ram_ctl.bits.ldw.rdwr = ZCP_RAM_WR;
73044961713Sgirish 	ram_en.bits.ldw.be = byte_en;
73144961713Sgirish 	ram_ctl.bits.ldw.cfifo = cfifo_entryn;
73244961713Sgirish 
73344961713Sgirish 	/* Setup data */
73444961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_DATA0_REG, val->w0);
73544961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_DATA1_REG, val->w1);
73644961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_DATA2_REG, val->w2);
73744961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_DATA3_REG, val->w3);
73844961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_DATA4_REG, val->w4);
73944961713Sgirish 
74044961713Sgirish 	/* Set byte mask */
74144961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_BE_REG, ram_en.value);
74244961713Sgirish 
74344961713Sgirish 	/* Write to RAM */
74444961713Sgirish 	NXGE_REG_WR64(handle, ZCP_RAM_ACC_REG, ram_ctl.value);
74544961713Sgirish 
74644961713Sgirish 	/* Wait for RAM write complete */
74744961713Sgirish 	ZCP_WAIT_RAM_READY(handle, ram_ctl.value);
74844961713Sgirish 	if (ram_ctl.bits.ldw.busy != 0)
74944961713Sgirish 		return (-1);
75044961713Sgirish 
75144961713Sgirish 	return (0);
75244961713Sgirish }
753