|
|
1.1 root 1: /*
2: * @(#)qd_data.c 1.16 (ULTRIX) 7/2/86
3: */
4:
5: /************************************************************************
6: * *
7: * Copyright (c) 1985, 1986 by *
8: * Digital Equipment Corporation, Maynard, MA *
9: * All rights reserved. *
10: * *
11: * This software is furnished under a license and may be used and *
12: * copied only in accordance with the terms of such license and *
13: * with the inclusion of the above copyright notice. This *
14: * software or any other copies thereof may not be provided or *
15: * otherwise made available to any other person. No title to and *
16: * ownership of the software is hereby transferred. *
17: * *
18: * The information in this software is subject to change without *
19: * notice and should not be construed as a commitment by Digital *
20: * Equipment Corporation. *
21: * *
22: * Digital assumes no responsibility for the use or reliability *
23: * of its software on equipment which is not supplied by Digital. *
24: * *
25: ************************************************************************/
26:
27: /*
28: * qd_data.c
29: *
30: * Modification history
31: *
32: * QDSS data file
33: *
34: * 3-Jul-85 - longo
35: *
36: * Created file.
37: *
38: * 15-Jul-85 - longo
39: *
40: * Added "qdfont.h" include and moved "mouse_report" struct
41: * and definitions in from "qduser.h".
42: *
43: * 18-Aug-85 - longo
44: *
45: * Added "duart_imask" entry to qdflags for shadowing.
46: *
47: * 4-Sep-85 - longo
48: *
49: * Added storage "QBAreg[]" for DMA support.
50: *
51: * 11-Sep-85 - longo
52: *
53: * Added constant for event buffer size (now 1k).
54: *
55: * 17-Sep-85 - longo
56: *
57: * Changes for DMA support.
58: *
59: * 18-Sep-85 - longo
60: *
61: * Changes for scroll interrupt support.
62: *
63: * 2-Oct-85 - longo
64: *
65: * Added color map write buffer shared RAM stuff and adder
66: * interrupt enable register shadowing to qdflags.
67: *
68: * 4-Oct-85 - longo
69: *
70: * Added kernel loop back state flag to qdflags.
71: *
72: * 16-Oct-85 - longo
73: *
74: * Added "pntr_id" entry to qdflags struct.
75: *
76: * 22-Oct-85 - longo
77: *
78: * Added buf structures for use by driver strategy routines.
79: *
80: * 23-Oct-85 - longo
81: *
82: * Added "user_dma" entry to qdflag structure.
83: *
84: * 8-Nov-85 - longo
85: *
86: * Added "selmask" entry to qdflags structure.
87: *
88: * 11-Nov-85 - longo
89: *
90: * Changed "_vs_eventqueue" struct references to "qdinput".
91: *
92: * 25-Nov-85 - longo
93: *
94: * Added "one_only" lock switch for single process access.
95: *
96: * 18-Mar-86 - jaw
97: *
98: * Add routines to cpu switch for nexus/unibus addreses.
99: * Also got rid of some globals like nexnum.
100: * ka8800 cleanup.
101: *
102: * 19-Mar-86 - ricky palmer
103: *
104: * Added "devio.h" to include list. V2.0
105: *
106: * 02-Jul-86 - Brian Stevens
107: *
108: * Added cursor structure for each display
109: *
110: */
111:
112: #include "qd.h" /* # of QDSS's the system is configured for */
113:
114: #include "../vax/pte.h" /* page table values */
115: #include "../vax/mtpr.h" /* VAX register access stuff */
116:
117: #include "../sys/param.h" /* general system params & macros */
118: #include "../sys/conf.h" /* "linesw" tty driver dispatch */
119: #include "../sys/user.h" /* user structure (what else?) */
120: #include "qdioctl.h" /* ioctl call values */
121: #include "../sys/tty.h"
122: #include "../sys/map.h" /* resource allocation map struct */
123: #include "../sys/buf.h" /* buf structs */
124: #include "../sys/vm.h" /* includes 'vm' header files */
125: #include "../sys/clist.h" /* char list handling structs */
126: #include "../sys/file.h" /* file I/O definitions */
127: #include "../sys/uio.h" /* write/read call structs */
128: #include "../sys/kernel.h" /* clock handling structs */
129: #include "../vax/cpu.h" /* per cpu (pcpu) struct */
130:
131: #include "../vaxuba/ubareg.h" /* uba & 'qba' register structs */
132: #include "../vaxuba/ubavar.h" /* uba structs & uba map externs */
133:
134: #include "qduser.h" /* definitions shared with my client */
135: #include "qdreg.h" /* QDSS device register structures */
136:
137: /*-----------------------------------------------------------
138: * QDSS driver status flags for tracking operational state */
139:
140: struct qdflags {
141:
142: u_int inuse; /* which minor dev's are in use now */
143: u_int config; /* I/O page register content */
144: u_int mapped; /* user mapping status word */
145: u_int kernel_loop; /* if kernel console is redirected */
146: u_int user_dma; /* DMA from user space in progress */
147: u_short pntr_id; /* type code of pointing device */
148: u_short duart_imask; /* shadowing for duart intrpt mask reg */
149: u_short adder_ie; /* shadowing for adder intrpt enbl reg */
150: u_short curs_acc; /* cursor acceleration factor */
151: u_short curs_thr; /* cursor acceleration threshold level */
152: u_short tab_res; /* tablet resolution factor */
153: u_short selmask; /* mask for active qd select entries */
154: };
155:
156: /* bit definitions for "inuse" entry */
157:
158: #define CONS_DEV 0x01
159: #define ALTCONS_DEV 0x02
160: #define GRAPHIC_DEV 0x04
161:
162: /* bit definitions for 'mapped' member of flag structure */
163:
164: #define MAPDEV 0x01 /* hardware is mapped */
165: #define MAPDMA 0x02 /* DMA buffer mapped */
166: #define MAPEQ 0x04 /* event queue buffer mapped */
167: #define MAPSCR 0x08 /* scroll param area mapped */
168: #define MAPCOLOR 0x10 /* color map writing buffer mapped */
169:
170: /* bit definitions for 'selmask' member of qdflag structure */
171:
172: #define SEL_READ 0x01 /* read select is active */
173: #define SEL_WRITE 0x02 /* write select is active */
174:
175: /*----------------------------------------------
176: * constants used in shared memory operations */
177:
178: #define EVENT_BUFSIZE 1024 /* # of bytes per device's event buffer */
179:
180: #define MAXEVENTS ( (EVENT_BUFSIZE - sizeof(struct qdinput)) \
181: / sizeof(struct _vs_event) )
182:
183: #define DMA_BUFSIZ (1024 * 3)
184:
185: #define COLOR_BUFSIZ ((sizeof(struct color_buf) + 512) & ~0x01FF)
186:
187: /*******************************************************************/
188:
189: #ifdef BINARY
190:
191: extern struct uba_device *qdinfo[]; /* array of pntrs to each QDSS */
192: /* uba structure */
193: extern struct tty qd_tty[];
194:
195: extern struct qd_softc qd_softc[];
196:
197: /*----------------------------------------------------------
198: * static storage used by multiple functions in this code */
199:
200: extern int Qbus_unmap[]; /* Qbus mapper release key */
201: extern struct qdflags qdflags[]; /* QDSS device status flags */
202: extern struct qdmap qdmap[]; /* QDSS register map structure */
203: extern caddr_t qdbase[]; /* base address of each QDSS unit */
204: extern struct buf qdbuf[]; /* buf structs used by strategy */
205: extern char one_only[]; /* lock for single process access */
206:
207: /*-----------------------------
208: * shared memory allocation */
209:
210: extern char event_shared[]; /* reserve event buf space */
211: extern struct qdinput *eq_header[]; /* event buf header ptrs */
212:
213: extern char DMA_shared[]; /* reserve DMA buf space */
214: extern struct DMAreq_header *DMAheader[]; /* DMA buf header ptrs */
215:
216: extern char scroll_shared[]; /* reserve space for scroll structs */
217: extern struct scroll *scroll[]; /* pointers to scroll structures */
218:
219: extern char color_shared[]; /* reserve space: color bufs */
220: extern struct color_buf *color_buf[]; /* pointers to color bufs */
221:
222: /*--------------------------------
223: * mouse input event structures */
224:
225: extern struct mouse_report last_rep[];
226: extern struct mouse_report current_rep[];
227:
228: /*----------------------------
229: * input event "select" use */
230:
231: extern struct proc *rsel[]; /* process waiting for select */
232:
233: extern int DMAbuf_size;
234:
235: /*----------------------------
236: * console cursor structure */
237:
238: struct _vs_cursor cursor[];
239:
240:
241: /*********************************************************************/
242:
243: #else
244:
245: /*--------------------------------------------------------------------------
246: * reference to an array of "uba_device" structures built by the auto
247: * configuration program. The uba_device structure decribes the device
248: * sufficiently for the driver to talk to it. The auto configuration code
249: * fills in the uba_device structures (located in ioconf.c) from user
250: * maintained info. */
251:
252: struct uba_device *qdinfo[NQD]; /* array of pntrs to each QDSS's */
253: /* uba structures */
254: struct tty qd_tty[NQD*4]; /* teletype structures for each.. */
255: /* ..possible minor device */
256:
257: struct qd_softc qd_softc[NQD];
258:
259: /*----------------------------------------------------------
260: * static storage used by multiple functions in this code */
261:
262: int Qbus_unmap[NQD]; /* Qbus mapper release code */
263: struct qdflags qdflags[NQD]; /* QDSS device status flags */
264: struct qdmap qdmap[NQD]; /* QDSS register map structure */
265: caddr_t qdbase[NQD]; /* base address of each QDSS unit */
266: struct buf qdbuf[NQD]; /* buf structs used by strategy */
267: char one_only[NQD]; /* lock for single process access */
268:
269: /*------------------------------------------------------------------------
270: * the array "event_shared[]" is made up of a number of event queue buffers
271: * equal to the number of QDSS's configured into the running kernel (NQD).
272: * Each event queue buffer begins with an event queue header (struct qdinput)
273: * followed by a group of event queue entries (struct _vs_event). The array
274: * "*eq_header[]" is an array of pointers to the start of each event queue
275: * buffer in "event_shared[]". */
276:
277: #define EQSIZE ((EVENT_BUFSIZE * NQD) + 512)
278:
279: char event_shared[EQSIZE]; /* reserve space for event bufs */
280: struct qdinput *eq_header[NQD]; /* event queue header pntrs */
281:
282: /*--------------------------------------------------------------------------
283: * This allocation method reserves enough memory pages for NQD shared DMA I/O
284: * buffers. Each buffer must consume an integral number of memory pages to
285: * guarantee that a following buffer will begin on a page boundary. Also,
286: * enough space is allocated so that the FIRST I/O buffer can start at the
287: * 1st page boundary after "&DMA_shared". Page boundaries are used so that
288: * memory protections can be turned on/off for individual buffers. */
289:
290: #define IOBUFSIZE ((DMA_BUFSIZ * NQD) + 512)
291:
292: char DMA_shared[IOBUFSIZE]; /* reserve I/O buffer space */
293: struct DMAreq_header *DMAheader[NQD]; /* DMA buffer header pntrs */
294:
295: /*-------------------------------------------------------------------------
296: * The driver assists a client in scroll operations by loading dragon
297: * registers from an interrupt service routine. The loading is done using
298: * parameters found in memory shrade between the driver and it's client.
299: * The scroll parameter structures are ALL loacted in the same memory page
300: * for reasons of memory economy. */
301:
302: char scroll_shared[2 * 512]; /* reserve space for scroll structs */
303: struct scroll *scroll[NQD]; /* pointers to scroll structures */
304:
305: /*-----------------------------------------------------------------------
306: * the driver is programmable to provide the user with color map write
307: * services at VSYNC interrupt time. At interrupt time the driver loads
308: * the color map with any user-requested load data found in shared memory */
309:
310: #define COLOR_SHARED ((COLOR_BUFSIZ * NQD) + 512)
311:
312: char color_shared[COLOR_SHARED]; /* reserve space: color bufs */
313: struct color_buf *color_buf[NQD]; /* pointers to color bufs */
314:
315: /*--------------------------------
316: * mouse input event structures */
317:
318: struct mouse_report last_rep[NQD];
319: struct mouse_report current_rep[NQD];
320:
321: /*----------------------------
322: * input event "select" use */
323:
324: struct proc *rsel[NQD]; /* process waiting for select */
325:
326: /*----------------------------
327: * console cursor structure */
328:
329: struct _vs_cursor cursor[NQD];
330:
331:
332: /************************************************************************/
333:
334: int nNQD = NQD;
335:
336: int DMAbuf_size = DMA_BUFSIZ;
337:
338: #endif
339:
340:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.