ThunderScope/Software/xdma_driver_linux/include/libxdma_api.h

151 lines
4.9 KiB
C

/*
* This file is part of the Xilinx DMA IP Core driver for Linux
*
* Copyright (c) 2016-present, Xilinx, Inc.
* All rights reserved.
*
* This source code 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 that 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.
*
* The full GNU General Public License is included in this distribution in
* the file called "COPYING".
*/
#ifndef __XDMA_BASE_API_H__
#define __XDMA_BASE_API_H__
#include <linux/types.h>
#include <linux/scatterlist.h>
#include <linux/interrupt.h>
/*
* functions exported by the xdma driver
*/
typedef struct {
u64 write_submitted;
u64 write_completed;
u64 read_requested;
u64 read_completed;
u64 restart;
u64 open;
u64 close;
u64 msix_trigger;
} xdma_statistics;
/*
* This struct should be constantly updated by XMDA using u64_stats_* APIs
* The front end will read the structure without locking (That's why updating atomically is a must)
* every time it prints the statistics.
*/
//static XDMA_Statistics stats;
/*
* xdma_device_open - read the pci bars and configure the fpga
* should be called from probe()
* NOTE:
* user interrupt will not enabled until xdma_user_isr_enable()
* is called
* @pdev: ptr to pci_dev
* @mod_name: the module name to be used for request_irq
* @user_max: max # of user/event (interrupts) to be configured
* @channel_max: max # of c2h and h2c channels to be configured
* NOTE: if the user/channel provisioned is less than the max specified,
* libxdma will update the user_max/channel_max
* returns
* a opaque handle (for libxdma to identify the device)
* NULL, in case of error
*/
void *xdma_device_open(const char *mod_name, struct pci_dev *pdev,
int *user_max, int *h2c_channel_max, int *c2h_channel_max);
/*
* xdma_device_close - prepare fpga for removal: disable all interrupts (users
* and xdma) and release all resources
* should called from remove()
* @pdev: ptr to struct pci_dev
* @tuples: from xdma_device_open()
*/
void xdma_device_close(struct pci_dev *pdev, void *dev_handle);
/*
* xdma_device_restart - restart the fpga
* @pdev: ptr to struct pci_dev
* TODO:
* may need more refining on the parameter list
* return < 0 in case of error
* TODO: exact error code will be defined later
*/
int xdma_device_restart(struct pci_dev *pdev, void *dev_handle);
/*
* xdma_user_isr_register - register a user ISR handler
* It is expected that the xdma will register the ISR, and for the user
* interrupt, it will call the corresponding handle if it is registered and
* enabled.
*
* @pdev: ptr to the the pci_dev struct
* @mask: bitmask of user interrupts (0 ~ 15)to be registered
* bit 0: user interrupt 0
* ...
* bit 15: user interrupt 15
* any bit above bit 15 will be ignored.
* @handler: the correspoinding handler
* a NULL handler will be treated as de-registeration
* @name: to be passed to the handler, ignored if handler is NULL`
* @dev: to be passed to the handler, ignored if handler is NULL`
* return < 0 in case of error
* TODO: exact error code will be defined later
*/
int xdma_user_isr_register(void *dev_hndl, unsigned int mask,
irq_handler_t handler, void *dev);
/*
* xdma_user_isr_enable/disable - enable or disable user interrupt
* @pdev: ptr to the the pci_dev struct
* @mask: bitmask of user interrupts (0 ~ 15)to be registered
* return < 0 in case of error
* TODO: exact error code will be defined later
*/
int xdma_user_isr_enable(void *dev_hndl, unsigned int mask);
int xdma_user_isr_disable(void *dev_hndl, unsigned int mask);
/*
* xdma_xfer_submit - submit data for dma operation (for both read and write)
* This is a blocking call
* @channel: channle number (< channel_max)
* == channel_max means libxdma can pick any channel available:q
* @dir: DMA_FROM/TO_DEVICE
* @offset: offset into the DDR/BRAM memory to read from or write to
* @sg_tbl: the scatter-gather list of data buffers
* @timeout: timeout in mili-seconds, *currently ignored
* return # of bytes transfered or
* < 0 in case of error
* TODO: exact error code will be defined later
*/
ssize_t xdma_xfer_submit(void *dev_hndl, int channel, bool write, u64 ep_addr,
struct sg_table *sgt, bool dma_mapped, int timeout_ms);
ssize_t xdma_xfer_submit_nowait(void *cb_hndl, void *dev_hndl, int channel, bool write, u64 ep_addr,
struct sg_table *sgt, bool dma_mapped, int timeout_ms);
ssize_t xdma_xfer_completion(void *cb_hndl, void *dev_hndl, int channel, bool write, u64 ep_addr,
struct sg_table *sgt, bool dma_mapped, int timeout_ms);
/////////////////////missing API////////////////////
//xdma_get_channle_state - if no interrupt on DMA hang is available
//xdma_channle_restart
#endif