2009-07-31 12:28:17 +04:00
# ifndef _VME_BRIDGE_H_
# define _VME_BRIDGE_H_
2015-10-11 01:00:58 +03:00
# include <linux/vme.h>
2009-07-31 12:28:17 +04:00
# define VME_CRCSR_BUF_SIZE (508*1024)
/*
* Resource structures
*/
struct vme_master_resource {
struct list_head list ;
struct vme_bridge * parent ;
/*
* We are likely to need to access the VME bus in interrupt context , so
2009-08-11 19:20:22 +04:00
* protect master routines with a spinlock rather than a mutex .
2009-07-31 12:28:17 +04:00
*/
spinlock_t lock ;
int locked ;
int number ;
2011-12-01 21:06:29 +04:00
u32 address_attr ;
u32 cycle_attr ;
u32 width_attr ;
2010-02-18 18:13:12 +03:00
struct resource bus_resource ;
2010-11-12 14:15:40 +03:00
void __iomem * kern_base ;
2009-07-31 12:28:17 +04:00
} ;
struct vme_slave_resource {
struct list_head list ;
struct vme_bridge * parent ;
2009-08-11 19:20:22 +04:00
struct mutex mtx ;
2009-07-31 12:28:17 +04:00
int locked ;
int number ;
2011-12-01 21:06:29 +04:00
u32 address_attr ;
u32 cycle_attr ;
2009-07-31 12:28:17 +04:00
} ;
struct vme_dma_pattern {
u32 pattern ;
2011-12-01 21:06:29 +04:00
u32 type ;
2009-07-31 12:28:17 +04:00
} ;
struct vme_dma_pci {
dma_addr_t address ;
} ;
struct vme_dma_vme {
unsigned long long address ;
2011-12-01 21:06:29 +04:00
u32 aspace ;
u32 cycle ;
u32 dwidth ;
2009-07-31 12:28:17 +04:00
} ;
struct vme_dma_list {
struct list_head list ;
struct vme_dma_resource * parent ;
struct list_head entries ;
2009-08-11 19:20:22 +04:00
struct mutex mtx ;
2009-07-31 12:28:17 +04:00
} ;
struct vme_dma_resource {
struct list_head list ;
struct vme_bridge * parent ;
2009-08-11 19:20:22 +04:00
struct mutex mtx ;
2009-07-31 12:28:17 +04:00
int locked ;
int number ;
struct list_head pending ;
struct list_head running ;
2011-12-01 21:06:29 +04:00
u32 route_attr ;
2009-07-31 12:28:17 +04:00
} ;
2009-08-11 20:44:56 +04:00
struct vme_lm_resource {
struct list_head list ;
struct vme_bridge * parent ;
struct mutex mtx ;
int locked ;
int number ;
int monitors ;
} ;
2015-09-18 02:01:44 +03:00
struct vme_error_handler {
2009-07-31 12:28:17 +04:00
struct list_head list ;
2015-09-18 02:01:44 +03:00
unsigned long long start ; /* Beginning of error window */
unsigned long long end ; /* End of error window */
unsigned long long first_error ; /* Address of the first error */
u32 aspace ; /* Address space of error window*/
unsigned num_errors ; /* Number of errors */
2009-07-31 12:28:17 +04:00
} ;
struct vme_callback {
void ( * func ) ( int , int , void * ) ;
void * priv_data ;
} ;
struct vme_irq {
int count ;
2015-10-11 01:00:58 +03:00
struct vme_callback callback [ VME_NUM_STATUSID ] ;
2009-07-31 12:28:17 +04:00
} ;
/* Allow 16 characters for name (including null character) */
# define VMENAMSIZ 16
/* This structure stores all the information about one bridge
* The structure should be dynamically allocated by the driver and one instance
* of the structure should be present for each VME chip present in the system .
*/
struct vme_bridge {
2009-12-15 11:43:02 +03:00
char name [ VMENAMSIZ ] ;
2009-07-31 12:28:17 +04:00
int num ;
struct list_head master_resources ;
struct list_head slave_resources ;
struct list_head dma_resources ;
2009-08-11 20:44:56 +04:00
struct list_head lm_resources ;
2009-07-31 12:28:17 +04:00
2015-09-18 02:01:44 +03:00
/* List for registered errors handlers */
struct list_head vme_error_handlers ;
/* List of devices on this bridge */
struct list_head devices ;
2009-07-31 12:28:17 +04:00
/* Bridge Info - XXX Move to private structure? */
2011-08-10 13:33:46 +04:00
struct device * parent ; /* Parent device (eg. pdev->dev for PCI) */
2010-02-18 18:13:05 +03:00
void * driver_priv ; /* Private pointer for the bridge driver */
2011-08-12 14:30:48 +04:00
struct list_head bus_list ; /* list of VME buses */
2009-07-31 12:28:17 +04:00
/* Interrupt callbacks */
struct vme_irq irq [ 7 ] ;
2009-10-29 19:34:54 +03:00
/* Locking for VME irq callback configuration */
struct mutex irq_mtx ;
2009-07-31 12:28:17 +04:00
/* Slave Functions */
int ( * slave_get ) ( struct vme_slave_resource * , int * ,
unsigned long long * , unsigned long long * , dma_addr_t * ,
2011-12-01 21:06:29 +04:00
u32 * , u32 * ) ;
2009-07-31 12:28:17 +04:00
int ( * slave_set ) ( struct vme_slave_resource * , int , unsigned long long ,
2011-12-01 21:06:29 +04:00
unsigned long long , dma_addr_t , u32 , u32 ) ;
2009-07-31 12:28:17 +04:00
/* Master Functions */
int ( * master_get ) ( struct vme_master_resource * , int * ,
2011-12-01 21:06:29 +04:00
unsigned long long * , unsigned long long * , u32 * , u32 * ,
u32 * ) ;
2009-07-31 12:28:17 +04:00
int ( * master_set ) ( struct vme_master_resource * , int ,
2011-12-01 21:06:29 +04:00
unsigned long long , unsigned long long , u32 , u32 , u32 ) ;
2009-07-31 12:28:17 +04:00
ssize_t ( * master_read ) ( struct vme_master_resource * , void * , size_t ,
loff_t ) ;
ssize_t ( * master_write ) ( struct vme_master_resource * , void * , size_t ,
loff_t ) ;
unsigned int ( * master_rmw ) ( struct vme_master_resource * , unsigned int ,
unsigned int , unsigned int , loff_t ) ;
/* DMA Functions */
int ( * dma_list_add ) ( struct vme_dma_list * , struct vme_dma_attr * ,
struct vme_dma_attr * , size_t ) ;
int ( * dma_list_exec ) ( struct vme_dma_list * ) ;
int ( * dma_list_empty ) ( struct vme_dma_list * ) ;
/* Interrupt Functions */
2010-02-18 18:13:05 +03:00
void ( * irq_set ) ( struct vme_bridge * , int , int , int ) ;
int ( * irq_generate ) ( struct vme_bridge * , int , int ) ;
2009-07-31 12:28:17 +04:00
/* Location monitor functions */
2011-12-01 21:06:29 +04:00
int ( * lm_set ) ( struct vme_lm_resource * , unsigned long long , u32 , u32 ) ;
int ( * lm_get ) ( struct vme_lm_resource * , unsigned long long * , u32 * ,
u32 * ) ;
2009-08-11 20:44:56 +04:00
int ( * lm_attach ) ( struct vme_lm_resource * , int , void ( * callback ) ( int ) ) ;
int ( * lm_detach ) ( struct vme_lm_resource * , int ) ;
2009-07-31 12:28:17 +04:00
/* CR/CSR space functions */
2010-02-18 18:13:05 +03:00
int ( * slot_get ) ( struct vme_bridge * ) ;
2011-08-10 13:33:46 +04:00
/* Bridge parent interface */
void * ( * alloc_consistent ) ( struct device * dev , size_t size ,
dma_addr_t * dma ) ;
void ( * free_consistent ) ( struct device * dev , size_t size ,
void * vaddr , dma_addr_t dma ) ;
2009-07-31 12:28:17 +04:00
} ;
2015-09-18 02:01:42 +03:00
void vme_bus_error_handler ( struct vme_bridge * bridge ,
2015-09-18 02:01:43 +03:00
unsigned long long address , int am ) ;
2009-10-29 19:34:54 +03:00
void vme_irq_handler ( struct vme_bridge * , int , int ) ;
2016-04-24 23:11:38 +03:00
struct vme_bridge * vme_init_bridge ( struct vme_bridge * ) ;
2009-12-15 11:43:02 +03:00
int vme_register_bridge ( struct vme_bridge * ) ;
void vme_unregister_bridge ( struct vme_bridge * ) ;
2015-09-18 02:01:44 +03:00
struct vme_error_handler * vme_register_error_handler (
struct vme_bridge * bridge , u32 aspace ,
unsigned long long address , size_t len ) ;
void vme_unregister_error_handler ( struct vme_error_handler * handler ) ;
2009-07-31 12:28:17 +04:00
# endif /* _VME_BRIDGE_H_ */