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 * Source file containing the implementation of Driver buffer management
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and related helper functions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <oce_impl.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic ddi_dma_attr_t oce_dma_buf_attr = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DMA_ATTR_V0, /* version number */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x0000000000000000ull, /* low address */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0xFFFFFFFFFFFFFFFFull, /* high address */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000000FFFFFFFFull, /* dma counter max */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_DMA_ALIGNMENT, /* alignment */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000FFF, /* burst sizes */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000001, /* minimum transfer size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000000FFFFFFFFull, /* maximum transfer size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0xFFFFFFFFFFFFFFFFull, /* maximum segment size */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 1, /* scatter/gather list length */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0x00000001, /* granularity */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan 0 /* DMA flags */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanstatic ddi_device_acc_attr_t oce_dma_buf_accattr = {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DEVICE_ATTR_V0,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_NEVERSWAP_ACC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_STRICTORDER_ACC,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan};
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to allocate a dma buffer for mapping memory va-pa
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
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 *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return pointer to a oce_dma_buf_t structure handling the map
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * NULL => failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_dma_buf_t *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_alloc_dma_buffer(struct oce_dev *dev,
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t size, ddi_dma_attr_t *dma_attr, uint32_t flags)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_t *dbuf;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_cookie_t cookie;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t count;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size_t actual_len;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int ret = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(size > 0);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan /* if NULL use default */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan if (dma_attr == NULL) {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dma_attr = &oce_dma_buf_attr;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan dbuf = kmem_zalloc(sizeof (oce_dma_buf_t), KM_NOSLEEP);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (dbuf == NULL) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate dma handle */
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ret = ddi_dma_alloc_handle(dev->dip, dma_attr,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan DDI_DMA_DONTWAIT, NULL, &dbuf->dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to allocate DMA handle");
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan goto handle_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate the DMA-able memory */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_mem_alloc(dbuf->dma_handle, size, &oce_dma_buf_accattr,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan flags, DDI_DMA_DONTWAIT, NULL, &dbuf->base,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan &actual_len, &dbuf->acc_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_SUCCESS) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to allocate DMA memory");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto alloc_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* bind handle */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ret = ddi_dma_addr_bind_handle(dbuf->dma_handle,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (struct as *)0, dbuf->base, actual_len,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan DDI_DMA_RDWR | flags,
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan DDI_DMA_DONTWAIT, NULL, &cookie, &count);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ret != DDI_DMA_MAPPED) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Failed to bind dma handle");
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan goto bind_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan bzero(dbuf->base, actual_len);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dbuf->addr = cookie.dmac_laddress;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dbuf->size = actual_len;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* usable length */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dbuf->len = size;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan dbuf->num_pages = OCE_NUM_PAGES(size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (dbuf);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanbind_fail:
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ddi_dma_mem_free(&dbuf->acc_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanalloc_fail:
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ddi_dma_free_handle(&dbuf->dma_handle);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanhandle_fail:
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan kmem_free(dbuf, sizeof (oce_dma_buf_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_dma_alloc_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to delete a dma buffer
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dbuf - dma obj to delete
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return none
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_free_dma_buffer(struct oce_dev *dev, oce_dma_buf_t *dbuf)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan _NOTE(ARGUNUSED(dev));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dbuf == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dbuf->dma_handle != NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (void) ddi_dma_unbind_handle(dbuf->dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dbuf->acc_handle != NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_mem_free(&dbuf->acc_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dbuf->dma_handle != NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ddi_dma_free_handle(&dbuf->dma_handle);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kmem_free(dbuf, sizeof (oce_dma_buf_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_free_dma_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to create a ring buffer
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
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 *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return pointer to a ring_buffer structure, NULL on failure
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_ring_buffer_t *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathancreate_ring_buffer(struct oce_dev *dev,
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t num_items, uint32_t item_size, uint32_t flags)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_ring_buffer_t *ring;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t size;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* allocate the ring buffer */
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan ring = kmem_zalloc(sizeof (oce_ring_buffer_t), KM_NOSLEEP);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan if (ring == NULL) {
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan return (NULL);
8d738d7d1f42180d941afa8b9a7310a2a437d17cSukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* get the dbuf defining the ring */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan size = num_items * item_size;
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan ring->dbuf = oce_alloc_dma_buffer(dev, size, NULL, flags);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (ring->dbuf == NULL) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_log(dev, CE_WARN, MOD_CONFIG, "%s",
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan "Ring buffer allocation failed");
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan goto dbuf_fail;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* fill the rest of the ring */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring->num_items = num_items;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring->item_size = item_size;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring->num_used = 0;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (ring);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathandbuf_fail:
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kmem_free(ring, sizeof (oce_ring_buffer_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return (NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* create_ring_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to destroy a ring buffer
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * dev - software handle to teh device
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * ring - the ring buffer to delete
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return none
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathandestroy_ring_buffer(struct oce_dev *dev, oce_ring_buffer_t *ring)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(dev != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ASSERT(ring != NULL);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* free the dbuf associated with the ring */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_free_dma_buffer(dev, ring->dbuf);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ring->dbuf = NULL;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan /* free the ring itself */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan kmem_free(ring, sizeof (oce_ring_buffer_t));
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* destroy_ring_buffer */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * function to enable the fma flags
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fm_caps - FM capability flags
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * return none
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanoce_set_dma_fma_flags(int fm_caps)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan{
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (fm_caps == DDI_FM_NOT_CAPABLE) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan return;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
12d61dab3304980e691068219eaaab6398744a2eSukumar Swaminathan oce_dma_buf_accattr.devacc_attr_access = DDI_DEFAULT_ACC;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (DDI_FM_DMA_ERR_CAP(fm_caps)) {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_attr.dma_attr_flags |= DDI_DMA_FLAGERR;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_dma_buf_attr.dma_attr_flags &= ~DDI_DMA_FLAGERR;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan }
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan} /* oce_set_dma_fma_flags */