update from Mike Hibler for new VM and other machine support
[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 *
22d09b27 14 * @(#)grf.c 7.5 (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
26#include "param.h"
27#include "user.h"
28#include "proc.h"
29#include "ioctl.h"
30#include "file.h"
60f56dfc
KM
31#include "malloc.h"
32
33#include "device.h"
34#include "grfioctl.h"
35#include "grfvar.h"
36
37#include "machine/cpu.h"
38
39#ifdef HPUXCOMPAT
40#include "../hpux/hpux.h"
41#endif
42
22d09b27
KM
43#include "../vm/vm_param.h"
44#include "../vm/vm_map.h"
45#include "../vm/vm_kern.h"
46#include "../vm/vm_page.h"
47#include "../vm/vm_pager.h"
48#include "specdev.h"
49#include "vnode.h"
50#include "mman.h"
51
60f56dfc
KM
52#include "ite.h"
53#if NITE == 0
54#define iteon(u,f)
55#define iteoff(u,f)
56#endif
57
58int grfprobe();
59int tc_init(), tc_mode();
60int gb_init(), gb_mode();
61int rb_init(), rb_mode();
62int dv_init(), dv_mode();
63
64struct grfdev grfdev[] = {
65 GID_TOPCAT, GRFBOBCAT, tc_init, tc_mode,
66 "topcat",
67 GID_GATORBOX, GRFGATOR, gb_init, gb_mode,
68 "gatorbox",
69 GID_RENAISSANCE,GRFRBOX, rb_init, rb_mode,
70 "renaissance",
71 GID_LRCATSEYE, GRFCATSEYE, tc_init, tc_mode,
72 "lo-res catseye",
73 GID_HRCCATSEYE, GRFCATSEYE, tc_init, tc_mode,
74 "hi-res catseye",
75 GID_HRMCATSEYE, GRFCATSEYE, tc_init, tc_mode,
76 "hi-res catseye",
77 GID_DAVINCI, GRFDAVINCI, dv_init, dv_mode,
78 "davinci",
79};
80int ngrfdev = sizeof(grfdev) / sizeof(grfdev[0]);
81
82struct driver grfdriver = { grfprobe, "grf" };
83struct grf_softc grf_softc[NGRF];
84
60f56dfc
KM
85#ifdef DEBUG
86int grfdebug = 0;
87#define GDB_DEVNO 0x01
88#define GDB_MMAP 0x02
89#define GDB_IOMAP 0x04
90#define GDB_LOCK 0x08
91#endif
92
93/*
94 * XXX: called from ite console init routine.
95 * Does just what configure will do later but without printing anything.
96 */
97grfconfig()
98{
99 register caddr_t addr;
100 register struct hp_hw *hw;
101 register struct hp_device *hd, *nhd;
102
103 for (hw = sc_table; hw->hw_type; hw++) {
104 if (hw->hw_type != BITMAP)
105 continue;
106 /*
107 * Found one, now match up with a logical unit number
108 */
109 nhd = NULL;
110 addr = hw->hw_addr;
111 for (hd = hp_dinit; hd->hp_driver; hd++) {
112 if (hd->hp_driver != &grfdriver || hd->hp_alive)
113 continue;
114 /*
115 * Wildcarded. If first, remember as possible match.
116 */
117 if (hd->hp_addr == NULL) {
118 if (nhd == NULL)
119 nhd = hd;
120 continue;
121 }
122 /*
123 * Not wildcarded.
124 * If exact match done searching, else keep looking.
125 */
126 if ((caddr_t)sctoaddr(hd->hp_addr) == addr) {
127 nhd = hd;
128 break;
129 }
130 }
131 /*
132 * Found a match, initialize
133 */
134 if (nhd && grfinit(addr, nhd->hp_unit)) {
135 nhd->hp_addr = addr;
136 }
137 }
138}
139
140/*
141 * Normal init routine called by configure() code
142 */
143grfprobe(hd)
144 struct hp_device *hd;
145{
146 struct grf_softc *gp = &grf_softc[hd->hp_unit];
147
148 if ((gp->g_flags & GF_ALIVE) == 0 &&
149 !grfinit(hd->hp_addr, hd->hp_unit))
150 return(0);
151 printf("grf%d: %d x %d ", hd->hp_unit,
152 gp->g_display.gd_dwidth, gp->g_display.gd_dheight);
153 if (gp->g_display.gd_colors == 2)
154 printf("monochrome");
155 else
156 printf("%d color", gp->g_display.gd_colors);
157 printf(" %s display\n", grfdev[gp->g_type].gd_desc);
158 return(1);
159}
160
161grfinit(addr, unit)
162 caddr_t addr;
163{
164 struct grf_softc *gp = &grf_softc[unit];
165 struct grfreg *gr;
166 register struct grfdev *gd;
167
168 gr = (struct grfreg *) addr;
169 if (gr->gr_id != GRFHWID)
170 return(0);
171 for (gd = grfdev; gd < &grfdev[ngrfdev]; gd++)
172 if (gd->gd_hardid == gr->gr_id2)
173 break;
174 if (gd < &grfdev[ngrfdev] && (*gd->gd_init)(gp, addr)) {
175 gp->g_display.gd_id = gd->gd_softid;
176 gp->g_type = gd - grfdev;
177 gp->g_flags = GF_ALIVE;
178 return(1);
179 }
180 return(0);
181}
182
183/*ARGSUSED*/
184grfopen(dev, flags)
185 dev_t dev;
186{
187 int unit = GRFUNIT(dev);
188 register struct grf_softc *gp = &grf_softc[unit];
189 int error = 0;
190
191 if (unit >= NGRF || (gp->g_flags & GF_ALIVE) == 0)
192 return(ENXIO);
193 if ((gp->g_flags & (GF_OPEN|GF_EXCLUDE)) == (GF_OPEN|GF_EXCLUDE))
194 return(EBUSY);
195#ifdef HPUXCOMPAT
196 /*
197 * XXX: cannot handle both HPUX and BSD processes at the same time
198 */
199 if (u.u_procp->p_flag & SHPUX)
200 if (gp->g_flags & GF_BSDOPEN)
201 return(EBUSY);
202 else
203 gp->g_flags |= GF_HPUXOPEN;
204 else
205 if (gp->g_flags & GF_HPUXOPEN)
206 return(EBUSY);
207 else
208 gp->g_flags |= GF_BSDOPEN;
209#endif
210 /*
211 * First open.
212 * XXX: always put in graphics mode.
213 */
214 error = 0;
215 if ((gp->g_flags & GF_OPEN) == 0) {
216 gp->g_flags |= GF_OPEN;
217 error = grfon(dev);
218 }
219 return(error);
220}
221
222/*ARGSUSED*/
223grfclose(dev, flags)
224 dev_t dev;
225{
226 register struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
227
228 (void) grfoff(dev);
229 (void) grfunlock(gp);
230 gp->g_flags &= GF_ALIVE;
231 return(0);
232}
233
234/*ARGSUSED*/
235grfioctl(dev, cmd, data, flag)
236 dev_t dev;
237 caddr_t data;
238{
239 register struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
240 int error;
241
242#ifdef HPUXCOMPAT
243 if (u.u_procp->p_flag & SHPUX)
244 return(hpuxgrfioctl(dev, cmd, data, flag));
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
KM
266 case GRFIOCMAP:
267 error = grfmmap(dev, (caddr_t *)data);
268 break;
269
270 case GRFIOCUNMAP:
271 error = grfunmmap(dev, *(caddr_t *)data);
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{
05d14dfb 295 struct proc *p = u.u_procp; /* 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",
353 u.u_procp->p_pid, gp-grf_softc, gp->g_flags,
354 gp->g_lockp ? gp->g_lockp->p_pid : -1);
355#endif
356 if (gp->g_lockp != u.u_procp)
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*/
388hpuxgrfioctl(dev, cmd, data, flag)
389 dev_t dev;
390 caddr_t data;
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:
429 error = grfmmap(dev, (caddr_t *)data);
430 break;
431
432 case GCUNMAP:
433 error = grfunmmap(dev, *(caddr_t *)data);
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
60f56dfc 510 (void) grfunmmap(dev, (caddr_t)0);
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];
550 int newdev;
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 */
60f56dfc
KM
557 if (gp->g_display.gd_regaddr != (caddr_t)GRFIADDR)
558 newdev |= ((u_int)gp->g_display.gd_regaddr-EXTIOBASE) | 0x200;
559 if (dev & GRFIMDEV)
560 newdev |= 0x02;
561 else if (dev & GRFOVDEV)
562 newdev |= 0x01;
563#ifdef DEBUG
564 if (grfdebug & GDB_DEVNO)
565 printf("grfdevno: dev %x newdev %x\n", dev, newdev);
566#endif
567 return(newdev);
568}
569#endif
570
60f56dfc
KM
571grfmmap(dev, addrp)
572 dev_t dev;
573 caddr_t *addrp;
574{
05d14dfb 575 struct proc *p = u.u_procp; /* XXX */
60f56dfc 576 struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
22d09b27
KM
577 int len, error;
578 struct vnode vn;
579 struct specinfo si;
580 int flags;
60f56dfc
KM
581
582#ifdef DEBUG
583 if (grfdebug & GDB_MMAP)
05d14dfb 584 printf("grfmmap(%d): addr %x\n", p->p_pid, *addrp);
60f56dfc
KM
585#endif
586 len = gp->g_display.gd_regsize + gp->g_display.gd_fbsize;
22d09b27
KM
587 flags = MAP_FILE|MAP_SHARED;
588 if (*addrp)
589 flags |= MAP_FIXED;
590 else
591 *addrp = (caddr_t)0x1000000; /* XXX */
592 vn.v_type = VCHR; /* XXX */
593 vn.v_specinfo = &si; /* XXX */
594 vn.v_rdev = dev; /* XXX */
595 error = vm_mmap(u.u_procp->p_map, (vm_offset_t *)addrp,
596 (vm_size_t)len, VM_PROT_ALL, flags, (caddr_t)&vn, 0);
96d5f73d 597 return(error);
60f56dfc
KM
598}
599
600grfunmmap(dev, addr)
601 dev_t dev;
602 caddr_t addr;
60f56dfc 603{
05d14dfb 604 struct proc *p = u.u_procp; /* XXX */
22d09b27
KM
605 struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
606 vm_size_t size;
607 int rv;
60f56dfc
KM
608
609#ifdef DEBUG
610 if (grfdebug & GDB_MMAP)
22d09b27 611 printf("grfunmmap(%d): dev %x addr %x\n", p->p_pid, dev, addr);
60f56dfc 612#endif
22d09b27
KM
613 if (addr == 0)
614 return(EINVAL); /* XXX: how do we deal with this? */
615 size = round_page(gp->g_display.gd_regsize + gp->g_display.gd_fbsize);
616 rv = vm_deallocate(p->p_map, (vm_offset_t)addr, size);
617 return(rv == KERN_SUCCESS ? 0 : EINVAL);
60f56dfc
KM
618}
619
620#ifdef HPUXCOMPAT
621iommap(dev, addrp)
622 dev_t dev;
623 caddr_t *addrp;
624{
05d14dfb 625 struct proc *p = u.u_procp; /* XXX */
60f56dfc 626 struct grf_softc *gp = &grf_softc[GRFUNIT(dev)];
60f56dfc
KM
627
628#ifdef DEBUG
629 if (grfdebug & (GDB_MMAP|GDB_IOMAP))
05d14dfb 630 printf("iommap(%d): addr %x\n", p->p_pid, *addrp);
60f56dfc 631#endif
22d09b27 632 return(EINVAL);
60f56dfc
KM
633}
634
635iounmmap(dev, addr)
636 dev_t dev;
637 caddr_t addr;
638{
22d09b27 639 int unit = minor(dev);
60f56dfc
KM
640
641#ifdef DEBUG
642 if (grfdebug & (GDB_MMAP|GDB_IOMAP))
643 printf("iounmmap(%d): id %d addr %x\n",
644 u.u_procp->p_pid, unit, addr);
645#endif
22d09b27 646 return(0);
60f56dfc
KM
647}
648
649/*
650 * Processes involved in framebuffer mapping via GCSLOT are recorded in
651 * an array of pids. The first element is used to record the last slot used
652 * (for faster lookups). The remaining elements record up to GRFMAXLCK-1
653 * process ids. Returns a slot number between 1 and GRFMAXLCK or 0 if no
654 * slot is available.
655 */
656grffindpid(gp)
657 struct grf_softc *gp;
658{
659 register short pid, *sp;
660 register int i, limit;
661 int ni;
662
663 if (gp->g_pid == NULL) {
664 gp->g_pid = (short *)
665 malloc(GRFMAXLCK * sizeof(short), M_DEVBUF, M_WAITOK);
666 bzero((caddr_t)gp->g_pid, GRFMAXLCK * sizeof(short));
667 }
668 pid = u.u_procp->p_pid;
669 ni = limit = gp->g_pid[0];
670 for (i = 1, sp = &gp->g_pid[1]; i <= limit; i++, sp++) {
671 if (*sp == pid)
672 goto done;
673 if (*sp == 0)
674 ni = i;
675 }
676 i = ni;
677 if (i < limit) {
678 gp->g_pid[i] = pid;
679 goto done;
680 }
681 if (++i == GRFMAXLCK)
682 return(0);
683 gp->g_pid[0] = i;
684 gp->g_pid[i] = pid;
685done:
686#ifdef DEBUG
687 if (grfdebug & GDB_LOCK)
688 printf("grffindpid(%d): slot %d of %d\n",
689 pid, i, gp->g_pid[0]);
690#endif
691 return(i);
692}
693
694grfrmpid(gp)
695 struct grf_softc *gp;
696{
697 register short pid, *sp;
698 register int limit, i;
699 int mi;
700
701 if (gp->g_pid == NULL || (limit = gp->g_pid[0]) == 0)
702 return;
703 pid = u.u_procp->p_pid;
704 limit = gp->g_pid[0];
705 mi = 0;
706 for (i = 1, sp = &gp->g_pid[1]; i <= limit; i++, sp++) {
707 if (*sp == pid)
708 *sp = 0;
709 else if (*sp)
710 mi = i;
711 }
712 i = mi;
713 if (i < limit)
714 gp->g_pid[0] = i;
715#ifdef DEBUG
716 if (grfdebug & GDB_LOCK)
717 printf("grfrmpid(%d): slot %d of %d\n",
718 pid, sp-gp->g_pid, gp->g_pid[0]);
719#endif
720}
721
60f56dfc
KM
722grflckmmap(dev, addrp)
723 dev_t dev;
724 caddr_t *addrp;
725{
05d14dfb 726 struct proc *p = u.u_procp; /* XXX */
60f56dfc
KM
727
728#ifdef DEBUG
729 if (grfdebug & (GDB_MMAP|GDB_LOCK))
730 printf("grflckmmap(%d): addr %x\n",
05d14dfb 731 p->p_pid, *addrp);
60f56dfc 732#endif
22d09b27 733 return(EINVAL);
60f56dfc
KM
734}
735
736grflckunmmap(dev, addr)
737 dev_t dev;
738 caddr_t addr;
739{
60f56dfc
KM
740 int unit = minor(dev);
741
742#ifdef DEBUG
743 if (grfdebug & (GDB_MMAP|GDB_LOCK))
744 printf("grflckunmmap(%d): id %d addr %x\n",
745 u.u_procp->p_pid, unit, addr);
746#endif
60f56dfc
KM
747 return(EINVAL);
748}
749#endif /* HPUXCOMPAT */
22d09b27 750
60f56dfc 751#endif /* NGRF > 0 */