a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER START
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * The contents of this file are subject to the terms of the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Common Development and Distribution License (the "License").
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You may not use this file except in compliance with the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a23fd118e437af0a7877dd313db8fdaa3537c675yl * or http://www.opensolaris.org/os/licensing.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See the License for the specific language governing permissions
a23fd118e437af0a7877dd313db8fdaa3537c675yl * and limitations under the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * When distributing Covered Code, include this CDDL HEADER in each
a23fd118e437af0a7877dd313db8fdaa3537c675yl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * If applicable, add the following below this CDDL HEADER, with the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * fields enclosed by brackets "[]" replaced with your own identifying
a23fd118e437af0a7877dd313db8fdaa3537c675yl * information: Portions Copyright [yyyy] [name of copyright owner]
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER END
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl * Copyright (c) 2002-2006 Neterion, Inc.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifndef XGE_HAL_MM_H
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_HAL_MM_H
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xge-os-pal.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xge-debug.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xgehal-types.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include "xgehal-driver.h"
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl__EXTERN_BEGIN_DECLS
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef void* xge_hal_mempool_h;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * struct xge_hal_mempool_dma_t - Represents DMA objects passed to the
a23fd118e437af0a7877dd313db8fdaa3537c675yl caller.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef struct xge_hal_mempool_dma_t {
a23fd118e437af0a7877dd313db8fdaa3537c675yl dma_addr_t addr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_dma_h handle;
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_dma_acc_h acc_handle;
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_mempool_dma_t;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * xge_hal_mempool_item_f - Mempool item alloc/free callback
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @mempoolh: Memory pool handle.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @item: Item that gets allocated or freed.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @index: Item's index in the memory pool.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * @is_last: True, if this item is the last one in the pool; false - otherwise.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * userdat: Per-pool user context.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Memory pool allocation/deallocation callback.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef xge_hal_status_e (*xge_hal_mempool_item_f) (xge_hal_mempool_h mempoolh,
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *memblock, int memblock_index,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_mempool_dma_t *dma_object, void *item,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int index, int is_last, void *userdata);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * struct xge_hal_mempool_t - Memory pool.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef struct xge_hal_mempool_t {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_mempool_item_f item_func_alloc;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_mempool_item_f item_func_free;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *userdata;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **memblocks_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **memblocks_priv_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_mempool_dma_t *memblocks_dma_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_dev_h pdev;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int memblock_size;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int memblocks_max;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int memblocks_allocated;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int item_size;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int items_max;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int items_initial;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int items_current;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int items_per_memblock;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **items_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void **shadow_items_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int items_priv_size;
a23fd118e437af0a7877dd313db8fdaa3537c675yl} xge_hal_mempool_t;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * __hal_mempool_item - Returns pointer to the item in the mempool
a23fd118e437af0a7877dd313db8fdaa3537c675yl * items array.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void*
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_mempool_item(xge_hal_mempool_t *mempool, int index)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl return mempool->items_arr[index];
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * __hal_mempool_item_priv - will return pointer on per item private space
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void*
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_mempool_item_priv(xge_hal_mempool_t *mempool, int memblock_idx,
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *item, int *memblock_item_idx)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl ptrdiff_t offset;
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *memblock = mempool->memblocks_arr[memblock_idx];
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(memblock);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl offset = (int)((char * )item - (char *)memblock);
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(offset >= 0 && offset < mempool->memblock_size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl (*memblock_item_idx) = (int) offset / mempool->item_size;
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert((*memblock_item_idx) < mempool->items_per_memblock);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (char*)mempool->memblocks_priv_arr[memblock_idx] +
a23fd118e437af0a7877dd313db8fdaa3537c675yl (*memblock_item_idx) * mempool->items_priv_size;
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * __hal_mempool_items_arr - will return pointer to the items array in the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * mempool.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void*
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_mempool_items_arr(xge_hal_mempool_t *mempool)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl return mempool->items_arr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * __hal_mempool_memblock - will return pointer to the memblock in the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * mempool memblocks array.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void*
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_mempool_memblock(xge_hal_mempool_t *mempool, int memblock_idx)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_assert(mempool->memblocks_arr[memblock_idx]);
a23fd118e437af0a7877dd313db8fdaa3537c675yl return mempool->memblocks_arr[memblock_idx];
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * __hal_mempool_memblock_dma - will return pointer to the dma block
a23fd118e437af0a7877dd313db8fdaa3537c675yl * corresponds to the memblock(identified by memblock_idx) in the mempool.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline xge_hal_mempool_dma_t*
a23fd118e437af0a7877dd313db8fdaa3537c675yl__hal_mempool_memblock_dma(xge_hal_mempool_t *mempool, int memblock_idx)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl return mempool->memblocks_dma_arr + memblock_idx;
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_status_e __hal_mempool_grow(xge_hal_mempool_t *mempool,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int num_allocate, int *num_allocated);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylxge_hal_mempool_t* __hal_mempool_create(pci_dev_h pdev, int memblock_size,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int item_size, int private_size, int items_initial,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int items_max, xge_hal_mempool_item_f item_func_alloc,
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_hal_mempool_item_f item_func_free, void *userdata);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylvoid __hal_mempool_destroy(xge_hal_mempool_t *mempool);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl__EXTERN_END_DECLS
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif /* XGE_HAL_MM_H */