Root/drivers/vme/vme_bridge.h

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

Archive Download this file



interactive