oce_buf.c revision 4d0e50075058332ce0cd62bc2669a8a4dea45da0
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
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 * 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 * 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 * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Copyright 2009 Emulex. All rights reserved.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Use is subject to license terms.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Source file containing the implementation of Driver buffer management
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and related helper functions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic ddi_dma_attr_t oce_dma_buf_attr = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x0000000000000000ull, /* low address */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0xFFFFFFFFFFFFFFFFull, /* high address */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000000FFFFFFFFull, /* dma counter max */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000000FFFFFFFFull, /* maximum transfer size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0xFFFFFFFFFFFFFFFFull, /* maximum segment size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0 /* DMA flags */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic ddi_device_acc_attr_t oce_dma_buf_accattr = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to allocate a dma buffer for mapping memory va-pa
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * size - size of the memory to map
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * flags - DDI_DMA_CONSISTENT/DDI_DMA_STREAMING
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return pointer to a oce_dma_buf_t structure handling the map
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * NULL => failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_alloc_dma_buffer(struct oce_dev *dev,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dbuf = kmem_zalloc(sizeof (oce_dma_buf_t), KM_SLEEP);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate dma handle */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_alloc_handle(dev->dip, &oce_dma_buf_attr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_SLEEP, NULL, &dbuf->dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to allocate DMA handle");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate the DMA-able memory */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_mem_alloc(dbuf->dma_handle, size, &oce_dma_buf_accattr,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan flags, DDI_DMA_SLEEP, NULL, &dbuf->base,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to allocate DMA memory");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* bind handle */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_addr_bind_handle(dbuf->dma_handle,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to bind dma handle");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* usable length */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_dma_alloc_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to delete a dma buffer
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dbuf - dma obj to delete
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_free_dma_buffer(struct oce_dev *dev, oce_dma_buf_t *dbuf)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_unbind_handle(dbuf->dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kmem_free(dbuf, sizeof (oce_dma_buf_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_free_dma_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to create a ring buffer
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to the device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * num_items - number of items in the ring
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * item_size - size of an individual item in the ring
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * flags - DDI_DMA_CONSISTENT/DDI_DMA_STREAMING for ring memory
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return pointer to a ring_buffer structure, NULL on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t num_items, uint32_t item_size, uint32_t flags)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate the ring buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring = kmem_zalloc(sizeof (oce_ring_buffer_t), KM_SLEEP);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get the dbuf defining the ring */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring->dbuf = oce_alloc_dma_buffer(dev, size, flags);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Ring buffer allocation failed");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the rest of the ring */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kmem_free(ring, sizeof (oce_ring_buffer_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* create_ring_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to destroy a ring buffer
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to teh device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * ring - the ring buffer to delete
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathandestroy_ring_buffer(struct oce_dev *dev, oce_ring_buffer_t *ring)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* free the dbuf associated with the ring */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* free the ring itself */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kmem_free(ring, sizeof (oce_ring_buffer_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* destroy_ring_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to enable the fma flags
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fm_caps - FM capability flags
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_accattr.devacc_attr_access = DDI_FLAGERR_ACC;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_accattr.devacc_attr_access = DDI_DEFAULT_ACC;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_attr.dma_attr_flags |= DDI_DMA_FLAGERR;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_set_dma_fma_flags */