162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/drivers/misc/xillybus.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2011 Xillybus Ltd, http://xillybus.com 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Header file for the Xillybus FPGA/host framework. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __XILLYBUS_H 1162306a36Sopenharmony_ci#define __XILLYBUS_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/list.h> 1462306a36Sopenharmony_ci#include <linux/device.h> 1562306a36Sopenharmony_ci#include <linux/dma-mapping.h> 1662306a36Sopenharmony_ci#include <linux/interrupt.h> 1762306a36Sopenharmony_ci#include <linux/sched.h> 1862306a36Sopenharmony_ci#include <linux/cdev.h> 1962306a36Sopenharmony_ci#include <linux/spinlock.h> 2062306a36Sopenharmony_ci#include <linux/mutex.h> 2162306a36Sopenharmony_ci#include <linux/workqueue.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct xilly_endpoint_hardware; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_cistruct xilly_buffer { 2662306a36Sopenharmony_ci void *addr; 2762306a36Sopenharmony_ci dma_addr_t dma_addr; 2862306a36Sopenharmony_ci int end_offset; /* Counting elements, not bytes */ 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistruct xilly_idt_handle { 3262306a36Sopenharmony_ci unsigned char *chandesc; 3362306a36Sopenharmony_ci unsigned char *names; 3462306a36Sopenharmony_ci int names_len; 3562306a36Sopenharmony_ci int entries; 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* 3962306a36Sopenharmony_ci * Read-write confusion: wr_* and rd_* notation sticks to FPGA view, so 4062306a36Sopenharmony_ci * wr_* buffers are those consumed by read(), since the FPGA writes to them 4162306a36Sopenharmony_ci * and vice versa. 4262306a36Sopenharmony_ci */ 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistruct xilly_channel { 4562306a36Sopenharmony_ci struct xilly_endpoint *endpoint; 4662306a36Sopenharmony_ci int chan_num; 4762306a36Sopenharmony_ci int log2_element_size; 4862306a36Sopenharmony_ci int seekable; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci struct xilly_buffer **wr_buffers; /* FPGA writes, driver reads! */ 5162306a36Sopenharmony_ci int num_wr_buffers; 5262306a36Sopenharmony_ci unsigned int wr_buf_size; /* In bytes */ 5362306a36Sopenharmony_ci int wr_fpga_buf_idx; 5462306a36Sopenharmony_ci int wr_host_buf_idx; 5562306a36Sopenharmony_ci int wr_host_buf_pos; 5662306a36Sopenharmony_ci int wr_empty; 5762306a36Sopenharmony_ci int wr_ready; /* Significant only when wr_empty == 1 */ 5862306a36Sopenharmony_ci int wr_sleepy; 5962306a36Sopenharmony_ci int wr_eof; 6062306a36Sopenharmony_ci int wr_hangup; 6162306a36Sopenharmony_ci spinlock_t wr_spinlock; 6262306a36Sopenharmony_ci struct mutex wr_mutex; 6362306a36Sopenharmony_ci wait_queue_head_t wr_wait; 6462306a36Sopenharmony_ci wait_queue_head_t wr_ready_wait; 6562306a36Sopenharmony_ci int wr_ref_count; 6662306a36Sopenharmony_ci int wr_synchronous; 6762306a36Sopenharmony_ci int wr_allow_partial; 6862306a36Sopenharmony_ci int wr_exclusive_open; 6962306a36Sopenharmony_ci int wr_supports_nonempty; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci struct xilly_buffer **rd_buffers; /* FPGA reads, driver writes! */ 7262306a36Sopenharmony_ci int num_rd_buffers; 7362306a36Sopenharmony_ci unsigned int rd_buf_size; /* In bytes */ 7462306a36Sopenharmony_ci int rd_fpga_buf_idx; 7562306a36Sopenharmony_ci int rd_host_buf_pos; 7662306a36Sopenharmony_ci int rd_host_buf_idx; 7762306a36Sopenharmony_ci int rd_full; 7862306a36Sopenharmony_ci spinlock_t rd_spinlock; 7962306a36Sopenharmony_ci struct mutex rd_mutex; 8062306a36Sopenharmony_ci wait_queue_head_t rd_wait; 8162306a36Sopenharmony_ci int rd_ref_count; 8262306a36Sopenharmony_ci int rd_allow_partial; 8362306a36Sopenharmony_ci int rd_synchronous; 8462306a36Sopenharmony_ci int rd_exclusive_open; 8562306a36Sopenharmony_ci struct delayed_work rd_workitem; 8662306a36Sopenharmony_ci unsigned char rd_leftovers[4]; 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistruct xilly_endpoint { 9062306a36Sopenharmony_ci struct device *dev; 9162306a36Sopenharmony_ci struct module *owner; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci int dma_using_dac; /* =1 if 64-bit DMA is used, =0 otherwise. */ 9462306a36Sopenharmony_ci __iomem void *registers; 9562306a36Sopenharmony_ci int fatal_error; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci struct mutex register_mutex; 9862306a36Sopenharmony_ci wait_queue_head_t ep_wait; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci int num_channels; /* EXCLUDING message buffer */ 10162306a36Sopenharmony_ci struct xilly_channel **channels; 10262306a36Sopenharmony_ci int msg_counter; 10362306a36Sopenharmony_ci int failed_messages; 10462306a36Sopenharmony_ci int idtlen; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci u32 *msgbuf_addr; 10762306a36Sopenharmony_ci dma_addr_t msgbuf_dma_addr; 10862306a36Sopenharmony_ci unsigned int msg_buf_size; 10962306a36Sopenharmony_ci}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistruct xilly_mapping { 11262306a36Sopenharmony_ci struct device *device; 11362306a36Sopenharmony_ci dma_addr_t dma_addr; 11462306a36Sopenharmony_ci size_t size; 11562306a36Sopenharmony_ci int direction; 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciirqreturn_t xillybus_isr(int irq, void *data); 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_cistruct xilly_endpoint *xillybus_init_endpoint(struct device *dev); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ciint xillybus_endpoint_discovery(struct xilly_endpoint *endpoint); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_civoid xillybus_endpoint_remove(struct xilly_endpoint *endpoint); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#endif /* __XILLYBUS_H */ 127