4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * The contents of this file are subject to the terms of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Common Development and Distribution License (the "License").
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You may not use this file except in compliance with the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * See the License for the specific language governing permissions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and limitations under the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore/* Copyright © 2003-2011 Emulex. All rights reserved. */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Header file defining the driver buffer management interface
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifndef _OCE_BUF_H_
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define _OCE_BUF_H_
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifdef __cplusplus
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanextern "C" {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <sys/ddidmareq.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_io.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_utils.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define GET_Q_NEXT(_START, _STEP, _END) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (((_START) + (_STEP)) < (_END) ? ((_START) + (_STEP)) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan : (((_START) + (_STEP)) - (_END)))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_MAX_TX_HDL 8
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan#define OCE_MAX_TXDMA_COOKIES 18
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_TXMAP_ALIGN 1
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_TX_MAX_FRAGS (OCE_MAX_TX_HDL * OCE_MAX_TXDMA_COOKIES)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* helper structure to access OS addresses */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef union oce_addr_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint64_t addr64;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifdef _BIG_ENDIAN
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t addr_hi;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t addr_lo;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#else
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t addr_lo;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t addr_hi;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }dw;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}oce_addr64_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct oce_dma_buf_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan caddr_t base;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint64_t addr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_acc_handle_t acc_handle;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_handle_t dma_handle;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* size of the memory */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t size;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t off;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t len;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t num_pages;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}oce_dma_buf_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define DBUF_PA(obj) (((oce_dma_buf_t *)(obj))->addr)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define DBUF_VA(obj) (((oce_dma_buf_t *)(obj))->base)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define DBUF_DHDL(obj) (((oce_dma_buf_t *)(obj))->dma_handle)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define DBUF_AHDL(obj) (((oce_dma_buf_t *)obj))->acc_handle)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan#define DBUF_SYNC(obj, flags) (void) ddi_dma_sync(DBUF_DHDL(obj), 0,\
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan 0, (flags))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct oce_ring_buffer_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint16_t cidx; /* Get ptr */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint16_t pidx; /* Put Ptr */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t item_size; /* Size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t num_items; /* count */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t num_used;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_t *dbuf; /* dma buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}oce_ring_buffer_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct oce_rq_bdesc_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_t *rqb;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_rq *rq;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_addr64_t frag_addr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mblk_t *mp;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan frtn_t fr_rtn;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t ref_cnt;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}oce_rq_bdesc_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct oce_wq_bdesc_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T link;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_t *wqb;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_addr64_t frag_addr;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} oce_wq_bdesc_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct oce_wq_mdesc_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T link;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_handle_t dma_handle;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} oce_wq_mdesc_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanenum entry_type {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan HEADER_WQE = 0x1, /* arbitrary value */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan MAPPED_WQE,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan COPY_WQE,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DUMMY_WQE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct _oce_handle_s {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan enum entry_type type;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan void *hdl; /* opaque handle */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}oce_handle_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct _oce_wqe_desc_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T link;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_handle_t hdesc[OCE_MAX_TX_HDL];
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_nic_frag_wqe frag[OCE_TX_MAX_FRAGS];
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_wq *wq;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan mblk_t *mp;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint16_t wqe_cnt;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint16_t frag_idx;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint16_t frag_cnt;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint16_t nhdl;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}oce_wqe_desc_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#pragma pack(1)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* Always keep it 2 mod 4 */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct _oce_rq_buf_hdr_s {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan void *datap;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint8_t pad[18];
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* ether_vlan_header_t vhdr; */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} oce_rq_buf_hdr_t;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#pragma pack()
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore#define OCE_RQE_BUF_HEADROOM 18
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define MAX_POOL_NAME 32
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_NUM_PENDING(ring) ring->num_used
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_NUM_FREE(ring) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (uint32_t)(ring->num_items - ring->num_used)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_FULL(ring) (ring->num_used == ring->num_items)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_EMPTY(ring) (ring->num_used == 0)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_GET(ring, n) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring->cidx = GET_Q_NEXT(ring->cidx, n, ring->num_items)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_PUT(ring, n) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring->pidx = GET_Q_NEXT(ring->pidx, n, ring->num_items)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_GET_CONSUMER_ITEM_VA(ring, type) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void*)(((type *)DBUF_VA(ring->dbuf)) + ring->cidx)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_GET_CONSUMER_ITEM_PA(ring, type) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (uint64_t)(((type *)DBUF_PA(ring->dbuf)) + ring->cidx)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_GET_PRODUCER_ITEM_VA(ring, type) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void *)(((type *)DBUF_VA(ring->dbuf)) + ring->pidx)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define RING_GET_PRODUCER_ITEM_PA(ring, type) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (uint64_t)(((type *)DBUF_PA(ring->dbuf)) + ring->pidx)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* Rq cache */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint oce_rqb_cache_create(struct oce_rq *rq, size_t buf_size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_rqb_cache_destroy(struct oce_rq *rq);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* Wq Cache */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint oce_wqe_desc_ctor(void *buf, void *arg, int kmflags);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_wqe_desc_dtor(void *buf, void *arg);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint oce_wqb_cache_create(struct oce_wq *wq, size_t buf_size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_wqb_cache_destroy(struct oce_wq *wq);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_wqm_cache_destroy(struct oce_wq *wq);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint oce_wqm_cache_create(struct oce_wq *wq);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_page_list(oce_dma_buf_t *dbuf,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct phys_addr *pa_list, int list_size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifdef __cplusplus
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif /* _OCE_BUF_H_ */