source: drsdaq/VME/atlas/include/vme_rcc/vme_rcc_driver.h@ 2273

Last change on this file since 2273 was 22, checked in by ogrimm, 16 years ago
First commit of drsdaq program
  • Property svn:executable set to *
File size: 5.8 KB
Line 
1// $Id: vme_rcc_driver.h,v 1.13 2007/09/28 15:18:25 joos Exp $
2/************************************************************************/
3/* */
4/* File: vme_rcc_driver.h */
5/* */
6/* This is the private header file for RCC VMEbus driver */
7/* */
8/* 26. Oct. 01 MAJO created */
9/* 02. Nov. 01 JOP interrupts */
10/* 26. Nov. 01 JOP bus errors */
11/* 17. Apr. 02 JOP RORA */
12/* */
13/************ C 2005 - The software with that certain something *********/
14
15#ifndef _VME_RCC_DRIVER_H
16#define _VME_RCC_DRIVER_H
17
18#include <linux/types.h>
19#include "vme_rcc_common.h"
20
21#define VME_VCTSIZE 256
22#define VME_DMADONESIZE 64 //max. number of completed DMA transactions
23#define MAX_PROC_TEXT_SIZE 0x10000 //The output of "more /proc/vme_rcc" must not generate more characters than that
24#define BAR0 0
25
26// I/O registers
27#define CMOSA 0x70
28#define CMOSD 0x71
29#define BID1 0x35
30#define BID2 0x36
31
32
33/********/
34/*Macros*/
35/********/
36#ifdef DRIVER_DEBUG
37 #define kdebug(x) {if (debug) printk x;}
38#else
39 #define kdebug(x)
40#endif
41
42#ifdef DRIVER_ERROR
43 #define kerror(x) {if (errorlog) printk x;}
44#else
45 #define kerror(x)
46#endif
47
48
49/******************/
50/*Type definitions*/
51/******************/
52typedef struct
53{
54 u_int vbase;
55 u_int vtop;
56 u_int pbase;
57 u_int ptop;
58 u_int am;
59 u_int enab;
60 u_int wp;
61 u_int rp;
62 u_int space;
63 u_int options;
64} mstslvmap_t;
65
66typedef struct
67{
68 mstslvmap_t master[8];
69 mstslvmap_t slave[8];
70} all_mstslvmap_t;
71
72// a link between an interrupt and a program is described by a LINK DESCRIPTOR
73typedef struct
74{
75 int pid; // pid of linked process, 0 if not linked
76 u_int vct; // vector #
77 u_int lvl; // level
78 u_int type; // type
79 u_int pending; // interrupt pending
80 u_int total_count; // total # interrupts with this vector (after LINK)
81 VME_IntHandle_t* group_ptr; // pointer to the structure of vectors with same handle
82 struct semaphore sem; // its semaphore
83 int sig; // its signal
84} link_dsc_t;
85
86typedef struct
87{
88 link_dsc_t link_dsc[VME_VCTSIZE];
89 struct semaphore link_dsc_sem;
90} link_dsc_table_t;
91
92// a link between BERR and a program is described by a BERR LINK DESCRIPTOR
93typedef struct
94{
95 int pid; // pid of linked process, 0 if not linked
96 int sig; // its signal
97} berr_link_dsc_t;
98
99typedef struct
100{
101 berr_link_dsc_t berr_link_dsc[VME_MAX_BERR_PROCS];
102 struct semaphore proc_sem;
103} berr_proc_table_t;
104
105// holds info about the bus errors - filled by the BERR ISR
106typedef struct
107{
108 u_int vmeadd; // last latched VMEbus address
109 u_int am; // and its AM code
110 u_int iack; // indicates BERR for IACK cycle
111 u_int lword; // Only for VP-100 & VP-110
112 u_int ds0; // Only for VP-100 & VP-110
113 u_int ds1; // Only for VP-100 & VP-110
114 u_int wr; // Only for VP-100 & VP-110
115 int multiple;
116 int flag;
117} berr_dsc_t;
118
119typedef struct
120{
121 int pid; // pid of linked process, 0 if not linked
122 int sig; // the signal (0 if semaphore used)
123 u_int num; // number of interrupts received
124 struct semaphore sem; // external semaphore
125 struct semaphore proc_sem; // internal semaphore
126} sysfail_link_dsc_t;
127
128typedef struct
129{
130 int pid; // pid of process owning the master mapping
131 u_int vaddr; // address returned by ioremap
132} master_map_dsc_t;
133
134typedef struct
135{
136 master_map_dsc_t map[VME_MAX_MASTERMAP];
137 struct semaphore sem;
138} master_map_t;
139
140typedef struct
141{
142 u_int berr_dsc_flag[VME_MAX_BERR_PROCS];
143 u_int link_dsc_flag[VME_VCTSIZE];
144 u_int sysfail_dsc_flag;
145 u_int dma[VME_DMADONESIZE];
146 u_int mastermap[VME_MAX_MASTERMAP];
147 VME_BusErrorInfo_t VME_BerrInfo;
148 VME_IntHandle_t VME_int_handle2;
149 VME_IntEnable_t VME_IntEnable;
150} private_data_t;
151
152typedef struct InterruptCounters_t
153{
154 u_int acfail;
155 u_int sysfail;
156 u_int sw_int;
157 u_int sw_iack;
158 u_int verr;
159 u_int lerr;
160 u_int dma;
161 u_int virq[7];
162 u_int vown;
163} InterruptCounters_t;
164
165struct vme_proc_data_t
166{
167 char name[10];
168 char value[100];
169};
170
171
172/******************************/
173/*Standard function prototypes*/
174/******************************/
175static int vme_rcc_open(struct inode *ino, struct file *filep);
176static int vme_rcc_release(struct inode *ino, struct file *filep);
177static int vme_rcc_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg);
178static int vme_rcc_mmap(struct file *file, struct vm_area_struct *vma);
179static int vme_rcc_write_procmem(struct file *file, const char *buffer, u_long count, void *data);
180static int vme_rcc_read_procmem(char *buf, char **start, off_t offset, int count, int *eof, void *data);
181static void vme_rcc_vmaClose(struct vm_area_struct *vma);
182
183/*****************************/
184/*Special function prototypes*/
185/*****************************/
186static int berr_check(u_int *addr, u_int *multi, u_int *am);
187static int cct_berrInt(void);
188static void fill_mstmap(u_int d1, u_int d2, u_int d3, u_int d4, mstslvmap_t *mstslvmap);
189static void fill_slvmap(u_int d1, u_int d2, u_int d3, u_int d4, mstslvmap_t *mstslvmap);
190static void vme_dmaTimeout(u_long arg);
191static void vme_intTimeout(u_long arg);
192static void vme_intSysfailTimeout(u_long arg);
193static void vme_dma_handler(void);
194static void vme_irq_handler(int level);
195static void init_cct_berr(void);
196static void mask_cct_berr(void);
197static void send_berr_signals(void);
198static void read_berr_capture(void);
199
200#endif
Note: See TracBrowser for help on using the repository browser.