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