include reordering due to vn_if change
[unix-history] / usr / src / sys / hp / dev / grf.c
CommitLineData
60f56dfc
KM
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1990 The Regents of the University of California.
4 * All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.
9 *
10 * %sccs.include.redist.c%
11 *
950dea01 12 * from: Utah $Hdr: grf.c 1.31 91/01/21$
60f56dfc 13 *
8642881d 14 * @(#)grf.c 7.10 (Berkeley) %G%
60f56dfc
KM
15 */
16
17/*
18 * Graphics display driver for the HP300.
19 * This is the hardware-independent portion of the driver.
20 * Hardware access is through the grfdev routines below.
21 */
22
23#include "grf.h"
24#if NGRF > 0
25
88f29710
MK
26#include "param.h"
27#include "proc.h"
28#include "ioctl.h"
29#include "file.h"
30#include "malloc.h"
60f56dfc
KM
31
32#include "device.h"
33#include "grfioctl.h"
34#include "grfvar.h"
35
88f29710 36#include "machine/cpu.h"
60f56dfc
KM
37
38#ifdef HPUXCOMPAT
39#include "../hpux/hpux.h"
40#endif
41
88f29710 42#include "vm/vm.h"
b28b3a13
KB
43#include "vm/vm_kern.h"
44#include "vm/vm_page.h"
45#include "vm/vm_pager.h"
88f29710 46
88f29710 47#include "vnode.h"
8642881d 48#include "specdev.h"
88f29710 49#include "mman.h"
22d09b27 50
60f56dfc
KM
51#include "ite.h"
52#if NITE == 0
53#define iteon(u,f)
54#define iteoff(u,f)
55#endif
56
57int grfprobe();
58int tc_init(), tc_mode();
59int gb_init(), gb_mode();
60int rb_init(), rb_mode();
61int dv_init(), dv_mode();
62
63struct grfdev grfdev[] = {
64 GID_TOPCAT, GRFBOBCAT, tc_init, tc_mode,
65 "topcat",
66 GID_GATORBOX, GRFGATOR, gb_init, gb_mode,
67 "gatorbox",
68 GID_RENAISSANCE,GRFRBOX, rb_init, rb_mode,
69 "renaissance",
70 GID_LRCATSEYE, GRFCATSEYE, tc_init, tc_mode,
71 "lo-res catseye",
72 GID_HRCCATSEYE, GRFCATSEYE, tc_init, tc_mode,
73 "hi-res catseye",
74 GID_HRMCATSEYE, GRFCATSEYE, tc_init, tc_mode,
75 "hi-res catseye",
76 GID_DAVINCI, GRFDAVINCI, dv_init, dv_mode,
77 "davinci",
78};
79int ngrfdev = sizeof(grfdev) / sizeof(grfdev[0]);
80
81struct driver grfdriver = { grfprobe, "grf" };
82struct grf_softc grf_softc[NGRF];
83
60f56dfc
KM
84#ifdef DEBUG
85int grfdebug = 0;
86#define GDB_DEVNO 0x01
87#define GDB_MMAP 0x02
88#define GDB_IOMAP 0x04
89#define GDB_LOCK 0x08
90#endif
91
92/*
93 * XXX: called from ite console init routine.
94 * Does just what configure will do later but without printing anything.
95 */
96grfconfig()
97{
98 register caddr_t addr;
99 register struct hp_hw *hw;
100 register struct hp_device *hd, *nhd;
101
102 for (hw = sc_table; hw->hw_type; hw++) {
950dea01 103 if (!HW_ISDEV(hw, D_BITMAP))
60f56dfc
KM
104 continue;
105 /*
106 * Found one, now match up with a logical unit number
107 */
108 nhd = NULL;
950dea01 109 addr = hw->hw_kva;
60f56dfc
KM
110 for (hd = hp_dinit; hd->hp_driver; hd++) {
111 if (hd->hp_driver != &grfdriver || hd->hp_alive)
112 continue;
113 /*
114 * Wildcarded. If first, remember as possible match.
115 */
116 if (hd->hp_addr == NULL) {
117 if (nhd == NULL)
118 nhd = hd;
119 continue;
120 }
121 /*
122 * Not wildcarded.
123 * If exact match done searching, else keep looking.
124 */
950dea01 125 if (sctova(hd->hp_addr) == addr) {
60f56dfc
KM
126 nhd = hd;
127 break;
128 }
129 }
130 /*
131 * Found a match, initialize
132 */
950dea01 133 if (nhd && grfinit(addr, nhd->hp_unit))
60f56dfc 134 nhd->hp_addr = addr;
60f56dfc
KM
135 }
136}
137
138/*
139 * Normal init routine called by configure() code
140 */
141grfprobe(hd)
142 struct hp_device *hd;
143{
144 struct grf_softc *gp = &grf_softc[hd->hp_unit];
145
146 if ((gp->g_flags & GF_ALIVE) == 0 &&
147 !grfinit(hd->hp_addr, hd->hp_unit))
148 return(0);
149 printf("grf%d: %d x %d ", hd->hp_unit,
150 gp->g_display.gd_dwidth, gp->g_display.gd_dheight);
151 if (gp->g_display.gd_colors == 2)
152 printf("monochrome");
153 else
154 printf("%d color", gp->g_display.gd_colors);
155 printf(" %s display\n", grfdev[gp->g_type].gd_desc);
156 return(1);
157}
158
159grfinit(addr, unit)
160 caddr_t addr;
161{
162 struct grf_softc *gp = &grf_softc[unit];
163 struct grfreg *gr;
164 register struct grfdev *gd;
165
166 gr = (struct grfreg *) addr;
167 if (gr->gr_id != GRFHWID)
168 return(0);
169 for (gd = grfdev; gd < &grfdev[ngrfdev]; gd++)
170 if (gd->gd_hardid == gr->gr_id2)
171 break;
172 if (gd < &grfdev[ngrfdev] && (*gd->gd_init)(gp, addr)) {
173 gp->g_display.gd_id = gd->gd_softid;
174 gp->g_type = gd - grfdev;
175 gp->g_flags = GF_ALIVE;
176 return(1);
177 }
178 return(0);
179}
180
181/*ARGSUSED*/
182grfopen(dev, flags)
183 dev_t dev;
184{
185 int unit = GRFUNIT(dev);
186 register struct grf_softc *gp = &grf_softc[unit];
187 int error = 0;
188
189 if (unit >= NGRF || (gp->g_flags & GF_ALIVE) == 0)
190 return(ENXIO);
191 if ((gp->g_flags & (GF_OPEN|GF_EXCLUDE)) == (GF_OPEN|GF_EXCLUDE))
192 return(EBUSY);
193#ifdef HPUXCOMPAT
194 /*
195 * XXX: cannot handle both HPUX and BSD processes at the same time
196 */
88f29710 197 if (curproc->p_flag & SHPUX)
60f56dfc
KM
198 if (gp->g_flags & GF_BSDOPEN)
199 return(EBUSY);
200 else
201 gp->g_flags |= GF_HPUXOPEN;
202 else
203 if (gp->g_flags & GF_HPUXOPEN)
204 return(EBUSY);
205 else
206 gp->g_flags |= GF_BSDOPEN;
207#endif
208 /*
209 * First open.
210 * XXX: always put in graphics mode.
211 */
212 error = 0;
213 if ((gp->g_flags & GF_OPEN) == 0) {
214 gp->g_flags |= GF_OPEN;
215 error = grfon(dev);
216 }
217 return(error);
218}
219
220/*ARGSUSED*/
221grfclose(dev, flags)
222 dev_t dev;
223{
224 register struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
225
226 (void) grfoff(dev);
227 (void) grfunlock(gp);
228 gp->g_flags &= GF_ALIVE;
229 return(0);
230}
231
232/*ARGSUSED*/
88f29710 233grfioctl(dev, cmd, data, flag, p)
60f56dfc
KM
234 dev_t dev;
235 caddr_t data;
88f29710 236 struct proc *p;
60f56dfc
KM
237{
238 register struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
239 int error;
240
241#ifdef HPUXCOMPAT
88f29710
MK
242 if (p->p_flag & SHPUX)
243 return(hpuxgrfioctl(dev, cmd, data, flag, p));
60f56dfc
KM
244#endif
245 error = 0;
246 switch (cmd) {
247
248 /* XXX: compatibility hack */
249 case OGRFIOCGINFO:
250 bcopy((caddr_t)&gp->g_display, data, sizeof(struct ogrfinfo));
251 break;
252
253 case GRFIOCGINFO:
254 bcopy((caddr_t)&gp->g_display, data, sizeof(struct grfinfo));
255 break;
256
257 case GRFIOCON:
258 error = grfon(dev);
259 break;
260
261 case GRFIOCOFF:
262 error = grfoff(dev);
263 break;
264
60f56dfc 265 case GRFIOCMAP:
88f29710 266 error = grfmmap(dev, (caddr_t *)data, p);
60f56dfc
KM
267 break;
268
269 case GRFIOCUNMAP:
88f29710 270 error = grfunmmap(dev, *(caddr_t *)data, p);
60f56dfc 271 break;
60f56dfc
KM
272
273 default:
274 error = EINVAL;
275 break;
276
277 }
278 return(error);
279}
280
281/*ARGSUSED*/
282grfselect(dev, rw)
283 dev_t dev;
284{
285 if (rw == FREAD)
286 return(0);
287 return(1);
288}
289
290grflock(gp, block)
291 register struct grf_softc *gp;
292 int block;
293{
88f29710 294 struct proc *p = curproc; /* XXX */
339a5f2c
KM
295 int error;
296 extern char devioc[];
297
60f56dfc
KM
298#ifdef DEBUG
299 if (grfdebug & GDB_LOCK)
300 printf("grflock(%d): dev %x flags %x lockpid %x\n",
05d14dfb 301 p->p_pid, gp-grf_softc, gp->g_flags,
60f56dfc
KM
302 gp->g_lockp ? gp->g_lockp->p_pid : -1);
303#endif
304#ifdef HPUXCOMPAT
305 if (gp->g_pid) {
306#ifdef DEBUG
307 if (grfdebug & GDB_LOCK)
950dea01
MH
308 printf(" lockpslot %d lockslot %d lock[lockslot] %d\n",
309 gp->g_lock->gl_lockslot, gp->g_lockpslot,
310 gp->g_lock->gl_locks[gp->g_lockpslot]);
60f56dfc 311#endif
950dea01
MH
312 gp->g_lock->gl_lockslot = 0;
313 if (gp->g_lock->gl_locks[gp->g_lockpslot] == 0) {
60f56dfc
KM
314 gp->g_lockp = NULL;
315 gp->g_lockpslot = 0;
316 }
317 }
318#endif
319 if (gp->g_lockp) {
05d14dfb 320 if (gp->g_lockp == p)
60f56dfc
KM
321 return(EBUSY);
322 if (!block)
323 return(EAGAIN);
324 do {
325 gp->g_flags |= GF_WANTED;
339a5f2c
KM
326 if (error = tsleep((caddr_t)&gp->g_flags,
327 (PZERO+1) | PCATCH, devioc, 0))
328 return (error);
60f56dfc
KM
329 } while (gp->g_lockp);
330 }
05d14dfb 331 gp->g_lockp = p;
60f56dfc
KM
332#ifdef HPUXCOMPAT
333 if (gp->g_pid) {
334 int slot = grffindpid(gp);
335#ifdef DEBUG
336 if (grfdebug & GDB_LOCK)
337 printf(" slot %d\n", slot);
338#endif
950dea01
MH
339 gp->g_lockpslot = gp->g_lock->gl_lockslot = slot;
340 gp->g_lock->gl_locks[slot] = 1;
60f56dfc
KM
341 }
342#endif
343 return(0);
344}
345
346grfunlock(gp)
347 register struct grf_softc *gp;
348{
349#ifdef DEBUG
350 if (grfdebug & GDB_LOCK)
351 printf("grfunlock(%d): dev %x flags %x lockpid %d\n",
88f29710 352 curproc->p_pid, gp-grf_softc, gp->g_flags,
60f56dfc
KM
353 gp->g_lockp ? gp->g_lockp->p_pid : -1);
354#endif
88f29710 355 if (gp->g_lockp != curproc)
60f56dfc
KM
356 return(EBUSY);
357#ifdef HPUXCOMPAT
358 if (gp->g_pid) {
359#ifdef DEBUG
360 if (grfdebug & GDB_LOCK)
950dea01
MH
361 printf(" lockpslot %d lockslot %d lock[lockslot] %d\n",
362 gp->g_lock->gl_lockslot, gp->g_lockpslot,
363 gp->g_lock->gl_locks[gp->g_lockpslot]);
60f56dfc 364#endif
950dea01
MH
365 gp->g_lock->gl_locks[gp->g_lockpslot] = 0;
366 gp->g_lockpslot = gp->g_lock->gl_lockslot = 0;
60f56dfc
KM
367 }
368#endif
369 if (gp->g_flags & GF_WANTED) {
370 wakeup((caddr_t)&gp->g_flags);
371 gp->g_flags &= ~GF_WANTED;
372 }
373 gp->g_lockp = NULL;
374 return(0);
375}
376
377/*ARGSUSED*/
378grfmap(dev, off, prot)
379 dev_t dev;
380{
381 return(grfaddr(&grf_softc[GRFUNIT(dev)], off));
382}
383
384#ifdef HPUXCOMPAT
385
386/*ARGSUSED*/
88f29710 387hpuxgrfioctl(dev, cmd, data, flag, p)
60f56dfc
KM
388 dev_t dev;
389 caddr_t data;
88f29710 390 struct proc *p;
60f56dfc
KM
391{
392 register struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
393 int error;
394
395 error = 0;
396 switch (cmd) {
397
398 case GCID:
399 *(int *)data = gp->g_display.gd_id;
400 break;
401
402 case GCON:
403 error = grfon(dev);
404 break;
405
406 case GCOFF:
407 error = grfoff(dev);
408 break;
409
410 case GCLOCK:
411 error = grflock(gp, 1);
412 break;
413
414 case GCUNLOCK:
415 error = grfunlock(gp);
416 break;
417
418 case GCAON:
419 case GCAOFF:
420 break;
421
422 /* GCSTATIC is implied by our implementation */
423 case GCSTATIC_CMAP:
424 case GCVARIABLE_CMAP:
425 break;
426
60f56dfc
KM
427 /* map in control regs and frame buffer */
428 case GCMAP:
88f29710 429 error = grfmmap(dev, (caddr_t *)data, p);
60f56dfc
KM
430 break;
431
432 case GCUNMAP:
88f29710 433 error = grfunmmap(dev, *(caddr_t *)data, p);
60f56dfc
KM
434 /* XXX: HP-UX uses GCUNMAP to get rid of GCSLOT memory */
435 if (error)
436 error = grflckunmmap(dev, *(caddr_t *)data);
437 break;
438
439 case GCSLOT:
440 {
441 struct grf_slot *sp = (struct grf_slot *)data;
442
443 sp->slot = grffindpid(gp);
22d09b27 444 if (sp->slot) {
60f56dfc 445 error = grflckmmap(dev, (caddr_t *)&sp->addr);
22d09b27
KM
446 if (error && gp->g_pid) {
447 free((caddr_t)gp->g_pid, M_DEVBUF);
448 gp->g_pid = NULL;
449 }
450 } else
60f56dfc
KM
451 error = EINVAL; /* XXX */
452 break;
453 }
454
455 /*
456 * XXX: only used right now to map in rbox control registers
457 * Will be replaced in the future with a real IOMAP interface.
458 */
459 case IOMAPMAP:
460 error = iommap(dev, (caddr_t *)data);
96d5f73d
MH
461#if 0
462 /*
463 * It may not be worth kludging this (using p_devtmp) to
464 * make this work. It was an undocumented side-effect
465 * in HP-UX that the mapped address was the return value
466 * of the ioctl. The only thing I remember that counted
467 * on this behavior was the rbox X10 server.
468 */
60f56dfc
KM
469 if (!error)
470 u.u_r.r_val1 = *(int *)data; /* XXX: this sux */
96d5f73d 471#endif
60f56dfc
KM
472 break;
473
474 case IOMAPUNMAP:
475 error = iounmmap(dev, *(caddr_t *)data);
476 break;
60f56dfc
KM
477
478 default:
479 error = EINVAL;
480 break;
481 }
482 return(error);
483}
484
485#endif
486
487grfon(dev)
488 dev_t dev;
489{
490 int unit = GRFUNIT(dev);
491 struct grf_softc *gp = &grf_softc[unit];
492
493 /*
494 * XXX: iteoff call relies on devices being in same order
495 * as ITEs and the fact that iteoff only uses the minor part
496 * of the dev arg.
497 */
498 iteoff(unit, 3);
499 return((*grfdev[gp->g_type].gd_mode)
500 (gp, (dev&GRFOVDEV) ? GM_GRFOVON : GM_GRFON));
501}
502
503grfoff(dev)
504 dev_t dev;
505{
506 int unit = GRFUNIT(dev);
507 struct grf_softc *gp = &grf_softc[unit];
508 int error;
509
88f29710 510 (void) grfunmmap(dev, (caddr_t)0, curproc);
60f56dfc
KM
511 error = (*grfdev[gp->g_type].gd_mode)
512 (gp, (dev&GRFOVDEV) ? GM_GRFOVOFF : GM_GRFOFF);
513 /* XXX: see comment for iteoff above */
514 iteon(unit, 2);
515 return(error);
516}
517
518grfaddr(gp, off)
519 struct grf_softc *gp;
520 register int off;
521{
60f56dfc
KM
522 register struct grfinfo *gi = &gp->g_display;
523
524 /* control registers */
525 if (off >= 0 && off < gi->gd_regsize)
526 return(((u_int)gi->gd_regaddr + off) >> PGSHIFT);
527
528 /* frame buffer */
529 if (off >= gi->gd_regsize && off < gi->gd_regsize+gi->gd_fbsize) {
530 off -= gi->gd_regsize;
531 return(((u_int)gi->gd_fbaddr + off) >> PGSHIFT);
532 }
60f56dfc
KM
533 /* bogus */
534 return(-1);
535}
536
537#ifdef HPUXCOMPAT
538/*
539 * Convert a BSD style minor devno to HPUX style.
540 * We cannot just create HPUX style nodes as they require 24 bits
541 * of minor device number and we only have 8.
542 * XXX: This may give the wrong result for remote stats of other
543 * machines where device 10 exists.
544 */
545grfdevno(dev)
546 dev_t dev;
547{
548 int unit = GRFUNIT(dev);
549 struct grf_softc *gp = &grf_softc[unit];
950dea01 550 int newdev, sc;
60f56dfc
KM
551
552 if (unit >= NGRF || (gp->g_flags&GF_ALIVE) == 0)
553 return(bsdtohpuxdev(dev));
554 /* magic major number */
555 newdev = 12 << 24;
556 /* now construct minor number */
950dea01
MH
557 if (gp->g_display.gd_regaddr != (caddr_t)GRFIADDR) {
558 sc = patosc(gp->g_display.gd_regaddr);
559 newdev |= (sc << 16) | 0x200;
560 }
60f56dfc
KM
561 if (dev & GRFIMDEV)
562 newdev |= 0x02;
563 else if (dev & GRFOVDEV)
564 newdev |= 0x01;
565#ifdef DEBUG
566 if (grfdebug & GDB_DEVNO)
567 printf("grfdevno: dev %x newdev %x\n", dev, newdev);
568#endif
569 return(newdev);
570}
571#endif
572
88f29710 573grfmmap(dev, addrp, p)
60f56dfc
KM
574 dev_t dev;
575 caddr_t *addrp;
88f29710 576 struct proc *p;
60f56dfc
KM
577{
578 struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
22d09b27
KM
579 int len, error;
580 struct vnode vn;
581 struct specinfo si;
582 int flags;
60f56dfc
KM
583
584#ifdef DEBUG
585 if (grfdebug & GDB_MMAP)
05d14dfb 586 printf("grfmmap(%d): addr %x\n", p->p_pid, *addrp);
60f56dfc
KM
587#endif
588 len = gp->g_display.gd_regsize + gp->g_display.gd_fbsize;
22d09b27
KM
589 flags = MAP_FILE|MAP_SHARED;
590 if (*addrp)
591 flags |= MAP_FIXED;
592 else
593 *addrp = (caddr_t)0x1000000; /* XXX */
594 vn.v_type = VCHR; /* XXX */
595 vn.v_specinfo = &si; /* XXX */
596 vn.v_rdev = dev; /* XXX */
88f29710 597 error = vm_mmap(&p->p_vmspace->vm_map, (vm_offset_t *)addrp,
22d09b27 598 (vm_size_t)len, VM_PROT_ALL, flags, (caddr_t)&vn, 0);
96d5f73d 599 return(error);
60f56dfc
KM
600}
601
88f29710 602grfunmmap(dev, addr, p)
60f56dfc
KM
603 dev_t dev;
604 caddr_t addr;
88f29710 605 struct proc *p;
60f56dfc 606{
22d09b27
KM
607 struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
608 vm_size_t size;
609 int rv;
60f56dfc
KM
610
611#ifdef DEBUG
612 if (grfdebug & GDB_MMAP)
22d09b27 613 printf("grfunmmap(%d): dev %x addr %x\n", p->p_pid, dev, addr);
60f56dfc 614#endif
22d09b27
KM
615 if (addr == 0)
616 return(EINVAL); /* XXX: how do we deal with this? */
617 size = round_page(gp->g_display.gd_regsize + gp->g_display.gd_fbsize);
6055b25f 618 rv = vm_deallocate(&p->p_vmspace->vm_map, (vm_offset_t)addr, size);
22d09b27 619 return(rv == KERN_SUCCESS ? 0 : EINVAL);
60f56dfc
KM
620}
621
622#ifdef HPUXCOMPAT
623iommap(dev, addrp)
624 dev_t dev;
625 caddr_t *addrp;
626{
88f29710 627 struct proc *p = curproc; /* XXX */
60f56dfc 628 struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
60f56dfc
KM
629
630#ifdef DEBUG
631 if (grfdebug & (GDB_MMAP|GDB_IOMAP))
05d14dfb 632 printf("iommap(%d): addr %x\n", p->p_pid, *addrp);
60f56dfc 633#endif
22d09b27 634 return(EINVAL);
60f56dfc
KM
635}
636
637iounmmap(dev, addr)
638 dev_t dev;
639 caddr_t addr;
640{
22d09b27 641 int unit = minor(dev);
60f56dfc
KM
642
643#ifdef DEBUG
644 if (grfdebug & (GDB_MMAP|GDB_IOMAP))
645 printf("iounmmap(%d): id %d addr %x\n",
88f29710 646 curproc->p_pid, unit, addr);
60f56dfc 647#endif
22d09b27 648 return(0);
60f56dfc
KM
649}
650
651/*
652 * Processes involved in framebuffer mapping via GCSLOT are recorded in
653 * an array of pids. The first element is used to record the last slot used
654 * (for faster lookups). The remaining elements record up to GRFMAXLCK-1
655 * process ids. Returns a slot number between 1 and GRFMAXLCK or 0 if no
656 * slot is available.
657 */
658grffindpid(gp)
659 struct grf_softc *gp;
660{
661 register short pid, *sp;
662 register int i, limit;
663 int ni;
664
665 if (gp->g_pid == NULL) {
666 gp->g_pid = (short *)
667 malloc(GRFMAXLCK * sizeof(short), M_DEVBUF, M_WAITOK);
668 bzero((caddr_t)gp->g_pid, GRFMAXLCK * sizeof(short));
669 }
88f29710 670 pid = curproc->p_pid;
60f56dfc
KM
671 ni = limit = gp->g_pid[0];
672 for (i = 1, sp = &gp->g_pid[1]; i <= limit; i++, sp++) {
673 if (*sp == pid)
674 goto done;
675 if (*sp == 0)
676 ni = i;
677 }
678 i = ni;
679 if (i < limit) {
680 gp->g_pid[i] = pid;
681 goto done;
682 }
683 if (++i == GRFMAXLCK)
684 return(0);
685 gp->g_pid[0] = i;
686 gp->g_pid[i] = pid;
687done:
688#ifdef DEBUG
689 if (grfdebug & GDB_LOCK)
690 printf("grffindpid(%d): slot %d of %d\n",
691 pid, i, gp->g_pid[0]);
692#endif
693 return(i);
694}
695
696grfrmpid(gp)
697 struct grf_softc *gp;
698{
699 register short pid, *sp;
700 register int limit, i;
701 int mi;
702
703 if (gp->g_pid == NULL || (limit = gp->g_pid[0]) == 0)
704 return;
88f29710 705 pid = curproc->p_pid;
60f56dfc
KM
706 limit = gp->g_pid[0];
707 mi = 0;
708 for (i = 1, sp = &gp->g_pid[1]; i <= limit; i++, sp++) {
709 if (*sp == pid)
710 *sp = 0;
711 else if (*sp)
712 mi = i;
713 }
714 i = mi;
715 if (i < limit)
716 gp->g_pid[0] = i;
717#ifdef DEBUG
718 if (grfdebug & GDB_LOCK)
719 printf("grfrmpid(%d): slot %d of %d\n",
720 pid, sp-gp->g_pid, gp->g_pid[0]);
721#endif
722}
723
60f56dfc
KM
724grflckmmap(dev, addrp)
725 dev_t dev;
726 caddr_t *addrp;
727{
60f56dfc 728#ifdef DEBUG
88f29710
MK
729 struct proc *p = curproc; /* XXX */
730
60f56dfc
KM
731 if (grfdebug & (GDB_MMAP|GDB_LOCK))
732 printf("grflckmmap(%d): addr %x\n",
05d14dfb 733 p->p_pid, *addrp);
60f56dfc 734#endif
22d09b27 735 return(EINVAL);
60f56dfc
KM
736}
737
738grflckunmmap(dev, addr)
739 dev_t dev;
740 caddr_t addr;
741{
88f29710 742#ifdef DEBUG
60f56dfc
KM
743 int unit = minor(dev);
744
60f56dfc
KM
745 if (grfdebug & (GDB_MMAP|GDB_LOCK))
746 printf("grflckunmmap(%d): id %d addr %x\n",
88f29710 747 curproc->p_pid, unit, addr);
60f56dfc 748#endif
60f56dfc
KM
749 return(EINVAL);
750}
751#endif /* HPUXCOMPAT */
22d09b27 752
60f56dfc 753#endif /* NGRF > 0 */