plumvideo.c revision 1.22.2.3 1 1.22.2.3 nathanw /* $NetBSD: plumvideo.c,v 1.22.2.3 2002/04/01 07:40:25 nathanw Exp $ */
2 1.22.2.2 nathanw
3 1.22.2.2 nathanw /*-
4 1.22.2.3 nathanw * Copyright (c) 1999-2002 The NetBSD Foundation, Inc.
5 1.22.2.2 nathanw * All rights reserved.
6 1.22.2.2 nathanw *
7 1.22.2.2 nathanw * This code is derived from software contributed to The NetBSD Foundation
8 1.22.2.2 nathanw * by UCHIYAMA Yasushi.
9 1.22.2.2 nathanw *
10 1.22.2.2 nathanw * Redistribution and use in source and binary forms, with or without
11 1.22.2.2 nathanw * modification, are permitted provided that the following conditions
12 1.22.2.2 nathanw * are met:
13 1.22.2.2 nathanw * 1. Redistributions of source code must retain the above copyright
14 1.22.2.2 nathanw * notice, this list of conditions and the following disclaimer.
15 1.22.2.2 nathanw * 2. Redistributions in binary form must reproduce the above copyright
16 1.22.2.2 nathanw * notice, this list of conditions and the following disclaimer in the
17 1.22.2.2 nathanw * documentation and/or other materials provided with the distribution.
18 1.22.2.2 nathanw * 3. All advertising materials mentioning features or use of this software
19 1.22.2.2 nathanw * must display the following acknowledgement:
20 1.22.2.2 nathanw * This product includes software developed by the NetBSD
21 1.22.2.2 nathanw * Foundation, Inc. and its contributors.
22 1.22.2.2 nathanw * 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.22.2.2 nathanw * contributors may be used to endorse or promote products derived
24 1.22.2.2 nathanw * from this software without specific prior written permission.
25 1.22.2.2 nathanw *
26 1.22.2.2 nathanw * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.22.2.2 nathanw * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.22.2.2 nathanw * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.22.2.2 nathanw * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.22.2.2 nathanw * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.22.2.2 nathanw * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.22.2.2 nathanw * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.22.2.2 nathanw * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.22.2.2 nathanw * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.22.2.2 nathanw * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.22.2.2 nathanw * POSSIBILITY OF SUCH DAMAGE.
37 1.22.2.2 nathanw */
38 1.22.2.2 nathanw
39 1.22.2.2 nathanw #undef PLUMVIDEODEBUG
40 1.22.2.2 nathanw #include "plumohci.h" /* Plum2 OHCI shared memory allocated on V-RAM */
41 1.22.2.3 nathanw #include "bivideo.h"
42 1.22.2.2 nathanw
43 1.22.2.2 nathanw #include <sys/param.h>
44 1.22.2.2 nathanw #include <sys/systm.h>
45 1.22.2.2 nathanw #include <sys/device.h>
46 1.22.2.2 nathanw
47 1.22.2.2 nathanw #include <sys/ioctl.h>
48 1.22.2.2 nathanw #include <sys/buf.h>
49 1.22.2.2 nathanw #include <uvm/uvm_extern.h>
50 1.22.2.2 nathanw
51 1.22.2.2 nathanw #include <dev/cons.h> /* consdev */
52 1.22.2.2 nathanw
53 1.22.2.2 nathanw #include <mips/cache.h>
54 1.22.2.2 nathanw
55 1.22.2.2 nathanw #include <machine/bus.h>
56 1.22.2.2 nathanw #include <machine/intr.h>
57 1.22.2.2 nathanw #include <machine/config_hook.h>
58 1.22.2.2 nathanw
59 1.22.2.2 nathanw #include <hpcmips/tx/tx39var.h>
60 1.22.2.2 nathanw #include <hpcmips/dev/plumvar.h>
61 1.22.2.2 nathanw #include <hpcmips/dev/plumicuvar.h>
62 1.22.2.2 nathanw #include <hpcmips/dev/plumpowervar.h>
63 1.22.2.2 nathanw #include <hpcmips/dev/plumvideoreg.h>
64 1.22.2.2 nathanw
65 1.22.2.2 nathanw #include <machine/bootinfo.h>
66 1.22.2.2 nathanw
67 1.22.2.2 nathanw #include <dev/wscons/wsdisplayvar.h>
68 1.22.2.2 nathanw #include <dev/rasops/rasops.h>
69 1.22.2.2 nathanw #include <dev/hpc/video_subr.h>
70 1.22.2.2 nathanw
71 1.22.2.2 nathanw #include <dev/wscons/wsconsio.h>
72 1.22.2.2 nathanw #include <dev/hpc/hpcfbvar.h>
73 1.22.2.2 nathanw #include <dev/hpc/hpcfbio.h>
74 1.22.2.3 nathanw #if NBIVIDEO > 0
75 1.22.2.3 nathanw #include <dev/hpc/bivideovar.h>
76 1.22.2.3 nathanw #endif
77 1.22.2.2 nathanw
78 1.22.2.2 nathanw #ifdef PLUMVIDEODEBUG
79 1.22.2.2 nathanw int plumvideo_debug = 1;
80 1.22.2.2 nathanw #define DPRINTF(arg) if (plumvideo_debug) printf arg;
81 1.22.2.2 nathanw #define DPRINTFN(n, arg) if (plumvideo_debug > (n)) printf arg;
82 1.22.2.2 nathanw #else
83 1.22.2.2 nathanw #define DPRINTF(arg)
84 1.22.2.2 nathanw #define DPRINTFN(n, arg)
85 1.22.2.2 nathanw #endif
86 1.22.2.2 nathanw
87 1.22.2.2 nathanw struct plumvideo_softc {
88 1.22.2.2 nathanw struct device sc_dev;
89 1.22.2.2 nathanw tx_chipset_tag_t sc_tc;
90 1.22.2.2 nathanw plum_chipset_tag_t sc_pc;
91 1.22.2.2 nathanw
92 1.22.2.2 nathanw void *sc_powerhook; /* power management hook */
93 1.22.2.2 nathanw int sc_console;
94 1.22.2.2 nathanw
95 1.22.2.2 nathanw /* control register */
96 1.22.2.2 nathanw bus_space_tag_t sc_regt;
97 1.22.2.2 nathanw bus_space_handle_t sc_regh;
98 1.22.2.2 nathanw /* frame buffer */
99 1.22.2.2 nathanw bus_space_tag_t sc_fbiot;
100 1.22.2.2 nathanw bus_space_handle_t sc_fbioh;
101 1.22.2.2 nathanw /* clut buffer (8bpp only) */
102 1.22.2.2 nathanw bus_space_tag_t sc_clutiot;
103 1.22.2.2 nathanw bus_space_handle_t sc_clutioh;
104 1.22.2.2 nathanw /* bitblt */
105 1.22.2.2 nathanw bus_space_tag_t sc_bitbltt;
106 1.22.2.2 nathanw bus_space_handle_t sc_bitblth;
107 1.22.2.2 nathanw
108 1.22.2.2 nathanw struct video_chip sc_chip;
109 1.22.2.2 nathanw struct hpcfb_fbconf sc_fbconf;
110 1.22.2.2 nathanw struct hpcfb_dspconf sc_dspconf;
111 1.22.2.2 nathanw };
112 1.22.2.2 nathanw
113 1.22.2.2 nathanw int plumvideo_match(struct device*, struct cfdata*, void*);
114 1.22.2.2 nathanw void plumvideo_attach(struct device*, struct device*, void*);
115 1.22.2.2 nathanw
116 1.22.2.2 nathanw int plumvideo_ioctl(void *, u_long, caddr_t, int, struct proc *);
117 1.22.2.2 nathanw paddr_t plumvideo_mmap(void *, off_t, int);
118 1.22.2.2 nathanw
119 1.22.2.2 nathanw struct cfattach plumvideo_ca = {
120 1.22.2.2 nathanw sizeof(struct plumvideo_softc), plumvideo_match, plumvideo_attach
121 1.22.2.2 nathanw };
122 1.22.2.2 nathanw
123 1.22.2.2 nathanw struct hpcfb_accessops plumvideo_ha = {
124 1.22.2.2 nathanw plumvideo_ioctl, plumvideo_mmap
125 1.22.2.2 nathanw };
126 1.22.2.2 nathanw
127 1.22.2.2 nathanw int plumvideo_power(void *, int, long, void *);
128 1.22.2.2 nathanw
129 1.22.2.2 nathanw int plumvideo_init(struct plumvideo_softc *, int *);
130 1.22.2.2 nathanw void plumvideo_hpcfbinit(struct plumvideo_softc *, int);
131 1.22.2.2 nathanw
132 1.22.2.2 nathanw void plumvideo_clut_default(struct plumvideo_softc *);
133 1.22.2.2 nathanw void plumvideo_clut_set(struct plumvideo_softc *, u_int32_t *, int, int);
134 1.22.2.2 nathanw void plumvideo_clut_get(struct plumvideo_softc *, u_int32_t *, int, int);
135 1.22.2.2 nathanw void __plumvideo_clut_access(struct plumvideo_softc *,
136 1.22.2.2 nathanw void (*)(bus_space_tag_t, bus_space_handle_t));
137 1.22.2.2 nathanw static void _flush_cache(void) __attribute__((__unused__)); /* !!! */
138 1.22.2.2 nathanw
139 1.22.2.2 nathanw #ifdef PLUMVIDEODEBUG
140 1.22.2.2 nathanw void plumvideo_dump(struct plumvideo_softc*);
141 1.22.2.2 nathanw #endif
142 1.22.2.2 nathanw
143 1.22.2.2 nathanw #define ON 1
144 1.22.2.2 nathanw #define OFF 0
145 1.22.2.2 nathanw
146 1.22.2.2 nathanw int
147 1.22.2.2 nathanw plumvideo_match(struct device *parent, struct cfdata *cf, void *aux)
148 1.22.2.2 nathanw {
149 1.22.2.2 nathanw /*
150 1.22.2.2 nathanw * VRAM area also uses as UHOSTC shared RAM.
151 1.22.2.2 nathanw */
152 1.22.2.2 nathanw return (2); /* 1st attach group */
153 1.22.2.2 nathanw }
154 1.22.2.2 nathanw
155 1.22.2.2 nathanw void
156 1.22.2.2 nathanw plumvideo_attach(struct device *parent, struct device *self, void *aux)
157 1.22.2.2 nathanw {
158 1.22.2.2 nathanw struct plum_attach_args *pa = aux;
159 1.22.2.2 nathanw struct plumvideo_softc *sc = (void*)self;
160 1.22.2.2 nathanw struct hpcfb_attach_args ha;
161 1.22.2.2 nathanw int console, reverse_flag;
162 1.22.2.2 nathanw
163 1.22.2.2 nathanw sc->sc_console = console = cn_tab ? 0 : 1;
164 1.22.2.2 nathanw sc->sc_pc = pa->pa_pc;
165 1.22.2.2 nathanw sc->sc_regt = pa->pa_regt;
166 1.22.2.2 nathanw sc->sc_fbiot = sc->sc_clutiot = sc->sc_bitbltt = pa->pa_iot;
167 1.22.2.2 nathanw
168 1.22.2.2 nathanw printf(": ");
169 1.22.2.2 nathanw
170 1.22.2.2 nathanw /* map register area */
171 1.22.2.2 nathanw if (bus_space_map(sc->sc_regt, PLUM_VIDEO_REGBASE,
172 1.22.2.2 nathanw PLUM_VIDEO_REGSIZE, 0, &sc->sc_regh)) {
173 1.22.2.2 nathanw printf("register map failed\n");
174 1.22.2.2 nathanw return;
175 1.22.2.2 nathanw }
176 1.22.2.2 nathanw
177 1.22.2.2 nathanw /* power control */
178 1.22.2.2 nathanw plumvideo_power(sc, 0, 0,
179 1.22.2.2 nathanw (void *)(console ? PWR_RESUME : PWR_SUSPEND));
180 1.22.2.2 nathanw /* Add a hard power hook to power saving */
181 1.22.2.2 nathanw sc->sc_powerhook = config_hook(CONFIG_HOOK_PMEVENT,
182 1.22.2.2 nathanw CONFIG_HOOK_PMEVENT_HARDPOWER,
183 1.22.2.2 nathanw CONFIG_HOOK_SHARE,
184 1.22.2.2 nathanw plumvideo_power, sc);
185 1.22.2.2 nathanw if (sc->sc_powerhook == 0)
186 1.22.2.2 nathanw printf("WARNING unable to establish hard power hook");
187 1.22.2.2 nathanw
188 1.22.2.2 nathanw /*
189 1.22.2.2 nathanw * Initialize LCD controller
190 1.22.2.2 nathanw * map V-RAM area.
191 1.22.2.2 nathanw * reinstall bootinfo structure.
192 1.22.2.2 nathanw * some OHCI shared-buffer hack. XXX
193 1.22.2.2 nathanw */
194 1.22.2.2 nathanw if (plumvideo_init(sc, &reverse_flag) != 0)
195 1.22.2.2 nathanw return;
196 1.22.2.2 nathanw
197 1.22.2.2 nathanw printf("\n");
198 1.22.2.2 nathanw
199 1.22.2.2 nathanw /* Attach frame buffer device */
200 1.22.2.2 nathanw plumvideo_hpcfbinit(sc, reverse_flag);
201 1.22.2.2 nathanw
202 1.22.2.2 nathanw #ifdef PLUMVIDEODEBUG
203 1.22.2.2 nathanw if (plumvideo_debug > 0)
204 1.22.2.2 nathanw plumvideo_dump(sc);
205 1.22.2.2 nathanw /* attach debug draw routine (debugging use) */
206 1.22.2.2 nathanw video_attach_drawfunc(&sc->sc_chip);
207 1.22.2.2 nathanw tx_conf_register_video(sc->sc_pc->pc_tc, &sc->sc_chip);
208 1.22.2.2 nathanw #endif /* PLUMVIDEODEBUG */
209 1.22.2.2 nathanw
210 1.22.2.2 nathanw if(console && hpcfb_cnattach(&sc->sc_fbconf) != 0) {
211 1.22.2.2 nathanw panic("plumvideo_attach: can't init fb console");
212 1.22.2.2 nathanw }
213 1.22.2.2 nathanw
214 1.22.2.2 nathanw ha.ha_console = console;
215 1.22.2.2 nathanw ha.ha_accessops = &plumvideo_ha;
216 1.22.2.2 nathanw ha.ha_accessctx = sc;
217 1.22.2.2 nathanw ha.ha_curfbconf = 0;
218 1.22.2.2 nathanw ha.ha_nfbconf = 1;
219 1.22.2.2 nathanw ha.ha_fbconflist = &sc->sc_fbconf;
220 1.22.2.2 nathanw ha.ha_curdspconf = 0;
221 1.22.2.2 nathanw ha.ha_ndspconf = 1;
222 1.22.2.2 nathanw ha.ha_dspconflist = &sc->sc_dspconf;
223 1.22.2.2 nathanw
224 1.22.2.2 nathanw config_found(self, &ha, hpcfbprint);
225 1.22.2.3 nathanw #if NBIVIDEO > 0
226 1.22.2.3 nathanw /* bivideo is no longer need */
227 1.22.2.3 nathanw bivideo_dont_attach = 1;
228 1.22.2.3 nathanw #endif /* NBIVIDEO > 0 */
229 1.22.2.2 nathanw }
230 1.22.2.2 nathanw
231 1.22.2.2 nathanw void
232 1.22.2.2 nathanw plumvideo_hpcfbinit(struct plumvideo_softc *sc, int reverse_flag)
233 1.22.2.2 nathanw {
234 1.22.2.2 nathanw struct hpcfb_fbconf *fb = &sc->sc_fbconf;
235 1.22.2.2 nathanw struct video_chip *chip = &sc->sc_chip;
236 1.22.2.2 nathanw vaddr_t fbvaddr = (vaddr_t)sc->sc_fbioh;
237 1.22.2.2 nathanw int height = chip->vc_fbheight;
238 1.22.2.2 nathanw int width = chip->vc_fbwidth;
239 1.22.2.2 nathanw int depth = chip->vc_fbdepth;
240 1.22.2.2 nathanw
241 1.22.2.2 nathanw memset(fb, 0, sizeof(struct hpcfb_fbconf));
242 1.22.2.2 nathanw
243 1.22.2.2 nathanw fb->hf_conf_index = 0; /* configuration index */
244 1.22.2.2 nathanw fb->hf_nconfs = 1; /* how many configurations */
245 1.22.2.2 nathanw strncpy(fb->hf_name, "PLUM built-in video", HPCFB_MAXNAMELEN);
246 1.22.2.2 nathanw /* frame buffer name */
247 1.22.2.2 nathanw strncpy(fb->hf_conf_name, "LCD", HPCFB_MAXNAMELEN);
248 1.22.2.2 nathanw /* configuration name */
249 1.22.2.2 nathanw fb->hf_height = height;
250 1.22.2.2 nathanw fb->hf_width = width;
251 1.22.2.2 nathanw fb->hf_baseaddr = (u_long)fbvaddr;
252 1.22.2.2 nathanw fb->hf_offset = (u_long)fbvaddr - mips_ptob(mips_btop(fbvaddr));
253 1.22.2.2 nathanw /* frame buffer start offset */
254 1.22.2.2 nathanw fb->hf_bytes_per_line = (width * depth) / NBBY;
255 1.22.2.2 nathanw fb->hf_nplanes = 1;
256 1.22.2.2 nathanw fb->hf_bytes_per_plane = height * fb->hf_bytes_per_line;
257 1.22.2.2 nathanw
258 1.22.2.2 nathanw fb->hf_access_flags |= HPCFB_ACCESS_BYTE;
259 1.22.2.2 nathanw fb->hf_access_flags |= HPCFB_ACCESS_WORD;
260 1.22.2.2 nathanw fb->hf_access_flags |= HPCFB_ACCESS_DWORD;
261 1.22.2.2 nathanw if (reverse_flag)
262 1.22.2.2 nathanw fb->hf_access_flags |= HPCFB_ACCESS_REVERSE;
263 1.22.2.2 nathanw
264 1.22.2.2 nathanw switch (depth) {
265 1.22.2.2 nathanw default:
266 1.22.2.2 nathanw panic("plumvideo_hpcfbinit: not supported color depth\n");
267 1.22.2.2 nathanw /* NOTREACHED */
268 1.22.2.2 nathanw case 16:
269 1.22.2.2 nathanw fb->hf_class = HPCFB_CLASS_RGBCOLOR;
270 1.22.2.2 nathanw fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
271 1.22.2.2 nathanw fb->hf_order_flags = HPCFB_REVORDER_WORD;
272 1.22.2.2 nathanw fb->hf_pack_width = 16;
273 1.22.2.2 nathanw fb->hf_pixels_per_pack = 1;
274 1.22.2.2 nathanw fb->hf_pixel_width = 16;
275 1.22.2.2 nathanw
276 1.22.2.2 nathanw fb->hf_class_data_length = sizeof(struct hf_rgb_tag);
277 1.22.2.2 nathanw /* reserved for future use */
278 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_flags = 0;
279 1.22.2.2 nathanw
280 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_red_width = 5;
281 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_red_shift = 11;
282 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_green_width = 6;
283 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_green_shift = 5;
284 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_blue_width = 5;
285 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_blue_shift = 0;
286 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_alpha_width = 0;
287 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_alpha_shift = 0;
288 1.22.2.2 nathanw break;
289 1.22.2.2 nathanw
290 1.22.2.2 nathanw case 8:
291 1.22.2.2 nathanw fb->hf_order_flags = HPCFB_REVORDER_BYTE | HPCFB_REVORDER_WORD;
292 1.22.2.2 nathanw fb->hf_class = HPCFB_CLASS_INDEXCOLOR;
293 1.22.2.2 nathanw fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
294 1.22.2.2 nathanw fb->hf_pack_width = 8;
295 1.22.2.2 nathanw fb->hf_pixels_per_pack = 1;
296 1.22.2.2 nathanw fb->hf_pixel_width = 8;
297 1.22.2.2 nathanw fb->hf_class_data_length = sizeof(struct hf_indexed_tag);
298 1.22.2.2 nathanw /* reserved for future use */
299 1.22.2.2 nathanw fb->hf_u.hf_indexed.hf_flags = 0;
300 1.22.2.2 nathanw break;
301 1.22.2.2 nathanw }
302 1.22.2.2 nathanw }
303 1.22.2.2 nathanw
304 1.22.2.2 nathanw int
305 1.22.2.2 nathanw plumvideo_init(struct plumvideo_softc *sc, int *reverse)
306 1.22.2.2 nathanw {
307 1.22.2.2 nathanw struct video_chip *chip = &sc->sc_chip;
308 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
309 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
310 1.22.2.2 nathanw plumreg_t reg;
311 1.22.2.2 nathanw size_t vram_size;
312 1.22.2.2 nathanw int bpp, width, height, vram_pitch;
313 1.22.2.2 nathanw
314 1.22.2.2 nathanw *reverse = video_reverse_color();
315 1.22.2.2 nathanw chip->vc_v = sc->sc_pc->pc_tc;
316 1.22.2.2 nathanw #if notyet
317 1.22.2.2 nathanw /* map BitBlt area */
318 1.22.2.2 nathanw if (bus_space_map(sc->sc_bitbltt,
319 1.22.2.2 nathanw PLUM_VIDEO_BITBLT_IOBASE,
320 1.22.2.2 nathanw PLUM_VIDEO_BITBLT_IOSIZE, 0,
321 1.22.2.2 nathanw &sc->sc_bitblth)) {
322 1.22.2.2 nathanw printf(": BitBlt map failed\n");
323 1.22.2.2 nathanw return (1);
324 1.22.2.2 nathanw }
325 1.22.2.2 nathanw #endif
326 1.22.2.2 nathanw reg = plum_conf_read(regt, regh, PLUM_VIDEO_PLGMD_REG);
327 1.22.2.2 nathanw
328 1.22.2.2 nathanw switch (reg & PLUM_VIDEO_PLGMD_GMODE_MASK) {
329 1.22.2.2 nathanw case PLUM_VIDEO_PLGMD_16BPP:
330 1.22.2.2 nathanw #if NPLUMOHCI > 0 /* reserve V-RAM area for USB OHCI */
331 1.22.2.2 nathanw /* FALLTHROUGH */
332 1.22.2.2 nathanw #else
333 1.22.2.2 nathanw bpp = 16;
334 1.22.2.2 nathanw break;
335 1.22.2.2 nathanw #endif
336 1.22.2.2 nathanw default:
337 1.22.2.2 nathanw bootinfo->fb_type = *reverse ? BIFB_D8_FF : BIFB_D8_00;
338 1.22.2.2 nathanw reg &= ~PLUM_VIDEO_PLGMD_GMODE_MASK;
339 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLGMD_REG, reg);
340 1.22.2.2 nathanw reg |= PLUM_VIDEO_PLGMD_8BPP;
341 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLGMD_REG, reg);
342 1.22.2.2 nathanw #if notyet
343 1.22.2.2 nathanw /* change BitBlt color depth */
344 1.22.2.2 nathanw plum_conf_write(sc->sc_bitbltt, sc->sc_bitblth, 0x8, 0);
345 1.22.2.2 nathanw #endif
346 1.22.2.2 nathanw /* FALLTHROUGH */
347 1.22.2.2 nathanw case PLUM_VIDEO_PLGMD_8BPP:
348 1.22.2.2 nathanw bpp = 8;
349 1.22.2.2 nathanw break;
350 1.22.2.2 nathanw }
351 1.22.2.2 nathanw chip->vc_fbdepth = bpp;
352 1.22.2.2 nathanw
353 1.22.2.2 nathanw /*
354 1.22.2.2 nathanw * Get display size from WindowsCE setted.
355 1.22.2.2 nathanw */
356 1.22.2.2 nathanw chip->vc_fbwidth = width = bootinfo->fb_width =
357 1.22.2.2 nathanw plum_conf_read(regt, regh, PLUM_VIDEO_PLHPX_REG) + 1;
358 1.22.2.2 nathanw chip->vc_fbheight = height = bootinfo->fb_height =
359 1.22.2.2 nathanw plum_conf_read(regt, regh, PLUM_VIDEO_PLVT_REG) -
360 1.22.2.2 nathanw plum_conf_read(regt, regh, PLUM_VIDEO_PLVDS_REG);
361 1.22.2.2 nathanw
362 1.22.2.2 nathanw /*
363 1.22.2.2 nathanw * set line byte length to bootinfo and LCD controller.
364 1.22.2.2 nathanw */
365 1.22.2.2 nathanw vram_pitch = bootinfo->fb_line_bytes = (width * bpp) / NBBY;
366 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLPIT1_REG, vram_pitch);
367 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLPIT2_REG,
368 1.22.2.2 nathanw vram_pitch & PLUM_VIDEO_PLPIT2_MASK);
369 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLOFS_REG, vram_pitch);
370 1.22.2.2 nathanw
371 1.22.2.2 nathanw /*
372 1.22.2.2 nathanw * boot messages and map CLUT(if any).
373 1.22.2.2 nathanw */
374 1.22.2.2 nathanw printf("display mode: ");
375 1.22.2.2 nathanw switch (bpp) {
376 1.22.2.2 nathanw default:
377 1.22.2.2 nathanw printf("disabled ");
378 1.22.2.2 nathanw break;
379 1.22.2.2 nathanw case 8:
380 1.22.2.2 nathanw printf("8bpp ");
381 1.22.2.2 nathanw /* map CLUT area */
382 1.22.2.2 nathanw if (bus_space_map(sc->sc_clutiot,
383 1.22.2.2 nathanw PLUM_VIDEO_CLUT_LCD_IOBASE,
384 1.22.2.2 nathanw PLUM_VIDEO_CLUT_LCD_IOSIZE, 0,
385 1.22.2.2 nathanw &sc->sc_clutioh)) {
386 1.22.2.2 nathanw printf(": CLUT map failed\n");
387 1.22.2.2 nathanw return (1);
388 1.22.2.2 nathanw }
389 1.22.2.2 nathanw /* install default CLUT */
390 1.22.2.2 nathanw plumvideo_clut_default(sc);
391 1.22.2.2 nathanw break;
392 1.22.2.2 nathanw case 16:
393 1.22.2.2 nathanw printf("16bpp ");
394 1.22.2.2 nathanw break;
395 1.22.2.2 nathanw }
396 1.22.2.2 nathanw
397 1.22.2.2 nathanw /*
398 1.22.2.2 nathanw * calcurate frame buffer size.
399 1.22.2.2 nathanw */
400 1.22.2.2 nathanw reg = plum_conf_read(regt, regh, PLUM_VIDEO_PLGMD_REG);
401 1.22.2.2 nathanw vram_size = (width * height * bpp) / NBBY;
402 1.22.2.2 nathanw vram_size = mips_round_page(vram_size);
403 1.22.2.2 nathanw chip->vc_fbsize = vram_size;
404 1.22.2.2 nathanw
405 1.22.2.2 nathanw /*
406 1.22.2.2 nathanw * map V-RAM area.
407 1.22.2.2 nathanw */
408 1.22.2.2 nathanw if (bus_space_map(sc->sc_fbiot, PLUM_VIDEO_VRAM_IOBASE,
409 1.22.2.2 nathanw vram_size, 0, &sc->sc_fbioh)) {
410 1.22.2.2 nathanw printf(": V-RAM map failed\n");
411 1.22.2.2 nathanw return (1);
412 1.22.2.2 nathanw }
413 1.22.2.2 nathanw
414 1.22.2.2 nathanw bootinfo->fb_addr = (unsigned char *)sc->sc_fbioh;
415 1.22.2.2 nathanw chip->vc_fbvaddr = (vaddr_t)sc->sc_fbioh;
416 1.22.2.2 nathanw chip->vc_fbpaddr = PLUM_VIDEO_VRAM_IOBASE_PHYSICAL;
417 1.22.2.2 nathanw
418 1.22.2.2 nathanw return (0);
419 1.22.2.2 nathanw }
420 1.22.2.2 nathanw
421 1.22.2.2 nathanw int
422 1.22.2.2 nathanw plumvideo_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
423 1.22.2.2 nathanw {
424 1.22.2.2 nathanw struct plumvideo_softc *sc = (struct plumvideo_softc *)v;
425 1.22.2.2 nathanw struct hpcfb_fbconf *fbconf;
426 1.22.2.2 nathanw struct hpcfb_dspconf *dspconf;
427 1.22.2.2 nathanw struct wsdisplay_cmap *cmap;
428 1.22.2.2 nathanw u_int8_t *r, *g, *b;
429 1.22.2.2 nathanw u_int32_t *rgb;
430 1.22.2.2 nathanw int idx, error;
431 1.22.2.2 nathanw size_t cnt;
432 1.22.2.2 nathanw
433 1.22.2.2 nathanw switch (cmd) {
434 1.22.2.2 nathanw case WSDISPLAYIO_GETCMAP:
435 1.22.2.2 nathanw cmap = (struct wsdisplay_cmap*)data;
436 1.22.2.2 nathanw cnt = cmap->count;
437 1.22.2.2 nathanw idx = cmap->index;
438 1.22.2.2 nathanw
439 1.22.2.2 nathanw if (sc->sc_fbconf.hf_class != HPCFB_CLASS_INDEXCOLOR ||
440 1.22.2.2 nathanw sc->sc_fbconf.hf_pack_width != 8 ||
441 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx) ||
442 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx + cnt -1)) {
443 1.22.2.2 nathanw return (EINVAL);
444 1.22.2.2 nathanw }
445 1.22.2.2 nathanw
446 1.22.2.2 nathanw if (!uvm_useracc(cmap->red, cnt, B_WRITE) ||
447 1.22.2.2 nathanw !uvm_useracc(cmap->green, cnt, B_WRITE) ||
448 1.22.2.2 nathanw !uvm_useracc(cmap->blue, cnt, B_WRITE)) {
449 1.22.2.2 nathanw return (EFAULT);
450 1.22.2.2 nathanw }
451 1.22.2.2 nathanw
452 1.22.2.2 nathanw error = cmap_work_alloc(&r, &g, &b, &rgb, cnt);
453 1.22.2.2 nathanw if (error != 0) {
454 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
455 1.22.2.2 nathanw return (ENOMEM);
456 1.22.2.2 nathanw }
457 1.22.2.2 nathanw plumvideo_clut_get(sc, rgb, idx, cnt);
458 1.22.2.2 nathanw rgb24_decompose(rgb, r, g, b, cnt);
459 1.22.2.2 nathanw
460 1.22.2.2 nathanw copyout(r, cmap->red, cnt);
461 1.22.2.2 nathanw copyout(g, cmap->green,cnt);
462 1.22.2.2 nathanw copyout(b, cmap->blue, cnt);
463 1.22.2.2 nathanw
464 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
465 1.22.2.2 nathanw
466 1.22.2.2 nathanw return (0);
467 1.22.2.2 nathanw
468 1.22.2.2 nathanw case WSDISPLAYIO_PUTCMAP:
469 1.22.2.2 nathanw cmap = (struct wsdisplay_cmap*)data;
470 1.22.2.2 nathanw cnt = cmap->count;
471 1.22.2.2 nathanw idx = cmap->index;
472 1.22.2.2 nathanw
473 1.22.2.2 nathanw if (sc->sc_fbconf.hf_class != HPCFB_CLASS_INDEXCOLOR ||
474 1.22.2.2 nathanw sc->sc_fbconf.hf_pack_width != 8 ||
475 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx) ||
476 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx + cnt -1)) {
477 1.22.2.2 nathanw return (EINVAL);
478 1.22.2.2 nathanw }
479 1.22.2.2 nathanw
480 1.22.2.2 nathanw if (!uvm_useracc(cmap->red, cnt, B_WRITE) ||
481 1.22.2.2 nathanw !uvm_useracc(cmap->green, cnt, B_WRITE) ||
482 1.22.2.2 nathanw !uvm_useracc(cmap->blue, cnt, B_WRITE)) {
483 1.22.2.2 nathanw return (EFAULT);
484 1.22.2.2 nathanw }
485 1.22.2.2 nathanw
486 1.22.2.2 nathanw error = cmap_work_alloc(&r, &g, &b, &rgb, cnt);
487 1.22.2.2 nathanw if (error != 0) {
488 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
489 1.22.2.2 nathanw return (ENOMEM);
490 1.22.2.2 nathanw }
491 1.22.2.2 nathanw copyin(cmap->red, r, cnt);
492 1.22.2.2 nathanw copyin(cmap->green, g, cnt);
493 1.22.2.2 nathanw copyin(cmap->blue, b, cnt);
494 1.22.2.2 nathanw rgb24_compose(rgb, r, g, b, cnt);
495 1.22.2.2 nathanw plumvideo_clut_set(sc, rgb, idx, cnt);
496 1.22.2.2 nathanw
497 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
498 1.22.2.2 nathanw
499 1.22.2.2 nathanw return (0);
500 1.22.2.2 nathanw
501 1.22.2.2 nathanw case HPCFBIO_GCONF:
502 1.22.2.2 nathanw fbconf = (struct hpcfb_fbconf *)data;
503 1.22.2.2 nathanw if (fbconf->hf_conf_index != 0 &&
504 1.22.2.2 nathanw fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
505 1.22.2.2 nathanw return (EINVAL);
506 1.22.2.2 nathanw }
507 1.22.2.2 nathanw *fbconf = sc->sc_fbconf; /* structure assignment */
508 1.22.2.2 nathanw return (0);
509 1.22.2.2 nathanw
510 1.22.2.2 nathanw case HPCFBIO_SCONF:
511 1.22.2.2 nathanw fbconf = (struct hpcfb_fbconf *)data;
512 1.22.2.2 nathanw if (fbconf->hf_conf_index != 0 &&
513 1.22.2.2 nathanw fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
514 1.22.2.2 nathanw return (EINVAL);
515 1.22.2.2 nathanw }
516 1.22.2.2 nathanw /*
517 1.22.2.2 nathanw * nothing to do because we have only one configration
518 1.22.2.2 nathanw */
519 1.22.2.2 nathanw return (0);
520 1.22.2.2 nathanw
521 1.22.2.2 nathanw case HPCFBIO_GDSPCONF:
522 1.22.2.2 nathanw dspconf = (struct hpcfb_dspconf *)data;
523 1.22.2.2 nathanw if ((dspconf->hd_unit_index != 0 &&
524 1.22.2.2 nathanw dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
525 1.22.2.2 nathanw (dspconf->hd_conf_index != 0 &&
526 1.22.2.2 nathanw dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
527 1.22.2.2 nathanw return (EINVAL);
528 1.22.2.2 nathanw }
529 1.22.2.2 nathanw *dspconf = sc->sc_dspconf; /* structure assignment */
530 1.22.2.2 nathanw return (0);
531 1.22.2.2 nathanw
532 1.22.2.2 nathanw case HPCFBIO_SDSPCONF:
533 1.22.2.2 nathanw dspconf = (struct hpcfb_dspconf *)data;
534 1.22.2.2 nathanw if ((dspconf->hd_unit_index != 0 &&
535 1.22.2.2 nathanw dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
536 1.22.2.2 nathanw (dspconf->hd_conf_index != 0 &&
537 1.22.2.2 nathanw dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
538 1.22.2.2 nathanw return (EINVAL);
539 1.22.2.2 nathanw }
540 1.22.2.2 nathanw /*
541 1.22.2.2 nathanw * nothing to do
542 1.22.2.2 nathanw * because we have only one unit and one configration
543 1.22.2.2 nathanw */
544 1.22.2.2 nathanw return (0);
545 1.22.2.2 nathanw
546 1.22.2.2 nathanw case HPCFBIO_GOP:
547 1.22.2.2 nathanw case HPCFBIO_SOP:
548 1.22.2.2 nathanw /* XXX not implemented yet */
549 1.22.2.2 nathanw return (EINVAL);
550 1.22.2.2 nathanw }
551 1.22.2.2 nathanw
552 1.22.2.3 nathanw return (EPASSTHROUGH);
553 1.22.2.2 nathanw }
554 1.22.2.2 nathanw
555 1.22.2.2 nathanw paddr_t
556 1.22.2.2 nathanw plumvideo_mmap(void *ctx, off_t offset, int prot)
557 1.22.2.2 nathanw {
558 1.22.2.2 nathanw struct plumvideo_softc *sc = (struct plumvideo_softc *)ctx;
559 1.22.2.2 nathanw
560 1.22.2.2 nathanw if (offset < 0 || (sc->sc_fbconf.hf_bytes_per_plane +
561 1.22.2.2 nathanw sc->sc_fbconf.hf_offset) < offset) {
562 1.22.2.2 nathanw return (-1);
563 1.22.2.2 nathanw }
564 1.22.2.2 nathanw
565 1.22.2.2 nathanw return (mips_btop(PLUM_VIDEO_VRAM_IOBASE_PHYSICAL + offset));
566 1.22.2.2 nathanw }
567 1.22.2.2 nathanw
568 1.22.2.2 nathanw void
569 1.22.2.2 nathanw plumvideo_clut_get(struct plumvideo_softc *sc, u_int32_t *rgb, int beg,
570 1.22.2.2 nathanw int cnt)
571 1.22.2.2 nathanw {
572 1.22.2.2 nathanw static void __plumvideo_clut_get(bus_space_tag_t,
573 1.22.2.2 nathanw bus_space_handle_t);
574 1.22.2.2 nathanw static void __plumvideo_clut_get(iot, ioh)
575 1.22.2.2 nathanw bus_space_tag_t iot;
576 1.22.2.2 nathanw bus_space_handle_t ioh;
577 1.22.2.2 nathanw {
578 1.22.2.2 nathanw int i;
579 1.22.2.2 nathanw
580 1.22.2.2 nathanw for (i = 0, beg *= 4; i < cnt; i++, beg += 4) {
581 1.22.2.2 nathanw *rgb++ = bus_space_read_4(iot, ioh, beg) &
582 1.22.2.2 nathanw 0x00ffffff;
583 1.22.2.2 nathanw }
584 1.22.2.2 nathanw }
585 1.22.2.2 nathanw
586 1.22.2.2 nathanw KASSERT(rgb);
587 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg));
588 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg + cnt - 1));
589 1.22.2.2 nathanw __plumvideo_clut_access(sc, __plumvideo_clut_get);
590 1.22.2.2 nathanw }
591 1.22.2.2 nathanw
592 1.22.2.2 nathanw void
593 1.22.2.2 nathanw plumvideo_clut_set(struct plumvideo_softc *sc, u_int32_t *rgb, int beg,
594 1.22.2.2 nathanw int cnt)
595 1.22.2.2 nathanw {
596 1.22.2.2 nathanw static void __plumvideo_clut_set(bus_space_tag_t,
597 1.22.2.2 nathanw bus_space_handle_t);
598 1.22.2.2 nathanw static void __plumvideo_clut_set(iot, ioh)
599 1.22.2.2 nathanw bus_space_tag_t iot;
600 1.22.2.2 nathanw bus_space_handle_t ioh;
601 1.22.2.2 nathanw {
602 1.22.2.2 nathanw int i;
603 1.22.2.2 nathanw
604 1.22.2.2 nathanw for (i = 0, beg *= 4; i < cnt; i++, beg +=4) {
605 1.22.2.2 nathanw bus_space_write_4(iot, ioh, beg,
606 1.22.2.2 nathanw *rgb++ & 0x00ffffff);
607 1.22.2.2 nathanw }
608 1.22.2.2 nathanw }
609 1.22.2.2 nathanw
610 1.22.2.2 nathanw KASSERT(rgb);
611 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg));
612 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg + cnt - 1));
613 1.22.2.2 nathanw __plumvideo_clut_access(sc, __plumvideo_clut_set);
614 1.22.2.2 nathanw }
615 1.22.2.2 nathanw
616 1.22.2.2 nathanw void
617 1.22.2.2 nathanw plumvideo_clut_default(struct plumvideo_softc *sc)
618 1.22.2.2 nathanw {
619 1.22.2.2 nathanw static void __plumvideo_clut_default(bus_space_tag_t,
620 1.22.2.2 nathanw bus_space_handle_t);
621 1.22.2.2 nathanw static void __plumvideo_clut_default(iot, ioh)
622 1.22.2.2 nathanw bus_space_tag_t iot;
623 1.22.2.2 nathanw bus_space_handle_t ioh;
624 1.22.2.2 nathanw {
625 1.22.2.2 nathanw const u_int8_t compo6[6] = { 0, 51, 102, 153, 204, 255 };
626 1.22.2.2 nathanw const u_int32_t ansi_color[16] = {
627 1.22.2.2 nathanw 0x000000, 0xff0000, 0x00ff00, 0xffff00,
628 1.22.2.2 nathanw 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff,
629 1.22.2.2 nathanw 0x000000, 0x800000, 0x008000, 0x808000,
630 1.22.2.2 nathanw 0x000080, 0x800080, 0x008080, 0x808080,
631 1.22.2.2 nathanw };
632 1.22.2.2 nathanw int i, r, g, b;
633 1.22.2.2 nathanw
634 1.22.2.2 nathanw /* ANSI escape sequence */
635 1.22.2.2 nathanw for (i = 0; i < 16; i++) {
636 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2, ansi_color[i]);
637 1.22.2.2 nathanw }
638 1.22.2.2 nathanw /* 16 - 31, gray scale */
639 1.22.2.2 nathanw for ( ; i < 32; i++) {
640 1.22.2.2 nathanw int j = (i - 16) * 17;
641 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2, RGB24(j, j, j));
642 1.22.2.2 nathanw }
643 1.22.2.2 nathanw /* 32 - 247, RGB color */
644 1.22.2.2 nathanw for (r = 0; r < 6; r++) {
645 1.22.2.2 nathanw for (g = 0; g < 6; g++) {
646 1.22.2.2 nathanw for (b = 0; b < 6; b++) {
647 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2,
648 1.22.2.2 nathanw RGB24(compo6[r],
649 1.22.2.2 nathanw compo6[g],
650 1.22.2.2 nathanw compo6[b]));
651 1.22.2.2 nathanw i++;
652 1.22.2.2 nathanw }
653 1.22.2.2 nathanw }
654 1.22.2.2 nathanw }
655 1.22.2.2 nathanw /* 248 - 245, just white */
656 1.22.2.2 nathanw for ( ; i < 256; i++) {
657 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2, 0xffffff);
658 1.22.2.2 nathanw }
659 1.22.2.2 nathanw }
660 1.22.2.2 nathanw
661 1.22.2.2 nathanw __plumvideo_clut_access(sc, __plumvideo_clut_default);
662 1.22.2.2 nathanw }
663 1.22.2.2 nathanw
664 1.22.2.2 nathanw void
665 1.22.2.2 nathanw __plumvideo_clut_access(struct plumvideo_softc *sc, void (*palette_func)
666 1.22.2.2 nathanw (bus_space_tag_t, bus_space_handle_t))
667 1.22.2.2 nathanw {
668 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
669 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
670 1.22.2.2 nathanw plumreg_t val, gmode;
671 1.22.2.2 nathanw
672 1.22.2.2 nathanw /* display off */
673 1.22.2.2 nathanw val = bus_space_read_4(regt, regh, PLUM_VIDEO_PLGMD_REG);
674 1.22.2.2 nathanw gmode = val & PLUM_VIDEO_PLGMD_GMODE_MASK;
675 1.22.2.2 nathanw val &= ~PLUM_VIDEO_PLGMD_GMODE_MASK;
676 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
677 1.22.2.2 nathanw
678 1.22.2.2 nathanw /* palette access disable */
679 1.22.2.2 nathanw val &= ~PLUM_VIDEO_PLGMD_PALETTE_ENABLE;
680 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
681 1.22.2.2 nathanw
682 1.22.2.2 nathanw /* change palette mode to CPU */
683 1.22.2.2 nathanw val &= ~PLUM_VIDEO_PLGMD_MODE_DISPLAY;
684 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
685 1.22.2.2 nathanw
686 1.22.2.2 nathanw /* palette access */
687 1.22.2.2 nathanw (*palette_func) (sc->sc_clutiot, sc->sc_clutioh);
688 1.22.2.2 nathanw
689 1.22.2.2 nathanw /* change palette mode to Display */
690 1.22.2.2 nathanw val |= PLUM_VIDEO_PLGMD_MODE_DISPLAY;
691 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
692 1.22.2.2 nathanw
693 1.22.2.2 nathanw /* palette access enable */
694 1.22.2.2 nathanw val |= PLUM_VIDEO_PLGMD_PALETTE_ENABLE;
695 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
696 1.22.2.2 nathanw
697 1.22.2.2 nathanw /* display on */
698 1.22.2.2 nathanw val |= gmode;
699 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
700 1.22.2.2 nathanw }
701 1.22.2.2 nathanw
702 1.22.2.2 nathanw /* !!! */
703 1.22.2.2 nathanw static void
704 1.22.2.2 nathanw _flush_cache()
705 1.22.2.2 nathanw {
706 1.22.2.2 nathanw mips_dcache_wbinv_all();
707 1.22.2.2 nathanw mips_icache_sync_all();
708 1.22.2.2 nathanw }
709 1.22.2.2 nathanw
710 1.22.2.2 nathanw int
711 1.22.2.2 nathanw plumvideo_power(void *ctx, int type, long id, void *msg)
712 1.22.2.2 nathanw {
713 1.22.2.2 nathanw struct plumvideo_softc *sc = ctx;
714 1.22.2.2 nathanw plum_chipset_tag_t pc = sc->sc_pc;
715 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
716 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
717 1.22.2.2 nathanw int why = (int)msg;
718 1.22.2.2 nathanw
719 1.22.2.2 nathanw switch (why) {
720 1.22.2.2 nathanw case PWR_RESUME:
721 1.22.2.2 nathanw if (!sc->sc_console)
722 1.22.2.2 nathanw return (0); /* serial console */
723 1.22.2.2 nathanw
724 1.22.2.2 nathanw DPRINTF(("%s: ON\n", sc->sc_dev.dv_xname));
725 1.22.2.2 nathanw /* power on */
726 1.22.2.2 nathanw /* LCD power on and display on */
727 1.22.2.2 nathanw plum_power_establish(pc, PLUM_PWR_LCD);
728 1.22.2.2 nathanw /* back-light on */
729 1.22.2.2 nathanw plum_power_establish(pc, PLUM_PWR_BKL);
730 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLLUM_REG,
731 1.22.2.2 nathanw PLUM_VIDEO_PLLUM_MAX);
732 1.22.2.2 nathanw break;
733 1.22.2.2 nathanw case PWR_SUSPEND:
734 1.22.2.2 nathanw /* FALLTHROUGH */
735 1.22.2.2 nathanw case PWR_STANDBY:
736 1.22.2.2 nathanw DPRINTF(("%s: OFF\n", sc->sc_dev.dv_xname));
737 1.22.2.2 nathanw /* back-light off */
738 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLLUM_REG,
739 1.22.2.2 nathanw PLUM_VIDEO_PLLUM_MIN);
740 1.22.2.2 nathanw plum_power_disestablish(pc, PLUM_PWR_BKL);
741 1.22.2.2 nathanw /* power down */
742 1.22.2.2 nathanw plum_power_disestablish(pc, PLUM_PWR_LCD);
743 1.22.2.2 nathanw break;
744 1.22.2.2 nathanw }
745 1.22.2.2 nathanw
746 1.22.2.2 nathanw return (0);
747 1.22.2.2 nathanw }
748 1.22.2.2 nathanw
749 1.22.2.2 nathanw #ifdef PLUMVIDEODEBUG
750 1.22.2.2 nathanw void
751 1.22.2.2 nathanw plumvideo_dump(struct plumvideo_softc *sc)
752 1.22.2.2 nathanw {
753 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
754 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
755 1.22.2.2 nathanw
756 1.22.2.2 nathanw plumreg_t reg;
757 1.22.2.2 nathanw int i;
758 1.22.2.2 nathanw
759 1.22.2.2 nathanw for (i = 0; i < 0x160; i += 4) {
760 1.22.2.2 nathanw reg = plum_conf_read(regt, regh, i);
761 1.22.2.2 nathanw printf("0x%03x %08x", i, reg);
762 1.22.2.2 nathanw dbg_bit_print(reg);
763 1.22.2.2 nathanw }
764 1.22.2.2 nathanw }
765 1.22.2.2 nathanw #endif /* PLUMVIDEODEBUG */
766