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