Commit | Line | Data |
---|---|---|
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 | * | |
16a027eb | 12 | * from: Utah $Hdr: grf_rb.c 1.13 91/04/02$ |
60f56dfc | 13 | * |
16a027eb | 14 | * @(#)grf_rb.c 7.5 (Berkeley) %G% |
60f56dfc KM |
15 | */ |
16 | ||
17 | #include "grf.h" | |
18 | #if NGRF > 0 | |
19 | ||
20 | /* | |
21 | * Graphics routines for the Renaissance, HP98720 Graphics system. | |
22 | */ | |
b28b3a13 KB |
23 | #include "sys/param.h" |
24 | #include "sys/errno.h" | |
60f56dfc KM |
25 | |
26 | #include "grfioctl.h" | |
27 | #include "grfvar.h" | |
28 | #include "grf_rbreg.h" | |
29 | ||
b28b3a13 | 30 | #include "../include/cpu.h" |
60f56dfc | 31 | |
60f56dfc KM |
32 | /* |
33 | * Initialize hardware. | |
34 | * Must point g_display at a grfinfo structure describing the hardware. | |
35 | * Returns 0 if hardware not present, non-zero ow. | |
36 | */ | |
37 | rb_init(gp, addr) | |
38 | struct grf_softc *gp; | |
16a027eb | 39 | caddr_t addr; |
60f56dfc KM |
40 | { |
41 | register struct rboxfb *rbp; | |
42 | struct grfinfo *gi = &gp->g_display; | |
43 | int fboff; | |
16a027eb | 44 | extern caddr_t sctopa(), iomap(); |
60f56dfc KM |
45 | |
46 | rbp = (struct rboxfb *) addr; | |
16a027eb MH |
47 | if (ISIIOVA(addr)) |
48 | gi->gd_regaddr = (caddr_t) IIOP(addr); | |
49 | else | |
50 | gi->gd_regaddr = sctopa(vatosc(addr)); | |
60f56dfc KM |
51 | gi->gd_regsize = 0x20000; |
52 | gi->gd_fbwidth = (rbp->fbwmsb << 8) | rbp->fbwlsb; | |
53 | gi->gd_fbheight = (rbp->fbhmsb << 8) | rbp->fbhlsb; | |
60f56dfc | 54 | gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight; |
16a027eb MH |
55 | fboff = (rbp->fbomsb << 8) | rbp->fbolsb; |
56 | gi->gd_fbaddr = (caddr_t) (*((u_char *)addr + fboff) << 16); | |
57 | if (gi->gd_regaddr >= (caddr_t)DIOIIBASE) { | |
58 | /* | |
59 | * For DIO II space the fbaddr just computed is the offset | |
60 | * from the select code base (regaddr) of the framebuffer. | |
61 | * Hence it is also implicitly the size of the register set. | |
62 | */ | |
63 | gi->gd_regsize = (int) gi->gd_fbaddr; | |
64 | gi->gd_fbaddr += (int) gi->gd_regaddr; | |
65 | gp->g_regkva = addr; | |
66 | gp->g_fbkva = addr + gi->gd_regsize; | |
67 | } else { | |
68 | /* | |
69 | * For DIO space we need to map the seperate framebuffer. | |
70 | */ | |
71 | gp->g_regkva = addr; | |
72 | gp->g_fbkva = iomap(gi->gd_fbaddr, gi->gd_fbsize); | |
73 | } | |
60f56dfc KM |
74 | gi->gd_dwidth = (rbp->dwmsb << 8) | rbp->dwlsb; |
75 | gi->gd_dheight = (rbp->dwmsb << 8) | rbp->dwlsb; | |
76 | gi->gd_planes = 0; /* ?? */ | |
77 | gi->gd_colors = 256; | |
78 | return(1); | |
79 | } | |
80 | ||
60f56dfc KM |
81 | /* |
82 | * Change the mode of the display. | |
83 | * Right now all we can do is grfon/grfoff. | |
84 | * Return a UNIX error number or 0 for success. | |
85 | */ | |
86 | rb_mode(gp, cmd) | |
87 | register struct grf_softc *gp; | |
88 | { | |
89 | register struct rboxfb *rbp; | |
90 | int error = 0; | |
91 | ||
16a027eb | 92 | rbp = (struct rboxfb *) gp->g_regkva; |
60f56dfc KM |
93 | switch (cmd) { |
94 | /* | |
95 | * The minimal register info here is from the Renaissance X driver. | |
96 | */ | |
97 | case GM_GRFON: | |
98 | case GM_GRFOFF: | |
99 | break; | |
100 | case GM_GRFOVON: | |
101 | rbp->write_enable = 0; | |
102 | rbp->opwen = 0xF; | |
103 | rbp->drive = 0x10; | |
104 | break; | |
105 | case GM_GRFOVOFF: | |
106 | rbp->opwen = 0; | |
107 | rbp->write_enable = 0xffffffff; | |
108 | rbp->drive = 0x01; | |
109 | break; | |
110 | default: | |
111 | error = EINVAL; | |
112 | break; | |
113 | } | |
114 | return(error); | |
115 | } | |
116 | ||
117 | #endif |