Home | History | Annotate | Line # | Download | only in dev
w100.c revision 1.2.8.1
      1  1.2.8.1  thorpej /* $NetBSD: w100.c,v 1.2.8.1 2020/12/14 14:38:04 thorpej Exp $ */
      2      1.1  tsutsui /*
      3      1.1  tsutsui  * Copyright (c) 2002, 2003  Genetec Corporation.  All rights reserved.
      4      1.1  tsutsui  * Written by Hiroyuki Bessho for Genetec Corporation.
      5      1.1  tsutsui  *
      6      1.1  tsutsui  * Redistribution and use in source and binary forms, with or without
      7      1.1  tsutsui  * modification, are permitted provided that the following conditions
      8      1.1  tsutsui  * are met:
      9      1.1  tsutsui  * 1. Redistributions of source code must retain the above copyright
     10      1.1  tsutsui  *    notice, this list of conditions and the following disclaimer.
     11      1.1  tsutsui  * 2. Redistributions in binary form must reproduce the above copyright
     12      1.1  tsutsui  *    notice, this list of conditions and the following disclaimer in the
     13      1.1  tsutsui  *    documentation and/or other materials provided with the distribution.
     14      1.1  tsutsui  * 3. The name of Genetec Corporation may not be used to endorse or
     15      1.1  tsutsui  *    promote products derived from this software without specific prior
     16      1.1  tsutsui  *    written permission.
     17      1.1  tsutsui  *
     18      1.1  tsutsui  * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
     19      1.1  tsutsui  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     20      1.1  tsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     21      1.1  tsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
     22      1.1  tsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23      1.1  tsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24      1.1  tsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     25      1.1  tsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     26      1.1  tsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     27      1.1  tsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     28      1.1  tsutsui  * POSSIBILITY OF SUCH DAMAGE.
     29      1.1  tsutsui  */
     30      1.1  tsutsui #include <sys/cdefs.h>
     31  1.2.8.1  thorpej __KERNEL_RCSID(0, "$NetBSD: w100.c,v 1.2.8.1 2020/12/14 14:38:04 thorpej Exp $");
     32      1.1  tsutsui 
     33      1.1  tsutsui #include <sys/param.h>
     34      1.1  tsutsui #include <sys/systm.h>
     35      1.1  tsutsui #include <sys/conf.h>
     36      1.1  tsutsui #include <sys/uio.h>
     37  1.2.8.1  thorpej #include <sys/kmem.h>
     38      1.1  tsutsui #include <sys/kernel.h>			/* for cold */
     39      1.1  tsutsui 
     40      1.1  tsutsui #include <uvm/uvm_extern.h>
     41      1.1  tsutsui 
     42      1.1  tsutsui #include <dev/cons.h>
     43      1.1  tsutsui #include <dev/wscons/wsconsio.h>
     44      1.1  tsutsui #include <dev/wscons/wsdisplayvar.h>
     45      1.1  tsutsui #include <dev/wscons/wscons_callbacks.h>
     46      1.1  tsutsui #include <dev/rasops/rasops.h>
     47      1.1  tsutsui #include <dev/wsfont/wsfont.h>
     48      1.1  tsutsui 
     49      1.1  tsutsui #include <sys/bus.h>
     50      1.1  tsutsui #include <machine/cpu.h>
     51      1.1  tsutsui #include <arm/cpufunc.h>
     52      1.1  tsutsui 
     53      1.1  tsutsui #include <zaurus/dev/w100reg.h>
     54      1.1  tsutsui #include <zaurus/dev/w100var.h>
     55      1.1  tsutsui 
     56      1.1  tsutsui #include "wsdisplay.h"
     57      1.1  tsutsui 
     58      1.1  tsutsui /* Console */
     59      1.1  tsutsui struct {
     60      1.1  tsutsui 	int is_console;
     61      1.1  tsutsui 	struct w100_wsscreen_descr *descr;
     62      1.1  tsutsui 	const struct w100_panel_geometry *geom;
     63      1.1  tsutsui } w100_console;
     64      1.1  tsutsui 
     65      1.1  tsutsui static void w100_initialize(struct w100_softc *sc,
     66      1.1  tsutsui 		 const struct w100_panel_geometry *geom);
     67      1.1  tsutsui static int  w100_new_screen(struct w100_softc *sc, int depth,
     68      1.1  tsutsui 		 struct w100_screen **scrpp);
     69      1.1  tsutsui static void w100_lcd_geometry(struct w100_softc *sc,
     70      1.1  tsutsui                  const struct w100_panel_geometry *geom);
     71      1.1  tsutsui #if NWSDISPLAY > 0
     72      1.1  tsutsui static void w100_setup_rasops(struct w100_softc *sc,
     73      1.1  tsutsui 		 struct rasops_info *rinfo,
     74      1.1  tsutsui 		 struct w100_wsscreen_descr *descr,
     75      1.1  tsutsui 		 const struct w100_panel_geometry *geom);
     76      1.1  tsutsui #endif
     77      1.1  tsutsui 
     78      1.1  tsutsui #define w100_reg_write(sc, offset, value) \
     79      1.1  tsutsui     bus_space_write_4((sc)->iot, (sc)->ioh_reg, offset, value)
     80      1.1  tsutsui 
     81      1.1  tsutsui static void
     82      1.1  tsutsui w100_lcd_geometry(struct w100_softc *sc,
     83      1.1  tsutsui     const struct w100_panel_geometry *geom)
     84      1.1  tsutsui {
     85      1.1  tsutsui 
     86      1.1  tsutsui 	sc->geometry = geom;
     87      1.1  tsutsui 	switch (geom->rotate) {
     88      1.1  tsutsui 	case W100_PANEL_ROTATE_CW:
     89      1.1  tsutsui 		sc->display_width  = geom->panel_height;
     90      1.1  tsutsui 		sc->display_height = geom->panel_width;
     91      1.1  tsutsui 		w100_reg_write(sc, W100_REG_PCLK_CTRL, 0x00000061);
     92      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_CTRL, 0x00de1d0e);
     93      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_OFFSET, 0x00895b00);
     94      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_PITCH, 0x00000500);
     95      1.1  tsutsui 		break;
     96      1.1  tsutsui 	case W100_PANEL_ROTATE_CCW:
     97      1.1  tsutsui 		sc->display_width  = geom->panel_height;
     98      1.1  tsutsui 		sc->display_height = geom->panel_width;
     99      1.1  tsutsui 		w100_reg_write(sc, W100_REG_PCLK_CTRL, 0x00000061);
    100      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_CTRL, 0x00de1d16);
    101      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_OFFSET, 0x008004fc);
    102      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_PITCH, 0x00000500);
    103      1.1  tsutsui 		break;
    104      1.1  tsutsui 	case W100_PANEL_ROTATE_UD:
    105      1.1  tsutsui 		sc->display_width  = geom->panel_width;
    106      1.1  tsutsui 		sc->display_height = geom->panel_height;
    107      1.1  tsutsui 		w100_reg_write(sc, W100_REG_PCLK_CTRL, 0x00000021);
    108      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_CTRL, 0x00ded7e);
    109      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_OFFSET, 0x00895ffc);
    110      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_PITCH, 0x000003c0);
    111      1.1  tsutsui 		break;
    112      1.1  tsutsui 	default:
    113      1.1  tsutsui 		sc->display_width  = geom->panel_width;
    114      1.1  tsutsui 		sc->display_height = geom->panel_height;
    115      1.1  tsutsui 		w100_reg_write(sc, W100_REG_PCLK_CTRL, 0x00000021);
    116      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_CTRL, 0x00de1d66);
    117      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_OFFSET, 0x00800000);
    118      1.1  tsutsui 		w100_reg_write(sc, W100_REG_GRAPHIC_PITCH, 0x000003c0);
    119      1.1  tsutsui 		break;
    120      1.1  tsutsui 	}
    121      1.1  tsutsui 	w100_reg_write(sc, W100_REG_DISP_DB_BUF_CTRL, 0x0000007b);
    122      1.1  tsutsui }
    123      1.1  tsutsui 
    124      1.1  tsutsui /*
    125      1.1  tsutsui  * Initialize the LCD controller.
    126      1.1  tsutsui  */
    127      1.1  tsutsui static void
    128      1.1  tsutsui w100_initialize(struct w100_softc *sc, const struct w100_panel_geometry *geom)
    129      1.1  tsutsui {
    130      1.1  tsutsui 
    131      1.1  tsutsui 	w100_lcd_geometry(sc, geom);
    132      1.1  tsutsui }
    133      1.1  tsutsui 
    134      1.1  tsutsui 
    135      1.1  tsutsui /*
    136      1.1  tsutsui  * Common driver attachment code.
    137      1.1  tsutsui  */
    138      1.1  tsutsui void
    139      1.1  tsutsui w100_attach_subr(struct w100_softc *sc, bus_space_tag_t iot,
    140      1.1  tsutsui     const struct w100_panel_geometry *geom)
    141      1.1  tsutsui {
    142      1.1  tsutsui 	bus_space_handle_t ioh_cfg, ioh_reg, ioh_vram;
    143      1.1  tsutsui 	int error;
    144      1.1  tsutsui 
    145      1.1  tsutsui 	aprint_normal(": ATI Imageon100 LCD controller\n");
    146      1.1  tsutsui 	aprint_naive("\n");
    147      1.1  tsutsui 
    148      1.1  tsutsui 	sc->n_screens = 0;
    149      1.1  tsutsui 	LIST_INIT(&sc->screens);
    150      1.1  tsutsui 
    151      1.1  tsutsui 	/* config handler */
    152      1.1  tsutsui 	error = bus_space_map(iot, W100_CFG_ADDRESS, W100_CFG_SIZE, 0,
    153      1.1  tsutsui 	    &ioh_cfg);
    154      1.1  tsutsui 	if (error) {
    155      1.1  tsutsui 		aprint_error_dev(sc->dev,
    156      1.1  tsutsui 		    "failed to map config (errorno=%d)\n", error);
    157      1.1  tsutsui 		return;
    158      1.1  tsutsui 	}
    159      1.1  tsutsui 
    160      1.1  tsutsui 	/* register handler */
    161      1.1  tsutsui 	error = bus_space_map(iot, W100_REG_ADDRESS, W100_REG_SIZE, 0,
    162      1.1  tsutsui 	    &ioh_reg);
    163      1.1  tsutsui 	if (error) {
    164      1.1  tsutsui 		aprint_error_dev(sc->dev,
    165      1.1  tsutsui 		    "failed to map register (errorno=%d)\n", error);
    166      1.1  tsutsui 		return;
    167      1.1  tsutsui 	}
    168      1.1  tsutsui 
    169      1.1  tsutsui 	/* videomem handler */
    170      1.1  tsutsui 	error = bus_space_map(iot, W100_EXTMEM_ADDRESS, W100_EXTMEM_SIZE, 0,
    171      1.1  tsutsui 	    &ioh_vram);
    172      1.1  tsutsui 	if (error) {
    173      1.1  tsutsui 		aprint_error_dev(sc->dev,
    174      1.1  tsutsui 		    "failed to vram register (errorno=%d)\n", error);
    175      1.1  tsutsui 		return;
    176      1.1  tsutsui 	}
    177      1.1  tsutsui 
    178      1.1  tsutsui 	sc->iot = iot;
    179      1.1  tsutsui 	sc->ioh_cfg = ioh_cfg;
    180      1.1  tsutsui 	sc->ioh_reg = ioh_reg;
    181      1.1  tsutsui 	sc->ioh_vram = ioh_vram;
    182      1.1  tsutsui 
    183      1.1  tsutsui 	w100_initialize(sc, geom);
    184      1.1  tsutsui 
    185      1.1  tsutsui #if NWSDISPLAY > 0
    186      1.1  tsutsui 	if (w100_console.is_console) {
    187      1.1  tsutsui 		struct w100_wsscreen_descr *descr = w100_console.descr;
    188      1.1  tsutsui 		struct w100_screen *scr;
    189      1.1  tsutsui 		struct rasops_info *ri;
    190      1.1  tsutsui 		long defattr;
    191      1.1  tsutsui 
    192      1.1  tsutsui 		error = w100_new_screen(sc, descr->depth, &scr);
    193      1.1  tsutsui 		if (error) {
    194      1.1  tsutsui 			aprint_error_dev(sc->dev,
    195      1.1  tsutsui 			    "unable to create new screen (errno=%d)", error);
    196      1.1  tsutsui 			return;
    197      1.1  tsutsui 		}
    198      1.1  tsutsui 
    199      1.1  tsutsui 		ri = &scr->rinfo;
    200      1.1  tsutsui 		ri->ri_hw = (void *)scr;
    201      1.1  tsutsui 		ri->ri_bits = scr->buf_va;
    202      1.1  tsutsui 		w100_setup_rasops(sc, ri, descr, geom);
    203      1.1  tsutsui 
    204      1.1  tsutsui 		/* assumes 16 bpp */
    205      1.1  tsutsui 		(*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr);
    206      1.1  tsutsui 
    207      1.1  tsutsui 		sc->active = scr;
    208      1.1  tsutsui 
    209      1.1  tsutsui 		wsdisplay_cnattach(&descr->c, ri, ri->ri_ccol, ri->ri_crow,
    210      1.1  tsutsui 		    defattr);
    211      1.1  tsutsui 
    212      1.1  tsutsui 		aprint_normal_dev(sc->dev, "console\n");
    213      1.1  tsutsui 	}
    214      1.1  tsutsui #endif
    215      1.1  tsutsui }
    216      1.1  tsutsui 
    217      1.1  tsutsui int
    218      1.1  tsutsui w100_cnattach(struct w100_wsscreen_descr *descr,
    219      1.1  tsutsui     const struct w100_panel_geometry *geom)
    220      1.1  tsutsui {
    221      1.1  tsutsui 
    222      1.1  tsutsui 	w100_console.descr = descr;
    223      1.1  tsutsui 	w100_console.geom = geom;
    224      1.1  tsutsui 	w100_console.is_console = 1;
    225      1.1  tsutsui 
    226      1.1  tsutsui 	return 0;
    227      1.1  tsutsui }
    228      1.1  tsutsui 
    229      1.1  tsutsui /*
    230      1.1  tsutsui  * Create and initialize a new screen buffer.
    231      1.1  tsutsui  */
    232      1.1  tsutsui static int
    233      1.1  tsutsui w100_new_screen(struct w100_softc *sc, int depth, struct w100_screen **scrpp)
    234      1.1  tsutsui {
    235      1.1  tsutsui 	struct w100_screen *scr = NULL;
    236      1.1  tsutsui 	int error = 0;
    237      1.1  tsutsui 
    238  1.2.8.1  thorpej 	scr = kmem_zalloc(sizeof(*scr), KM_SLEEP);
    239      1.1  tsutsui 	scr->buf_va = (u_char *)bus_space_vaddr(sc->iot, sc->ioh_vram);
    240      1.1  tsutsui 	scr->depth = depth;
    241      1.1  tsutsui 
    242      1.1  tsutsui 	LIST_INSERT_HEAD(&sc->screens, scr, link);
    243      1.1  tsutsui 	sc->n_screens++;
    244      1.1  tsutsui 
    245      1.1  tsutsui 	*scrpp = scr;
    246      1.1  tsutsui 
    247      1.1  tsutsui 	return error;
    248      1.1  tsutsui }
    249      1.1  tsutsui 
    250      1.1  tsutsui #if NWSDISPLAY > 0
    251      1.1  tsutsui /*
    252      1.1  tsutsui  * Initialize rasops for a screen, as well as struct wsscreen_descr if this
    253      1.1  tsutsui  * is the first screen creation.
    254      1.1  tsutsui  */
    255      1.1  tsutsui static void
    256      1.1  tsutsui w100_setup_rasops(struct w100_softc *sc, struct rasops_info *rinfo,
    257      1.1  tsutsui     struct w100_wsscreen_descr *descr, const struct w100_panel_geometry *geom)
    258      1.1  tsutsui {
    259      1.1  tsutsui 
    260      1.1  tsutsui 	rinfo->ri_flg = descr->flags;
    261      1.1  tsutsui 	rinfo->ri_depth = descr->depth;
    262      1.1  tsutsui 	rinfo->ri_width = sc->display_width;
    263      1.1  tsutsui 	rinfo->ri_height = sc->display_height;
    264      1.1  tsutsui 	rinfo->ri_stride = rinfo->ri_width * rinfo->ri_depth / 8;
    265      1.1  tsutsui #ifdef notyet
    266      1.1  tsutsui 	rinfo->ri_wsfcookie = -1;	/* XXX */
    267      1.1  tsutsui #endif
    268      1.1  tsutsui 
    269      1.1  tsutsui 	/* swap B and R */
    270      1.1  tsutsui 	if (descr->depth == 16) {
    271      1.1  tsutsui 		rinfo->ri_rnum = 5;
    272      1.1  tsutsui 		rinfo->ri_rpos = 11;
    273      1.1  tsutsui 		rinfo->ri_gnum = 6;
    274      1.1  tsutsui 		rinfo->ri_gpos = 5;
    275      1.1  tsutsui 		rinfo->ri_bnum = 5;
    276      1.1  tsutsui 		rinfo->ri_bpos = 0;
    277      1.1  tsutsui 	}
    278      1.1  tsutsui 
    279      1.1  tsutsui 	if (descr->c.nrows == 0) {
    280      1.1  tsutsui 		/* get rasops to compute screen size the first time */
    281      1.1  tsutsui 		rasops_init(rinfo, 100, 100);
    282      1.1  tsutsui 	} else {
    283      1.1  tsutsui 		rasops_init(rinfo, descr->c.nrows, descr->c.ncols);
    284      1.1  tsutsui 	}
    285      1.1  tsutsui 
    286      1.1  tsutsui 	descr->c.nrows = rinfo->ri_rows;
    287      1.1  tsutsui 	descr->c.ncols = rinfo->ri_cols;
    288      1.1  tsutsui 	descr->c.capabilities = rinfo->ri_caps;
    289      1.1  tsutsui 	descr->c.textops = &rinfo->ri_ops;
    290      1.1  tsutsui }
    291      1.1  tsutsui #endif
    292      1.1  tsutsui 
    293      1.1  tsutsui /*
    294      1.1  tsutsui  * Power management
    295      1.1  tsutsui  */
    296      1.1  tsutsui void
    297      1.1  tsutsui w100_suspend(struct w100_softc *sc)
    298      1.1  tsutsui {
    299      1.1  tsutsui 
    300      1.1  tsutsui 	if (sc->active) {
    301      1.1  tsutsui 		/* XXX not yet */
    302      1.1  tsutsui 	}
    303      1.1  tsutsui }
    304      1.1  tsutsui 
    305      1.1  tsutsui void
    306      1.1  tsutsui w100_resume(struct w100_softc *sc)
    307      1.1  tsutsui {
    308      1.1  tsutsui 
    309      1.1  tsutsui 	if (sc->active) {
    310      1.1  tsutsui 		w100_initialize(sc, sc->geometry);
    311      1.1  tsutsui 		/* XXX: and more */
    312      1.1  tsutsui 	}
    313      1.1  tsutsui }
    314      1.1  tsutsui 
    315      1.1  tsutsui void
    316      1.1  tsutsui w100_power(int why, void *v)
    317      1.1  tsutsui {
    318      1.1  tsutsui 	struct w100_softc *sc = v;
    319      1.1  tsutsui 
    320      1.1  tsutsui 	switch (why) {
    321      1.1  tsutsui 	case PWR_SUSPEND:
    322      1.1  tsutsui 	case PWR_STANDBY:
    323      1.1  tsutsui 		w100_suspend(sc);
    324      1.1  tsutsui 		break;
    325      1.1  tsutsui 
    326      1.1  tsutsui 	case PWR_RESUME:
    327      1.1  tsutsui 		w100_resume(sc);
    328      1.1  tsutsui 		break;
    329      1.1  tsutsui 	}
    330      1.1  tsutsui }
    331      1.1  tsutsui 
    332      1.1  tsutsui /*
    333      1.1  tsutsui  * Initialize struct wsscreen_descr based on values calculated by
    334      1.1  tsutsui  * raster operation subsystem.
    335      1.1  tsutsui  */
    336      1.1  tsutsui #if 0
    337      1.1  tsutsui int
    338      1.1  tsutsui w100_setup_wsscreen(struct w100_wsscreen_descr *descr,
    339      1.1  tsutsui     const struct w100_panel_geometry *geom,
    340      1.1  tsutsui     const char *fontname)
    341      1.1  tsutsui {
    342      1.1  tsutsui 	int width = geom->panel_width;
    343      1.1  tsutsui 	int height = geom->panel_height;
    344      1.1  tsutsui 	int cookie = -1;
    345      1.1  tsutsui 	struct rasops_info rinfo;
    346      1.1  tsutsui 
    347      1.1  tsutsui 	memset(&rinfo, 0, sizeof rinfo);
    348      1.1  tsutsui 
    349      1.1  tsutsui 	if (fontname) {
    350      1.1  tsutsui 		wsfont_init();
    351      1.1  tsutsui 		cookie = wsfont_find(fontname, 0, 0, 0,
    352      1.1  tsutsui 		    WSDISPLAY_FONTORDER_L2R, WSDISPLAY_FONTORDER_L2R);
    353      1.1  tsutsui 		if (cookie < 0 ||
    354      1.1  tsutsui 		    wsfont_lock(cookie, &rinfo.ri_font))
    355      1.1  tsutsui 			return -1;
    356      1.1  tsutsui 	}
    357      1.1  tsutsui 	else {
    358      1.1  tsutsui 		/* let rasops_init() choose any font */
    359      1.1  tsutsui 	}
    360      1.1  tsutsui 
    361      1.1  tsutsui 	/* let rasops_init calculate # of cols and rows in character */
    362      1.1  tsutsui 	rinfo.ri_flg = 0;
    363      1.1  tsutsui 	rinfo.ri_depth = descr->depth;
    364      1.1  tsutsui 	rinfo.ri_bits = NULL;
    365      1.1  tsutsui 	rinfo.ri_width = width;
    366      1.1  tsutsui 	rinfo.ri_height = height;
    367      1.1  tsutsui 	rinfo.ri_stride = width * rinfo.ri_depth / 8;
    368      1.1  tsutsui 	rinfo.ri_wsfcookie = cookie;
    369      1.1  tsutsui 
    370      1.1  tsutsui 	rasops_init(&rinfo, 100, 100);
    371      1.1  tsutsui 
    372      1.1  tsutsui 	descr->c.nrows = rinfo.ri_rows;
    373      1.1  tsutsui 	descr->c.ncols = rinfo.ri_cols;
    374      1.1  tsutsui 	descr->c.capabilities = rinfo.ri_caps;
    375      1.1  tsutsui 
    376      1.1  tsutsui 	return cookie;
    377      1.1  tsutsui }
    378      1.1  tsutsui #endif
    379      1.1  tsutsui 
    380      1.1  tsutsui int
    381      1.1  tsutsui w100_show_screen(void *v, void *cookie, int waitok,
    382      1.1  tsutsui     void (*cb)(void *, int, int), void *cbarg)
    383      1.1  tsutsui {
    384      1.1  tsutsui 
    385      1.1  tsutsui 	return 0;
    386      1.1  tsutsui }
    387      1.1  tsutsui 
    388      1.1  tsutsui int
    389      1.1  tsutsui w100_alloc_screen(void *v, const struct wsscreen_descr *_type,
    390      1.1  tsutsui     void **cookiep, int *curxp, int *curyp, long *attrp)
    391      1.1  tsutsui {
    392      1.1  tsutsui 	struct w100_softc *sc = v;
    393      1.1  tsutsui 	struct w100_screen *scr;
    394      1.1  tsutsui 	const struct w100_wsscreen_descr *type =
    395      1.1  tsutsui 		(const struct w100_wsscreen_descr *)_type;
    396      1.1  tsutsui 	int error;
    397      1.1  tsutsui 
    398      1.1  tsutsui 	if (sc->n_screens > 0)
    399      1.1  tsutsui 		return ENOMEM;
    400      1.1  tsutsui 
    401      1.1  tsutsui 	error = w100_new_screen(sc, type->depth, &scr);
    402      1.1  tsutsui 	if (error)
    403      1.1  tsutsui 		return error;
    404      1.1  tsutsui 
    405      1.1  tsutsui 	/*
    406      1.1  tsutsui 	 * initialize raster operation for this screen.
    407      1.1  tsutsui 	 */
    408      1.1  tsutsui 	scr->rinfo.ri_flg = 0;
    409      1.1  tsutsui 	scr->rinfo.ri_depth = type->depth;
    410      1.1  tsutsui 	scr->rinfo.ri_bits = scr->buf_va;
    411      1.1  tsutsui 	scr->rinfo.ri_width = sc->display_width;
    412      1.1  tsutsui 	scr->rinfo.ri_height = sc->display_height;
    413      1.1  tsutsui 	scr->rinfo.ri_stride = scr->rinfo.ri_width * scr->rinfo.ri_depth / 8;
    414      1.1  tsutsui 	scr->rinfo.ri_wsfcookie = -1;	/* XXX */
    415      1.1  tsutsui 
    416      1.1  tsutsui 	rasops_init(&scr->rinfo, type->c.nrows, type->c.ncols);
    417      1.1  tsutsui 
    418      1.1  tsutsui 	(*scr->rinfo.ri_ops.allocattr)(&scr->rinfo, 0, 0, 0, attrp);
    419      1.1  tsutsui 
    420      1.1  tsutsui 	*cookiep = scr;
    421      1.1  tsutsui 	*curxp = 0;
    422      1.1  tsutsui 	*curyp = 0;
    423      1.1  tsutsui 
    424      1.1  tsutsui 	return 0;
    425      1.1  tsutsui }
    426      1.1  tsutsui 
    427      1.1  tsutsui void
    428      1.1  tsutsui w100_free_screen(void *v, void *cookie)
    429      1.1  tsutsui {
    430      1.1  tsutsui 	struct w100_softc *sc = v;
    431      1.1  tsutsui 	struct w100_screen *scr = cookie;
    432      1.1  tsutsui 
    433      1.1  tsutsui 	LIST_REMOVE(scr, link);
    434      1.1  tsutsui 	sc->n_screens--;
    435      1.1  tsutsui }
    436      1.1  tsutsui 
    437      1.1  tsutsui int
    438      1.1  tsutsui w100_ioctl(void *v, void *vs, u_long cmd, void *data, int flag,
    439      1.1  tsutsui 	struct lwp *l)
    440      1.1  tsutsui {
    441      1.1  tsutsui 	struct w100_softc *sc = v;
    442      1.1  tsutsui 	struct w100_screen *scr = sc->active;  /* ??? */
    443      1.1  tsutsui 	struct wsdisplay_fbinfo *wsdisp_info;
    444      1.1  tsutsui 
    445      1.1  tsutsui 	switch (cmd) {
    446      1.1  tsutsui 	case WSDISPLAYIO_GTYPE:
    447      1.1  tsutsui 		*(int *)data = WSDISPLAY_TYPE_UNKNOWN;
    448      1.1  tsutsui 		return 0;
    449      1.1  tsutsui 
    450      1.1  tsutsui 	case WSDISPLAYIO_GINFO:
    451      1.1  tsutsui 		wsdisp_info = (struct wsdisplay_fbinfo *)data;
    452      1.1  tsutsui 		wsdisp_info->height = sc->display_height;
    453      1.1  tsutsui 		wsdisp_info->width = sc->display_width;
    454      1.1  tsutsui 		wsdisp_info->depth = scr->depth;
    455      1.1  tsutsui 		wsdisp_info->cmsize = 0;
    456      1.1  tsutsui 		return 0;
    457      1.1  tsutsui 
    458      1.1  tsutsui 	case WSDISPLAYIO_LINEBYTES:
    459      1.1  tsutsui 		*(u_int *)data = scr->rinfo.ri_stride;
    460      1.1  tsutsui 		return 0;
    461      1.1  tsutsui 
    462      1.1  tsutsui 	case WSDISPLAYIO_GETCMAP:
    463      1.1  tsutsui 	case WSDISPLAYIO_PUTCMAP:
    464      1.1  tsutsui 		return EPASSTHROUGH;	/* XXX Colormap */
    465      1.1  tsutsui 
    466      1.1  tsutsui 	case WSDISPLAYIO_SVIDEO:
    467      1.1  tsutsui 		if (*(int *)data == WSDISPLAYIO_VIDEO_ON) {
    468      1.1  tsutsui 			/* XXX: turn it on */
    469      1.1  tsutsui 		} else {
    470      1.1  tsutsui 			/* XXX: start LCD shutdown */
    471      1.1  tsutsui 			/* XXX: sleep until interrupt */
    472      1.1  tsutsui 		}
    473      1.1  tsutsui 		return 0;
    474      1.1  tsutsui 
    475      1.1  tsutsui 	case WSDISPLAYIO_GVIDEO:
    476      1.1  tsutsui 		/* XXX: not yet */
    477      1.1  tsutsui 		*(u_int *)data = WSDISPLAYIO_VIDEO_ON;
    478      1.1  tsutsui 		return 0;
    479      1.1  tsutsui 
    480      1.1  tsutsui 	case WSDISPLAYIO_GCURPOS:
    481      1.1  tsutsui 	case WSDISPLAYIO_SCURPOS:
    482      1.1  tsutsui 	case WSDISPLAYIO_GCURMAX:
    483      1.1  tsutsui 	case WSDISPLAYIO_GCURSOR:
    484      1.1  tsutsui 	case WSDISPLAYIO_SCURSOR:
    485      1.1  tsutsui 		return EPASSTHROUGH;	/* XXX */
    486      1.1  tsutsui 	}
    487      1.1  tsutsui 
    488      1.1  tsutsui 	return EPASSTHROUGH;
    489      1.1  tsutsui }
    490      1.1  tsutsui 
    491      1.1  tsutsui paddr_t
    492      1.1  tsutsui w100_mmap(void *v, void *vs, off_t offset, int prot)
    493      1.1  tsutsui {
    494      1.1  tsutsui 	struct w100_softc *sc = v;
    495      1.1  tsutsui 	struct w100_screen *scr = sc->active;  /* ??? */
    496      1.1  tsutsui 
    497      1.1  tsutsui 	if (scr == NULL)
    498      1.1  tsutsui 		return -1;
    499      1.1  tsutsui 
    500      1.1  tsutsui 	if (offset < 0 ||
    501      1.1  tsutsui 	    offset >= scr->rinfo.ri_stride * scr->rinfo.ri_height)
    502      1.1  tsutsui 		return -1;
    503      1.1  tsutsui 
    504      1.1  tsutsui 	return arm_btop(W100_EXTMEM_ADDRESS + offset);
    505      1.1  tsutsui }
    506      1.1  tsutsui 
    507      1.1  tsutsui 
    508      1.1  tsutsui static void
    509      1.1  tsutsui w100_cursor(void *cookie, int on, int row, int col)
    510      1.1  tsutsui {
    511      1.1  tsutsui 	struct w100_screen *scr = cookie;
    512      1.1  tsutsui 
    513      1.1  tsutsui 	(*scr->rinfo.ri_ops.cursor)(&scr->rinfo, on, row, col);
    514      1.1  tsutsui }
    515      1.1  tsutsui 
    516      1.1  tsutsui static int
    517      1.1  tsutsui w100_mapchar(void *cookie, int c, unsigned int *cp)
    518      1.1  tsutsui {
    519      1.1  tsutsui 	struct w100_screen *scr = cookie;
    520      1.1  tsutsui 
    521      1.1  tsutsui 	return (*scr->rinfo.ri_ops.mapchar)(&scr->rinfo, c, cp);
    522      1.1  tsutsui }
    523      1.1  tsutsui 
    524      1.1  tsutsui static void
    525      1.1  tsutsui w100_putchar(void *cookie, int row, int col, u_int uc, long attr)
    526      1.1  tsutsui {
    527      1.1  tsutsui 	struct w100_screen *scr = cookie;
    528      1.1  tsutsui 
    529      1.1  tsutsui 	(*scr->rinfo.ri_ops.putchar)(&scr->rinfo, row, col, uc, attr);
    530      1.1  tsutsui }
    531      1.1  tsutsui 
    532      1.1  tsutsui static void
    533      1.1  tsutsui w100_copycols(void *cookie, int row, int src, int dst, int num)
    534      1.1  tsutsui {
    535      1.1  tsutsui 	struct w100_screen *scr = cookie;
    536      1.1  tsutsui 
    537      1.1  tsutsui 	(*scr->rinfo.ri_ops.copycols)(&scr->rinfo, row, src, dst, num);
    538      1.1  tsutsui }
    539      1.1  tsutsui 
    540      1.1  tsutsui static void
    541      1.1  tsutsui w100_erasecols(void *cookie, int row, int col, int num, long attr)
    542      1.1  tsutsui {
    543      1.1  tsutsui 	struct w100_screen *scr = cookie;
    544      1.1  tsutsui 
    545      1.1  tsutsui 	(*scr->rinfo.ri_ops.erasecols)(&scr->rinfo, row, col, num, attr);
    546      1.1  tsutsui }
    547      1.1  tsutsui 
    548      1.1  tsutsui static void
    549      1.1  tsutsui w100_copyrows(void *cookie, int src, int dst, int num)
    550      1.1  tsutsui {
    551      1.1  tsutsui 	struct w100_screen *scr = cookie;
    552      1.1  tsutsui 
    553      1.1  tsutsui 	(*scr->rinfo.ri_ops.copyrows)(&scr->rinfo, src, dst, num);
    554      1.1  tsutsui }
    555      1.1  tsutsui 
    556      1.1  tsutsui static void
    557      1.1  tsutsui w100_eraserows(void *cookie, int row, int num, long attr)
    558      1.1  tsutsui {
    559      1.1  tsutsui 	struct w100_screen *scr = cookie;
    560      1.1  tsutsui 
    561      1.1  tsutsui 	(*scr->rinfo.ri_ops.eraserows)(&scr->rinfo, row, num, attr);
    562      1.1  tsutsui }
    563      1.1  tsutsui 
    564      1.1  tsutsui static int
    565      1.1  tsutsui w100_alloc_attr(void *cookie, int fg, int bg, int flg, long *attr)
    566      1.1  tsutsui {
    567      1.1  tsutsui 	struct w100_screen *scr = cookie;
    568      1.1  tsutsui 
    569      1.1  tsutsui 	return (*scr->rinfo.ri_ops.allocattr)(&scr->rinfo, fg, bg, flg, attr);
    570      1.1  tsutsui }
    571      1.1  tsutsui 
    572      1.1  tsutsui const struct wsdisplay_emulops w100_emulops = {
    573      1.1  tsutsui 	w100_cursor,
    574      1.1  tsutsui 	w100_mapchar,
    575      1.1  tsutsui 	w100_putchar,
    576      1.1  tsutsui 	w100_copycols,
    577      1.1  tsutsui 	w100_erasecols,
    578      1.1  tsutsui 	w100_copyrows,
    579      1.1  tsutsui 	w100_eraserows,
    580      1.1  tsutsui 	w100_alloc_attr
    581      1.1  tsutsui };
    582