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