make ANSI C compatible
[unix-history] / usr / src / sys / vax / uba / qd_data.c
CommitLineData
5a3761f9
MT
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
7e843ca4
MT
114#include "../vax/pte.h" /* page table values */
115#include "../vax/mtpr.h" /* VAX register access stuff */
5a3761f9
MT
116
117#include "../h/param.h" /* general system params & macros */
118#include "../h/conf.h" /* "linesw" tty driver dispatch */
119#include "../h/dir.h" /* for directory handling */
120#include "../h/user.h" /* user structure (what else?) */
7e843ca4 121#include "qdioctl.h" /* ioctl call values */
5a3761f9
MT
122#include "../h/tty.h"
123#include "../h/map.h" /* resource allocation map struct */
124#include "../h/buf.h" /* buf structs */
125#include "../h/vm.h" /* includes 'vm' header files */
5a3761f9
MT
126#include "../h/clist.h" /* char list handling structs */
127#include "../h/file.h" /* file I/O definitions */
128#include "../h/uio.h" /* write/read call structs */
129#include "../h/kernel.h" /* clock handling structs */
5a3761f9
MT
130#include "../vax/cpu.h" /* per cpu (pcpu) struct */
131
132#include "../vaxuba/ubareg.h" /* uba & 'qba' register structs */
133#include "../vaxuba/ubavar.h" /* uba structs & uba map externs */
134
7e843ca4
MT
135#include "qduser.h" /* definitions shared with my client */
136#include "qdreg.h" /* QDSS device register structures */
5a3761f9
MT
137
138/*-----------------------------------------------------------
139* QDSS driver status flags for tracking operational state */
140
141 struct qdflags {
142
143 u_int inuse; /* which minor dev's are in use now */
144 u_int config; /* I/O page register content */
145 u_int mapped; /* user mapping status word */
146 u_int kernel_loop; /* if kernel console is redirected */
147 u_int user_dma; /* DMA from user space in progress */
148 u_short pntr_id; /* type code of pointing device */
149 u_short duart_imask; /* shadowing for duart intrpt mask reg */
150 u_short adder_ie; /* shadowing for adder intrpt enbl reg */
151 u_short curs_acc; /* cursor acceleration factor */
152 u_short curs_thr; /* cursor acceleration threshold level */
153 u_short tab_res; /* tablet resolution factor */
154 u_short selmask; /* mask for active qd select entries */
155 };
156
157 /* bit definitions for "inuse" entry */
158
159#define CONS_DEV 0x01
160#define ALTCONS_DEV 0x02
161#define GRAPHIC_DEV 0x04
162
163 /* bit definitions for 'mapped' member of flag structure */
164
165#define MAPDEV 0x01 /* hardware is mapped */
166#define MAPDMA 0x02 /* DMA buffer mapped */
167#define MAPEQ 0x04 /* event queue buffer mapped */
168#define MAPSCR 0x08 /* scroll param area mapped */
169#define MAPCOLOR 0x10 /* color map writing buffer mapped */
170
171 /* bit definitions for 'selmask' member of qdflag structure */
172
173#define SEL_READ 0x01 /* read select is active */
174#define SEL_WRITE 0x02 /* write select is active */
175
176/*----------------------------------------------
177* constants used in shared memory operations */
178
179#define EVENT_BUFSIZE 1024 /* # of bytes per device's event buffer */
180
181#define MAXEVENTS ( (EVENT_BUFSIZE - sizeof(struct qdinput)) \
182 / sizeof(struct _vs_event) )
183
184#define DMA_BUFSIZ (1024 * 3)
185
186#define COLOR_BUFSIZ ((sizeof(struct color_buf) + 512) & ~0x01FF)
187
188/*******************************************************************/
189
190#ifdef BINARY
191
192 extern struct uba_device *qdinfo[]; /* array of pntrs to each QDSS */
193 /* uba structure */
194 extern struct tty qd_tty[];
195
196 extern struct qd_softc qd_softc[];
197
198/*----------------------------------------------------------
199* static storage used by multiple functions in this code */
200
201 extern int Qbus_unmap[]; /* Qbus mapper release key */
202 extern struct qdflags qdflags[]; /* QDSS device status flags */
203 extern struct qdmap qdmap[]; /* QDSS register map structure */
204 extern caddr_t qdbase[]; /* base address of each QDSS unit */
205 extern struct buf qdbuf[]; /* buf structs used by strategy */
206 extern char one_only[]; /* lock for single process access */
207
208/*-----------------------------
209* shared memory allocation */
210
211 extern char event_shared[]; /* reserve event buf space */
212 extern struct qdinput *eq_header[]; /* event buf header ptrs */
213
214 extern char DMA_shared[]; /* reserve DMA buf space */
215 extern struct DMAreq_header *DMAheader[]; /* DMA buf header ptrs */
216
217 extern char scroll_shared[]; /* reserve space for scroll structs */
218 extern struct scroll *scroll[]; /* pointers to scroll structures */
219
220 extern char color_shared[]; /* reserve space: color bufs */
221 extern struct color_buf *color_buf[]; /* pointers to color bufs */
222
223/*--------------------------------
224* mouse input event structures */
225
226 extern struct mouse_report last_rep[];
227 extern struct mouse_report current_rep[];
228
229/*----------------------------
230* input event "select" use */
231
232 extern struct proc *rsel[]; /* process waiting for select */
233
234 extern int DMAbuf_size;
235
236/*----------------------------
237* console cursor structure */
238
239 struct _vs_cursor cursor[];
240
241
242/*********************************************************************/
243
244#else
245
246/*--------------------------------------------------------------------------
247* reference to an array of "uba_device" structures built by the auto
248* configuration program. The uba_device structure decribes the device
249* sufficiently for the driver to talk to it. The auto configuration code
250* fills in the uba_device structures (located in ioconf.c) from user
251* maintained info. */
252
253 struct uba_device *qdinfo[NQD]; /* array of pntrs to each QDSS's */
254 /* uba structures */
255 struct tty qd_tty[NQD*4]; /* teletype structures for each.. */
256 /* ..possible minor device */
257
258 struct qd_softc qd_softc[NQD];
259
260/*----------------------------------------------------------
261* static storage used by multiple functions in this code */
262
263 int Qbus_unmap[NQD]; /* Qbus mapper release code */
264 struct qdflags qdflags[NQD]; /* QDSS device status flags */
265 struct qdmap qdmap[NQD]; /* QDSS register map structure */
266 caddr_t qdbase[NQD]; /* base address of each QDSS unit */
267 struct buf qdbuf[NQD]; /* buf structs used by strategy */
268 char one_only[NQD]; /* lock for single process access */
269
270/*------------------------------------------------------------------------
271* the array "event_shared[]" is made up of a number of event queue buffers
272* equal to the number of QDSS's configured into the running kernel (NQD).
273* Each event queue buffer begins with an event queue header (struct qdinput)
274* followed by a group of event queue entries (struct _vs_event). The array
275* "*eq_header[]" is an array of pointers to the start of each event queue
276* buffer in "event_shared[]". */
277
278#define EQSIZE ((EVENT_BUFSIZE * NQD) + 512)
279
280 char event_shared[EQSIZE]; /* reserve space for event bufs */
281 struct qdinput *eq_header[NQD]; /* event queue header pntrs */
282
283/*--------------------------------------------------------------------------
284* This allocation method reserves enough memory pages for NQD shared DMA I/O
285* buffers. Each buffer must consume an integral number of memory pages to
286* guarantee that a following buffer will begin on a page boundary. Also,
287* enough space is allocated so that the FIRST I/O buffer can start at the
288* 1st page boundary after "&DMA_shared". Page boundaries are used so that
289* memory protections can be turned on/off for individual buffers. */
290
291#define IOBUFSIZE ((DMA_BUFSIZ * NQD) + 512)
292
293 char DMA_shared[IOBUFSIZE]; /* reserve I/O buffer space */
294 struct DMAreq_header *DMAheader[NQD]; /* DMA buffer header pntrs */
295
296/*-------------------------------------------------------------------------
297* The driver assists a client in scroll operations by loading dragon
298* registers from an interrupt service routine. The loading is done using
299* parameters found in memory shrade between the driver and it's client.
300* The scroll parameter structures are ALL loacted in the same memory page
301* for reasons of memory economy. */
302
303 char scroll_shared[2 * 512]; /* reserve space for scroll structs */
304 struct scroll *scroll[NQD]; /* pointers to scroll structures */
305
306/*-----------------------------------------------------------------------
307* the driver is programmable to provide the user with color map write
308* services at VSYNC interrupt time. At interrupt time the driver loads
309* the color map with any user-requested load data found in shared memory */
310
311#define COLOR_SHARED ((COLOR_BUFSIZ * NQD) + 512)
312
313 char color_shared[COLOR_SHARED]; /* reserve space: color bufs */
314 struct color_buf *color_buf[NQD]; /* pointers to color bufs */
315
316/*--------------------------------
317* mouse input event structures */
318
319 struct mouse_report last_rep[NQD];
320 struct mouse_report current_rep[NQD];
321
322/*----------------------------
323* input event "select" use */
324
325 struct proc *rsel[NQD]; /* process waiting for select */
326
327/*----------------------------
328* console cursor structure */
329
330 struct _vs_cursor cursor[NQD];
331
332
333/************************************************************************/
334
335 int nNQD = NQD;
336
337 int DMAbuf_size = DMA_BUFSIZ;
338
339#endif
340
341