blob: 1b3bbbb6f0f981e55e489c4923ed610b2490e149 [file] [log] [blame]
/*
* Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _NVSHM_IOBUF_H
#define _NVSHM_IOBUF_H
/* Baseband base address in BB memory space - this is a constant */
#define NVSHM_IPC_BB_BASE (0x8C000000)
#define ADDR_OUTSIDE(addr, base, size) (((unsigned long)(addr) \
< (unsigned long)(base)) || \
((unsigned long)(addr) \
> ((unsigned long)(base) + \
(unsigned long)(size))))
/**
* NVSHM_B2A convert from Baseband address space
* to AP virtual kernel space (cached)
*
* All iobuf conversion are done from/to cached kernel space
*
* @param h : struct nvshm_handle pointer
* @param x : address to convert
* @return : void * pointer in cached kernel space
*/
#define NVSHM_B2A(h, x) ((void *)(x) + ((int)(h)->ipc_base_virt) \
- NVSHM_IPC_BB_BASE)
/**
* NVSHM_A2B convert from AP kernel space (cached) to Baseband address space
*
* All iobuf conversion are done from/to cached kernel space
*
* @param h : struct nvshm_handle pointer
* @param x : address to convert
* @return : void * pointer in BB memory space
*/
#define NVSHM_A2B(h, x) ((void *)(x) - ((int)(h)->ipc_base_virt) \
+ NVSHM_IPC_BB_BASE)
/**
* Payload start address in AP virtual memory space
*
* @param h : struct nvshm_handle pointer
* @param b : pointer to the iobuf
* @return : pointer to payload in cached kernel space
*/
#define NVSHM_IOBUF_PAYLOAD(h, b) \
NVSHM_B2A((h), (b)->npdu_data + (b)->data_offset)
/**
* Alloc a nvshm_iobuf descriptor to be used for write operation
* Failure of allocation is considered as an Xoff situation and
* will be followed by a call to (*start_tx)() operation when flow
* control return to Xon. If excessive size is requested, call to
* (*error_event)() with NVSHM_IOBUF_ERROR will be raised synchronously
*
* @param struct nvshm_channel handle
* @param size - data size requested in bytes
* @return iobuf pointer or
* NULL if no iobuf can be allocated (flow control Xoff)
*/
struct nvshm_iobuf *nvshm_iobuf_alloc(struct nvshm_channel *handle, int size);
/**
* Free a nvshm_iobuf descriptor given in rx_event
* pointers are not followed and cleared on free
*
* @param struct nvshm_iobuf descriptor to free
*
*/
void nvshm_iobuf_free(struct nvshm_iobuf *iob);
/**
* Free a nvshm_iobuf descriptor list given in rx_event
* both ->next and ->sg_next are followed
*
* @param struct nvshm_iobuf list of descriptor to free
*
*/
void nvshm_iobuf_free_cluster(struct nvshm_iobuf *list);
/**
* clear/set nvshm_iobuf internal flags (unused/unspecified for now)
*
* @param struct nvshm_iobuf descriptor
* @param unsigned int set value
* @param unsigned int clear value
* @return 0 if no error
*/
int nvshm_iobuf_update_bits(struct nvshm_iobuf *iob,
unsigned int clear, unsigned int set);
/**
* Increase reference count of iobuf
*
* @param struct nvshm_iobuf descriptor
* @return previous ref value
*/
int nvshm_iobuf_ref(struct nvshm_iobuf *iob);
/**
* Decrease reference count of iobuf
*
* @param struct nvshm_iobuf descriptor
* @return previous ref value
*/
int nvshm_iobuf_unref(struct nvshm_iobuf *iob);
/**
* Increase reference count of iobuf cluster
*
* @param struct nvshm_iobuf descriptor
* @return previous maximum ref value
*/
int nvshm_iobuf_ref_cluster(struct nvshm_iobuf *iob);
/**
* Decrease reference count of iobuf cluster
*
* @param struct nvshm_iobuf descriptor
* @return previous maximum ref value
*/
int nvshm_iobuf_unref_cluster(struct nvshm_iobuf *iob);
/**
* Check if iobuf pointers are sane
*
* @param handle to nvshm channel
* @param struct nvshm_iobuf to check
* @return 0 if sane
*/
int nvshm_iobuf_check(struct nvshm_iobuf *iob);
/**
* Finalize BBC iobuf free
* Only called internaly
* @param handle to nvshm
* @return None
*/
void nvshm_iobuf_bbc_free(struct nvshm_handle *handle);
/**
* Process iobuf freed by BBC
* Only called internaly
* @param handle to nvshm_iobuf
* @return None
*/
void nvshm_iobuf_process_freed(struct nvshm_iobuf *desc);
/**
* Init iobuf subsystem
*
* @param handle to nvshm channel
* @return 0 if ok negative otherwise
*/
int nvshm_iobuf_init(struct nvshm_handle *handle);
#endif /* _NVSHM_IOBUF_H */