Home | History | Annotate | Line # | Download | only in sbd
fb_sbdio.c revision 1.2
      1  1.2     jmmv /*	$NetBSD: fb_sbdio.c,v 1.2 2006/04/12 19:38:22 jmmv Exp $	*/
      2  1.1  tsutsui 
      3  1.1  tsutsui /*-
      4  1.1  tsutsui  * Copyright (c) 2004, 2005 The NetBSD Foundation, Inc.
      5  1.1  tsutsui  * All rights reserved.
      6  1.1  tsutsui  *
      7  1.1  tsutsui  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1  tsutsui  * by UCHIYAMA Yasushi.
      9  1.1  tsutsui  *
     10  1.1  tsutsui  * Redistribution and use in source and binary forms, with or without
     11  1.1  tsutsui  * modification, are permitted provided that the following conditions
     12  1.1  tsutsui  * are met:
     13  1.1  tsutsui  * 1. Redistributions of source code must retain the above copyright
     14  1.1  tsutsui  *    notice, this list of conditions and the following disclaimer.
     15  1.1  tsutsui  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  tsutsui  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  tsutsui  *    documentation and/or other materials provided with the distribution.
     18  1.1  tsutsui  * 3. All advertising materials mentioning features or use of this software
     19  1.1  tsutsui  *    must display the following acknowledgement:
     20  1.1  tsutsui  *        This product includes software developed by the NetBSD
     21  1.1  tsutsui  *        Foundation, Inc. and its contributors.
     22  1.1  tsutsui  * 4. Neither the name of The NetBSD Foundation nor the names of its
     23  1.1  tsutsui  *    contributors may be used to endorse or promote products derived
     24  1.1  tsutsui  *    from this software without specific prior written permission.
     25  1.1  tsutsui  *
     26  1.1  tsutsui  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  1.1  tsutsui  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  1.1  tsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  1.1  tsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  1.1  tsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  1.1  tsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  1.1  tsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  1.1  tsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  1.1  tsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  1.1  tsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  1.1  tsutsui  * POSSIBILITY OF SUCH DAMAGE.
     37  1.1  tsutsui  */
     38  1.1  tsutsui 
     39  1.1  tsutsui #define WIRED_FB_TLB
     40  1.1  tsutsui 
     41  1.1  tsutsui #include <sys/cdefs.h>
     42  1.2     jmmv __KERNEL_RCSID(0, "$NetBSD: fb_sbdio.c,v 1.2 2006/04/12 19:38:22 jmmv Exp $");
     43  1.1  tsutsui 
     44  1.1  tsutsui #include <sys/param.h>
     45  1.1  tsutsui #include <sys/systm.h>
     46  1.1  tsutsui #include <sys/malloc.h>
     47  1.1  tsutsui #include <dev/cons.h>
     48  1.1  tsutsui 
     49  1.1  tsutsui #include <uvm/uvm_extern.h>     /* pmap function to remap FB */
     50  1.1  tsutsui 
     51  1.1  tsutsui #include <dev/wscons/wsconsio.h>
     52  1.1  tsutsui #include <dev/wscons/wsdisplayvar.h>
     53  1.1  tsutsui #include <dev/wsfont/wsfont.h>
     54  1.1  tsutsui #include <dev/rasops/rasops.h>
     55  1.1  tsutsui 
     56  1.1  tsutsui #include <mips/pte.h>
     57  1.1  tsutsui 
     58  1.1  tsutsui #include <machine/locore.h>
     59  1.1  tsutsui #include <machine/sbdiovar.h>
     60  1.1  tsutsui 
     61  1.1  tsutsui #include <machine/gareg.h>
     62  1.1  tsutsui #include <machine/gavar.h>
     63  1.1  tsutsui 
     64  1.1  tsutsui #include <machine/vmparam.h>
     65  1.1  tsutsui #include <machine/wired_map.h>
     66  1.1  tsutsui 
     67  1.1  tsutsui 
     68  1.1  tsutsui struct fb_softc {
     69  1.1  tsutsui 	struct device sc_dv;
     70  1.1  tsutsui 	struct rasops_info *sc_ri;
     71  1.1  tsutsui 	struct ga *sc_ga;
     72  1.1  tsutsui 	int sc_nscreens;
     73  1.1  tsutsui };
     74  1.1  tsutsui 
     75  1.1  tsutsui int fb_sbdio_match(struct device *, struct cfdata *, void *);
     76  1.1  tsutsui void fb_sbdio_attach(struct device *, struct device *, void *);
     77  1.1  tsutsui 
     78  1.1  tsutsui CFATTACH_DECL(fb_sbdio, sizeof(struct fb_softc),
     79  1.1  tsutsui     fb_sbdio_match, fb_sbdio_attach, NULL, NULL);
     80  1.1  tsutsui 
     81  1.2     jmmv int _fb_ioctl(void *, void *, u_long, caddr_t, int, struct lwp *);
     82  1.2     jmmv paddr_t _fb_mmap(void *, void *, off_t, int);
     83  1.1  tsutsui int _fb_alloc_screen(void *, const struct wsscreen_descr *, void **,
     84  1.1  tsutsui     int *, int *, long *);
     85  1.1  tsutsui void _fb_free_screen(void *, void *);
     86  1.1  tsutsui int _fb_show_screen(void *, void *, int, void (*)(void *, int, int), void *);
     87  1.1  tsutsui void _fb_pollc(void *, int);
     88  1.1  tsutsui void fb_common_init(struct rasops_info *, struct ga *);
     89  1.1  tsutsui int fb_sbdio_cnattach(uint32_t, uint32_t, int);
     90  1.1  tsutsui void fb_pmap_enter(paddr_t, paddr_t, vaddr_t *, vaddr_t *);
     91  1.1  tsutsui 
     92  1.1  tsutsui struct wsscreen_descr _fb_std_screen = {
     93  1.1  tsutsui 	"std", 0, 0,
     94  1.1  tsutsui 	0, /* textops */
     95  1.1  tsutsui 	0, 0,
     96  1.1  tsutsui 	0
     97  1.1  tsutsui };
     98  1.1  tsutsui 
     99  1.1  tsutsui const struct wsscreen_descr *_fb_screen_table[] = {
    100  1.1  tsutsui 	&_fb_std_screen,
    101  1.1  tsutsui };
    102  1.1  tsutsui 
    103  1.1  tsutsui struct wsscreen_list _fb_screen_list = {
    104  1.1  tsutsui 	.nscreens	=
    105  1.1  tsutsui 	    sizeof(_fb_screen_table) / sizeof(_fb_screen_table[0]),
    106  1.1  tsutsui 	.screens	= _fb_screen_table
    107  1.1  tsutsui };
    108  1.1  tsutsui 
    109  1.1  tsutsui struct wsdisplay_accessops _fb_accessops = {
    110  1.1  tsutsui 	.ioctl		= _fb_ioctl,
    111  1.1  tsutsui 	.mmap		= _fb_mmap,
    112  1.1  tsutsui 	.alloc_screen	= _fb_alloc_screen,
    113  1.1  tsutsui 	.free_screen	= _fb_free_screen,
    114  1.1  tsutsui 	.show_screen	= _fb_show_screen,
    115  1.1  tsutsui 	.load_font	= 0,
    116  1.1  tsutsui 	.pollc		= _fb_pollc
    117  1.1  tsutsui };
    118  1.1  tsutsui 
    119  1.1  tsutsui /* console stuff */
    120  1.1  tsutsui static struct rasops_info fb_console_ri;
    121  1.1  tsutsui static struct ga fb_console_ga;
    122  1.1  tsutsui static paddr_t fb_consaddr;
    123  1.1  tsutsui 
    124  1.1  tsutsui 
    125  1.1  tsutsui int
    126  1.1  tsutsui fb_sbdio_match(struct device *parent, struct cfdata *match, void *aux)
    127  1.1  tsutsui {
    128  1.1  tsutsui 	struct sbdio_attach_args *sa = aux;
    129  1.1  tsutsui 
    130  1.1  tsutsui 	return strcmp(sa->sa_name, "fb") ? 0 : 1;
    131  1.1  tsutsui }
    132  1.1  tsutsui 
    133  1.1  tsutsui void
    134  1.1  tsutsui fb_sbdio_attach(struct device *parent, struct device *self, void *aux)
    135  1.1  tsutsui {
    136  1.1  tsutsui 	struct sbdio_attach_args *sa = aux;
    137  1.1  tsutsui 	struct wsemuldisplaydev_attach_args wa;
    138  1.1  tsutsui 	struct fb_softc *sc = (void *)self;
    139  1.1  tsutsui 	struct rasops_info *ri;
    140  1.1  tsutsui 	struct ga *ga;
    141  1.1  tsutsui 	vaddr_t memva, regva;
    142  1.1  tsutsui 	int console;
    143  1.1  tsutsui 
    144  1.1  tsutsui 	printf(" at %p, %p\n", (void *)sa->sa_addr1, (void *)sa->sa_addr2);
    145  1.1  tsutsui 
    146  1.1  tsutsui 	console = (sa->sa_addr1 == fb_consaddr);
    147  1.1  tsutsui 	if (console) {
    148  1.1  tsutsui 		/* already initialized in fb_cnattach() */
    149  1.1  tsutsui 		sc->sc_ri = ri = &fb_console_ri;
    150  1.1  tsutsui 		sc->sc_ga = &fb_console_ga;
    151  1.1  tsutsui 		sc->sc_nscreens = 1;
    152  1.1  tsutsui 	} else {
    153  1.1  tsutsui 		ri = malloc(sizeof(struct rasops_info), M_DEVBUF,
    154  1.1  tsutsui 		    M_NOWAIT | M_ZERO);
    155  1.1  tsutsui 		if (ri == NULL) {
    156  1.1  tsutsui 			printf(":can't allocate rasops memory\n");
    157  1.1  tsutsui 			return;
    158  1.1  tsutsui 		}
    159  1.1  tsutsui 		ga = malloc(sizeof(struct ga), M_DEVBUF, M_NOWAIT | M_ZERO);
    160  1.1  tsutsui 		if (ga == NULL) {
    161  1.1  tsutsui 			printf(":can't allocate ga memory\n");
    162  1.1  tsutsui 			return;
    163  1.1  tsutsui 		}
    164  1.1  tsutsui 		ga->reg_paddr = sa->sa_addr2;
    165  1.1  tsutsui 		ga->flags = sa->sa_flags;
    166  1.1  tsutsui 		fb_pmap_enter(sa->sa_addr1, sa->sa_addr2,
    167  1.1  tsutsui 		    &memva, &regva);
    168  1.1  tsutsui 		ri->ri_bits = (void *)memva;
    169  1.1  tsutsui 		ga->reg_addr = regva;
    170  1.1  tsutsui 		fb_common_init(ri, ga);
    171  1.1  tsutsui 		sc->sc_ri = ri;
    172  1.1  tsutsui 		sc->sc_ga = ga;
    173  1.1  tsutsui 	}
    174  1.1  tsutsui 
    175  1.1  tsutsui 	wa.console = console;
    176  1.1  tsutsui 	wa.scrdata = &_fb_screen_list;
    177  1.1  tsutsui 	wa.accessops = &_fb_accessops;
    178  1.1  tsutsui 	wa.accesscookie	= (void *)sc;
    179  1.1  tsutsui 
    180  1.1  tsutsui 	config_found(self, &wa, wsdisplaydevprint);
    181  1.1  tsutsui }
    182  1.1  tsutsui 
    183  1.1  tsutsui void
    184  1.1  tsutsui fb_common_init(struct rasops_info *ri, struct ga *ga)
    185  1.1  tsutsui {
    186  1.1  tsutsui 	int ga_active, cookie;
    187  1.1  tsutsui 
    188  1.1  tsutsui 	/* XXX */
    189  1.1  tsutsui 	ga_active = 0;
    190  1.1  tsutsui 	if (ga->flags == 0x0000 || ga->flags == 0x0001)
    191  1.1  tsutsui 		ga_active = ga_init(ga);
    192  1.1  tsutsui 
    193  1.1  tsutsui 	/*
    194  1.1  tsutsui 	 * TR2 IPL CLUT.
    195  1.1  tsutsui 	 * 0     black
    196  1.1  tsutsui 	 * 1	 red
    197  1.1  tsutsui 	 * 2	 green
    198  1.1  tsutsui 	 * 4	 blue
    199  1.1  tsutsui 	 * 8	 yellow
    200  1.1  tsutsui 	 * 16	 cyan
    201  1.1  tsutsui 	 * 32	 magenta
    202  1.1  tsutsui 	 * 64	 light gray
    203  1.1  tsutsui 	 * 128	 dark gray
    204  1.1  tsutsui 	 * 255	 white
    205  1.1  tsutsui 	 * other black
    206  1.1  tsutsui 	 * When CLUT isn't intialized for NetBSD, use black-red pair.
    207  1.1  tsutsui 	 */
    208  1.1  tsutsui 	ri->ri_flg = RI_CENTER | RI_CLEAR;
    209  1.1  tsutsui 	if (!ga_active)
    210  1.1  tsutsui 		ri->ri_flg |= RI_FORCEMONO;
    211  1.1  tsutsui 
    212  1.1  tsutsui 	ri->ri_depth = 8;
    213  1.1  tsutsui 	ri->ri_width = 1280;
    214  1.1  tsutsui 	ri->ri_height = 1024;
    215  1.1  tsutsui 	ri->ri_stride = 2048;
    216  1.1  tsutsui 	ri->ri_hw = (void *)ga;
    217  1.1  tsutsui 
    218  1.1  tsutsui 	wsfont_init();
    219  1.1  tsutsui 	/* prefer 12 pixel wide font */
    220  1.1  tsutsui 	cookie = wsfont_find(NULL, 12, 0, 0, 0, 0);
    221  1.1  tsutsui 	if (cookie <= 0)
    222  1.1  tsutsui 		cookie = wsfont_find(NULL, 0, 0, 0, 0, 0);
    223  1.1  tsutsui 	if (cookie <= 0) {
    224  1.1  tsutsui 		printf("sfb: font table is empty\n");
    225  1.1  tsutsui 		return;
    226  1.1  tsutsui 	}
    227  1.1  tsutsui 
    228  1.1  tsutsui 	if (wsfont_lock(cookie, &ri->ri_font)) {
    229  1.1  tsutsui 		printf("fb: can't lock font\n");
    230  1.1  tsutsui 		return;
    231  1.1  tsutsui 	}
    232  1.1  tsutsui 	ri->ri_wsfcookie = cookie;
    233  1.1  tsutsui 
    234  1.1  tsutsui 	rasops_init(ri, 34, 80);
    235  1.1  tsutsui 
    236  1.1  tsutsui #if 0
    237  1.1  tsutsui 	/* XXX no accelarated functions yet */
    238  1.1  tsutsui 	ri->ri_ops.putchar = xxx_putchar;
    239  1.1  tsutsui 	ri->ri_ops.erasecols = xxx_erasecols;
    240  1.1  tsutsui 	ri->ri_ops.copyrows = xxx_copyrows;
    241  1.1  tsutsui 	ri->ri_ops.eraserows = xxx_eraserows;
    242  1.1  tsutsui 	ir->ri_do_cursor = xxx_do_cursor;
    243  1.1  tsutsui #endif
    244  1.1  tsutsui 
    245  1.1  tsutsui 	/* XXX shouldn't be global */
    246  1.1  tsutsui 	_fb_std_screen.nrows = ri->ri_rows;
    247  1.1  tsutsui 	_fb_std_screen.ncols = ri->ri_cols;
    248  1.1  tsutsui 	_fb_std_screen.textops = &ri->ri_ops;
    249  1.1  tsutsui 	_fb_std_screen.capabilities = ri->ri_caps;
    250  1.1  tsutsui }
    251  1.1  tsutsui 
    252  1.1  tsutsui int
    253  1.1  tsutsui fb_sbdio_cnattach(uint32_t mem, uint32_t reg, int flags)
    254  1.1  tsutsui {
    255  1.1  tsutsui 	struct rasops_info *ri;
    256  1.1  tsutsui 	struct ga *ga;
    257  1.1  tsutsui 	vaddr_t memva, regva;
    258  1.1  tsutsui 	long defattr;
    259  1.1  tsutsui 
    260  1.1  tsutsui 	ri = &fb_console_ri;
    261  1.1  tsutsui 	ga = &fb_console_ga;
    262  1.1  tsutsui 
    263  1.1  tsutsui 	ga->reg_paddr = reg;
    264  1.1  tsutsui 	ga->flags = flags;
    265  1.1  tsutsui 	fb_pmap_enter((paddr_t)mem, (paddr_t)reg, &memva, &regva);
    266  1.1  tsutsui 	ri->ri_bits = (void *)memva;
    267  1.1  tsutsui 	ga->reg_addr = regva;
    268  1.1  tsutsui 
    269  1.1  tsutsui 	fb_common_init(ri, ga);
    270  1.1  tsutsui 
    271  1.1  tsutsui 	(*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr);
    272  1.1  tsutsui 	wsdisplay_cnattach(&_fb_std_screen, ri, 0, 0, defattr);
    273  1.1  tsutsui 	fb_consaddr = mem;
    274  1.1  tsutsui 
    275  1.1  tsutsui 	return 0;
    276  1.1  tsutsui }
    277  1.1  tsutsui 
    278  1.1  tsutsui int
    279  1.2     jmmv _fb_ioctl(void *v, void *vs, u_long cmd, caddr_t data, int flag, struct lwp *l)
    280  1.1  tsutsui {
    281  1.1  tsutsui 	struct fb_softc *sc = v;
    282  1.1  tsutsui 	struct wsdisplay_fbinfo *fbinfo = (void *)data;
    283  1.1  tsutsui 	struct wsdisplay_cmap *cmap = (void *)data;
    284  1.1  tsutsui 	struct rasops_info *ri = sc->sc_ri;
    285  1.1  tsutsui 	struct ga *ga = sc->sc_ga;
    286  1.1  tsutsui 	int i;
    287  1.1  tsutsui 
    288  1.1  tsutsui 	switch (cmd) {
    289  1.1  tsutsui 	case WSDISPLAYIO_GTYPE:
    290  1.1  tsutsui 		*(uint32_t *)data = WSDISPLAY_TYPE_UNKNOWN;
    291  1.1  tsutsui 		return 0;
    292  1.1  tsutsui 
    293  1.1  tsutsui 	case WSDISPLAYIO_GINFO:
    294  1.1  tsutsui 		fbinfo->height = ri->ri_height;
    295  1.1  tsutsui 		fbinfo->width  = ri->ri_width;
    296  1.1  tsutsui 		fbinfo->depth  = ri->ri_depth;
    297  1.1  tsutsui 		fbinfo->cmsize = 256;
    298  1.1  tsutsui 		return 0;
    299  1.1  tsutsui 
    300  1.1  tsutsui #if 1
    301  1.1  tsutsui 	case WSDISPLAYIO_LINEBYTES:
    302  1.1  tsutsui 		*(u_int *)data = ri->ri_stride;
    303  1.1  tsutsui 		return 0;
    304  1.1  tsutsui 
    305  1.1  tsutsui #endif
    306  1.1  tsutsui 	case WSDISPLAYIO_GETCMAP:
    307  1.1  tsutsui 		if (ri->ri_flg == RI_FORCEMONO)
    308  1.1  tsutsui 			break;
    309  1.1  tsutsui 		ga_clut_get(ga);
    310  1.1  tsutsui 		for (i = 0; i < cmap->count; i++) {
    311  1.1  tsutsui 			cmap->red[i] = ga->clut[cmap->index + i][0];
    312  1.1  tsutsui 			cmap->green[i] = ga->clut[cmap->index + i][1];
    313  1.1  tsutsui 			cmap->blue[i] = ga->clut[cmap->index + i][2];
    314  1.1  tsutsui 		}
    315  1.1  tsutsui 		return 0;
    316  1.1  tsutsui 
    317  1.1  tsutsui 	case WSDISPLAYIO_PUTCMAP:
    318  1.1  tsutsui 		if (ri->ri_flg == RI_FORCEMONO)
    319  1.1  tsutsui 			break;
    320  1.1  tsutsui 		for (i = 0; i < cmap->count; i++) {
    321  1.1  tsutsui 			ga->clut[cmap->index + i][0] = cmap->red[i];
    322  1.1  tsutsui 			ga->clut[cmap->index + i][1] = cmap->green[i];
    323  1.1  tsutsui 			ga->clut[cmap->index + i][2] = cmap->blue[i];
    324  1.1  tsutsui 		}
    325  1.1  tsutsui 		ga_clut_set(ga);
    326  1.1  tsutsui 		return 0;
    327  1.1  tsutsui 	}
    328  1.1  tsutsui 
    329  1.1  tsutsui 	return EPASSTHROUGH;
    330  1.1  tsutsui }
    331  1.1  tsutsui 
    332  1.1  tsutsui paddr_t
    333  1.2     jmmv _fb_mmap(void *v, void *vs, off_t offset, int prot)
    334  1.1  tsutsui {
    335  1.1  tsutsui 
    336  1.1  tsutsui 	if (offset < 0 || offset >= GA_FRB_SIZE)
    337  1.1  tsutsui 		return -1;
    338  1.1  tsutsui 
    339  1.1  tsutsui 	return mips_btop(GA_FRB_ADDR + offset);
    340  1.1  tsutsui }
    341  1.1  tsutsui 
    342  1.1  tsutsui int
    343  1.1  tsutsui _fb_alloc_screen(void *v, const struct wsscreen_descr *type, void **cookie,
    344  1.1  tsutsui     int *curx, int *cury, long *attr)
    345  1.1  tsutsui {
    346  1.1  tsutsui 	struct fb_softc *sc = v;
    347  1.1  tsutsui 	struct rasops_info *ri = sc->sc_ri;
    348  1.1  tsutsui 	long defattr;
    349  1.1  tsutsui 
    350  1.1  tsutsui #if 0
    351  1.1  tsutsui 	if (sc->sc_nscreens > 0)
    352  1.1  tsutsui 		return ENOMEM;
    353  1.1  tsutsui #endif
    354  1.1  tsutsui 
    355  1.1  tsutsui 	*cookie = ri;
    356  1.1  tsutsui 	*curx = *cury = 0;
    357  1.1  tsutsui 	ri->ri_ops.allocattr(ri, 0, 0, 0, &defattr);
    358  1.1  tsutsui 	*attr = defattr;
    359  1.1  tsutsui 	sc->sc_nscreens++;
    360  1.1  tsutsui 
    361  1.1  tsutsui 	return 0;
    362  1.1  tsutsui }
    363  1.1  tsutsui 
    364  1.1  tsutsui void
    365  1.1  tsutsui _fb_free_screen(void *v, void *cookie)
    366  1.1  tsutsui {
    367  1.1  tsutsui 	struct fb_softc *sc = v;
    368  1.1  tsutsui 
    369  1.1  tsutsui 	sc->sc_nscreens--;
    370  1.1  tsutsui }
    371  1.1  tsutsui 
    372  1.1  tsutsui int
    373  1.1  tsutsui _fb_show_screen(void *v, void *cookie, int waitok,
    374  1.1  tsutsui     void (*cb)(void *, int, int), void *cbarg)
    375  1.1  tsutsui {
    376  1.1  tsutsui 
    377  1.1  tsutsui 	return 0;
    378  1.1  tsutsui }
    379  1.1  tsutsui 
    380  1.1  tsutsui void
    381  1.1  tsutsui _fb_pollc(void *v, int on)
    382  1.1  tsutsui {
    383  1.1  tsutsui 
    384  1.1  tsutsui 	/* no interrupt used. */
    385  1.1  tsutsui }
    386  1.1  tsutsui 
    387  1.1  tsutsui void
    388  1.1  tsutsui fb_pmap_enter(paddr_t fb_paddr, paddr_t reg_paddr,
    389  1.1  tsutsui     vaddr_t *fb_vaddr, vaddr_t *reg_vaddr)
    390  1.1  tsutsui {
    391  1.1  tsutsui #ifdef WIRED_FB_TLB	/* Make wired 16MPage for frame buffer */
    392  1.1  tsutsui 	vaddr_t va;
    393  1.1  tsutsui 	vsize_t fb_off, reg_off, pgsize;
    394  1.1  tsutsui 
    395  1.1  tsutsui 	pgsize = MIPS3_WIRED_SIZE;
    396  1.1  tsutsui 	fb_off  = fb_paddr  & MIPS3_WIRED_OFFMASK;
    397  1.1  tsutsui 	reg_off = reg_paddr & MIPS3_WIRED_OFFMASK;
    398  1.1  tsutsui 	fb_paddr  = fb_paddr  & ~MIPS3_WIRED_OFFMASK;
    399  1.1  tsutsui 	reg_paddr = reg_paddr & ~MIPS3_WIRED_OFFMASK;
    400  1.1  tsutsui 	va = GA_FRB_ADDR;
    401  1.1  tsutsui 
    402  1.1  tsutsui 	if (mips3_wired_enter_page(va, fb_paddr, pgsize) == FALSE) {
    403  1.1  tsutsui 		printf("cannot allocate fb memory\n");
    404  1.1  tsutsui 		return;
    405  1.1  tsutsui 	}
    406  1.1  tsutsui 
    407  1.1  tsutsui 	if (mips3_wired_enter_page(va + pgsize, reg_paddr, pgsize) == FALSE) {
    408  1.1  tsutsui 		printf("cannot allocate fb register\n");
    409  1.1  tsutsui 		return;
    410  1.1  tsutsui 	}
    411  1.1  tsutsui 
    412  1.1  tsutsui 	*fb_vaddr  = va + fb_off;
    413  1.1  tsutsui 	*reg_vaddr = va + pgsize + reg_off;
    414  1.1  tsutsui #else /* WIRED_FB_TLB */
    415  1.1  tsutsui 	paddr_t pa, epa;
    416  1.1  tsutsui 	vaddr_t va, tva;
    417  1.1  tsutsui 
    418  1.1  tsutsui 	pa = addr;
    419  1.1  tsutsui 	epa = pa + size;
    420  1.1  tsutsui 
    421  1.1  tsutsui 	va = uvm_km_alloc(kernel_map, epa - pa, 0, UVM_KMF_VAONLY);
    422  1.1  tsutsui 	if (va == 0)
    423  1.1  tsutsui 		for (;;)
    424  1.1  tsutsui 			ROM_MONITOR();
    425  1.1  tsutsui 
    426  1.1  tsutsui 	for (tva = va; pa < epa; pa += PAGE_SIZE, tva += PAGE_SIZE)
    427  1.1  tsutsui 		pmap_kenter_pa(tva, pa, VM_PROT_READ | VM_PROT_WRITE);
    428  1.1  tsutsui 
    429  1.1  tsutsui 	pmap_update(pmap_kernel());
    430  1.1  tsutsui 
    431  1.1  tsutsui 	*fb_vaddr  = va;
    432  1.1  tsutsui #endif /* WIRED_FB_TLB */
    433  1.1  tsutsui }
    434