root/drivers/vme/vme_bridge.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _VME_BRIDGE_H_
   3 #define _VME_BRIDGE_H_
   4 
   5 #include <linux/vme.h>
   6 
   7 #define VME_CRCSR_BUF_SIZE (508*1024)
   8 /*
   9  * Resource structures
  10  */
  11 struct vme_master_resource {
  12         struct list_head list;
  13         struct vme_bridge *parent;
  14         /*
  15          * We are likely to need to access the VME bus in interrupt context, so
  16          * protect master routines with a spinlock rather than a mutex.
  17          */
  18         spinlock_t lock;
  19         int locked;
  20         int number;
  21         u32 address_attr;
  22         u32 cycle_attr;
  23         u32 width_attr;
  24         struct resource bus_resource;
  25         void __iomem *kern_base;
  26 };
  27 
  28 struct vme_slave_resource {
  29         struct list_head list;
  30         struct vme_bridge *parent;
  31         struct mutex mtx;
  32         int locked;
  33         int number;
  34         u32 address_attr;
  35         u32 cycle_attr;
  36 };
  37 
  38 struct vme_dma_pattern {
  39         u32 pattern;
  40         u32 type;
  41 };
  42 
  43 struct vme_dma_pci {
  44         dma_addr_t address;
  45 };
  46 
  47 struct vme_dma_vme {
  48         unsigned long long address;
  49         u32 aspace;
  50         u32 cycle;
  51         u32 dwidth;
  52 };
  53 
  54 struct vme_dma_list {
  55         struct list_head list;
  56         struct vme_dma_resource *parent;
  57         struct list_head entries;
  58         struct mutex mtx;
  59 };
  60 
  61 struct vme_dma_resource {
  62         struct list_head list;
  63         struct vme_bridge *parent;
  64         struct mutex mtx;
  65         int locked;
  66         int number;
  67         struct list_head pending;
  68         struct list_head running;
  69         u32 route_attr;
  70 };
  71 
  72 struct vme_lm_resource {
  73         struct list_head list;
  74         struct vme_bridge *parent;
  75         struct mutex mtx;
  76         int locked;
  77         int number;
  78         int monitors;
  79 };
  80 
  81 struct vme_error_handler {
  82         struct list_head list;
  83         unsigned long long start;       /* Beginning of error window */
  84         unsigned long long end;         /* End of error window */
  85         unsigned long long first_error; /* Address of the first error */
  86         u32 aspace;                     /* Address space of error window*/
  87         unsigned num_errors;            /* Number of errors */
  88 };
  89 
  90 struct vme_callback {
  91         void (*func)(int, int, void*);
  92         void *priv_data;
  93 };
  94 
  95 struct vme_irq {
  96         int count;
  97         struct vme_callback callback[VME_NUM_STATUSID];
  98 };
  99 
 100 /* Allow 16 characters for name (including null character) */
 101 #define VMENAMSIZ 16
 102 
 103 /* This structure stores all the information about one bridge
 104  * The structure should be dynamically allocated by the driver and one instance
 105  * of the structure should be present for each VME chip present in the system.
 106  */
 107 struct vme_bridge {
 108         char name[VMENAMSIZ];
 109         int num;
 110         struct list_head master_resources;
 111         struct list_head slave_resources;
 112         struct list_head dma_resources;
 113         struct list_head lm_resources;
 114 
 115         /* List for registered errors handlers */
 116         struct list_head vme_error_handlers;
 117         /* List of devices on this bridge */
 118         struct list_head devices;
 119 
 120         /* Bridge Info - XXX Move to private structure? */
 121         struct device *parent;  /* Parent device (eg. pdev->dev for PCI) */
 122         void *driver_priv;      /* Private pointer for the bridge driver */
 123         struct list_head bus_list; /* list of VME buses */
 124 
 125         /* Interrupt callbacks */
 126         struct vme_irq irq[7];
 127         /* Locking for VME irq callback configuration */
 128         struct mutex irq_mtx;
 129 
 130         /* Slave Functions */
 131         int (*slave_get) (struct vme_slave_resource *, int *,
 132                 unsigned long long *, unsigned long long *, dma_addr_t *,
 133                 u32 *, u32 *);
 134         int (*slave_set) (struct vme_slave_resource *, int, unsigned long long,
 135                 unsigned long long, dma_addr_t, u32, u32);
 136 
 137         /* Master Functions */
 138         int (*master_get) (struct vme_master_resource *, int *,
 139                 unsigned long long *, unsigned long long *, u32 *, u32 *,
 140                 u32 *);
 141         int (*master_set) (struct vme_master_resource *, int,
 142                 unsigned long long, unsigned long long,  u32, u32, u32);
 143         ssize_t (*master_read) (struct vme_master_resource *, void *, size_t,
 144                 loff_t);
 145         ssize_t (*master_write) (struct vme_master_resource *, void *, size_t,
 146                 loff_t);
 147         unsigned int (*master_rmw) (struct vme_master_resource *, unsigned int,
 148                 unsigned int, unsigned int, loff_t);
 149 
 150         /* DMA Functions */
 151         int (*dma_list_add) (struct vme_dma_list *, struct vme_dma_attr *,
 152                 struct vme_dma_attr *, size_t);
 153         int (*dma_list_exec) (struct vme_dma_list *);
 154         int (*dma_list_empty) (struct vme_dma_list *);
 155 
 156         /* Interrupt Functions */
 157         void (*irq_set) (struct vme_bridge *, int, int, int);
 158         int (*irq_generate) (struct vme_bridge *, int, int);
 159 
 160         /* Location monitor functions */
 161         int (*lm_set) (struct vme_lm_resource *, unsigned long long, u32, u32);
 162         int (*lm_get) (struct vme_lm_resource *, unsigned long long *, u32 *,
 163                 u32 *);
 164         int (*lm_attach)(struct vme_lm_resource *, int,
 165                          void (*callback)(void *), void *);
 166         int (*lm_detach) (struct vme_lm_resource *, int);
 167 
 168         /* CR/CSR space functions */
 169         int (*slot_get) (struct vme_bridge *);
 170 
 171         /* Bridge parent interface */
 172         void *(*alloc_consistent)(struct device *dev, size_t size,
 173                 dma_addr_t *dma);
 174         void (*free_consistent)(struct device *dev, size_t size,
 175                 void *vaddr, dma_addr_t dma);
 176 };
 177 
 178 void vme_bus_error_handler(struct vme_bridge *bridge,
 179                            unsigned long long address, int am);
 180 void vme_irq_handler(struct vme_bridge *, int, int);
 181 
 182 struct vme_bridge *vme_init_bridge(struct vme_bridge *);
 183 int vme_register_bridge(struct vme_bridge *);
 184 void vme_unregister_bridge(struct vme_bridge *);
 185 struct vme_error_handler *vme_register_error_handler(
 186         struct vme_bridge *bridge, u32 aspace,
 187         unsigned long long address, size_t len);
 188 void vme_unregister_error_handler(struct vme_error_handler *handler);
 189 
 190 #endif /* _VME_BRIDGE_H_ */

/* [<][>][^][v][top][bottom][index][help] */