Home | History | Annotate | Line # | Download | only in dev
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