1 1.4 rin /* $NetBSD: w100.c,v 1.4 2021/11/20 00:17:10 rin 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.4 rin __KERNEL_RCSID(0, "$NetBSD: w100.c,v 1.4 2021/11/20 00:17:10 rin 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.3 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.3 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.4 rin rinfo->ri_flg = descr->flags | RI_CLEAR | RI_ENABLE_ALPHA; 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