plumvideo.c revision 1.22.2.5 1 1.22.2.5 nathanw /* $NetBSD: plumvideo.c,v 1.22.2.5 2002/06/20 03:38:49 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_pack_width = 16;
272 1.22.2.2 nathanw fb->hf_pixels_per_pack = 1;
273 1.22.2.2 nathanw fb->hf_pixel_width = 16;
274 1.22.2.2 nathanw
275 1.22.2.2 nathanw fb->hf_class_data_length = sizeof(struct hf_rgb_tag);
276 1.22.2.2 nathanw /* reserved for future use */
277 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_flags = 0;
278 1.22.2.2 nathanw
279 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_red_width = 5;
280 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_red_shift = 11;
281 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_green_width = 6;
282 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_green_shift = 5;
283 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_blue_width = 5;
284 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_blue_shift = 0;
285 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_alpha_width = 0;
286 1.22.2.2 nathanw fb->hf_u.hf_rgb.hf_alpha_shift = 0;
287 1.22.2.2 nathanw break;
288 1.22.2.2 nathanw
289 1.22.2.2 nathanw case 8:
290 1.22.2.2 nathanw fb->hf_class = HPCFB_CLASS_INDEXCOLOR;
291 1.22.2.2 nathanw fb->hf_access_flags |= HPCFB_ACCESS_STATIC;
292 1.22.2.2 nathanw fb->hf_pack_width = 8;
293 1.22.2.2 nathanw fb->hf_pixels_per_pack = 1;
294 1.22.2.2 nathanw fb->hf_pixel_width = 8;
295 1.22.2.2 nathanw fb->hf_class_data_length = sizeof(struct hf_indexed_tag);
296 1.22.2.2 nathanw /* reserved for future use */
297 1.22.2.2 nathanw fb->hf_u.hf_indexed.hf_flags = 0;
298 1.22.2.2 nathanw break;
299 1.22.2.2 nathanw }
300 1.22.2.2 nathanw }
301 1.22.2.2 nathanw
302 1.22.2.2 nathanw int
303 1.22.2.2 nathanw plumvideo_init(struct plumvideo_softc *sc, int *reverse)
304 1.22.2.2 nathanw {
305 1.22.2.2 nathanw struct video_chip *chip = &sc->sc_chip;
306 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
307 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
308 1.22.2.2 nathanw plumreg_t reg;
309 1.22.2.2 nathanw size_t vram_size;
310 1.22.2.2 nathanw int bpp, width, height, vram_pitch;
311 1.22.2.2 nathanw
312 1.22.2.2 nathanw *reverse = video_reverse_color();
313 1.22.2.2 nathanw chip->vc_v = sc->sc_pc->pc_tc;
314 1.22.2.2 nathanw #if notyet
315 1.22.2.2 nathanw /* map BitBlt area */
316 1.22.2.2 nathanw if (bus_space_map(sc->sc_bitbltt,
317 1.22.2.2 nathanw PLUM_VIDEO_BITBLT_IOBASE,
318 1.22.2.2 nathanw PLUM_VIDEO_BITBLT_IOSIZE, 0,
319 1.22.2.2 nathanw &sc->sc_bitblth)) {
320 1.22.2.2 nathanw printf(": BitBlt map failed\n");
321 1.22.2.2 nathanw return (1);
322 1.22.2.2 nathanw }
323 1.22.2.2 nathanw #endif
324 1.22.2.2 nathanw reg = plum_conf_read(regt, regh, PLUM_VIDEO_PLGMD_REG);
325 1.22.2.2 nathanw
326 1.22.2.2 nathanw switch (reg & PLUM_VIDEO_PLGMD_GMODE_MASK) {
327 1.22.2.2 nathanw case PLUM_VIDEO_PLGMD_16BPP:
328 1.22.2.2 nathanw #if NPLUMOHCI > 0 /* reserve V-RAM area for USB OHCI */
329 1.22.2.2 nathanw /* FALLTHROUGH */
330 1.22.2.2 nathanw #else
331 1.22.2.2 nathanw bpp = 16;
332 1.22.2.2 nathanw break;
333 1.22.2.2 nathanw #endif
334 1.22.2.2 nathanw default:
335 1.22.2.2 nathanw bootinfo->fb_type = *reverse ? BIFB_D8_FF : BIFB_D8_00;
336 1.22.2.2 nathanw reg &= ~PLUM_VIDEO_PLGMD_GMODE_MASK;
337 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLGMD_REG, reg);
338 1.22.2.2 nathanw reg |= PLUM_VIDEO_PLGMD_8BPP;
339 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLGMD_REG, reg);
340 1.22.2.2 nathanw #if notyet
341 1.22.2.2 nathanw /* change BitBlt color depth */
342 1.22.2.2 nathanw plum_conf_write(sc->sc_bitbltt, sc->sc_bitblth, 0x8, 0);
343 1.22.2.2 nathanw #endif
344 1.22.2.2 nathanw /* FALLTHROUGH */
345 1.22.2.2 nathanw case PLUM_VIDEO_PLGMD_8BPP:
346 1.22.2.2 nathanw bpp = 8;
347 1.22.2.2 nathanw break;
348 1.22.2.2 nathanw }
349 1.22.2.2 nathanw chip->vc_fbdepth = bpp;
350 1.22.2.2 nathanw
351 1.22.2.2 nathanw /*
352 1.22.2.2 nathanw * Get display size from WindowsCE setted.
353 1.22.2.2 nathanw */
354 1.22.2.2 nathanw chip->vc_fbwidth = width = bootinfo->fb_width =
355 1.22.2.2 nathanw plum_conf_read(regt, regh, PLUM_VIDEO_PLHPX_REG) + 1;
356 1.22.2.2 nathanw chip->vc_fbheight = height = bootinfo->fb_height =
357 1.22.2.2 nathanw plum_conf_read(regt, regh, PLUM_VIDEO_PLVT_REG) -
358 1.22.2.2 nathanw plum_conf_read(regt, regh, PLUM_VIDEO_PLVDS_REG);
359 1.22.2.2 nathanw
360 1.22.2.2 nathanw /*
361 1.22.2.2 nathanw * set line byte length to bootinfo and LCD controller.
362 1.22.2.2 nathanw */
363 1.22.2.2 nathanw vram_pitch = bootinfo->fb_line_bytes = (width * bpp) / NBBY;
364 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLPIT1_REG, vram_pitch);
365 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLPIT2_REG,
366 1.22.2.2 nathanw vram_pitch & PLUM_VIDEO_PLPIT2_MASK);
367 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLOFS_REG, vram_pitch);
368 1.22.2.2 nathanw
369 1.22.2.2 nathanw /*
370 1.22.2.2 nathanw * boot messages and map CLUT(if any).
371 1.22.2.2 nathanw */
372 1.22.2.2 nathanw printf("display mode: ");
373 1.22.2.2 nathanw switch (bpp) {
374 1.22.2.2 nathanw default:
375 1.22.2.2 nathanw printf("disabled ");
376 1.22.2.2 nathanw break;
377 1.22.2.2 nathanw case 8:
378 1.22.2.2 nathanw printf("8bpp ");
379 1.22.2.2 nathanw /* map CLUT area */
380 1.22.2.2 nathanw if (bus_space_map(sc->sc_clutiot,
381 1.22.2.2 nathanw PLUM_VIDEO_CLUT_LCD_IOBASE,
382 1.22.2.2 nathanw PLUM_VIDEO_CLUT_LCD_IOSIZE, 0,
383 1.22.2.2 nathanw &sc->sc_clutioh)) {
384 1.22.2.2 nathanw printf(": CLUT map failed\n");
385 1.22.2.2 nathanw return (1);
386 1.22.2.2 nathanw }
387 1.22.2.2 nathanw /* install default CLUT */
388 1.22.2.2 nathanw plumvideo_clut_default(sc);
389 1.22.2.2 nathanw break;
390 1.22.2.2 nathanw case 16:
391 1.22.2.2 nathanw printf("16bpp ");
392 1.22.2.2 nathanw break;
393 1.22.2.2 nathanw }
394 1.22.2.2 nathanw
395 1.22.2.2 nathanw /*
396 1.22.2.2 nathanw * calcurate frame buffer size.
397 1.22.2.2 nathanw */
398 1.22.2.2 nathanw reg = plum_conf_read(regt, regh, PLUM_VIDEO_PLGMD_REG);
399 1.22.2.2 nathanw vram_size = (width * height * bpp) / NBBY;
400 1.22.2.2 nathanw vram_size = mips_round_page(vram_size);
401 1.22.2.2 nathanw chip->vc_fbsize = vram_size;
402 1.22.2.2 nathanw
403 1.22.2.2 nathanw /*
404 1.22.2.2 nathanw * map V-RAM area.
405 1.22.2.2 nathanw */
406 1.22.2.2 nathanw if (bus_space_map(sc->sc_fbiot, PLUM_VIDEO_VRAM_IOBASE,
407 1.22.2.2 nathanw vram_size, 0, &sc->sc_fbioh)) {
408 1.22.2.2 nathanw printf(": V-RAM map failed\n");
409 1.22.2.2 nathanw return (1);
410 1.22.2.2 nathanw }
411 1.22.2.2 nathanw
412 1.22.2.2 nathanw bootinfo->fb_addr = (unsigned char *)sc->sc_fbioh;
413 1.22.2.2 nathanw chip->vc_fbvaddr = (vaddr_t)sc->sc_fbioh;
414 1.22.2.2 nathanw chip->vc_fbpaddr = PLUM_VIDEO_VRAM_IOBASE_PHYSICAL;
415 1.22.2.2 nathanw
416 1.22.2.2 nathanw return (0);
417 1.22.2.2 nathanw }
418 1.22.2.2 nathanw
419 1.22.2.2 nathanw int
420 1.22.2.2 nathanw plumvideo_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
421 1.22.2.2 nathanw {
422 1.22.2.2 nathanw struct plumvideo_softc *sc = (struct plumvideo_softc *)v;
423 1.22.2.2 nathanw struct hpcfb_fbconf *fbconf;
424 1.22.2.2 nathanw struct hpcfb_dspconf *dspconf;
425 1.22.2.2 nathanw struct wsdisplay_cmap *cmap;
426 1.22.2.2 nathanw u_int8_t *r, *g, *b;
427 1.22.2.2 nathanw u_int32_t *rgb;
428 1.22.2.2 nathanw int idx, error;
429 1.22.2.2 nathanw size_t cnt;
430 1.22.2.2 nathanw
431 1.22.2.2 nathanw switch (cmd) {
432 1.22.2.2 nathanw case WSDISPLAYIO_GETCMAP:
433 1.22.2.2 nathanw cmap = (struct wsdisplay_cmap*)data;
434 1.22.2.2 nathanw cnt = cmap->count;
435 1.22.2.2 nathanw idx = cmap->index;
436 1.22.2.2 nathanw
437 1.22.2.2 nathanw if (sc->sc_fbconf.hf_class != HPCFB_CLASS_INDEXCOLOR ||
438 1.22.2.2 nathanw sc->sc_fbconf.hf_pack_width != 8 ||
439 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx) ||
440 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx + cnt -1)) {
441 1.22.2.2 nathanw return (EINVAL);
442 1.22.2.2 nathanw }
443 1.22.2.2 nathanw
444 1.22.2.2 nathanw if (!uvm_useracc(cmap->red, cnt, B_WRITE) ||
445 1.22.2.2 nathanw !uvm_useracc(cmap->green, cnt, B_WRITE) ||
446 1.22.2.2 nathanw !uvm_useracc(cmap->blue, cnt, B_WRITE)) {
447 1.22.2.2 nathanw return (EFAULT);
448 1.22.2.2 nathanw }
449 1.22.2.2 nathanw
450 1.22.2.2 nathanw error = cmap_work_alloc(&r, &g, &b, &rgb, cnt);
451 1.22.2.2 nathanw if (error != 0) {
452 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
453 1.22.2.2 nathanw return (ENOMEM);
454 1.22.2.2 nathanw }
455 1.22.2.2 nathanw plumvideo_clut_get(sc, rgb, idx, cnt);
456 1.22.2.2 nathanw rgb24_decompose(rgb, r, g, b, cnt);
457 1.22.2.2 nathanw
458 1.22.2.2 nathanw copyout(r, cmap->red, cnt);
459 1.22.2.2 nathanw copyout(g, cmap->green,cnt);
460 1.22.2.2 nathanw copyout(b, cmap->blue, cnt);
461 1.22.2.2 nathanw
462 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
463 1.22.2.2 nathanw
464 1.22.2.2 nathanw return (0);
465 1.22.2.2 nathanw
466 1.22.2.2 nathanw case WSDISPLAYIO_PUTCMAP:
467 1.22.2.2 nathanw cmap = (struct wsdisplay_cmap*)data;
468 1.22.2.2 nathanw cnt = cmap->count;
469 1.22.2.2 nathanw idx = cmap->index;
470 1.22.2.2 nathanw
471 1.22.2.2 nathanw if (sc->sc_fbconf.hf_class != HPCFB_CLASS_INDEXCOLOR ||
472 1.22.2.2 nathanw sc->sc_fbconf.hf_pack_width != 8 ||
473 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx) ||
474 1.22.2.2 nathanw !LEGAL_CLUT_INDEX(idx + cnt -1)) {
475 1.22.2.2 nathanw return (EINVAL);
476 1.22.2.2 nathanw }
477 1.22.2.2 nathanw
478 1.22.2.2 nathanw if (!uvm_useracc(cmap->red, cnt, B_WRITE) ||
479 1.22.2.2 nathanw !uvm_useracc(cmap->green, cnt, B_WRITE) ||
480 1.22.2.2 nathanw !uvm_useracc(cmap->blue, cnt, B_WRITE)) {
481 1.22.2.2 nathanw return (EFAULT);
482 1.22.2.2 nathanw }
483 1.22.2.2 nathanw
484 1.22.2.2 nathanw error = cmap_work_alloc(&r, &g, &b, &rgb, cnt);
485 1.22.2.2 nathanw if (error != 0) {
486 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
487 1.22.2.2 nathanw return (ENOMEM);
488 1.22.2.2 nathanw }
489 1.22.2.2 nathanw copyin(cmap->red, r, cnt);
490 1.22.2.2 nathanw copyin(cmap->green, g, cnt);
491 1.22.2.2 nathanw copyin(cmap->blue, b, cnt);
492 1.22.2.2 nathanw rgb24_compose(rgb, r, g, b, cnt);
493 1.22.2.2 nathanw plumvideo_clut_set(sc, rgb, idx, cnt);
494 1.22.2.2 nathanw
495 1.22.2.2 nathanw cmap_work_free(r, g, b, rgb);
496 1.22.2.2 nathanw
497 1.22.2.2 nathanw return (0);
498 1.22.2.2 nathanw
499 1.22.2.2 nathanw case HPCFBIO_GCONF:
500 1.22.2.2 nathanw fbconf = (struct hpcfb_fbconf *)data;
501 1.22.2.2 nathanw if (fbconf->hf_conf_index != 0 &&
502 1.22.2.2 nathanw fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
503 1.22.2.2 nathanw return (EINVAL);
504 1.22.2.2 nathanw }
505 1.22.2.2 nathanw *fbconf = sc->sc_fbconf; /* structure assignment */
506 1.22.2.2 nathanw return (0);
507 1.22.2.2 nathanw
508 1.22.2.2 nathanw case HPCFBIO_SCONF:
509 1.22.2.2 nathanw fbconf = (struct hpcfb_fbconf *)data;
510 1.22.2.2 nathanw if (fbconf->hf_conf_index != 0 &&
511 1.22.2.2 nathanw fbconf->hf_conf_index != HPCFB_CURRENT_CONFIG) {
512 1.22.2.2 nathanw return (EINVAL);
513 1.22.2.2 nathanw }
514 1.22.2.2 nathanw /*
515 1.22.2.2 nathanw * nothing to do because we have only one configration
516 1.22.2.2 nathanw */
517 1.22.2.2 nathanw return (0);
518 1.22.2.2 nathanw
519 1.22.2.2 nathanw case HPCFBIO_GDSPCONF:
520 1.22.2.2 nathanw dspconf = (struct hpcfb_dspconf *)data;
521 1.22.2.2 nathanw if ((dspconf->hd_unit_index != 0 &&
522 1.22.2.2 nathanw dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
523 1.22.2.2 nathanw (dspconf->hd_conf_index != 0 &&
524 1.22.2.2 nathanw dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
525 1.22.2.2 nathanw return (EINVAL);
526 1.22.2.2 nathanw }
527 1.22.2.2 nathanw *dspconf = sc->sc_dspconf; /* structure assignment */
528 1.22.2.2 nathanw return (0);
529 1.22.2.2 nathanw
530 1.22.2.2 nathanw case HPCFBIO_SDSPCONF:
531 1.22.2.2 nathanw dspconf = (struct hpcfb_dspconf *)data;
532 1.22.2.2 nathanw if ((dspconf->hd_unit_index != 0 &&
533 1.22.2.2 nathanw dspconf->hd_unit_index != HPCFB_CURRENT_UNIT) ||
534 1.22.2.2 nathanw (dspconf->hd_conf_index != 0 &&
535 1.22.2.2 nathanw dspconf->hd_conf_index != HPCFB_CURRENT_CONFIG)) {
536 1.22.2.2 nathanw return (EINVAL);
537 1.22.2.2 nathanw }
538 1.22.2.2 nathanw /*
539 1.22.2.2 nathanw * nothing to do
540 1.22.2.2 nathanw * because we have only one unit and one configration
541 1.22.2.2 nathanw */
542 1.22.2.2 nathanw return (0);
543 1.22.2.2 nathanw
544 1.22.2.2 nathanw case HPCFBIO_GOP:
545 1.22.2.2 nathanw case HPCFBIO_SOP:
546 1.22.2.2 nathanw /* XXX not implemented yet */
547 1.22.2.2 nathanw return (EINVAL);
548 1.22.2.2 nathanw }
549 1.22.2.2 nathanw
550 1.22.2.3 nathanw return (EPASSTHROUGH);
551 1.22.2.2 nathanw }
552 1.22.2.2 nathanw
553 1.22.2.2 nathanw paddr_t
554 1.22.2.2 nathanw plumvideo_mmap(void *ctx, off_t offset, int prot)
555 1.22.2.2 nathanw {
556 1.22.2.2 nathanw struct plumvideo_softc *sc = (struct plumvideo_softc *)ctx;
557 1.22.2.2 nathanw
558 1.22.2.2 nathanw if (offset < 0 || (sc->sc_fbconf.hf_bytes_per_plane +
559 1.22.2.2 nathanw sc->sc_fbconf.hf_offset) < offset) {
560 1.22.2.2 nathanw return (-1);
561 1.22.2.2 nathanw }
562 1.22.2.2 nathanw
563 1.22.2.2 nathanw return (mips_btop(PLUM_VIDEO_VRAM_IOBASE_PHYSICAL + offset));
564 1.22.2.2 nathanw }
565 1.22.2.2 nathanw
566 1.22.2.2 nathanw void
567 1.22.2.2 nathanw plumvideo_clut_get(struct plumvideo_softc *sc, u_int32_t *rgb, int beg,
568 1.22.2.2 nathanw int cnt)
569 1.22.2.2 nathanw {
570 1.22.2.2 nathanw static void __plumvideo_clut_get(bus_space_tag_t,
571 1.22.2.2 nathanw bus_space_handle_t);
572 1.22.2.2 nathanw static void __plumvideo_clut_get(iot, ioh)
573 1.22.2.2 nathanw bus_space_tag_t iot;
574 1.22.2.2 nathanw bus_space_handle_t ioh;
575 1.22.2.2 nathanw {
576 1.22.2.2 nathanw int i;
577 1.22.2.2 nathanw
578 1.22.2.2 nathanw for (i = 0, beg *= 4; i < cnt; i++, beg += 4) {
579 1.22.2.2 nathanw *rgb++ = bus_space_read_4(iot, ioh, beg) &
580 1.22.2.2 nathanw 0x00ffffff;
581 1.22.2.2 nathanw }
582 1.22.2.2 nathanw }
583 1.22.2.2 nathanw
584 1.22.2.2 nathanw KASSERT(rgb);
585 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg));
586 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg + cnt - 1));
587 1.22.2.2 nathanw __plumvideo_clut_access(sc, __plumvideo_clut_get);
588 1.22.2.2 nathanw }
589 1.22.2.2 nathanw
590 1.22.2.2 nathanw void
591 1.22.2.2 nathanw plumvideo_clut_set(struct plumvideo_softc *sc, u_int32_t *rgb, int beg,
592 1.22.2.2 nathanw int cnt)
593 1.22.2.2 nathanw {
594 1.22.2.2 nathanw static void __plumvideo_clut_set(bus_space_tag_t,
595 1.22.2.2 nathanw bus_space_handle_t);
596 1.22.2.2 nathanw static void __plumvideo_clut_set(iot, ioh)
597 1.22.2.2 nathanw bus_space_tag_t iot;
598 1.22.2.2 nathanw bus_space_handle_t ioh;
599 1.22.2.2 nathanw {
600 1.22.2.2 nathanw int i;
601 1.22.2.2 nathanw
602 1.22.2.2 nathanw for (i = 0, beg *= 4; i < cnt; i++, beg +=4) {
603 1.22.2.2 nathanw bus_space_write_4(iot, ioh, beg,
604 1.22.2.2 nathanw *rgb++ & 0x00ffffff);
605 1.22.2.2 nathanw }
606 1.22.2.2 nathanw }
607 1.22.2.2 nathanw
608 1.22.2.2 nathanw KASSERT(rgb);
609 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg));
610 1.22.2.2 nathanw KASSERT(LEGAL_CLUT_INDEX(beg + cnt - 1));
611 1.22.2.2 nathanw __plumvideo_clut_access(sc, __plumvideo_clut_set);
612 1.22.2.2 nathanw }
613 1.22.2.2 nathanw
614 1.22.2.2 nathanw void
615 1.22.2.2 nathanw plumvideo_clut_default(struct plumvideo_softc *sc)
616 1.22.2.2 nathanw {
617 1.22.2.2 nathanw static void __plumvideo_clut_default(bus_space_tag_t,
618 1.22.2.2 nathanw bus_space_handle_t);
619 1.22.2.2 nathanw static void __plumvideo_clut_default(iot, ioh)
620 1.22.2.2 nathanw bus_space_tag_t iot;
621 1.22.2.2 nathanw bus_space_handle_t ioh;
622 1.22.2.2 nathanw {
623 1.22.2.5 nathanw static const u_int8_t compo6[6] = { 0, 51, 102, 153, 204, 255 };
624 1.22.2.5 nathanw static const u_int32_t ansi_color[16] = {
625 1.22.2.2 nathanw 0x000000, 0xff0000, 0x00ff00, 0xffff00,
626 1.22.2.2 nathanw 0x0000ff, 0xff00ff, 0x00ffff, 0xffffff,
627 1.22.2.2 nathanw 0x000000, 0x800000, 0x008000, 0x808000,
628 1.22.2.2 nathanw 0x000080, 0x800080, 0x008080, 0x808080,
629 1.22.2.2 nathanw };
630 1.22.2.2 nathanw int i, r, g, b;
631 1.22.2.2 nathanw
632 1.22.2.2 nathanw /* ANSI escape sequence */
633 1.22.2.2 nathanw for (i = 0; i < 16; i++) {
634 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2, ansi_color[i]);
635 1.22.2.2 nathanw }
636 1.22.2.2 nathanw /* 16 - 31, gray scale */
637 1.22.2.2 nathanw for ( ; i < 32; i++) {
638 1.22.2.2 nathanw int j = (i - 16) * 17;
639 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2, RGB24(j, j, j));
640 1.22.2.2 nathanw }
641 1.22.2.2 nathanw /* 32 - 247, RGB color */
642 1.22.2.2 nathanw for (r = 0; r < 6; r++) {
643 1.22.2.2 nathanw for (g = 0; g < 6; g++) {
644 1.22.2.2 nathanw for (b = 0; b < 6; b++) {
645 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2,
646 1.22.2.2 nathanw RGB24(compo6[r],
647 1.22.2.2 nathanw compo6[g],
648 1.22.2.2 nathanw compo6[b]));
649 1.22.2.2 nathanw i++;
650 1.22.2.2 nathanw }
651 1.22.2.2 nathanw }
652 1.22.2.2 nathanw }
653 1.22.2.2 nathanw /* 248 - 245, just white */
654 1.22.2.2 nathanw for ( ; i < 256; i++) {
655 1.22.2.2 nathanw bus_space_write_4(iot, ioh, i << 2, 0xffffff);
656 1.22.2.2 nathanw }
657 1.22.2.2 nathanw }
658 1.22.2.2 nathanw
659 1.22.2.2 nathanw __plumvideo_clut_access(sc, __plumvideo_clut_default);
660 1.22.2.2 nathanw }
661 1.22.2.2 nathanw
662 1.22.2.2 nathanw void
663 1.22.2.2 nathanw __plumvideo_clut_access(struct plumvideo_softc *sc, void (*palette_func)
664 1.22.2.2 nathanw (bus_space_tag_t, bus_space_handle_t))
665 1.22.2.2 nathanw {
666 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
667 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
668 1.22.2.2 nathanw plumreg_t val, gmode;
669 1.22.2.2 nathanw
670 1.22.2.2 nathanw /* display off */
671 1.22.2.2 nathanw val = bus_space_read_4(regt, regh, PLUM_VIDEO_PLGMD_REG);
672 1.22.2.2 nathanw gmode = val & PLUM_VIDEO_PLGMD_GMODE_MASK;
673 1.22.2.2 nathanw val &= ~PLUM_VIDEO_PLGMD_GMODE_MASK;
674 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
675 1.22.2.2 nathanw
676 1.22.2.2 nathanw /* palette access disable */
677 1.22.2.2 nathanw val &= ~PLUM_VIDEO_PLGMD_PALETTE_ENABLE;
678 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
679 1.22.2.2 nathanw
680 1.22.2.2 nathanw /* change palette mode to CPU */
681 1.22.2.2 nathanw val &= ~PLUM_VIDEO_PLGMD_MODE_DISPLAY;
682 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
683 1.22.2.2 nathanw
684 1.22.2.2 nathanw /* palette access */
685 1.22.2.2 nathanw (*palette_func) (sc->sc_clutiot, sc->sc_clutioh);
686 1.22.2.2 nathanw
687 1.22.2.2 nathanw /* change palette mode to Display */
688 1.22.2.2 nathanw val |= PLUM_VIDEO_PLGMD_MODE_DISPLAY;
689 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
690 1.22.2.2 nathanw
691 1.22.2.2 nathanw /* palette access enable */
692 1.22.2.2 nathanw val |= PLUM_VIDEO_PLGMD_PALETTE_ENABLE;
693 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
694 1.22.2.2 nathanw
695 1.22.2.2 nathanw /* display on */
696 1.22.2.2 nathanw val |= gmode;
697 1.22.2.2 nathanw bus_space_write_4(regt, regh, PLUM_VIDEO_PLGMD_REG, val);
698 1.22.2.2 nathanw }
699 1.22.2.2 nathanw
700 1.22.2.2 nathanw /* !!! */
701 1.22.2.2 nathanw static void
702 1.22.2.2 nathanw _flush_cache()
703 1.22.2.2 nathanw {
704 1.22.2.2 nathanw mips_dcache_wbinv_all();
705 1.22.2.2 nathanw mips_icache_sync_all();
706 1.22.2.2 nathanw }
707 1.22.2.2 nathanw
708 1.22.2.2 nathanw int
709 1.22.2.2 nathanw plumvideo_power(void *ctx, int type, long id, void *msg)
710 1.22.2.2 nathanw {
711 1.22.2.2 nathanw struct plumvideo_softc *sc = ctx;
712 1.22.2.2 nathanw plum_chipset_tag_t pc = sc->sc_pc;
713 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
714 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
715 1.22.2.2 nathanw int why = (int)msg;
716 1.22.2.2 nathanw
717 1.22.2.2 nathanw switch (why) {
718 1.22.2.2 nathanw case PWR_RESUME:
719 1.22.2.2 nathanw if (!sc->sc_console)
720 1.22.2.2 nathanw return (0); /* serial console */
721 1.22.2.2 nathanw
722 1.22.2.2 nathanw DPRINTF(("%s: ON\n", sc->sc_dev.dv_xname));
723 1.22.2.2 nathanw /* power on */
724 1.22.2.2 nathanw /* LCD power on and display on */
725 1.22.2.2 nathanw plum_power_establish(pc, PLUM_PWR_LCD);
726 1.22.2.2 nathanw /* back-light on */
727 1.22.2.2 nathanw plum_power_establish(pc, PLUM_PWR_BKL);
728 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLLUM_REG,
729 1.22.2.2 nathanw PLUM_VIDEO_PLLUM_MAX);
730 1.22.2.2 nathanw break;
731 1.22.2.2 nathanw case PWR_SUSPEND:
732 1.22.2.2 nathanw /* FALLTHROUGH */
733 1.22.2.2 nathanw case PWR_STANDBY:
734 1.22.2.2 nathanw DPRINTF(("%s: OFF\n", sc->sc_dev.dv_xname));
735 1.22.2.2 nathanw /* back-light off */
736 1.22.2.2 nathanw plum_conf_write(regt, regh, PLUM_VIDEO_PLLUM_REG,
737 1.22.2.2 nathanw PLUM_VIDEO_PLLUM_MIN);
738 1.22.2.2 nathanw plum_power_disestablish(pc, PLUM_PWR_BKL);
739 1.22.2.2 nathanw /* power down */
740 1.22.2.2 nathanw plum_power_disestablish(pc, PLUM_PWR_LCD);
741 1.22.2.2 nathanw break;
742 1.22.2.2 nathanw }
743 1.22.2.2 nathanw
744 1.22.2.2 nathanw return (0);
745 1.22.2.2 nathanw }
746 1.22.2.2 nathanw
747 1.22.2.2 nathanw #ifdef PLUMVIDEODEBUG
748 1.22.2.2 nathanw void
749 1.22.2.2 nathanw plumvideo_dump(struct plumvideo_softc *sc)
750 1.22.2.2 nathanw {
751 1.22.2.2 nathanw bus_space_tag_t regt = sc->sc_regt;
752 1.22.2.2 nathanw bus_space_handle_t regh = sc->sc_regh;
753 1.22.2.2 nathanw
754 1.22.2.2 nathanw plumreg_t reg;
755 1.22.2.2 nathanw int i;
756 1.22.2.2 nathanw
757 1.22.2.2 nathanw for (i = 0; i < 0x160; i += 4) {
758 1.22.2.2 nathanw reg = plum_conf_read(regt, regh, i);
759 1.22.2.2 nathanw printf("0x%03x %08x", i, reg);
760 1.22.2.2 nathanw dbg_bit_print(reg);
761 1.22.2.2 nathanw }
762 1.22.2.2 nathanw }
763 1.22.2.2 nathanw #endif /* PLUMVIDEODEBUG */
764