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