14d0e5007SSukumar Swaminathan /*
24d0e5007SSukumar Swaminathan  * CDDL HEADER START
34d0e5007SSukumar Swaminathan  *
44d0e5007SSukumar Swaminathan  * The contents of this file are subject to the terms of the
54d0e5007SSukumar Swaminathan  * Common Development and Distribution License (the "License").
64d0e5007SSukumar Swaminathan  * You may not use this file except in compliance with the License.
74d0e5007SSukumar Swaminathan  *
84d0e5007SSukumar Swaminathan  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
94d0e5007SSukumar Swaminathan  * or http://www.opensolaris.org/os/licensing.
104d0e5007SSukumar Swaminathan  * See the License for the specific language governing permissions
114d0e5007SSukumar Swaminathan  * and limitations under the License.
124d0e5007SSukumar Swaminathan  *
134d0e5007SSukumar Swaminathan  * When distributing Covered Code, include this CDDL HEADER in each
144d0e5007SSukumar Swaminathan  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
154d0e5007SSukumar Swaminathan  * If applicable, add the following below this CDDL HEADER, with the
164d0e5007SSukumar Swaminathan  * fields enclosed by brackets "[]" replaced with your own identifying
174d0e5007SSukumar Swaminathan  * information: Portions Copyright [yyyy] [name of copyright owner]
184d0e5007SSukumar Swaminathan  *
194d0e5007SSukumar Swaminathan  * CDDL HEADER END
204d0e5007SSukumar Swaminathan  */
214d0e5007SSukumar Swaminathan 
22*3abb112fSGarrett D'Amore /* Copyright © 2003-2011 Emulex. All rights reserved.  */
234d0e5007SSukumar Swaminathan 
244d0e5007SSukumar Swaminathan /*
254d0e5007SSukumar Swaminathan  * Header file defining the driver buffer management interface
264d0e5007SSukumar Swaminathan  */
274d0e5007SSukumar Swaminathan 
284d0e5007SSukumar Swaminathan #ifndef _OCE_BUF_H_
294d0e5007SSukumar Swaminathan #define	_OCE_BUF_H_
304d0e5007SSukumar Swaminathan 
314d0e5007SSukumar Swaminathan #ifdef __cplusplus
324d0e5007SSukumar Swaminathan extern "C" {
334d0e5007SSukumar Swaminathan #endif
344d0e5007SSukumar Swaminathan 
354d0e5007SSukumar Swaminathan #include <sys/ddidmareq.h>
364d0e5007SSukumar Swaminathan #include <oce_io.h>
374d0e5007SSukumar Swaminathan #include <oce_utils.h>
384d0e5007SSukumar Swaminathan 
394d0e5007SSukumar Swaminathan #define	GET_Q_NEXT(_START, _STEP, _END) \
404d0e5007SSukumar Swaminathan 	(((_START) + (_STEP)) < (_END) ? ((_START) + (_STEP)) \
414d0e5007SSukumar Swaminathan 	: (((_START) + (_STEP)) - (_END)))
424d0e5007SSukumar Swaminathan 
434d0e5007SSukumar Swaminathan #define	OCE_MAX_TX_HDL		8
445b9d3151SSukumar Swaminathan #define	OCE_MAX_TXDMA_COOKIES	18
454d0e5007SSukumar Swaminathan #define	OCE_TXMAP_ALIGN		1
464d0e5007SSukumar Swaminathan #define	OCE_TX_MAX_FRAGS	(OCE_MAX_TX_HDL * OCE_MAX_TXDMA_COOKIES)
474d0e5007SSukumar Swaminathan 
484d0e5007SSukumar Swaminathan /* helper structure to access OS addresses */
494d0e5007SSukumar Swaminathan typedef union  oce_addr_s {
504d0e5007SSukumar Swaminathan 	uint64_t addr64;
514d0e5007SSukumar Swaminathan 	struct {
524d0e5007SSukumar Swaminathan #ifdef _BIG_ENDIAN
534d0e5007SSukumar Swaminathan 		uint32_t addr_hi;
544d0e5007SSukumar Swaminathan 		uint32_t addr_lo;
554d0e5007SSukumar Swaminathan #else
564d0e5007SSukumar Swaminathan 		uint32_t addr_lo;
574d0e5007SSukumar Swaminathan 		uint32_t addr_hi;
584d0e5007SSukumar Swaminathan #endif
594d0e5007SSukumar Swaminathan 	}dw;
604d0e5007SSukumar Swaminathan }oce_addr64_t;
614d0e5007SSukumar Swaminathan 
624d0e5007SSukumar Swaminathan typedef struct oce_dma_buf_s {
634d0e5007SSukumar Swaminathan 	caddr_t		base;
644d0e5007SSukumar Swaminathan 	uint64_t	addr;
654d0e5007SSukumar Swaminathan 	ddi_acc_handle_t acc_handle;
664d0e5007SSukumar Swaminathan 	ddi_dma_handle_t dma_handle;
674d0e5007SSukumar Swaminathan 	/* size of the memory */
684d0e5007SSukumar Swaminathan 	size_t		size;
694d0e5007SSukumar Swaminathan 	size_t		off;
704d0e5007SSukumar Swaminathan 	size_t		len;
714d0e5007SSukumar Swaminathan 	uint32_t	num_pages;
724d0e5007SSukumar Swaminathan }oce_dma_buf_t;
734d0e5007SSukumar Swaminathan 
744d0e5007SSukumar Swaminathan #define	DBUF_PA(obj) (((oce_dma_buf_t *)(obj))->addr)
754d0e5007SSukumar Swaminathan #define	DBUF_VA(obj) (((oce_dma_buf_t *)(obj))->base)
764d0e5007SSukumar Swaminathan #define	DBUF_DHDL(obj) (((oce_dma_buf_t *)(obj))->dma_handle)
774d0e5007SSukumar Swaminathan #define	DBUF_AHDL(obj) (((oce_dma_buf_t *)obj))->acc_handle)
785b9d3151SSukumar Swaminathan #define	DBUF_SYNC(obj, flags)	(void) ddi_dma_sync(DBUF_DHDL(obj), 0,\
795b9d3151SSukumar Swaminathan 			0, (flags))
804d0e5007SSukumar Swaminathan 
814d0e5007SSukumar Swaminathan typedef struct oce_ring_buffer_s {
824d0e5007SSukumar Swaminathan 	uint16_t    cidx; 	/* Get ptr */
834d0e5007SSukumar Swaminathan 	uint16_t    pidx;	/* Put Ptr */
844d0e5007SSukumar Swaminathan 	size_t	item_size;	/* Size */
854d0e5007SSukumar Swaminathan 	size_t  num_items;	/* count */
864d0e5007SSukumar Swaminathan 	uint32_t  num_used;
874d0e5007SSukumar Swaminathan 	oce_dma_buf_t   *dbuf;	/* dma buffer */
884d0e5007SSukumar Swaminathan }oce_ring_buffer_t;
894d0e5007SSukumar Swaminathan 
904d0e5007SSukumar Swaminathan typedef struct oce_rq_bdesc_s {
914d0e5007SSukumar Swaminathan 	oce_dma_buf_t	*rqb;
924d0e5007SSukumar Swaminathan 	struct oce_rq	*rq;
934d0e5007SSukumar Swaminathan 	oce_addr64_t 	frag_addr;
944d0e5007SSukumar Swaminathan 	mblk_t		*mp;
954d0e5007SSukumar Swaminathan 	frtn_t		fr_rtn;
965b9d3151SSukumar Swaminathan     uint32_t    ref_cnt;
974d0e5007SSukumar Swaminathan }oce_rq_bdesc_t;
984d0e5007SSukumar Swaminathan 
994d0e5007SSukumar Swaminathan typedef struct oce_wq_bdesc_s {
1004d0e5007SSukumar Swaminathan 	OCE_LIST_NODE_T  link;
1014d0e5007SSukumar Swaminathan 	oce_dma_buf_t	*wqb;
1024d0e5007SSukumar Swaminathan 	oce_addr64_t 	frag_addr;
1034d0e5007SSukumar Swaminathan } oce_wq_bdesc_t;
1044d0e5007SSukumar Swaminathan 
1054d0e5007SSukumar Swaminathan typedef struct oce_wq_mdesc_s {
1064d0e5007SSukumar Swaminathan 	OCE_LIST_NODE_T  	link;
1074d0e5007SSukumar Swaminathan 	ddi_dma_handle_t	dma_handle;
1084d0e5007SSukumar Swaminathan } oce_wq_mdesc_t;
1094d0e5007SSukumar Swaminathan 
1104d0e5007SSukumar Swaminathan enum entry_type {
1114d0e5007SSukumar Swaminathan 	HEADER_WQE = 0x1, /* arbitrary value */
1124d0e5007SSukumar Swaminathan 	MAPPED_WQE,
1134d0e5007SSukumar Swaminathan 	COPY_WQE,
1144d0e5007SSukumar Swaminathan 	DUMMY_WQE
1154d0e5007SSukumar Swaminathan };
1164d0e5007SSukumar Swaminathan 
1174d0e5007SSukumar Swaminathan typedef struct _oce_handle_s {
1185b9d3151SSukumar Swaminathan     enum entry_type	type;
1194d0e5007SSukumar Swaminathan 	void		*hdl; /* opaque handle */
1204d0e5007SSukumar Swaminathan }oce_handle_t;
1214d0e5007SSukumar Swaminathan 
1224d0e5007SSukumar Swaminathan typedef struct _oce_wqe_desc_s {
1234d0e5007SSukumar Swaminathan 	OCE_LIST_NODE_T  link;
1244d0e5007SSukumar Swaminathan 	oce_handle_t	hdesc[OCE_MAX_TX_HDL];
1254d0e5007SSukumar Swaminathan 	struct oce_nic_frag_wqe frag[OCE_TX_MAX_FRAGS];
1264d0e5007SSukumar Swaminathan 	struct oce_wq  *wq;
1274d0e5007SSukumar Swaminathan 	mblk_t		*mp;
1284d0e5007SSukumar Swaminathan 	uint16_t	wqe_cnt;
1295b9d3151SSukumar Swaminathan 	uint16_t	frag_idx;
1305b9d3151SSukumar Swaminathan 	uint16_t	frag_cnt;
1315b9d3151SSukumar Swaminathan 	uint16_t	nhdl;
1324d0e5007SSukumar Swaminathan }oce_wqe_desc_t;
1334d0e5007SSukumar Swaminathan 
1344d0e5007SSukumar Swaminathan #pragma pack(1)
1354d0e5007SSukumar Swaminathan /* Always keep it 2 mod 4 */
1364d0e5007SSukumar Swaminathan typedef struct _oce_rq_buf_hdr_s {
1374d0e5007SSukumar Swaminathan 	void *datap;
1384d0e5007SSukumar Swaminathan 	uint8_t pad[18];
1394d0e5007SSukumar Swaminathan 	/* ether_vlan_header_t vhdr; */
1404d0e5007SSukumar Swaminathan } oce_rq_buf_hdr_t;
1414d0e5007SSukumar Swaminathan #pragma pack()
1424d0e5007SSukumar Swaminathan 
143*3abb112fSGarrett D'Amore #define	OCE_RQE_BUF_HEADROOM	18
1444d0e5007SSukumar Swaminathan #define	MAX_POOL_NAME		32
1454d0e5007SSukumar Swaminathan 
1464d0e5007SSukumar Swaminathan #define	RING_NUM_PENDING(ring)	ring->num_used
1474d0e5007SSukumar Swaminathan 
1484d0e5007SSukumar Swaminathan #define	RING_NUM_FREE(ring)	\
1494d0e5007SSukumar Swaminathan 	(uint32_t)(ring->num_items - ring->num_used)
1504d0e5007SSukumar Swaminathan 
1514d0e5007SSukumar Swaminathan #define	RING_FULL(ring) (ring->num_used == ring->num_items)
1524d0e5007SSukumar Swaminathan 
1534d0e5007SSukumar Swaminathan #define	RING_EMPTY(ring) (ring->num_used == 0)
1544d0e5007SSukumar Swaminathan 
1554d0e5007SSukumar Swaminathan #define	RING_GET(ring, n)			\
1564d0e5007SSukumar Swaminathan 	ring->cidx = GET_Q_NEXT(ring->cidx, n, ring->num_items)
1574d0e5007SSukumar Swaminathan 
1584d0e5007SSukumar Swaminathan #define	RING_PUT(ring, n)			\
1594d0e5007SSukumar Swaminathan 	ring->pidx = GET_Q_NEXT(ring->pidx, n, ring->num_items)
1604d0e5007SSukumar Swaminathan 
1614d0e5007SSukumar Swaminathan #define	RING_GET_CONSUMER_ITEM_VA(ring, type) 	\
1624d0e5007SSukumar Swaminathan 	(void*)(((type *)DBUF_VA(ring->dbuf)) + ring->cidx)
1634d0e5007SSukumar Swaminathan 
1644d0e5007SSukumar Swaminathan #define	RING_GET_CONSUMER_ITEM_PA(ring, type)		\
1654d0e5007SSukumar Swaminathan 	(uint64_t)(((type *)DBUF_PA(ring->dbuf)) + ring->cidx)
1664d0e5007SSukumar Swaminathan 
1674d0e5007SSukumar Swaminathan #define	RING_GET_PRODUCER_ITEM_VA(ring, type)		\
1684d0e5007SSukumar Swaminathan 	(void *)(((type *)DBUF_VA(ring->dbuf)) + ring->pidx)
1694d0e5007SSukumar Swaminathan 
1704d0e5007SSukumar Swaminathan #define	RING_GET_PRODUCER_ITEM_PA(ring, type)		\
1714d0e5007SSukumar Swaminathan 	(uint64_t)(((type *)DBUF_PA(ring->dbuf)) + ring->pidx)
1724d0e5007SSukumar Swaminathan 
1734d0e5007SSukumar Swaminathan /* Rq cache */
1744d0e5007SSukumar Swaminathan int oce_rqb_cache_create(struct oce_rq *rq, size_t buf_size);
1754d0e5007SSukumar Swaminathan void oce_rqb_cache_destroy(struct oce_rq *rq);
1764d0e5007SSukumar Swaminathan 
1774d0e5007SSukumar Swaminathan /* Wq Cache */
1784d0e5007SSukumar Swaminathan int oce_wqe_desc_ctor(void *buf, void *arg, int kmflags);
1794d0e5007SSukumar Swaminathan void oce_wqe_desc_dtor(void *buf, void *arg);
1804d0e5007SSukumar Swaminathan 
1814d0e5007SSukumar Swaminathan int oce_wqb_cache_create(struct oce_wq *wq, size_t buf_size);
1824d0e5007SSukumar Swaminathan void oce_wqb_cache_destroy(struct oce_wq *wq);
1834d0e5007SSukumar Swaminathan 
1844d0e5007SSukumar Swaminathan void oce_wqm_cache_destroy(struct oce_wq *wq);
1854d0e5007SSukumar Swaminathan int oce_wqm_cache_create(struct oce_wq *wq);
1864d0e5007SSukumar Swaminathan 
1874d0e5007SSukumar Swaminathan void oce_page_list(oce_dma_buf_t *dbuf,
1884d0e5007SSukumar Swaminathan     struct phys_addr *pa_list, int list_size);
1894d0e5007SSukumar Swaminathan 
1904d0e5007SSukumar Swaminathan 
1914d0e5007SSukumar Swaminathan #ifdef __cplusplus
1924d0e5007SSukumar Swaminathan }
1934d0e5007SSukumar Swaminathan #endif
1944d0e5007SSukumar Swaminathan 
1954d0e5007SSukumar Swaminathan #endif /* _OCE_BUF_H_ */
196