1 1.5 thorpej /* $NetBSD: mntva.c,v 1.5 2021/08/07 16:18:41 thorpej Exp $ */ 2 1.1 rkujawa 3 1.1 rkujawa /* 4 1.1 rkujawa * Copyright (c) 2012, 2016 The NetBSD Foundation, Inc. 5 1.1 rkujawa * All rights reserved. 6 1.1 rkujawa * 7 1.1 rkujawa * This code is derived from software contributed to The NetBSD Foundation 8 1.1 rkujawa * by Lukas F. Hartmann. 9 1.1 rkujawa * This code is derived from software contributed to The NetBSD Foundation 10 1.1 rkujawa * by Radoslaw Kujawa. 11 1.1 rkujawa * 12 1.1 rkujawa * Redistribution and use in source and binary forms, with or without 13 1.1 rkujawa * modification, are permitted provided that the following conditions 14 1.1 rkujawa * are met: 15 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright 16 1.1 rkujawa * notice, this list of conditions and the following disclaimer. 17 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright 18 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the 19 1.1 rkujawa * documentation and/or other materials provided with the distribution. 20 1.1 rkujawa * 21 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 1.1 rkujawa * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 1.1 rkujawa * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 1.1 rkujawa * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 1.1 rkujawa * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 1.1 rkujawa * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 1.1 rkujawa * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 1.1 rkujawa * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 1.1 rkujawa * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 1.1 rkujawa * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 1.1 rkujawa */ 32 1.1 rkujawa 33 1.1 rkujawa #include <sys/cdefs.h> 34 1.5 thorpej __KERNEL_RCSID(0, "$NetBSD: mntva.c,v 1.5 2021/08/07 16:18:41 thorpej Exp $"); 35 1.1 rkujawa 36 1.1 rkujawa #include <sys/param.h> 37 1.1 rkujawa #include <sys/systm.h> 38 1.1 rkujawa #include <sys/kernel.h> 39 1.1 rkujawa #include <sys/device.h> 40 1.1 rkujawa #include <sys/endian.h> 41 1.1 rkujawa #include <sys/bus.h> 42 1.1 rkujawa #include <sys/cpu.h> 43 1.1 rkujawa #include <sys/conf.h> 44 1.1 rkujawa 45 1.1 rkujawa #include <dev/cons.h> 46 1.1 rkujawa 47 1.1 rkujawa #include <amiga/amiga/device.h> 48 1.1 rkujawa #include <amiga/amiga/isr.h> 49 1.1 rkujawa 50 1.1 rkujawa #include <amiga/dev/zbusvar.h> 51 1.1 rkujawa #include <amiga/dev/mntvavar.h> 52 1.1 rkujawa #include <amiga/dev/mntvareg.h> 53 1.1 rkujawa #include <dev/wsfb/genfbvar.h> 54 1.1 rkujawa 55 1.1 rkujawa #include "opt_amigacons.h" 56 1.1 rkujawa #include "opt_wsemul.h" 57 1.1 rkujawa #include "opt_mntva.h" 58 1.1 rkujawa #include "opt_wsfb.h" 59 1.1 rkujawa 60 1.1 rkujawa #include "mntva.h" 61 1.1 rkujawa 62 1.1 rkujawa /* #define MNTVA_DEBUG 1 */ 63 1.1 rkujawa 64 1.1 rkujawa static int mntva_match(device_t, cfdata_t, void *); 65 1.1 rkujawa static void mntva_attach(device_t, device_t, void *); 66 1.1 rkujawa 67 1.1 rkujawa static uint16_t mntva_reg_read(struct mntva_softc *sc, uint32_t reg); 68 1.1 rkujawa static void mntva_reg_write(struct mntva_softc *sc, uint32_t reg, uint32_t val); 69 1.1 rkujawa 70 1.1 rkujawa static bool mntva_mode_set(struct mntva_softc *sc); 71 1.1 rkujawa 72 1.1 rkujawa static paddr_t mntva_mmap(void *v, void *vs, off_t offset, int prot); 73 1.1 rkujawa static int mntva_ioctl(void *v, void *vs, u_long cmd, void *data, int flag, 74 1.1 rkujawa struct lwp *l); 75 1.1 rkujawa static void mntva_init_screen(void *cookie, struct vcons_screen *scr, 76 1.1 rkujawa int existing, long *defattr); 77 1.1 rkujawa static void mntva_init_palette(struct mntva_softc *sc); 78 1.1 rkujawa /* blitter support */ 79 1.1 rkujawa static void mntva_rectfill(struct mntva_softc *sc, int x, int y, int wi, 80 1.1 rkujawa int he, uint32_t color); 81 1.1 rkujawa static void mntva_bitblt(struct mntva_softc *sc, int xs, int ys, int xd, 82 1.1 rkujawa int yd, int wi, int he); 83 1.1 rkujawa 84 1.1 rkujawa /* accelerated raster ops */ 85 1.1 rkujawa static void mntva_eraserows(void *cookie, int row, int nrows, long fillattr); 86 1.1 rkujawa static void mntva_copyrows(void *cookie, int srcrow, int dstrow, int nrows); 87 1.1 rkujawa static void mntva_copycols(void *cookie, int row, int srccol, int dstcol, 88 1.1 rkujawa int ncols); 89 1.1 rkujawa static void mntva_erasecols(void *cookie, int row, int startcol, int ncols, 90 1.1 rkujawa long fillattr); 91 1.1 rkujawa #if 0 92 1.1 rkujawa static void mntva_cursor(void *cookie, int on, int row, int col); 93 1.1 rkujawa #endif 94 1.1 rkujawa 95 1.1 rkujawa /* 96 1.1 rkujawa * XXX: these will be called by console handling code, shouldn't they be 97 1.1 rkujawa * included from somewhere else? 98 1.1 rkujawa */ 99 1.1 rkujawa void mntvacninit(struct consdev *cd); 100 1.1 rkujawa void mntvacnprobe(struct consdev *cd); 101 1.1 rkujawa void mntvacnputc(dev_t cd, int ch); 102 1.1 rkujawa int mntvacngetc(dev_t cd); 103 1.1 rkujawa void mntvacnpollc(dev_t cd, int on); 104 1.1 rkujawa 105 1.1 rkujawa CFATTACH_DECL_NEW(mntva, sizeof(struct mntva_softc), 106 1.1 rkujawa mntva_match, mntva_attach, NULL, NULL); 107 1.1 rkujawa 108 1.1 rkujawa struct wsdisplay_accessops mntva_accessops = { 109 1.1 rkujawa mntva_ioctl, 110 1.1 rkujawa mntva_mmap, 111 1.1 rkujawa NULL, // alloc_screen 112 1.1 rkujawa NULL, // free_screen 113 1.1 rkujawa NULL, // show_screen 114 1.1 rkujawa NULL, // load_font 115 1.1 rkujawa NULL, // pollc 116 1.1 rkujawa NULL // scroll 117 1.1 rkujawa }; 118 1.1 rkujawa 119 1.1 rkujawa static int 120 1.1 rkujawa mntva_match(device_t parent, cfdata_t match, void *aux) 121 1.1 rkujawa { 122 1.1 rkujawa struct zbus_args *zap = aux; 123 1.1 rkujawa 124 1.1 rkujawa if (zap->manid == 0x6d6e && zap->prodid == 1) { 125 1.1 rkujawa #ifdef MNTVA_DEBUG 126 1.1 rkujawa /* XXX: this might not work during console init? */ 127 1.1 rkujawa aprint_normal("mntva_match... success!\n"); 128 1.1 rkujawa #endif /* MNTVA_DEBUG */ 129 1.1 rkujawa return 1; 130 1.1 rkujawa } 131 1.1 rkujawa 132 1.1 rkujawa return 0; 133 1.1 rkujawa } 134 1.1 rkujawa 135 1.1 rkujawa static void 136 1.1 rkujawa mntva_attach(device_t parent, device_t self, void *aux) 137 1.1 rkujawa { 138 1.1 rkujawa struct mntva_softc *sc = device_private(self); 139 1.1 rkujawa struct wsemuldisplaydev_attach_args ws_aa; 140 1.1 rkujawa struct rasops_info *ri; 141 1.1 rkujawa struct zbus_args *zap = aux; 142 1.1 rkujawa long defattr; 143 1.1 rkujawa 144 1.1 rkujawa sc->sc_isconsole = false; 145 1.1 rkujawa /* this should come from "opt_mntva.h" auto generated by kernel conf system */ 146 1.1 rkujawa #ifdef MNTVA_CONSOLE 147 1.1 rkujawa sc->sc_isconsole = true; 148 1.1 rkujawa #endif /* MNTVA_CONSOLE */ 149 1.1 rkujawa 150 1.3 rkujawa printf(": MNT VA2000"); 151 1.1 rkujawa 152 1.1 rkujawa if(sc->sc_isconsole) 153 1.1 rkujawa printf(" (console)"); 154 1.1 rkujawa 155 1.1 rkujawa printf("\n"); 156 1.1 rkujawa 157 1.1 rkujawa sc->sc_dev = self; 158 1.1 rkujawa sc->sc_memsize = MNTVA_FB_SIZE; 159 1.1 rkujawa 160 1.1 rkujawa sc->sc_bst.base = (bus_addr_t) zap->va; 161 1.1 rkujawa sc->sc_bst.absm = &amiga_bus_stride_1; 162 1.1 rkujawa sc->sc_iot = &sc->sc_bst; 163 1.1 rkujawa 164 1.1 rkujawa if (bus_space_map(sc->sc_iot, MNTVA_OFF_REG, MNTVA_REG_SIZE , 0, 165 1.1 rkujawa &sc->sc_regh)) { 166 1.1 rkujawa aprint_error_dev(sc->sc_dev, "mapping registers failed\n"); 167 1.1 rkujawa return; 168 1.1 rkujawa } 169 1.3 rkujawa if (bus_space_map(sc->sc_iot, MNTVA_OFF_FB, sc->sc_memsize, 170 1.3 rkujawa BUS_SPACE_MAP_LINEAR, &sc->sc_fbh)) { 171 1.3 rkujawa aprint_error_dev(sc->sc_dev, "mapping framebuffer failed\n"); 172 1.3 rkujawa return; 173 1.3 rkujawa } 174 1.1 rkujawa 175 1.1 rkujawa sc->sc_regpa = (bus_addr_t) kvtop((void*) sc->sc_regh); 176 1.1 rkujawa sc->sc_fbpa = (bus_addr_t) kvtop((void*) sc->sc_fbh); 177 1.1 rkujawa 178 1.1 rkujawa /* print the physical and virt addresses for registers and fb */ 179 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 180 1.1 rkujawa "registers at pa/va 0x%08x/0x%08x, fb at pa/va 0x%08x/0x%08x\n", 181 1.1 rkujawa (uint32_t) sc->sc_regpa, 182 1.1 rkujawa (uint32_t) bus_space_vaddr(sc->sc_iot, sc->sc_regh), 183 1.1 rkujawa (uint32_t) sc->sc_fbpa, 184 1.1 rkujawa (uint32_t) bus_space_vaddr(sc->sc_iot, sc->sc_fbh)); 185 1.1 rkujawa 186 1.1 rkujawa sc->sc_width = 1280; 187 1.1 rkujawa sc->sc_height = 720; 188 1.1 rkujawa sc->sc_bpp = 16; 189 1.1 rkujawa sc->sc_linebytes = 4096; 190 1.1 rkujawa 191 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "%zu kB framebuffer memory present\n", 192 1.1 rkujawa sc->sc_memsize / 1024); 193 1.1 rkujawa 194 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "setting %dx%d %d bpp resolution\n", 195 1.1 rkujawa sc->sc_width, sc->sc_height, sc->sc_bpp); 196 1.1 rkujawa 197 1.1 rkujawa mntva_mode_set(sc); 198 1.1 rkujawa 199 1.1 rkujawa sc->sc_defaultscreen_descr = (struct wsscreen_descr) { 200 1.1 rkujawa "default", 0, 0, NULL, 8, 16, 201 1.1 rkujawa WSSCREEN_WSCOLORS | WSSCREEN_HILIT, NULL }; 202 1.1 rkujawa sc->sc_screens[0] = &sc->sc_defaultscreen_descr; 203 1.1 rkujawa sc->sc_screenlist = (struct wsscreen_list) { 1, sc->sc_screens }; 204 1.1 rkujawa sc->sc_mode = WSDISPLAYIO_MODE_EMUL; 205 1.1 rkujawa 206 1.1 rkujawa vcons_init(&sc->vd, sc, &sc->sc_defaultscreen_descr, &mntva_accessops); 207 1.1 rkujawa sc->vd.init_screen = mntva_init_screen; 208 1.1 rkujawa 209 1.1 rkujawa ri = &sc->sc_console_screen.scr_ri; 210 1.1 rkujawa 211 1.1 rkujawa mntva_init_palette(sc); 212 1.1 rkujawa 213 1.1 rkujawa if (sc->sc_isconsole) { 214 1.1 rkujawa vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1, 215 1.1 rkujawa &defattr); 216 1.1 rkujawa 217 1.1 rkujawa sc->sc_console_screen.scr_flags = VCONS_SCREEN_IS_STATIC; 218 1.1 rkujawa vcons_redraw_screen(&sc->sc_console_screen); 219 1.1 rkujawa 220 1.1 rkujawa sc->sc_defaultscreen_descr.textops = &ri->ri_ops; 221 1.1 rkujawa sc->sc_defaultscreen_descr.capabilities = ri->ri_caps; 222 1.1 rkujawa sc->sc_defaultscreen_descr.nrows = ri->ri_rows; 223 1.1 rkujawa sc->sc_defaultscreen_descr.ncols = ri->ri_cols; 224 1.1 rkujawa 225 1.1 rkujawa wsdisplay_cnattach(&sc->sc_defaultscreen_descr, ri, 0, 0, 226 1.3 rkujawa defattr); 227 1.1 rkujawa vcons_replay_msgbuf(&sc->sc_console_screen); 228 1.1 rkujawa } else { 229 1.3 rkujawa if (sc->sc_console_screen.scr_ri.ri_rows == 0) 230 1.1 rkujawa vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1, 231 1.3 rkujawa &defattr); 232 1.3 rkujawa else 233 1.1 rkujawa (*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr); 234 1.1 rkujawa } 235 1.1 rkujawa 236 1.1 rkujawa ws_aa.console = sc->sc_isconsole; 237 1.1 rkujawa ws_aa.scrdata = &sc->sc_screenlist; 238 1.1 rkujawa ws_aa.accessops = &mntva_accessops; 239 1.1 rkujawa ws_aa.accesscookie = &sc->vd; 240 1.1 rkujawa 241 1.5 thorpej config_found(sc->sc_dev, &ws_aa, wsemuldisplaydevprint, CFARGS_NONE); 242 1.1 rkujawa } 243 1.1 rkujawa 244 1.1 rkujawa static void 245 1.1 rkujawa mntva_init_palette(struct mntva_softc *sc) 246 1.1 rkujawa { 247 1.1 rkujawa int i, j; 248 1.1 rkujawa 249 1.1 rkujawa j = 0; 250 1.1 rkujawa for (i=0; i<256; i++) { 251 1.1 rkujawa mntva_reg_write(sc, 0x200+i*2, rasops_cmap[j]); 252 1.1 rkujawa mntva_reg_write(sc, 0x400+i*2, rasops_cmap[j+1]); 253 1.1 rkujawa mntva_reg_write(sc, 0x600+i*2, rasops_cmap[j+2]); 254 1.1 rkujawa j+=3; 255 1.1 rkujawa } 256 1.1 rkujawa } 257 1.1 rkujawa 258 1.1 rkujawa static void 259 1.1 rkujawa mntva_init_screen(void *cookie, struct vcons_screen *scr, int existing, 260 1.1 rkujawa long *defattr) 261 1.1 rkujawa { 262 1.1 rkujawa struct mntva_softc *sc = cookie; 263 1.1 rkujawa struct rasops_info *ri = &scr->scr_ri; 264 1.1 rkujawa 265 1.1 rkujawa wsfont_init(); 266 1.1 rkujawa 267 1.1 rkujawa ri->ri_depth = sc->sc_bpp; 268 1.1 rkujawa ri->ri_width = sc->sc_width; 269 1.1 rkujawa ri->ri_height = sc->sc_height; 270 1.1 rkujawa ri->ri_stride = sc->sc_linebytes; 271 1.1 rkujawa ri->ri_flg = 0; 272 1.1 rkujawa 273 1.1 rkujawa /*ri->ri_flg = RI_BSWAP;*/ 274 1.1 rkujawa 275 1.1 rkujawa ri->ri_bits = (char *) bus_space_vaddr(sc->sc_iot, sc->sc_fbh); 276 1.1 rkujawa #ifdef MNTVA_DEBUG 277 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "ri_bits: %p\n", ri->ri_bits); 278 1.1 rkujawa #endif /* MNTVA_DEBUG */ 279 1.1 rkujawa 280 1.1 rkujawa scr->scr_flags = VCONS_SCREEN_IS_STATIC; 281 1.1 rkujawa 282 1.1 rkujawa rasops_init(ri, 0, 0); 283 1.1 rkujawa ri->ri_caps = WSSCREEN_WSCOLORS; 284 1.1 rkujawa rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight, 285 1.1 rkujawa sc->sc_width / ri->ri_font->fontwidth); 286 1.1 rkujawa 287 1.1 rkujawa ri->ri_hw = scr; 288 1.1 rkujawa 289 1.1 rkujawa ri->ri_ops.eraserows = mntva_eraserows; 290 1.1 rkujawa ri->ri_ops.copyrows = mntva_copyrows; 291 1.1 rkujawa ri->ri_ops.erasecols = mntva_erasecols; 292 1.1 rkujawa ri->ri_ops.copycols = mntva_copycols; 293 1.1 rkujawa #if 0 294 1.1 rkujawa ri->ri_ops.cursor = mntva_cursor; 295 1.1 rkujawa #endif 296 1.1 rkujawa } 297 1.1 rkujawa 298 1.1 rkujawa static bool 299 1.1 rkujawa mntva_mode_set(struct mntva_softc *sc) 300 1.1 rkujawa { 301 1.3 rkujawa mntva_reg_write(sc, MNTVA_CAPTURE_MODE, 0); 302 1.3 rkujawa 303 1.3 rkujawa mntva_reg_write(sc, MNTVA_H_SYNC_START, 1390); 304 1.3 rkujawa mntva_reg_write(sc, MNTVA_H_SYNC_END, 1430); 305 1.3 rkujawa mntva_reg_write(sc, MNTVA_H_MAX, 1650); 306 1.3 rkujawa mntva_reg_write(sc, MNTVA_V_SYNC_START, 725); 307 1.3 rkujawa mntva_reg_write(sc, MNTVA_V_SYNC_END, 730); 308 1.3 rkujawa mntva_reg_write(sc, MNTVA_V_MAX, 750); 309 1.3 rkujawa mntva_reg_write(sc, MNTVA_PIXEL_CLK_SEL, MNTVA_CLK_75MHZ); 310 1.3 rkujawa 311 1.1 rkujawa mntva_reg_write(sc, MNTVA_SCALEMODE, 0); 312 1.1 rkujawa mntva_reg_write(sc, MNTVA_SCREENW, sc->sc_width); 313 1.1 rkujawa mntva_reg_write(sc, MNTVA_SCREENH, sc->sc_height); 314 1.3 rkujawa mntva_reg_write(sc, MNTVA_ROW_PITCH, 2048); 315 1.3 rkujawa mntva_reg_write(sc, MNTVA_ROW_PITCH_SHIFT, 11); 316 1.3 rkujawa mntva_reg_write(sc, MNTVA_BLITTER_ROW_PITCH, 2048); 317 1.3 rkujawa mntva_reg_write(sc, MNTVA_BLITTER_ROW_PITCH_SHIFT, 11); 318 1.3 rkujawa mntva_reg_write(sc, MNTVA_MARGIN_X, 8); 319 1.3 rkujawa mntva_reg_write(sc, MNTVA_SAFE_X, 0x50); 320 1.1 rkujawa 321 1.1 rkujawa if (sc->sc_bpp == 8) 322 1.1 rkujawa mntva_reg_write(sc, MNTVA_COLORMODE, MNTVA_COLORMODE8); 323 1.1 rkujawa else if (sc->sc_bpp == 16) 324 1.1 rkujawa mntva_reg_write(sc, MNTVA_COLORMODE, MNTVA_COLORMODE16); 325 1.1 rkujawa else if (sc->sc_bpp == 32) 326 1.1 rkujawa mntva_reg_write(sc, MNTVA_COLORMODE, MNTVA_COLORMODE32); 327 1.1 rkujawa 328 1.1 rkujawa mntva_reg_write(sc, MNTVA_PANPTRHI, 0); 329 1.1 rkujawa mntva_reg_write(sc, MNTVA_PANPTRLO, 0); 330 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERBASEHI, 0); 331 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERBASELO, 0); 332 1.1 rkujawa 333 1.1 rkujawa return true; 334 1.1 rkujawa } 335 1.1 rkujawa 336 1.1 rkujawa static uint16_t 337 1.1 rkujawa mntva_reg_read(struct mntva_softc *sc, uint32_t reg) 338 1.1 rkujawa { 339 1.1 rkujawa uint32_t rv; 340 1.1 rkujawa rv = bus_space_read_2(sc->sc_iot, sc->sc_regh, reg); 341 1.1 rkujawa return rv; 342 1.1 rkujawa } 343 1.1 rkujawa 344 1.1 rkujawa static void 345 1.1 rkujawa mntva_reg_write(struct mntva_softc *sc, uint32_t reg, uint32_t val) 346 1.1 rkujawa { 347 1.1 rkujawa bus_space_write_2(sc->sc_iot, sc->sc_regh, reg, val); 348 1.1 rkujawa } 349 1.1 rkujawa 350 1.1 rkujawa static void 351 1.1 rkujawa mntva_rectfill(struct mntva_softc *sc, int x, int y, int wi, int he, 352 1.1 rkujawa uint32_t color) 353 1.1 rkujawa { 354 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERRGB, (uint16_t) color); 355 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERX1, (uint16_t) x); 356 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERY1, (uint16_t) y); 357 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERX2, (uint16_t) x + wi - 1); 358 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERY2, (uint16_t) y + he - 1); 359 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTER_ENABLE, MNTVA_BLITTER_FILL); 360 1.1 rkujawa 361 1.1 rkujawa while(mntva_reg_read(sc, MNTVA_BLITTER_ENABLE)) { 362 1.1 rkujawa /* busy wait */ 363 1.1 rkujawa } 364 1.1 rkujawa } 365 1.1 rkujawa 366 1.1 rkujawa static void 367 1.1 rkujawa mntva_bitblt(struct mntva_softc *sc, int xs, int ys, int xd, int yd, int wi, 368 1.1 rkujawa int he) 369 1.1 rkujawa { 370 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERX1, (uint16_t) xd); 371 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERY1, (uint16_t) yd); 372 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERX2, (uint16_t) xd + wi - 1); 373 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERY2, (uint16_t) yd + he - 1); 374 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERX3, (uint16_t) xs); 375 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERY3, (uint16_t) ys); 376 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERX4, (uint16_t) xs + wi - 1); 377 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTERY4, (uint16_t) ys + he - 1); 378 1.1 rkujawa mntva_reg_write(sc, MNTVA_BLITTER_ENABLE, MNTVA_BLITTER_COPY); 379 1.1 rkujawa 380 1.1 rkujawa while(mntva_reg_read(sc, MNTVA_BLITTER_ENABLE)) { 381 1.1 rkujawa /* busy wait */ 382 1.1 rkujawa } 383 1.1 rkujawa } 384 1.1 rkujawa 385 1.1 rkujawa static void 386 1.1 rkujawa mntva_copyrows(void *cookie, int srcrow, int dstrow, int nrows) 387 1.1 rkujawa { 388 1.1 rkujawa struct mntva_softc *sc; 389 1.1 rkujawa struct rasops_info *ri; 390 1.1 rkujawa struct vcons_screen *scr; 391 1.1 rkujawa int x, ys, yd, wi, he; 392 1.1 rkujawa 393 1.1 rkujawa ri = cookie; 394 1.1 rkujawa scr = ri->ri_hw; 395 1.1 rkujawa sc = scr->scr_cookie; 396 1.1 rkujawa 397 1.1 rkujawa if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) { 398 1.1 rkujawa x = ri->ri_xorigin; 399 1.1 rkujawa ys = ri->ri_yorigin + ri->ri_font->fontheight * srcrow; 400 1.1 rkujawa yd = ri->ri_yorigin + ri->ri_font->fontheight * dstrow; 401 1.1 rkujawa wi = ri->ri_emuwidth; 402 1.1 rkujawa he = ri->ri_font->fontheight * nrows; 403 1.1 rkujawa mntva_bitblt(sc, x, ys, x, yd, wi, he); 404 1.1 rkujawa } 405 1.1 rkujawa } 406 1.1 rkujawa 407 1.1 rkujawa static void 408 1.1 rkujawa mntva_eraserows(void *cookie, int row, int nrows, long fillattr) 409 1.1 rkujawa { 410 1.1 rkujawa struct mntva_softc *sc; 411 1.1 rkujawa struct rasops_info *ri; 412 1.1 rkujawa struct vcons_screen *scr; 413 1.1 rkujawa int x, y, wi, he, fg, bg, ul; 414 1.1 rkujawa 415 1.1 rkujawa ri = cookie; 416 1.1 rkujawa scr = ri->ri_hw; 417 1.1 rkujawa sc = scr->scr_cookie; 418 1.1 rkujawa 419 1.1 rkujawa if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) { 420 1.1 rkujawa rasops_unpack_attr(fillattr, &fg, &bg, &ul); 421 1.1 rkujawa if ((row == 0) && (nrows == ri->ri_rows)) 422 1.1 rkujawa mntva_rectfill(sc, 0, 0, ri->ri_width, 423 1.1 rkujawa ri->ri_height, ri->ri_devcmap[bg]); 424 1.1 rkujawa else { 425 1.1 rkujawa x = ri->ri_xorigin; 426 1.1 rkujawa y = ri->ri_yorigin + ri->ri_font->fontheight * row; 427 1.1 rkujawa wi = ri->ri_emuwidth; 428 1.1 rkujawa he = ri->ri_font->fontheight * nrows; 429 1.1 rkujawa mntva_rectfill(sc, x, y, wi, he, ri->ri_devcmap[bg]); 430 1.1 rkujawa } 431 1.1 rkujawa } 432 1.1 rkujawa } 433 1.1 rkujawa 434 1.1 rkujawa static void 435 1.1 rkujawa mntva_copycols(void *cookie, int row, int srccol, int dstcol, int ncols) 436 1.1 rkujawa { 437 1.1 rkujawa struct mntva_softc *sc; 438 1.1 rkujawa struct rasops_info *ri; 439 1.1 rkujawa struct vcons_screen *scr; 440 1.1 rkujawa int xs, xd, y, w, h; 441 1.1 rkujawa 442 1.1 rkujawa ri = cookie; 443 1.1 rkujawa scr = ri->ri_hw; 444 1.1 rkujawa sc = scr->scr_cookie; 445 1.1 rkujawa 446 1.1 rkujawa if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) { 447 1.1 rkujawa xs = ri->ri_xorigin + ri->ri_font->fontwidth * srccol; 448 1.1 rkujawa xd = ri->ri_xorigin + ri->ri_font->fontwidth * dstcol; 449 1.1 rkujawa y = ri->ri_yorigin + ri->ri_font->fontheight * row; 450 1.1 rkujawa w = ri->ri_font->fontwidth * ncols; 451 1.1 rkujawa h = ri->ri_font->fontheight; 452 1.1 rkujawa mntva_bitblt(sc, xs, y, xd, y, w, h); 453 1.1 rkujawa } 454 1.1 rkujawa 455 1.1 rkujawa } 456 1.1 rkujawa 457 1.1 rkujawa static void 458 1.1 rkujawa mntva_erasecols(void *cookie, int row, int startcol, int ncols, long fillattr) 459 1.1 rkujawa { 460 1.1 rkujawa struct mntva_softc *sc; 461 1.1 rkujawa struct rasops_info *ri; 462 1.1 rkujawa struct vcons_screen *scr; 463 1.1 rkujawa int x, y, w, h, fg, bg, ul; 464 1.1 rkujawa 465 1.1 rkujawa ri = cookie; 466 1.1 rkujawa scr = ri->ri_hw; 467 1.1 rkujawa sc = scr->scr_cookie; 468 1.1 rkujawa 469 1.1 rkujawa if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) { 470 1.1 rkujawa x = ri->ri_xorigin + ri->ri_font->fontwidth * startcol; 471 1.1 rkujawa y = ri->ri_yorigin + ri->ri_font->fontheight * row; 472 1.1 rkujawa w = ri->ri_font->fontwidth * ncols; 473 1.1 rkujawa h = ri->ri_font->fontheight; 474 1.1 rkujawa rasops_unpack_attr(fillattr, &fg, &bg, &ul); 475 1.1 rkujawa mntva_rectfill(sc, x, y, w, h, ri->ri_devcmap[bg & 0xf]); 476 1.1 rkujawa } 477 1.1 rkujawa } 478 1.1 rkujawa 479 1.1 rkujawa static int 480 1.1 rkujawa mntva_ioctl(void *v, void *vs, u_long cmd, void *data, int flag, struct lwp *l) 481 1.1 rkujawa { 482 1.1 rkujawa struct vcons_data *vd; 483 1.1 rkujawa struct mntva_softc *sc; 484 1.1 rkujawa struct wsdisplay_fbinfo *wsfbi; 485 1.1 rkujawa struct vcons_screen *ms; 486 1.1 rkujawa struct wsdisplayio_bus_id *busid; 487 1.1 rkujawa 488 1.1 rkujawa vd = v; 489 1.1 rkujawa sc = vd->cookie; 490 1.1 rkujawa ms = vd->active; 491 1.1 rkujawa 492 1.1 rkujawa switch (cmd) { 493 1.1 rkujawa case WSDISPLAYIO_GTYPE: 494 1.1 rkujawa *(u_int *) data = WSDISPLAY_TYPE_UNKNOWN; 495 1.1 rkujawa return 0; 496 1.1 rkujawa 497 1.1 rkujawa case WSDISPLAYIO_GET_BUSID: 498 1.1 rkujawa busid = data; 499 1.1 rkujawa busid->bus_type = WSDISPLAYIO_BUS_SOC; 500 1.1 rkujawa return 0; 501 1.1 rkujawa 502 1.1 rkujawa case WSDISPLAYIO_GINFO: 503 1.1 rkujawa if (ms == NULL) 504 1.1 rkujawa return ENODEV; 505 1.1 rkujawa 506 1.1 rkujawa wsfbi = (void *) data; 507 1.1 rkujawa wsfbi->height = ms->scr_ri.ri_height; 508 1.1 rkujawa wsfbi->width = ms->scr_ri.ri_width; 509 1.1 rkujawa wsfbi->depth = ms->scr_ri.ri_depth; 510 1.1 rkujawa wsfbi->cmsize = 256; 511 1.1 rkujawa return 0; 512 1.1 rkujawa 513 1.1 rkujawa case WSDISPLAYIO_LINEBYTES: 514 1.1 rkujawa *(u_int *) data = sc->sc_linebytes; 515 1.1 rkujawa return 0; 516 1.1 rkujawa 517 1.1 rkujawa case WSDISPLAYIO_SMODE: 518 1.1 rkujawa { 519 1.1 rkujawa int new_mode = *(int *) data; 520 1.1 rkujawa if (new_mode != sc->sc_mode) { 521 1.1 rkujawa sc->sc_mode = new_mode; 522 1.1 rkujawa if (new_mode == WSDISPLAYIO_MODE_EMUL) 523 1.1 rkujawa vcons_redraw_screen(ms); 524 1.1 rkujawa } 525 1.1 rkujawa return 0; 526 1.1 rkujawa } 527 1.1 rkujawa case WSDISPLAYIO_GET_FBINFO: 528 1.1 rkujawa { 529 1.1 rkujawa struct wsdisplayio_fbinfo *fbi = data; 530 1.1 rkujawa struct rasops_info *ri; 531 1.1 rkujawa int ret; 532 1.1 rkujawa 533 1.1 rkujawa ri = &sc->vd.active->scr_ri; 534 1.1 rkujawa ret = wsdisplayio_get_fbinfo(ri, fbi); 535 1.1 rkujawa return ret; 536 1.1 rkujawa } 537 1.1 rkujawa } 538 1.1 rkujawa 539 1.1 rkujawa return EPASSTHROUGH; 540 1.1 rkujawa } 541 1.1 rkujawa 542 1.1 rkujawa #if 0 543 1.1 rkujawa static void 544 1.1 rkujawa mntva_cursor(void *cookie, int on, int row, int col) 545 1.1 rkujawa { 546 1.1 rkujawa struct mntva_softc *sc; 547 1.1 rkujawa struct rasops_info *ri; 548 1.1 rkujawa struct vcons_screen *scr; 549 1.1 rkujawa int x, y, wi, he; 550 1.1 rkujawa 551 1.1 rkujawa ri = cookie; 552 1.1 rkujawa scr = ri->ri_hw; 553 1.1 rkujawa sc = scr->scr_cookie; 554 1.1 rkujawa 555 1.1 rkujawa wi = ri->ri_font->fontwidth; 556 1.1 rkujawa he = ri->ri_font->fontheight; 557 1.1 rkujawa 558 1.1 rkujawa if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) { 559 1.1 rkujawa x = ri->ri_ccol * wi + ri->ri_xorigin; 560 1.1 rkujawa y = ri->ri_crow * he + ri->ri_yorigin; 561 1.1 rkujawa if (ri->ri_flg & RI_CURSOR) { 562 1.1 rkujawa mntva_bitblt(sc, x, y, x, y, wi, he); 563 1.1 rkujawa ri->ri_flg &= ~RI_CURSOR; 564 1.1 rkujawa } 565 1.1 rkujawa ri->ri_crow = row; 566 1.1 rkujawa ri->ri_ccol = col; 567 1.1 rkujawa if (on) { 568 1.1 rkujawa x = ri->ri_ccol * wi + ri->ri_xorigin; 569 1.1 rkujawa y = ri->ri_crow * he + ri->ri_yorigin; 570 1.1 rkujawa mntva_bitblt(sc, x, y, x, y, wi, he); 571 1.1 rkujawa ri->ri_flg |= RI_CURSOR; 572 1.1 rkujawa } 573 1.1 rkujawa } else { 574 1.1 rkujawa scr->scr_ri.ri_crow = row; 575 1.1 rkujawa scr->scr_ri.ri_ccol = col; 576 1.1 rkujawa scr->scr_ri.ri_flg &= ~RI_CURSOR; 577 1.1 rkujawa } 578 1.1 rkujawa } 579 1.1 rkujawa #endif 580 1.1 rkujawa 581 1.1 rkujawa static paddr_t 582 1.1 rkujawa mntva_mmap(void *v, void *vs, off_t offset, int prot) 583 1.1 rkujawa { 584 1.1 rkujawa struct vcons_data *vd; 585 1.1 rkujawa struct mntva_softc *sc; 586 1.1 rkujawa paddr_t pa; 587 1.1 rkujawa 588 1.1 rkujawa vd = v; 589 1.1 rkujawa sc = vd->cookie; 590 1.1 rkujawa 591 1.1 rkujawa if (offset >= 0 && offset < sc->sc_memsize) { 592 1.1 rkujawa pa = bus_space_mmap(sc->sc_iot, sc->sc_fbpa, offset, prot, 593 1.3 rkujawa BUS_SPACE_MAP_LINEAR); 594 1.1 rkujawa return pa; 595 1.1 rkujawa } 596 1.1 rkujawa 597 1.1 rkujawa return -1; 598 1.1 rkujawa } 599 1.1 rkujawa 600 1.1 rkujawa void 601 1.1 rkujawa mntvacninit(struct consdev *cd) 602 1.1 rkujawa { 603 1.1 rkujawa /*wsdisplay_preattach(sc->sc_defaultscreen, ri, 0, 0, defattr);*/ 604 1.1 rkujawa } 605 1.1 rkujawa 606 1.1 rkujawa void 607 1.1 rkujawa mntvacnprobe(struct consdev *cd) 608 1.1 rkujawa { 609 1.2 phx #ifdef MNTVA_CONSOLE 610 1.1 rkujawa /* 611 1.1 rkujawa * This isn't exactly true, but cons.h does not define anything 612 1.1 rkujawa * that would fit our case exactly. 613 1.1 rkujawa */ 614 1.1 rkujawa cd->cn_pri = CN_INTERNAL; 615 1.1 rkujawa 616 1.1 rkujawa cd->cn_dev = NODEV; /* Filled later by wscons. */ 617 1.2 phx #endif /* MNTVA_CONSOLE */ 618 1.1 rkujawa } 619 1.1 rkujawa 620 1.1 rkujawa /* ARGSUSED */ 621 1.1 rkujawa void 622 1.1 rkujawa mntvacnputc(dev_t cd, int ch) 623 1.1 rkujawa { 624 1.1 rkujawa } 625 1.1 rkujawa 626 1.1 rkujawa /* ARGSUSED */ 627 1.1 rkujawa int 628 1.1 rkujawa mntvacngetc(dev_t cd) 629 1.1 rkujawa { 630 1.1 rkujawa return(0); 631 1.1 rkujawa } 632 1.1 rkujawa 633 1.1 rkujawa /* ARGSUSED */ 634 1.1 rkujawa void 635 1.1 rkujawa mntvacnpollc(dev_t cd, int on) 636 1.1 rkujawa { 637 1.1 rkujawa } 638 1.1 rkujawa 639