xref: /netbsd/sys/dev/ic/vgavar.h (revision bf9ec67e)
1 /* $NetBSD: vgavar.h,v 1.10 2001/12/29 17:40:35 junyoung Exp $ */
2 
3 /*
4  * Copyright (c) 1995, 1996 Carnegie-Mellon University.
5  * All rights reserved.
6  *
7  * Author: Chris G. Demetriou
8  *
9  * Permission to use, copy, modify and distribute this software and
10  * its documentation is hereby granted, provided that both the copyright
11  * notice and this permission notice appear in all copies of the
12  * software, derivative works or modified versions, and any portions
13  * thereof, and that both notices appear in supporting documentation.
14  *
15  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
16  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
17  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18  *
19  * Carnegie Mellon requests users of this software to return to
20  *
21  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
22  *  School of Computer Science
23  *  Carnegie Mellon University
24  *  Pittsburgh PA 15213-3890
25  *
26  * any improvements or extensions that they make and grant Carnegie the
27  * rights to redistribute these changes.
28  */
29 
30 #include <sys/callout.h>
31 
32 struct vga_handle {
33 	struct pcdisplay_handle vh_ph;
34 	bus_space_handle_t vh_ioh_vga, vh_allmemh;
35 	int vh_mono;
36 };
37 #define vh_iot 		vh_ph.ph_iot
38 #define vh_memt 	vh_ph.ph_memt
39 #define vh_ioh_6845 	vh_ph.ph_ioh_6845
40 #define vh_memh 	vh_ph.ph_memh
41 
42 struct vga_funcs {
43 	int (*vf_ioctl)(void *, u_long, caddr_t, int, struct proc *);
44 	paddr_t (*vf_mmap)(void *, off_t, int);
45 };
46 
47 struct vga_config {
48 	struct vga_handle hdl;
49 	struct vga_softc *softc;
50 
51 	int nscreens;
52 	LIST_HEAD(, vgascreen) screens;
53 	struct vgascreen *active; /* current display */
54 	const struct wsscreen_descr *currenttype;
55 	int currentfontset1, currentfontset2;
56 
57 	int vc_biosmapped;
58 	bus_space_tag_t vc_biostag;
59 	bus_space_handle_t vc_bioshdl;
60 
61 	struct egavga_font *vc_fonts[8]; /* currently loaded */
62 	TAILQ_HEAD(, egavga_font) vc_fontlist; /* LRU queue */
63 
64 	struct vgascreen *wantedscreen;
65 	void (*switchcb)(void *, int, int);
66 	void *switchcbarg;
67 
68 	int vc_type;
69 	const struct vga_funcs *vc_funcs;
70 
71 	struct callout vc_switch_callout;
72 };
73 
74 struct vga_softc {
75 	struct device sc_dev;
76 	struct vga_config *sc_vc;
77 };
78 
79 static inline u_int8_t 	_vga_attr_read(struct vga_handle *, int);
80 static inline void 	_vga_attr_write(struct vga_handle *, int, u_int8_t);
81 static inline u_int8_t 	_vga_ts_read(struct vga_handle *, int);
82 static inline void 	_vga_ts_write(struct vga_handle *, int, u_int8_t);
83 static inline u_int8_t 	_vga_gdc_read(struct vga_handle *, int);
84 static inline void 	_vga_gdc_write(struct vga_handle *, int, u_int8_t);
85 static inline u_int8_t 	_vga_crtc_read(struct vga_handle *, int);
86 static inline void 	_vga_crtc_write(struct vga_handle *, int, u_int8_t);
87 
88 static inline u_int8_t
89 _vga_attr_read(struct vga_handle *vh, int reg)
90 {
91 	u_int8_t res;
92 
93 	/* reset state */
94 	(void) bus_space_read_1(vh->vh_iot, vh->vh_ioh_6845, 10);
95 
96 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_ATC_INDEX, reg);
97 	res = bus_space_read_1(vh->vh_iot, vh->vh_ioh_vga, VGA_ATC_DATAR);
98 
99 	/* reset state XXX unneeded? */
100 	(void) bus_space_read_1(vh->vh_iot, vh->vh_ioh_6845, 10);
101 
102 	/* enable */
103 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, 0, 0x20);
104 
105 	return (res);
106 }
107 
108 static inline void
109 _vga_attr_write(struct vga_handle *vh, int reg, u_int8_t val)
110 {
111 	/* reset state */
112 	(void) bus_space_read_1(vh->vh_iot, vh->vh_ioh_6845, 10);
113 
114 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_ATC_INDEX, reg);
115 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_ATC_DATAW, val);
116 
117 	/* reset state XXX unneeded? */
118 	(void) bus_space_read_1(vh->vh_iot, vh->vh_ioh_6845, 10);
119 
120 	/* enable */
121 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, 0, 0x20);
122 }
123 
124 static inline u_int8_t
125 _vga_ts_read(struct vga_handle *vh, int reg)
126 {
127 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_TS_INDEX, reg);
128 	return (bus_space_read_1(vh->vh_iot, vh->vh_ioh_vga, VGA_TS_DATA));
129 }
130 
131 static inline void
132 _vga_ts_write(struct vga_handle *vh, int reg, u_int8_t val)
133 {
134 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_TS_INDEX, reg);
135 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_TS_DATA, val);
136 }
137 
138 static inline u_int8_t
139 _vga_gdc_read(struct vga_handle *vh, int reg)
140 {
141 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_GDC_INDEX, reg);
142 	return (bus_space_read_1(vh->vh_iot, vh->vh_ioh_vga, VGA_GDC_DATA));
143 }
144 
145 static inline void
146 _vga_gdc_write(struct vga_handle *vh, int reg, u_int8_t val)
147 {
148 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_GDC_INDEX, reg);
149 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_GDC_DATA, val);
150 }
151 
152 static inline u_int8_t
153 _vga_crtc_read(struct vga_handle *vh, int reg)
154 {
155 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_CRTC_INDEX, reg);
156 	return (bus_space_read_1(vh->vh_iot, vh->vh_ioh_vga, VGA_CRTC_DATA));
157 }
158 
159 static inline void
160 _vga_crtc_write(struct vga_handle *vh, int reg, u_int8_t val)
161 {
162 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_CRTC_INDEX, reg);
163 	bus_space_write_1(vh->vh_iot, vh->vh_ioh_vga, VGA_CRTC_DATA, val);
164 }
165 
166 #define vga_attr_read(vh, reg) \
167 	_vga_attr_read(vh, offsetof(struct reg_vgaattr, reg))
168 #define vga_attr_write(vh, reg, val) \
169 	_vga_attr_write(vh, offsetof(struct reg_vgaattr, reg), val)
170 #define vga_ts_read(vh, reg) \
171 	_vga_ts_read(vh, offsetof(struct reg_vgats, reg))
172 #define vga_ts_write(vh, reg, val) \
173 	_vga_ts_write(vh, offsetof(struct reg_vgats, reg), val)
174 #define vga_gdc_read(vh, reg) \
175 	_vga_gdc_read(vh, offsetof(struct reg_vgagdc, reg))
176 #define vga_gdc_write(vh, reg, val) \
177 	_vga_gdc_write(vh, offsetof(struct reg_vgagdc, reg), val)
178 
179 #define vga_6845_read(vh, reg) \
180 	pcdisplay_6845_read(&(vh)->vh_ph, reg)
181 #define vga_6845_write(vh, reg, val) \
182 	pcdisplay_6845_write(&(vh)->vh_ph, reg, val)
183 
184 int	vga_common_probe(bus_space_tag_t, bus_space_tag_t);
185 void	vga_common_attach(struct vga_softc *, bus_space_tag_t,
186 			  bus_space_tag_t, int, const struct vga_funcs *);
187 int	vga_is_console(bus_space_tag_t, int);
188 
189 int	vga_cnattach(bus_space_tag_t, bus_space_tag_t, int, int);
190 
191 struct wsscreen_descr;
192 void 	vga_loadchars(struct vga_handle *, int, int, int, int, char *);
193 void 	vga_setfontset(struct vga_handle *, int, int);
194 void 	vga_setscreentype(struct vga_handle *, const struct wsscreen_descr *);
195