xref: /original-bsd/sys/sparc/sbus/bt_subr.c (revision aaa71780)
1f01001fdStorek /*
2*aaa71780Sbostic  * Copyright (c) 1993
3*aaa71780Sbostic  *	The Regents of the University of California.  All rights reserved.
4f01001fdStorek  *
5f01001fdStorek  * This software was developed by the Computer Systems Engineering group
6f01001fdStorek  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
7f01001fdStorek  * contributed to Berkeley.
8f01001fdStorek  *
9f01001fdStorek  * All advertising materials mentioning features or use of this software
10f01001fdStorek  * must display the following acknowledgement:
11f01001fdStorek  *	This product includes software developed by the University of
12f01001fdStorek  *	California, Lawrence Berkeley Laboratory.
13f01001fdStorek  *
14f01001fdStorek  * %sccs.include.redist.c%
15f01001fdStorek  *
16*aaa71780Sbostic  *	@(#)bt_subr.c	8.2 (Berkeley) 01/21/94
17f01001fdStorek  *
18f01001fdStorek  * from: $Header: bt_subr.c,v 1.1 93/10/12 15:28:39 torek Exp $
19f01001fdStorek  */
20f01001fdStorek 
21f01001fdStorek #include <sys/param.h>
22f01001fdStorek #include <sys/buf.h>
23f01001fdStorek #include <sys/errno.h>
24f01001fdStorek #include <sys/fbio.h>
25f01001fdStorek 
26f01001fdStorek #include <sparc/sbus/btreg.h>
27f01001fdStorek #include <sparc/sbus/btvar.h>
28f01001fdStorek 
29f01001fdStorek /*
30f01001fdStorek  * Common code for dealing with Brooktree video DACs.
31f01001fdStorek  * (Contains some software-only code as well, since the colormap
32f01001fdStorek  * ioctls are shared between the cgthree and cgsix drivers.)
33f01001fdStorek  */
34f01001fdStorek 
35f01001fdStorek /*
36f01001fdStorek  * Implement an FBIOGETCMAP-like ioctl.
37f01001fdStorek  */
38f01001fdStorek int
bt_getcmap(p,cm,cmsize)39f01001fdStorek bt_getcmap(p, cm, cmsize)
40f01001fdStorek 	register struct fbcmap *p;
41f01001fdStorek 	union bt_cmap *cm;
42f01001fdStorek 	int cmsize;
43f01001fdStorek {
44f01001fdStorek 	register u_int i, start, count;
45f01001fdStorek 	register u_char *cp;
46f01001fdStorek 
47f01001fdStorek 	start = p->index;
48f01001fdStorek 	count = p->count;
49f01001fdStorek 	if (start >= cmsize || start + count > cmsize)
50f01001fdStorek 		return (EINVAL);
51f01001fdStorek 	if (!useracc(p->red, count, B_WRITE) ||
52f01001fdStorek 	    !useracc(p->green, count, B_WRITE) ||
53f01001fdStorek 	    !useracc(p->blue, count, B_WRITE))
54f01001fdStorek 		return (EFAULT);
55f01001fdStorek 	for (cp = &cm->cm_map[start][0], i = 0; i < count; cp += 3, i++) {
56f01001fdStorek 		p->red[i] = cp[0];
57f01001fdStorek 		p->green[i] = cp[1];
58f01001fdStorek 		p->blue[i] = cp[2];
59f01001fdStorek 	}
60f01001fdStorek 	return (0);
61f01001fdStorek }
62f01001fdStorek 
63f01001fdStorek /*
64f01001fdStorek  * Implement the software portion of an FBIOPUTCMAP-like ioctl.
65f01001fdStorek  */
66f01001fdStorek int
bt_putcmap(p,cm,cmsize)67f01001fdStorek bt_putcmap(p, cm, cmsize)
68f01001fdStorek 	register struct fbcmap *p;
69f01001fdStorek 	union bt_cmap *cm;
70f01001fdStorek 	int cmsize;
71f01001fdStorek {
72f01001fdStorek 	register u_int i, start, count;
73f01001fdStorek 	register u_char *cp;
74f01001fdStorek 
75f01001fdStorek 	start = p->index;
76f01001fdStorek 	count = p->count;
77f01001fdStorek 	if (start >= cmsize || start + count > cmsize)
78f01001fdStorek 		return (EINVAL);
79f01001fdStorek 	if (!useracc(p->red, count, B_READ) ||
80f01001fdStorek 	    !useracc(p->green, count, B_READ) ||
81f01001fdStorek 	    !useracc(p->blue, count, B_READ))
82f01001fdStorek 		return (EFAULT);
83f01001fdStorek 	for (cp = &cm->cm_map[start][0], i = 0; i < count; cp += 3, i++) {
84f01001fdStorek 		cp[0] = p->red[i];
85f01001fdStorek 		cp[1] = p->green[i];
86f01001fdStorek 		cp[2] = p->blue[i];
87f01001fdStorek 	}
88f01001fdStorek 	return (0);
89f01001fdStorek }
90