1 1.1 rkujawa /* $NetBSD: veritefb.c,v 1.1 2026/07/11 15:18:21 rkujawa Exp $ */ 2 1.1 rkujawa 3 1.1 rkujawa /* 4 1.1 rkujawa * Copyright (c) 2026 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 Radoslaw Kujawa. 9 1.1 rkujawa * 10 1.1 rkujawa * Redistribution and use in source and binary forms, with or without 11 1.1 rkujawa * modification, are permitted provided that the following conditions 12 1.1 rkujawa * are met: 13 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright 14 1.1 rkujawa * notice, this list of conditions and the following disclaimer. 15 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the 17 1.1 rkujawa * documentation and/or other materials provided with the distribution. 18 1.1 rkujawa * 19 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 1.1 rkujawa * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 1.1 rkujawa * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 1.1 rkujawa * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 1.1 rkujawa * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 1.1 rkujawa * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 1.1 rkujawa * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 1.1 rkujawa * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 1.1 rkujawa * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 1.1 rkujawa * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 1.1 rkujawa */ 30 1.1 rkujawa 31 1.1 rkujawa /* 32 1.1 rkujawa * Rendition Verite V2100/V2200 driver. 33 1.1 rkujawa * 34 1.1 rkujawa * Influenced by xf86-video-rendition. 35 1.1 rkujawa * 36 1.1 rkujawa * The on-board RISC boots from the card ROM at PCI reset and parks in 37 1.1 rkujawa * a loop. We reset it and hold before any other access to the card. 38 1.1 rkujawa * The console runs unaccelerated from autoconf on until 2D microcode is 39 1.1 rkujawa * loaded. 40 1.1 rkujawa */ 41 1.1 rkujawa 42 1.1 rkujawa #include <sys/cdefs.h> 43 1.1 rkujawa __KERNEL_RCSID(0, "$NetBSD: veritefb.c,v 1.1 2026/07/11 15:18:21 rkujawa Exp $"); 44 1.1 rkujawa 45 1.1 rkujawa #include <sys/param.h> 46 1.1 rkujawa #include <sys/systm.h> 47 1.1 rkujawa #include <sys/kernel.h> 48 1.1 rkujawa #include <sys/device.h> 49 1.1 rkujawa #include <sys/endian.h> 50 1.1 rkujawa 51 1.1 rkujawa #include <sys/exec_elf.h> 52 1.1 rkujawa 53 1.1 rkujawa #include <dev/firmload.h> 54 1.1 rkujawa 55 1.1 rkujawa #include <dev/pci/pcivar.h> 56 1.1 rkujawa #include <dev/pci/pcireg.h> 57 1.1 rkujawa #include <dev/pci/pcidevs.h> 58 1.1 rkujawa #include <dev/pci/pciio.h> 59 1.1 rkujawa 60 1.1 rkujawa #include <dev/pci/veritefbreg.h> 61 1.1 rkujawa #include <dev/pci/veritefb_ucode.h> 62 1.1 rkujawa #include <dev/pci/veritefbio.h> 63 1.1 rkujawa 64 1.1 rkujawa #include <dev/wscons/wsdisplayvar.h> 65 1.1 rkujawa #include <dev/wscons/wsconsio.h> 66 1.1 rkujawa #include <dev/wsfont/wsfont.h> 67 1.1 rkujawa #include <dev/rasops/rasops.h> 68 1.1 rkujawa #include <dev/wscons/wsdisplay_vconsvar.h> 69 1.1 rkujawa #include <dev/wscons/wsdisplay_glyphcachevar.h> 70 1.1 rkujawa #include <dev/pci/wsdisplay_pci.h> 71 1.1 rkujawa 72 1.1 rkujawa #include "opt_wsemul.h" 73 1.1 rkujawa #include "opt_veritefb.h" 74 1.1 rkujawa #include "opt_ddb.h" 75 1.1 rkujawa 76 1.1 rkujawa #include <dev/videomode/videomode.h> 77 1.1 rkujawa #include <dev/videomode/edidvar.h> 78 1.1 rkujawa 79 1.1 rkujawa #include <dev/i2c/i2cvar.h> 80 1.1 rkujawa #include <dev/i2c/i2c_bitbang.h> 81 1.1 rkujawa #include <dev/i2c/ddcvar.h> 82 1.1 rkujawa 83 1.1 rkujawa #ifdef DDB 84 1.1 rkujawa #include <machine/db_machdep.h> 85 1.1 rkujawa #include <ddb/db_command.h> 86 1.1 rkujawa #include <ddb/db_output.h> 87 1.1 rkujawa #endif 88 1.1 rkujawa 89 1.1 rkujawa #define VFB_MAXPOLL 100000 /* status/hold polls */ 90 1.1 rkujawa #define VFB_VSYNCPOLL 40000 /* vsync wait, ~2 frames in us */ 91 1.1 rkujawa #define VFB_SHORTPOLL 100 /* polls in the RISC debug port */ 92 1.1 rkujawa #define VFB_FIFOPOLL 100000 /* FIFO waits, us */ 93 1.1 rkujawa #define VFB_DRAINPOLL 10000 /* output FIFO drains */ 94 1.1 rkujawa 95 1.1 rkujawa #define VFB_PROBE_PATTERN 0xf5faaf5fU 96 1.1 rkujawa #define VFB_PROBE_START 0x12345678U 97 1.1 rkujawa #define VFB_MAXVRAM (16 * 1024 * 1024) 98 1.1 rkujawa #define VFB_MAXUCODE (1024 * 1024) /* sanity cap for firmware */ 99 1.1 rkujawa 100 1.1 rkujawa #define VFB_PLL_REF 1431818 /* 14.31818 MHz in units of 10 Hz */ 101 1.1 rkujawa 102 1.1 rkujawa #define VFB_FIRMWARE_NAME "v20002d.uc" 103 1.1 rkujawa 104 1.1 rkujawa #define VFB_GC_GAP 5 /* scanlines between fb and glyph cache */ 105 1.1 rkujawa #define VFB_UNDERLINE_OFF 2 /* underline offset from cell bottom */ 106 1.1 rkujawa #define VFB_GETPIXEL_PATTERN 0x5a5a5a5aU /* handshake test pixels */ 107 1.1 rkujawa #define VFB_CMD_BOGUS 50 /* unassigned cmd for fault injection */ 108 1.1 rkujawa 109 1.1 rkujawa #define VFB_ACCEL_OFF 0 /* no microcode loaded */ 110 1.1 rkujawa #define VFB_ACCEL_SW 1 /* degraded after a fault; never retried */ 111 1.1 rkujawa #define VFB_ACCEL_ON 2 /* RISC running, handshake passed */ 112 1.1 rkujawa 113 1.1 rkujawa struct veritefb_softc { 114 1.1 rkujawa device_t sc_dev; 115 1.1 rkujawa pci_chipset_tag_t sc_pc; 116 1.1 rkujawa pcitag_t sc_pcitag; 117 1.1 rkujawa 118 1.1 rkujawa bus_space_tag_t sc_iot; /* I/O registers (BAR1) */ 119 1.1 rkujawa bus_space_handle_t sc_ioh; 120 1.1 rkujawa bus_addr_t sc_io_paddr; 121 1.1 rkujawa bus_size_t sc_ios; 122 1.1 rkujawa bus_space_tag_t sc_mmiot; /* MMIO registers (BAR2) */ 123 1.1 rkujawa bus_space_handle_t sc_mmioh; 124 1.1 rkujawa bus_addr_t sc_mmio_paddr; 125 1.1 rkujawa bus_size_t sc_mmios; 126 1.1 rkujawa 127 1.1 rkujawa bus_space_tag_t sc_regt; 128 1.1 rkujawa bus_space_handle_t sc_regh; 129 1.1 rkujawa bus_size_t sc_regoff; 130 1.1 rkujawa bus_space_tag_t sc_memt; /* fb aperture (BAR0) */ 131 1.1 rkujawa bus_space_handle_t sc_memh; 132 1.1 rkujawa bus_addr_t sc_fb_paddr; 133 1.1 rkujawa bus_size_t sc_apsize; /* mapped aperture size */ 134 1.1 rkujawa bus_size_t sc_memsize; /* probed VRAM size */ 135 1.1 rkujawa bus_size_t sc_fb_offset; /* fb start (microcode area) */ 136 1.1 rkujawa 137 1.1 rkujawa /* RISC / acceleration state */ 138 1.1 rkujawa int sc_accel; /* VFB_ACCEL_* */ 139 1.1 rkujawa uint32_t sc_ucode_entry; 140 1.1 rkujawa uint8_t *sc_ucode; /* firmware image copy */ 141 1.1 rkujawa size_t sc_ucode_size; 142 1.1 rkujawa 143 1.1 rkujawa glyphcache sc_gc; /* VRAM glyph cache */ 144 1.1 rkujawa bool sc_gc_initted; 145 1.1 rkujawa #ifdef VERITEFB_DEBUG 146 1.1 rkujawa /* last words written to the input FIFO */ 147 1.1 rkujawa #define VFB_RING_SIZE 128 /* power of two */ 148 1.1 rkujawa uint32_t sc_ring[VFB_RING_SIZE]; 149 1.1 rkujawa unsigned sc_ring_count; 150 1.1 rkujawa struct veritefb_dbg_stats sc_stats; 151 1.1 rkujawa #endif 152 1.1 rkujawa 153 1.1 rkujawa /* software rendering ops, the permanent fallback */ 154 1.1 rkujawa void (*sc_orig_eraserows)(void *, int, int, long); 155 1.1 rkujawa void (*sc_orig_erasecols)(void *, int, int, int, long); 156 1.1 rkujawa void (*sc_orig_copyrows)(void *, int, int, int); 157 1.1 rkujawa void (*sc_orig_copycols)(void *, int, int, int, int); 158 1.1 rkujawa void (*sc_orig_putchar)(void *, int, int, u_int, long); 159 1.1 rkujawa 160 1.1 rkujawa int sc_width; 161 1.1 rkujawa int sc_height; 162 1.1 rkujawa int sc_depth; 163 1.1 rkujawa int sc_linebytes; 164 1.1 rkujawa uint8_t sc_stride0; /* pixel engine stride */ 165 1.1 rkujawa uint8_t sc_stride1; 166 1.1 rkujawa const struct videomode *sc_videomode; /* the mode in use */ 167 1.1 rkujawa 168 1.1 rkujawa /* DDC/EDID */ 169 1.1 rkujawa struct i2c_controller sc_i2c; 170 1.1 rkujawa uint32_t sc_ddc_base; /* CRTCCTL sans DDC bits */ 171 1.1 rkujawa uint8_t sc_edid[128]; 172 1.1 rkujawa struct edid_info sc_ei; 173 1.1 rkujawa bool sc_edid_valid; 174 1.1 rkujawa 175 1.1 rkujawa int sc_mode; /* WSDISPLAYIO_MODE_* */ 176 1.1 rkujawa struct vcons_data vd; 177 1.1 rkujawa struct vcons_screen sc_console_screen; 178 1.1 rkujawa struct wsscreen_descr sc_defaultscreen_descr; 179 1.1 rkujawa const struct wsscreen_descr *sc_screens[1]; 180 1.1 rkujawa struct wsscreen_list sc_screenlist; 181 1.1 rkujawa u_char sc_cmap_red[256]; 182 1.1 rkujawa u_char sc_cmap_green[256]; 183 1.1 rkujawa u_char sc_cmap_blue[256]; 184 1.1 rkujawa }; 185 1.1 rkujawa 186 1.1 rkujawa static const struct veritefb_stride { 187 1.1 rkujawa uint16_t linebytes; 188 1.1 rkujawa uint8_t stride0, stride1; 189 1.1 rkujawa } veritefb_stride_table[] = { 190 1.1 rkujawa { 640, 2, 4 }, 191 1.1 rkujawa { 704, 6, 4 }, 192 1.1 rkujawa { 768, 5, 0 }, 193 1.1 rkujawa { 784, 5, 1 }, 194 1.1 rkujawa { 800, 5, 2 }, 195 1.1 rkujawa { 832, 5, 3 }, 196 1.1 rkujawa { 896, 5, 4 }, 197 1.1 rkujawa { 1024, 3, 0 }, 198 1.1 rkujawa { 1040, 3, 1 }, 199 1.1 rkujawa { 1056, 3, 2 }, 200 1.1 rkujawa { 1088, 3, 3 }, 201 1.1 rkujawa { 1152, 3, 4 }, 202 1.1 rkujawa { 1168, 7, 1 }, 203 1.1 rkujawa { 1184, 7, 2 }, 204 1.1 rkujawa { 1216, 7, 3 }, 205 1.1 rkujawa { 1280, 1, 5 }, 206 1.1 rkujawa { 1536, 2, 5 }, 207 1.1 rkujawa { 1600, 6, 5 }, 208 1.1 rkujawa { 1792, 5, 5 }, 209 1.1 rkujawa { 2048, 0, 6 }, 210 1.1 rkujawa { 0, 0, 0 } 211 1.1 rkujawa }; 212 1.1 rkujawa 213 1.1 rkujawa static int veritefb_match(device_t, cfdata_t, void *); 214 1.1 rkujawa static void veritefb_attach(device_t, device_t, void *); 215 1.1 rkujawa 216 1.1 rkujawa static void veritefb_risc_softreset(struct veritefb_softc *); 217 1.1 rkujawa static void veritefb_risc_hold(struct veritefb_softc *); 218 1.1 rkujawa static void veritefb_risc_continue(struct veritefb_softc *); 219 1.1 rkujawa static void veritefb_risc_forcestep(struct veritefb_softc *, uint32_t); 220 1.1 rkujawa static void veritefb_risc_writerf(struct veritefb_softc *, uint8_t, 221 1.1 rkujawa uint32_t); 222 1.1 rkujawa static uint32_t veritefb_risc_readrf(struct veritefb_softc *, uint8_t); 223 1.1 rkujawa static uint32_t veritefb_risc_readmem(struct veritefb_softc *, uint32_t); 224 1.1 rkujawa static void veritefb_risc_writemem(struct veritefb_softc *, uint32_t, 225 1.1 rkujawa uint32_t); 226 1.1 rkujawa static void veritefb_risc_flushicache(struct veritefb_softc *); 227 1.1 rkujawa static void veritefb_risc_start(struct veritefb_softc *, uint32_t); 228 1.1 rkujawa 229 1.1 rkujawa static uint32_t veritefb_risc_samplepc(struct veritefb_softc *); 230 1.1 rkujawa static void veritefb_accel_fail(struct veritefb_softc *, const char *); 231 1.1 rkujawa static int veritefb_waitfifo(struct veritefb_softc *, int); 232 1.1 rkujawa static int veritefb_drain_outfifo(struct veritefb_softc *); 233 1.1 rkujawa static int veritefb_read_outfifo(struct veritefb_softc *, uint32_t *); 234 1.1 rkujawa static void veritefb_load_firmware(device_t); 235 1.1 rkujawa static bool veritefb_ucode_to_vram(struct veritefb_softc *); 236 1.1 rkujawa static bool veritefb_risc_init(struct veritefb_softc *); 237 1.1 rkujawa static size_t veritefb_mem_size(struct veritefb_softc *); 238 1.1 rkujawa 239 1.1 rkujawa static bool veritefb_calc_pclk(int, int *, int *, int *); 240 1.1 rkujawa static const struct veritefb_stride *veritefb_stride_for(int); 241 1.1 rkujawa static bool veritefb_set_mode(struct veritefb_softc *, 242 1.1 rkujawa const struct videomode *); 243 1.1 rkujawa 244 1.1 rkujawa static void veritefb_i2cbb_set_bits(void *, uint32_t); 245 1.1 rkujawa static void veritefb_i2cbb_set_dir(void *, uint32_t); 246 1.1 rkujawa static uint32_t veritefb_i2cbb_read_bits(void *); 247 1.1 rkujawa static int veritefb_i2c_send_start(void *, int); 248 1.1 rkujawa static int veritefb_i2c_send_stop(void *, int); 249 1.1 rkujawa static int veritefb_i2c_initiate_xfer(void *, i2c_addr_t, int); 250 1.1 rkujawa static int veritefb_i2c_read_byte(void *, uint8_t *, int); 251 1.1 rkujawa static int veritefb_i2c_write_byte(void *, uint8_t, int); 252 1.1 rkujawa static void veritefb_ddc_read(struct veritefb_softc *); 253 1.1 rkujawa static void veritefb_pick_mode(struct veritefb_softc *); 254 1.1 rkujawa static void veritefb_init_dac(struct veritefb_softc *); 255 1.1 rkujawa static void veritefb_wait_vsync(struct veritefb_softc *); 256 1.1 rkujawa static void veritefb_set_dac_entry(struct veritefb_softc *, int, uint8_t, 257 1.1 rkujawa uint8_t, uint8_t); 258 1.1 rkujawa static void veritefb_init_palette(struct veritefb_softc *); 259 1.1 rkujawa static int veritefb_getcmap(struct veritefb_softc *, 260 1.1 rkujawa struct wsdisplay_cmap *); 261 1.1 rkujawa static int veritefb_putcmap(struct veritefb_softc *, 262 1.1 rkujawa struct wsdisplay_cmap *); 263 1.1 rkujawa 264 1.1 rkujawa static void veritefb_init_screen(void *, struct vcons_screen *, int, 265 1.1 rkujawa long *); 266 1.1 rkujawa static paddr_t veritefb_mmap(void *, void *, off_t, int); 267 1.1 rkujawa static int veritefb_ioctl(void *, void *, u_long, void *, int, 268 1.1 rkujawa struct lwp *); 269 1.1 rkujawa 270 1.1 rkujawa static void veritefb_sync(struct veritefb_softc *); 271 1.1 rkujawa static bool veritefb_rectfill(struct veritefb_softc *, int, int, int, 272 1.1 rkujawa int, uint32_t); 273 1.1 rkujawa static bool veritefb_bitblt(struct veritefb_softc *, int, int, int, int, 274 1.1 rkujawa int, int); 275 1.1 rkujawa static void veritefb_eraserows(void *, int, int, long); 276 1.1 rkujawa static void veritefb_erasecols(void *, int, int, int, long); 277 1.1 rkujawa static void veritefb_copyrows(void *, int, int, int); 278 1.1 rkujawa static void veritefb_copycols(void *, int, int, int, int); 279 1.1 rkujawa static void veritefb_putchar(void *, int, int, u_int, long); 280 1.1 rkujawa static void veritefb_gc_bitblt(void *, int, int, int, int, int, int, 281 1.1 rkujawa int); 282 1.1 rkujawa 283 1.1 rkujawa #if defined(DDB) && defined(VERITEFB_DEBUG) 284 1.1 rkujawa static void veritefb_ddb_attach(struct veritefb_softc *); 285 1.1 rkujawa #endif 286 1.1 rkujawa 287 1.1 rkujawa CFATTACH_DECL_NEW(veritefb, sizeof(struct veritefb_softc), 288 1.1 rkujawa veritefb_match, veritefb_attach, NULL, NULL); 289 1.1 rkujawa 290 1.1 rkujawa static struct wsdisplay_accessops veritefb_accessops = { 291 1.1 rkujawa .ioctl = veritefb_ioctl, 292 1.1 rkujawa .mmap = veritefb_mmap, 293 1.1 rkujawa }; 294 1.1 rkujawa 295 1.1 rkujawa static inline uint8_t 296 1.1 rkujawa vfb_read1(struct veritefb_softc *sc, bus_size_t reg) 297 1.1 rkujawa { 298 1.1 rkujawa if (reg >= VFB_IOONLY_BASE) 299 1.1 rkujawa return bus_space_read_1(sc->sc_iot, sc->sc_ioh, reg); 300 1.1 rkujawa return bus_space_read_1(sc->sc_regt, sc->sc_regh, 301 1.1 rkujawa sc->sc_regoff + reg); 302 1.1 rkujawa } 303 1.1 rkujawa 304 1.1 rkujawa static inline void 305 1.1 rkujawa vfb_write1(struct veritefb_softc *sc, bus_size_t reg, uint8_t val) 306 1.1 rkujawa { 307 1.1 rkujawa if (reg >= VFB_IOONLY_BASE) { 308 1.1 rkujawa bus_space_write_1(sc->sc_iot, sc->sc_ioh, reg, val); 309 1.1 rkujawa return; 310 1.1 rkujawa } 311 1.1 rkujawa bus_space_write_1(sc->sc_regt, sc->sc_regh, sc->sc_regoff + reg, 312 1.1 rkujawa val); 313 1.1 rkujawa } 314 1.1 rkujawa 315 1.1 rkujawa static inline uint32_t 316 1.1 rkujawa vfb_read4(struct veritefb_softc *sc, bus_size_t reg) 317 1.1 rkujawa { 318 1.1 rkujawa if (reg >= VFB_IOONLY_BASE) 319 1.1 rkujawa return bus_space_read_4(sc->sc_iot, sc->sc_ioh, reg); 320 1.1 rkujawa return bus_space_read_4(sc->sc_regt, sc->sc_regh, 321 1.1 rkujawa sc->sc_regoff + reg); 322 1.1 rkujawa } 323 1.1 rkujawa 324 1.1 rkujawa static inline void 325 1.1 rkujawa vfb_write4(struct veritefb_softc *sc, bus_size_t reg, uint32_t val) 326 1.1 rkujawa { 327 1.1 rkujawa if (reg >= VFB_IOONLY_BASE) { 328 1.1 rkujawa bus_space_write_4(sc->sc_iot, sc->sc_ioh, reg, val); 329 1.1 rkujawa return; 330 1.1 rkujawa } 331 1.1 rkujawa bus_space_write_4(sc->sc_regt, sc->sc_regh, sc->sc_regoff + reg, 332 1.1 rkujawa val); 333 1.1 rkujawa } 334 1.1 rkujawa 335 1.1 rkujawa static inline uint32_t 336 1.1 rkujawa vfb_fb_read4(struct veritefb_softc *sc, bus_size_t off) 337 1.1 rkujawa { 338 1.1 rkujawa return bus_space_read_4(sc->sc_memt, sc->sc_memh, off); 339 1.1 rkujawa } 340 1.1 rkujawa 341 1.1 rkujawa static inline void 342 1.1 rkujawa vfb_fb_write4(struct veritefb_softc *sc, bus_size_t off, uint32_t val) 343 1.1 rkujawa { 344 1.1 rkujawa bus_space_write_4(sc->sc_memt, sc->sc_memh, off, val); 345 1.1 rkujawa } 346 1.1 rkujawa 347 1.1 rkujawa /* 348 1.1 rkujawa * The FIFO window: input FIFO on write, output FIFO on read. 349 1.1 rkujawa */ 350 1.1 rkujawa static void 351 1.1 rkujawa vfb_fifo_write(struct veritefb_softc *sc, uint32_t word) 352 1.1 rkujawa { 353 1.1 rkujawa #ifdef VERITEFB_DEBUG 354 1.1 rkujawa sc->sc_ring[sc->sc_ring_count++ & (VFB_RING_SIZE - 1)] = word; 355 1.1 rkujawa #endif 356 1.1 rkujawa bus_space_write_4(sc->sc_regt, sc->sc_regh, VFB_FIFO_SWAP_NO, word); 357 1.1 rkujawa } 358 1.1 rkujawa 359 1.1 rkujawa static inline uint32_t 360 1.1 rkujawa vfb_fifo_read(struct veritefb_softc *sc) 361 1.1 rkujawa { 362 1.1 rkujawa return bus_space_read_4(sc->sc_regt, sc->sc_regh, VFB_FIFO_SWAP_NO); 363 1.1 rkujawa } 364 1.1 rkujawa 365 1.1 rkujawa static void 366 1.1 rkujawa vfb_pacepoll4(struct veritefb_softc *sc, bus_size_t reg, uint32_t data, 367 1.1 rkujawa uint32_t mask) 368 1.1 rkujawa { 369 1.1 rkujawa int i; 370 1.1 rkujawa 371 1.1 rkujawa for (i = 0; i < VFB_SHORTPOLL; i++) 372 1.1 rkujawa if ((vfb_read4(sc, reg) & mask) == (data & mask)) 373 1.1 rkujawa break; 374 1.1 rkujawa } 375 1.1 rkujawa 376 1.1 rkujawa static void 377 1.1 rkujawa vfb_pacepoll1(struct veritefb_softc *sc, bus_size_t reg, uint8_t data, 378 1.1 rkujawa uint8_t mask) 379 1.1 rkujawa { 380 1.1 rkujawa int i; 381 1.1 rkujawa 382 1.1 rkujawa for (i = 0; i < VFB_SHORTPOLL; i++) 383 1.1 rkujawa if ((vfb_read1(sc, reg) & mask) == (data & mask)) 384 1.1 rkujawa break; 385 1.1 rkujawa } 386 1.1 rkujawa 387 1.1 rkujawa static int 388 1.1 rkujawa veritefb_match(device_t parent, cfdata_t match, void *aux) 389 1.1 rkujawa { 390 1.1 rkujawa const struct pci_attach_args *pa = aux; 391 1.1 rkujawa 392 1.1 rkujawa if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_RENDITION && 393 1.1 rkujawa PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_RENDITION_V2X00) 394 1.1 rkujawa return 100; /* ahead of genfb(4) */ 395 1.1 rkujawa 396 1.1 rkujawa return 0; 397 1.1 rkujawa } 398 1.1 rkujawa 399 1.1 rkujawa static void 400 1.1 rkujawa veritefb_attach(device_t parent, device_t self, void *aux) 401 1.1 rkujawa { 402 1.1 rkujawa struct veritefb_softc *sc = device_private(self); 403 1.1 rkujawa struct wsemuldisplaydev_attach_args ws_aa; 404 1.1 rkujawa struct rasops_info *ri; 405 1.1 rkujawa const struct pci_attach_args *pa = aux; 406 1.1 rkujawa pcireg_t screg; 407 1.1 rkujawa bool console; 408 1.1 rkujawa long defattr; 409 1.1 rkujawa 410 1.1 rkujawa #ifdef VERITEFB_CONSOLE 411 1.1 rkujawa console = true; 412 1.1 rkujawa #else 413 1.1 rkujawa console = false; 414 1.1 rkujawa prop_dictionary_get_bool(device_properties(self), "is_console", 415 1.1 rkujawa &console); 416 1.1 rkujawa #endif 417 1.1 rkujawa 418 1.1 rkujawa sc->sc_dev = self; 419 1.1 rkujawa sc->sc_pc = pa->pa_pc; 420 1.1 rkujawa sc->sc_pcitag = pa->pa_tag; 421 1.1 rkujawa 422 1.1 rkujawa screg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, 423 1.1 rkujawa PCI_COMMAND_STATUS_REG); 424 1.1 rkujawa screg |= PCI_COMMAND_IO_ENABLE | PCI_COMMAND_MEM_ENABLE; 425 1.1 rkujawa pci_conf_write(sc->sc_pc, sc->sc_pcitag, PCI_COMMAND_STATUS_REG, 426 1.1 rkujawa screg); 427 1.1 rkujawa 428 1.1 rkujawa pci_aprint_devinfo(pa, NULL); 429 1.1 rkujawa 430 1.1 rkujawa if (pci_mapreg_map(pa, VFB_IO_BAR, PCI_MAPREG_TYPE_IO, 0, 431 1.1 rkujawa &sc->sc_iot, &sc->sc_ioh, &sc->sc_io_paddr, &sc->sc_ios) != 0) { 432 1.1 rkujawa aprint_error_dev(sc->sc_dev, "unable to map I/O registers\n"); 433 1.1 rkujawa return; 434 1.1 rkujawa } 435 1.1 rkujawa sc->sc_regt = sc->sc_iot; 436 1.1 rkujawa sc->sc_regh = sc->sc_ioh; 437 1.1 rkujawa sc->sc_regoff = 0; 438 1.1 rkujawa 439 1.1 rkujawa /* 440 1.1 rkujawa * Reset and hold it the RISC before touching the rest of the card. 441 1.1 rkujawa */ 442 1.1 rkujawa veritefb_risc_softreset(sc); 443 1.1 rkujawa veritefb_risc_hold(sc); 444 1.1 rkujawa 445 1.1 rkujawa if (pci_mapreg_map(pa, VFB_MMIO_BAR, PCI_MAPREG_TYPE_MEM, 0, 446 1.1 rkujawa &sc->sc_mmiot, &sc->sc_mmioh, &sc->sc_mmio_paddr, 447 1.1 rkujawa &sc->sc_mmios) == 0) { 448 1.1 rkujawa sc->sc_regt = sc->sc_mmiot; 449 1.1 rkujawa sc->sc_regh = sc->sc_mmioh; 450 1.1 rkujawa sc->sc_regoff = VFB_MMIO_REG_BASE; 451 1.1 rkujawa } else { 452 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 453 1.1 rkujawa "MMIO BAR unmappable, all registers via I/O\n"); 454 1.1 rkujawa } 455 1.1 rkujawa 456 1.1 rkujawa if (pci_mapreg_map(pa, VFB_FB_BAR, PCI_MAPREG_TYPE_MEM, 457 1.1 rkujawa BUS_SPACE_MAP_LINEAR, &sc->sc_memt, &sc->sc_memh, 458 1.1 rkujawa &sc->sc_fb_paddr, &sc->sc_apsize) != 0) { 459 1.1 rkujawa aprint_error_dev(sc->sc_dev, 460 1.1 rkujawa "unable to map framebuffer aperture\n"); 461 1.1 rkujawa return; 462 1.1 rkujawa } 463 1.1 rkujawa 464 1.1 rkujawa if (sc->sc_regoff != 0) 465 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 466 1.1 rkujawa "fb at 0x%08x, MMIO registers at 0x%08x, " 467 1.1 rkujawa "I/O registers at 0x%04x\n", 468 1.1 rkujawa (uint32_t)sc->sc_fb_paddr, (uint32_t)sc->sc_mmio_paddr, 469 1.1 rkujawa (uint32_t)sc->sc_io_paddr); 470 1.1 rkujawa else 471 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 472 1.1 rkujawa "fb at 0x%08x, I/O registers at 0x%04x\n", 473 1.1 rkujawa (uint32_t)sc->sc_fb_paddr, (uint32_t)sc->sc_io_paddr); 474 1.1 rkujawa 475 1.1 rkujawa sc->sc_memsize = veritefb_mem_size(sc); 476 1.1 rkujawa if (sc->sc_memsize == 0) { 477 1.1 rkujawa aprint_error_dev(sc->sc_dev, "VRAM probe failed\n"); 478 1.1 rkujawa return; 479 1.1 rkujawa } 480 1.1 rkujawa 481 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "%zu MB video memory present\n", 482 1.1 rkujawa sc->sc_memsize / 1024 / 1024); 483 1.1 rkujawa 484 1.1 rkujawa /* 485 1.1 rkujawa * The first VFB_MC_SIZE bytes of VRAM are reserved for the 2D 486 1.1 rkujawa * microcode, the framebuffer lives above it. 487 1.1 rkujawa */ 488 1.1 rkujawa sc->sc_fb_offset = VFB_MC_SIZE; 489 1.1 rkujawa sc->sc_accel = VFB_ACCEL_OFF; 490 1.1 rkujawa 491 1.1 rkujawa veritefb_ddc_read(sc); 492 1.1 rkujawa veritefb_pick_mode(sc); 493 1.1 rkujawa 494 1.1 rkujawa sc->sc_width = sc->sc_videomode->hdisplay; 495 1.1 rkujawa sc->sc_height = sc->sc_videomode->vdisplay; 496 1.1 rkujawa sc->sc_depth = 8; 497 1.1 rkujawa 498 1.1 rkujawa { 499 1.1 rkujawa const struct veritefb_stride *st; 500 1.1 rkujawa 501 1.1 rkujawa st = veritefb_stride_for(sc->sc_width * (sc->sc_depth / 8)); 502 1.1 rkujawa if (st == NULL) { 503 1.1 rkujawa aprint_error_dev(sc->sc_dev, 504 1.1 rkujawa "no stride encoding for %d bytes/line\n", 505 1.1 rkujawa sc->sc_width * (sc->sc_depth / 8)); 506 1.1 rkujawa return; 507 1.1 rkujawa } 508 1.1 rkujawa sc->sc_linebytes = st->linebytes; 509 1.1 rkujawa sc->sc_stride0 = st->stride0; 510 1.1 rkujawa sc->sc_stride1 = st->stride1; 511 1.1 rkujawa } 512 1.1 rkujawa 513 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "setting %dx%d %d bpp resolution\n", 514 1.1 rkujawa sc->sc_width, sc->sc_height, sc->sc_depth); 515 1.1 rkujawa 516 1.1 rkujawa if (!veritefb_set_mode(sc, sc->sc_videomode)) { 517 1.1 rkujawa aprint_error_dev(sc->sc_dev, "mode set failed\n"); 518 1.1 rkujawa return; 519 1.1 rkujawa } 520 1.1 rkujawa 521 1.1 rkujawa bus_space_set_region_4(sc->sc_memt, sc->sc_memh, sc->sc_fb_offset, 0, 522 1.1 rkujawa (sc->sc_linebytes * sc->sc_height) / 4); 523 1.1 rkujawa 524 1.1 rkujawa veritefb_init_palette(sc); 525 1.1 rkujawa 526 1.1 rkujawa sc->sc_defaultscreen_descr = (struct wsscreen_descr){ 527 1.1 rkujawa "default", 528 1.1 rkujawa 0, 0, 529 1.1 rkujawa NULL, 530 1.1 rkujawa 8, 16, 531 1.1 rkujawa WSSCREEN_WSCOLORS | WSSCREEN_HILIT, 532 1.1 rkujawa NULL 533 1.1 rkujawa }; 534 1.1 rkujawa sc->sc_screens[0] = &sc->sc_defaultscreen_descr; 535 1.1 rkujawa sc->sc_screenlist = (struct wsscreen_list){1, sc->sc_screens}; 536 1.1 rkujawa sc->sc_mode = WSDISPLAYIO_MODE_EMUL; 537 1.1 rkujawa 538 1.1 rkujawa vcons_init(&sc->vd, sc, &sc->sc_defaultscreen_descr, 539 1.1 rkujawa &veritefb_accessops); 540 1.1 rkujawa sc->vd.init_screen = veritefb_init_screen; 541 1.1 rkujawa 542 1.1 rkujawa /* Glyph cache in the VRAM above the visible framebuffer. */ 543 1.1 rkujawa sc->sc_gc.gc_bitblt = veritefb_gc_bitblt; 544 1.1 rkujawa sc->sc_gc.gc_rectfill = NULL; 545 1.1 rkujawa sc->sc_gc.gc_blitcookie = sc; 546 1.1 rkujawa sc->sc_gc.gc_rop = VFB_ROP_COPY; 547 1.1 rkujawa sc->vd.show_screen_cookie = &sc->sc_gc; 548 1.1 rkujawa sc->vd.show_screen_cb = glyphcache_adapt; 549 1.1 rkujawa 550 1.1 rkujawa ri = &sc->sc_console_screen.scr_ri; 551 1.1 rkujawa 552 1.1 rkujawa vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1, &defattr); 553 1.1 rkujawa sc->sc_console_screen.scr_flags |= VCONS_SCREEN_IS_STATIC; 554 1.1 rkujawa 555 1.1 rkujawa sc->sc_gc_initted = glyphcache_init(&sc->sc_gc, 556 1.1 rkujawa sc->sc_height + VFB_GC_GAP, 557 1.1 rkujawa (int)((sc->sc_memsize - sc->sc_fb_offset) / sc->sc_linebytes) - 558 1.1 rkujawa sc->sc_height - VFB_GC_GAP, 559 1.1 rkujawa sc->sc_width, 560 1.1 rkujawa ri->ri_font->fontwidth, 561 1.1 rkujawa ri->ri_font->fontheight, 562 1.1 rkujawa defattr) == 0; 563 1.1 rkujawa if (!sc->sc_gc_initted) 564 1.1 rkujawa aprint_error_dev(sc->sc_dev, "glyph cache init failed\n"); 565 1.1 rkujawa 566 1.1 rkujawa sc->sc_defaultscreen_descr.textops = &ri->ri_ops; 567 1.1 rkujawa sc->sc_defaultscreen_descr.capabilities = ri->ri_caps; 568 1.1 rkujawa sc->sc_defaultscreen_descr.nrows = ri->ri_rows; 569 1.1 rkujawa sc->sc_defaultscreen_descr.ncols = ri->ri_cols; 570 1.1 rkujawa 571 1.1 rkujawa vcons_redraw_screen(&sc->sc_console_screen); 572 1.1 rkujawa 573 1.1 rkujawa if (console) { 574 1.1 rkujawa wsdisplay_cnattach(&sc->sc_defaultscreen_descr, ri, 0, 0, 575 1.1 rkujawa defattr); 576 1.1 rkujawa vcons_replay_msgbuf(&sc->sc_console_screen); 577 1.1 rkujawa } 578 1.1 rkujawa 579 1.1 rkujawa ws_aa.console = console; 580 1.1 rkujawa ws_aa.scrdata = &sc->sc_screenlist; 581 1.1 rkujawa ws_aa.accessops = &veritefb_accessops; 582 1.1 rkujawa ws_aa.accesscookie = &sc->vd; 583 1.1 rkujawa 584 1.1 rkujawa config_found(sc->sc_dev, &ws_aa, wsemuldisplaydevprint, CFARGS_NONE); 585 1.1 rkujawa 586 1.1 rkujawa #if defined(DDB) && defined(VERITEFB_DEBUG) 587 1.1 rkujawa veritefb_ddb_attach(sc); 588 1.1 rkujawa #endif 589 1.1 rkujawa 590 1.1 rkujawa /* Firmware needs a mounted root filesystem. */ 591 1.1 rkujawa config_mountroot(self, veritefb_load_firmware); 592 1.1 rkujawa } 593 1.1 rkujawa 594 1.1 rkujawa /* 595 1.1 rkujawa * Reset the chip, leaving the RISC held. 596 1.1 rkujawa */ 597 1.1 rkujawa static void 598 1.1 rkujawa veritefb_risc_softreset(struct veritefb_softc *sc) 599 1.1 rkujawa { 600 1.1 rkujawa int i; 601 1.1 rkujawa 602 1.1 rkujawa vfb_write1(sc, VFB_DEBUG, VFB_DEBUG_SOFTRESET | VFB_DEBUG_HOLDRISC); 603 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, VFB_STATEINDEX_PC); 604 1.1 rkujawa for (i = 0; i < 3; i++) 605 1.1 rkujawa (void)vfb_read4(sc, VFB_STATEDATA); 606 1.1 rkujawa 607 1.1 rkujawa vfb_write1(sc, VFB_DEBUG, VFB_DEBUG_HOLDRISC); 608 1.1 rkujawa for (i = 0; i < 3; i++) 609 1.1 rkujawa (void)vfb_read4(sc, VFB_STATEDATA); 610 1.1 rkujawa 611 1.1 rkujawa /* Clear any pending interrupts, no byte swapping. */ 612 1.1 rkujawa vfb_write1(sc, VFB_INTR, 0xff); 613 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, VFB_MEMENDIAN_NO); 614 1.1 rkujawa } 615 1.1 rkujawa 616 1.1 rkujawa /* 617 1.1 rkujawa * Make sure the RISC is held. 618 1.1 rkujawa */ 619 1.1 rkujawa static void 620 1.1 rkujawa veritefb_risc_hold(struct veritefb_softc *sc) 621 1.1 rkujawa { 622 1.1 rkujawa uint8_t debugreg; 623 1.1 rkujawa int i; 624 1.1 rkujawa 625 1.1 rkujawa for (i = 0; i < VFB_MAXPOLL; i++) { 626 1.1 rkujawa if ((vfb_read1(sc, VFB_STATUS) & VFB_STATUS_HOLD_MASK) == 627 1.1 rkujawa VFB_STATUS_HOLD_MASK) 628 1.1 rkujawa break; 629 1.1 rkujawa delay(1); 630 1.1 rkujawa } 631 1.1 rkujawa if (i == VFB_MAXPOLL) 632 1.1 rkujawa aprint_debug_dev(sc->sc_dev, 633 1.1 rkujawa "timeout waiting for idle status before hold\n"); 634 1.1 rkujawa 635 1.1 rkujawa debugreg = vfb_read1(sc, VFB_DEBUG); 636 1.1 rkujawa vfb_write1(sc, VFB_DEBUG, debugreg | VFB_DEBUG_HOLDRISC); 637 1.1 rkujawa 638 1.1 rkujawa for (i = 0; i < VFB_MAXPOLL; i++) { 639 1.1 rkujawa if (vfb_read1(sc, VFB_STATUS) & VFB_STATUS_HELD) 640 1.1 rkujawa break; 641 1.1 rkujawa delay(1); 642 1.1 rkujawa } 643 1.1 rkujawa if (i == VFB_MAXPOLL) 644 1.1 rkujawa aprint_debug_dev(sc->sc_dev, 645 1.1 rkujawa "timeout waiting for hold confirmation\n"); 646 1.1 rkujawa } 647 1.1 rkujawa 648 1.1 rkujawa /* 649 1.1 rkujawa * Probe the amount of VRAM by write/readback at 1 MB steps... 650 1.1 rkujawa */ 651 1.1 rkujawa static size_t 652 1.1 rkujawa veritefb_mem_size(struct veritefb_softc *sc) 653 1.1 rkujawa { 654 1.1 rkujawa const bus_size_t onemeg = 1024 * 1024; 655 1.1 rkujawa bus_size_t offset, maxvram; 656 1.1 rkujawa uint32_t pattern, start; 657 1.1 rkujawa uint8_t modereg, memendian; 658 1.1 rkujawa size_t memsize; 659 1.1 rkujawa 660 1.1 rkujawa maxvram = MIN(VFB_MAXVRAM, sc->sc_apsize); 661 1.1 rkujawa 662 1.1 rkujawa modereg = vfb_read1(sc, VFB_MODE); 663 1.1 rkujawa vfb_write1(sc, VFB_MODE, VFB_MODE_NATIVE); 664 1.1 rkujawa memendian = vfb_read1(sc, VFB_MEMENDIAN); 665 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, VFB_MEMENDIAN_NO); 666 1.1 rkujawa 667 1.1 rkujawa start = vfb_fb_read4(sc, 0); 668 1.1 rkujawa vfb_fb_write4(sc, 0, VFB_PROBE_START); 669 1.1 rkujawa for (offset = onemeg; offset < maxvram; offset += onemeg) { 670 1.1 rkujawa pattern = vfb_fb_read4(sc, offset); 671 1.1 rkujawa if (pattern == VFB_PROBE_START) 672 1.1 rkujawa break; /* wrapped around, back at offset 0 */ 673 1.1 rkujawa 674 1.1 rkujawa pattern ^= VFB_PROBE_PATTERN; 675 1.1 rkujawa vfb_fb_write4(sc, offset, pattern); 676 1.1 rkujawa if (vfb_fb_read4(sc, offset) != pattern) { 677 1.1 rkujawa offset -= onemeg; 678 1.1 rkujawa break; 679 1.1 rkujawa } 680 1.1 rkujawa vfb_fb_write4(sc, offset, pattern ^ VFB_PROBE_PATTERN); 681 1.1 rkujawa } 682 1.1 rkujawa vfb_fb_write4(sc, 0, start); 683 1.1 rkujawa 684 1.1 rkujawa if (offset >= maxvram) 685 1.1 rkujawa memsize = 4 * onemeg; 686 1.1 rkujawa else 687 1.1 rkujawa memsize = offset; 688 1.1 rkujawa 689 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, memendian); 690 1.1 rkujawa vfb_write1(sc, VFB_MODE, modereg); 691 1.1 rkujawa 692 1.1 rkujawa return memsize; 693 1.1 rkujawa } 694 1.1 rkujawa 695 1.1 rkujawa /* 696 1.1 rkujawa * Find PLL parameters for the requested pixel clock 697 1.1 rkujawa */ 698 1.1 rkujawa static bool 699 1.1 rkujawa veritefb_calc_pclk(int kHz, int *m, int *n, int *p) 700 1.1 rkujawa { 701 1.1 rkujawa int64_t target, vco, pcf, freq, diff, mindiff; 702 1.1 rkujawa int mm, nn, pp; 703 1.1 rkujawa 704 1.1 rkujawa target = (int64_t)kHz * 100; 705 1.1 rkujawa mindiff = INT64_MAX; 706 1.1 rkujawa *m = *n = *p = 0; 707 1.1 rkujawa 708 1.1 rkujawa for (pp = 1; pp <= VFB_PLL_P_MAX; pp++) { 709 1.1 rkujawa for (nn = 1; nn <= VFB_PLL_N_MAX; nn++) { 710 1.1 rkujawa pcf = VFB_PLL_REF / nn; 711 1.1 rkujawa if (pcf < VFB_PLL_PCF_MIN || pcf > VFB_PLL_PCF_MAX) 712 1.1 rkujawa continue; 713 1.1 rkujawa for (mm = 1; mm <= VFB_PLL_M_MAX; mm++) { 714 1.1 rkujawa vco = (int64_t)VFB_PLL_REF * mm / nn; 715 1.1 rkujawa if (vco < VFB_PLL_VCO_MIN || 716 1.1 rkujawa vco > VFB_PLL_VCO_MAX) 717 1.1 rkujawa continue; 718 1.1 rkujawa freq = vco / pp; 719 1.1 rkujawa diff = freq > target ? 720 1.1 rkujawa freq - target : target - freq; 721 1.1 rkujawa if (diff < mindiff) { 722 1.1 rkujawa *m = mm; 723 1.1 rkujawa *n = nn; 724 1.1 rkujawa *p = pp; 725 1.1 rkujawa mindiff = diff; 726 1.1 rkujawa } 727 1.1 rkujawa } 728 1.1 rkujawa } 729 1.1 rkujawa } 730 1.1 rkujawa 731 1.1 rkujawa return *m != 0; 732 1.1 rkujawa } 733 1.1 rkujawa 734 1.1 rkujawa /* 735 1.1 rkujawa * Smallest pixel-engine stride encoding that fits a line of the given 736 1.1 rkujawa * width... widths with no dense encoding get a padded framebuffer. 737 1.1 rkujawa */ 738 1.1 rkujawa static const struct veritefb_stride * 739 1.1 rkujawa veritefb_stride_for(int linebytes) 740 1.1 rkujawa { 741 1.1 rkujawa const struct veritefb_stride *st; 742 1.1 rkujawa 743 1.1 rkujawa for (st = veritefb_stride_table; st->linebytes != 0; st++) 744 1.1 rkujawa if (st->linebytes >= linebytes) 745 1.1 rkujawa return st; 746 1.1 rkujawa return NULL; 747 1.1 rkujawa } 748 1.1 rkujawa 749 1.1 rkujawa /* 750 1.1 rkujawa * Program a native (non-VGA) mode: memory/system clocks, pixel clock 751 1.1 rkujawa * PLL, RAMDAC, CRTC timing, frame base and stride, then enable video. 752 1.1 rkujawa */ 753 1.1 rkujawa static bool 754 1.1 rkujawa veritefb_set_mode(struct veritefb_softc *sc, const struct videomode *vm) 755 1.1 rkujawa { 756 1.1 rkujawa uint32_t memctl, crtcctl, offset, screenwidth; 757 1.1 rkujawa int m, n, p; 758 1.1 rkujawa 759 1.1 rkujawa if (!veritefb_calc_pclk(vm->dot_clock, &m, &n, &p)) { 760 1.1 rkujawa aprint_error_dev(sc->sc_dev, "no PLL solution for %d kHz\n", 761 1.1 rkujawa vm->dot_clock); 762 1.1 rkujawa return false; 763 1.1 rkujawa } 764 1.1 rkujawa aprint_debug_dev(sc->sc_dev, "PLL M=%d N=%d P=%d for %d kHz\n", 765 1.1 rkujawa m, n, p, vm->dot_clock); 766 1.1 rkujawa 767 1.1 rkujawa /* Leave VGA emulation; no legacy 0xA0000 window. */ 768 1.1 rkujawa vfb_write1(sc, VFB_MODE, VFB_MODE_NATIVE); 769 1.1 rkujawa 770 1.1 rkujawa /* 771 1.1 rkujawa * 8bpp this does not matter... 772 1.1 rkujawa * TODO: Revisit for 16/32bpp. 773 1.1 rkujawa */ 774 1.1 rkujawa switch (sc->sc_depth) { 775 1.1 rkujawa case 8: 776 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, VFB_MEMENDIAN_END); 777 1.1 rkujawa break; 778 1.1 rkujawa case 16: 779 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, VFB_MEMENDIAN_HW); 780 1.1 rkujawa break; 781 1.1 rkujawa case 32: 782 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, VFB_MEMENDIAN_NO); 783 1.1 rkujawa break; 784 1.1 rkujawa } 785 1.1 rkujawa 786 1.1 rkujawa /* System/memory clock: MClk 110 MHz, SClk 55 MHz. */ 787 1.1 rkujawa vfb_write4(sc, VFB_SCLKPLL, VFB_SCLKPLL_DEFAULT); 788 1.1 rkujawa delay(VFB_PLL_STABILIZE_US); 789 1.1 rkujawa 790 1.1 rkujawa /* Resume memory refresh, default write refresh period. */ 791 1.1 rkujawa memctl = vfb_read4(sc, VFB_MEMCTL) & ~VFB_MEMCTL_HOLDREFRESH; 792 1.1 rkujawa vfb_write4(sc, VFB_MEMCTL, memctl | VFB_MEMCTL_WREFRESH_DEFAULT); 793 1.1 rkujawa 794 1.1 rkujawa /* Native mode wants swizzled memory addressing. */ 795 1.1 rkujawa memctl = vfb_read4(sc, VFB_MEMCTL) & ~VFB_MEMCTL_ADRSWIZZLE_MASK; 796 1.1 rkujawa vfb_write4(sc, VFB_MEMCTL, memctl); 797 1.1 rkujawa 798 1.1 rkujawa vfb_write4(sc, VFB_PCLKPLL, 799 1.1 rkujawa __SHIFTIN((uint32_t)n, VFB_PCLKPLL_N_MASK) | 800 1.1 rkujawa __SHIFTIN((uint32_t)p, VFB_PCLKPLL_P_MASK) | 801 1.1 rkujawa __SHIFTIN((uint32_t)m, VFB_PCLKPLL_M_MASK)); 802 1.1 rkujawa delay(VFB_PLL_STABILIZE_US); 803 1.1 rkujawa 804 1.1 rkujawa veritefb_init_dac(sc); 805 1.1 rkujawa 806 1.1 rkujawa vfb_write4(sc, VFB_CRTCHORZ, 807 1.1 rkujawa __SHIFTIN((uint32_t)(vm->hsync_start - vm->hdisplay) / 8 - 1, 808 1.1 rkujawa VFB_CRTCHORZ_FRONTPORCH_MASK) | 809 1.1 rkujawa __SHIFTIN((uint32_t)(vm->hsync_end - vm->hsync_start) / 8 - 1, 810 1.1 rkujawa VFB_CRTCHORZ_SYNC_MASK) | 811 1.1 rkujawa __SHIFTIN((uint32_t)(vm->htotal - vm->hsync_end) / 8 - 1, 812 1.1 rkujawa VFB_CRTCHORZ_BACKPORCH_MASK) | 813 1.1 rkujawa __SHIFTIN((uint32_t)vm->hdisplay / 8 - 1, 814 1.1 rkujawa VFB_CRTCHORZ_ACTIVE_MASK)); 815 1.1 rkujawa vfb_write4(sc, VFB_CRTCVERT, 816 1.1 rkujawa __SHIFTIN((uint32_t)(vm->vsync_start - vm->vdisplay) - 1, 817 1.1 rkujawa VFB_CRTCVERT_FRONTPORCH_MASK) | 818 1.1 rkujawa __SHIFTIN((uint32_t)(vm->vsync_end - vm->vsync_start) - 1, 819 1.1 rkujawa VFB_CRTCVERT_SYNC_MASK) | 820 1.1 rkujawa __SHIFTIN((uint32_t)(vm->vtotal - vm->vsync_end) - 1, 821 1.1 rkujawa VFB_CRTCVERT_BACKPORCH_MASK) | 822 1.1 rkujawa __SHIFTIN((uint32_t)vm->vdisplay - 1, 823 1.1 rkujawa VFB_CRTCVERT_ACTIVE_MASK)); 824 1.1 rkujawa 825 1.1 rkujawa screenwidth = (uint32_t)sc->sc_width * (sc->sc_depth / 8); 826 1.1 rkujawa offset = sc->sc_linebytes - screenwidth + 827 1.1 rkujawa screenwidth % VFB_VIDEOFIFO_BYTES; 828 1.1 rkujawa if (screenwidth % VFB_VIDEOFIFO_BYTES == 0) 829 1.1 rkujawa offset += VFB_VIDEOFIFO_BYTES; 830 1.1 rkujawa vfb_write4(sc, VFB_FRAMEBASEA, (uint32_t)sc->sc_fb_offset); 831 1.1 rkujawa vfb_write4(sc, VFB_CRTCOFFSET, offset & VFB_CRTCOFFSET_MASK); 832 1.1 rkujawa 833 1.1 rkujawa crtcctl = VFB_PIXFMT_8I | 834 1.1 rkujawa VFB_CRTCCTL_VIDEOFIFOSIZE128 | 835 1.1 rkujawa ((vm->flags & VID_PHSYNC) ? VFB_CRTCCTL_HSYNCHI : 0) | 836 1.1 rkujawa ((vm->flags & VID_PVSYNC) ? VFB_CRTCCTL_VSYNCHI : 0) | 837 1.1 rkujawa VFB_CRTCCTL_HSYNCENABLE | 838 1.1 rkujawa VFB_CRTCCTL_VSYNCENABLE | 839 1.1 rkujawa VFB_CRTCCTL_VIDEOENABLE; 840 1.1 rkujawa vfb_write4(sc, VFB_CRTCCTL, crtcctl); 841 1.1 rkujawa 842 1.1 rkujawa return true; 843 1.1 rkujawa } 844 1.1 rkujawa 845 1.1 rkujawa #define VFB_DDC_PACE_US 5 /* between line transitions */ 846 1.1 rkujawa #define VFB_DDC_STRETCH_US 1000 /* max tolerated clock stretch */ 847 1.1 rkujawa 848 1.1 rkujawa static const struct i2c_bitbang_ops veritefb_i2cbb_ops = { 849 1.1 rkujawa veritefb_i2cbb_set_bits, 850 1.1 rkujawa veritefb_i2cbb_set_dir, 851 1.1 rkujawa veritefb_i2cbb_read_bits, 852 1.1 rkujawa { 853 1.1 rkujawa VFB_CRTCCTL_DDCDATA, /* SDA */ 854 1.1 rkujawa VFB_CRTCCTL_DDCOUTPUT, /* SCL */ 855 1.1 rkujawa 0, /* open-drain: no direction flip */ 856 1.1 rkujawa 0 857 1.1 rkujawa } 858 1.1 rkujawa }; 859 1.1 rkujawa 860 1.1 rkujawa /* 861 1.1 rkujawa * SDA in output mode is push-pull, so open-drain is emulated 862 1.1 rkujawa */ 863 1.1 rkujawa static void 864 1.1 rkujawa veritefb_i2cbb_set_bits(void *cookie, uint32_t bits) 865 1.1 rkujawa { 866 1.1 rkujawa struct veritefb_softc *sc = cookie; 867 1.1 rkujawa uint32_t v; 868 1.1 rkujawa 869 1.1 rkujawa v = sc->sc_ddc_base & ~(VFB_CRTCCTL_DDCDATA | 870 1.1 rkujawa VFB_CRTCCTL_DDCOUTPUT | VFB_CRTCCTL_ENABLEDDC); 871 1.1 rkujawa if (bits & VFB_CRTCCTL_DDCOUTPUT) 872 1.1 rkujawa v |= VFB_CRTCCTL_DDCOUTPUT; /* SCL: release */ 873 1.1 rkujawa if (bits & VFB_CRTCCTL_DDCDATA) 874 1.1 rkujawa v |= VFB_CRTCCTL_DDCDATA; /* SDA high: mirror to latch */ 875 1.1 rkujawa else 876 1.1 rkujawa v |= VFB_CRTCCTL_ENABLEDDC; /* SDA: drive low (b7=0) */ 877 1.1 rkujawa 878 1.1 rkujawa sc->sc_ddc_base = v; 879 1.1 rkujawa vfb_write4(sc, VFB_CRTCCTL, v); 880 1.1 rkujawa delay(VFB_DDC_PACE_US); 881 1.1 rkujawa } 882 1.1 rkujawa 883 1.1 rkujawa static void 884 1.1 rkujawa veritefb_i2cbb_set_dir(void *cookie, uint32_t dir) 885 1.1 rkujawa { 886 1.1 rkujawa /* open-drain emulation: direction is part of set_bits */ 887 1.1 rkujawa } 888 1.1 rkujawa 889 1.1 rkujawa static uint32_t 890 1.1 rkujawa veritefb_i2cbb_read_bits(void *cookie) 891 1.1 rkujawa { 892 1.1 rkujawa struct veritefb_softc *sc = cookie; 893 1.1 rkujawa 894 1.1 rkujawa return vfb_read4(sc, VFB_CRTCCTL); 895 1.1 rkujawa } 896 1.1 rkujawa 897 1.1 rkujawa /* 898 1.1 rkujawa * I2C START, including a properly shaped repeated START. 899 1.1 rkujawa */ 900 1.1 rkujawa static int 901 1.1 rkujawa veritefb_i2c_send_start(void *cookie, int flags) 902 1.1 rkujawa { 903 1.1 rkujawa struct veritefb_softc *sc = cookie; 904 1.1 rkujawa int bail; 905 1.1 rkujawa 906 1.1 rkujawa if ((veritefb_i2cbb_read_bits(sc) & VFB_CRTCCTL_DDCOUTPUT) == 0) { 907 1.1 rkujawa veritefb_i2cbb_set_bits(sc, VFB_CRTCCTL_DDCDATA); 908 1.1 rkujawa delay(VFB_DDC_PACE_US); /* SDA settle while SCL still low */ 909 1.1 rkujawa veritefb_i2cbb_set_bits(sc, 910 1.1 rkujawa VFB_CRTCCTL_DDCDATA | VFB_CRTCCTL_DDCOUTPUT); 911 1.1 rkujawa for (bail = 0; bail < VFB_DDC_STRETCH_US; bail++) { 912 1.1 rkujawa if (veritefb_i2cbb_read_bits(sc) & 913 1.1 rkujawa VFB_CRTCCTL_DDCOUTPUT) 914 1.1 rkujawa break; 915 1.1 rkujawa delay(1); 916 1.1 rkujawa } 917 1.1 rkujawa delay(VFB_DDC_PACE_US); /* START setup time (4.7 us) */ 918 1.1 rkujawa } 919 1.1 rkujawa return i2c_bitbang_send_start(cookie, flags, &veritefb_i2cbb_ops); 920 1.1 rkujawa } 921 1.1 rkujawa 922 1.1 rkujawa static int 923 1.1 rkujawa veritefb_i2c_send_stop(void *cookie, int flags) 924 1.1 rkujawa { 925 1.1 rkujawa return i2c_bitbang_send_stop(cookie, flags, &veritefb_i2cbb_ops); 926 1.1 rkujawa } 927 1.1 rkujawa 928 1.1 rkujawa static int 929 1.1 rkujawa veritefb_i2c_initiate_xfer(void *cookie, i2c_addr_t addr, int flags) 930 1.1 rkujawa { 931 1.1 rkujawa return i2c_bitbang_initiate_xfer(cookie, addr, flags, 932 1.1 rkujawa &veritefb_i2cbb_ops); 933 1.1 rkujawa } 934 1.1 rkujawa 935 1.1 rkujawa static int 936 1.1 rkujawa veritefb_i2c_read_byte(void *cookie, uint8_t *valp, int flags) 937 1.1 rkujawa { 938 1.1 rkujawa return i2c_bitbang_read_byte(cookie, valp, flags, 939 1.1 rkujawa &veritefb_i2cbb_ops); 940 1.1 rkujawa } 941 1.1 rkujawa 942 1.1 rkujawa static int 943 1.1 rkujawa veritefb_i2c_write_byte(void *cookie, uint8_t val, int flags) 944 1.1 rkujawa { 945 1.1 rkujawa return i2c_bitbang_write_byte(cookie, val, flags, 946 1.1 rkujawa &veritefb_i2cbb_ops); 947 1.1 rkujawa } 948 1.1 rkujawa 949 1.1 rkujawa static void 950 1.1 rkujawa veritefb_ddc_read(struct veritefb_softc *sc) 951 1.1 rkujawa { 952 1.1 rkujawa int i; 953 1.1 rkujawa 954 1.1 rkujawa /* 955 1.1 rkujawa * Release both lines (SDA as input, SCL high-Z) before 956 1.1 rkujawa * starting the controller. 957 1.1 rkujawa */ 958 1.1 rkujawa sc->sc_ddc_base = vfb_read4(sc, VFB_CRTCCTL) & 959 1.1 rkujawa ~(VFB_CRTCCTL_DDCDATA | VFB_CRTCCTL_DDCOUTPUT | 960 1.1 rkujawa VFB_CRTCCTL_ENABLEDDC); 961 1.1 rkujawa vfb_write4(sc, VFB_CRTCCTL, 962 1.1 rkujawa sc->sc_ddc_base | VFB_CRTCCTL_DDCOUTPUT); 963 1.1 rkujawa sc->sc_ddc_base |= VFB_CRTCCTL_DDCOUTPUT; 964 1.1 rkujawa 965 1.1 rkujawa iic_tag_init(&sc->sc_i2c); 966 1.1 rkujawa sc->sc_i2c.ic_cookie = sc; 967 1.1 rkujawa sc->sc_i2c.ic_send_start = veritefb_i2c_send_start; 968 1.1 rkujawa sc->sc_i2c.ic_send_stop = veritefb_i2c_send_stop; 969 1.1 rkujawa sc->sc_i2c.ic_initiate_xfer = veritefb_i2c_initiate_xfer; 970 1.1 rkujawa sc->sc_i2c.ic_read_byte = veritefb_i2c_read_byte; 971 1.1 rkujawa sc->sc_i2c.ic_write_byte = veritefb_i2c_write_byte; 972 1.1 rkujawa 973 1.1 rkujawa /* Some monitors do not respond on the first attempt. */ 974 1.1 rkujawa sc->sc_edid_valid = false; 975 1.1 rkujawa memset(sc->sc_edid, 0, sizeof(sc->sc_edid)); 976 1.1 rkujawa for (i = 0; i < 3; i++) { 977 1.1 rkujawa if (ddc_read_edid(&sc->sc_i2c, sc->sc_edid, 978 1.1 rkujawa sizeof(sc->sc_edid)) == 0 && sc->sc_edid[1] != 0) 979 1.1 rkujawa break; 980 1.1 rkujawa memset(sc->sc_edid, 0, sizeof(sc->sc_edid)); 981 1.1 rkujawa } 982 1.1 rkujawa 983 1.1 rkujawa if (sc->sc_edid[1] == 0) { 984 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "DDC: no EDID response\n"); 985 1.1 rkujawa return; 986 1.1 rkujawa } 987 1.1 rkujawa 988 1.1 rkujawa if (edid_parse(sc->sc_edid, &sc->sc_ei) != 0) { 989 1.1 rkujawa aprint_error_dev(sc->sc_dev, "DDC: EDID parse failed\n"); 990 1.1 rkujawa return; 991 1.1 rkujawa } 992 1.1 rkujawa sc->sc_edid_valid = true; 993 1.1 rkujawa #ifdef VERITEFB_DEBUG 994 1.1 rkujawa edid_print(&sc->sc_ei); 995 1.1 rkujawa #endif 996 1.1 rkujawa } 997 1.1 rkujawa 998 1.1 rkujawa /* 999 1.1 rkujawa * Can the hardware and this driver do the given mode? 1000 1.1 rkujawa */ 1001 1.1 rkujawa static bool 1002 1.1 rkujawa veritefb_mode_usable(struct veritefb_softc *sc, const struct videomode *m) 1003 1.1 rkujawa { 1004 1.1 rkujawa const struct veritefb_stride *st; 1005 1.1 rkujawa 1006 1.1 rkujawa if (m->dot_clock > 170000) 1007 1.1 rkujawa return false; 1008 1.1 rkujawa if (m->flags & (VID_INTERLACE | VID_DBLSCAN)) 1009 1.1 rkujawa return false; 1010 1.1 rkujawa if (m->hdisplay > 2048 || (m->hdisplay & 7) != 0 || 1011 1.1 rkujawa m->vdisplay > 2047) 1012 1.1 rkujawa return false; 1013 1.1 rkujawa if ((m->hsync_start - m->hdisplay) / 8 - 1 > 0x7 || 1014 1.1 rkujawa (m->hsync_end - m->hsync_start) / 8 - 1 > 0x1f || 1015 1.1 rkujawa (m->htotal - m->hsync_end) / 8 - 1 > 0x3f || 1016 1.1 rkujawa ((m->hsync_start - m->hdisplay) & 7) != 0 || 1017 1.1 rkujawa ((m->hsync_end - m->hsync_start) & 7) != 0 || 1018 1.1 rkujawa ((m->htotal - m->hsync_end) & 7) != 0) 1019 1.1 rkujawa return false; 1020 1.1 rkujawa if (m->vsync_start - m->vdisplay < 1 || 1021 1.1 rkujawa m->vsync_start - m->vdisplay - 1 > 0x3f || 1022 1.1 rkujawa m->vsync_end - m->vsync_start - 1 > 0x7 || 1023 1.1 rkujawa m->vtotal - m->vsync_end - 1 > 0x3f) 1024 1.1 rkujawa return false; 1025 1.1 rkujawa /* one byte per pixel at 8bpp, the stride may be padded */ 1026 1.1 rkujawa st = veritefb_stride_for(m->hdisplay); 1027 1.1 rkujawa if (st == NULL) 1028 1.1 rkujawa return false; 1029 1.1 rkujawa if ((bus_size_t)st->linebytes * m->vdisplay > 1030 1.1 rkujawa sc->sc_memsize - sc->sc_fb_offset) 1031 1.1 rkujawa return false; 1032 1.1 rkujawa return true; 1033 1.1 rkujawa } 1034 1.1 rkujawa 1035 1.1 rkujawa /* 1036 1.1 rkujawa * Choose the mode: the monitor's EDID preferred mode when usable, 1037 1.1 rkujawa * 640x480@60 from the modes database otherwise. 1038 1.1 rkujawa */ 1039 1.1 rkujawa static void 1040 1.1 rkujawa veritefb_pick_mode(struct veritefb_softc *sc) 1041 1.1 rkujawa { 1042 1.1 rkujawa const struct videomode *m; 1043 1.1 rkujawa 1044 1.1 rkujawa sc->sc_videomode = pick_mode_by_ref(640, 480, 60); 1045 1.1 rkujawa KASSERT(sc->sc_videomode != NULL); 1046 1.1 rkujawa 1047 1.1 rkujawa if (!sc->sc_edid_valid || sc->sc_ei.edid_preferred_mode == NULL) 1048 1.1 rkujawa return; 1049 1.1 rkujawa 1050 1.1 rkujawa m = sc->sc_ei.edid_preferred_mode; 1051 1.1 rkujawa if (!veritefb_mode_usable(sc, m)) { 1052 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 1053 1.1 rkujawa "EDID preferred mode %dx%d (%d kHz) not usable, " 1054 1.1 rkujawa "using default\n", 1055 1.1 rkujawa m->hdisplay, m->vdisplay, m->dot_clock); 1056 1.1 rkujawa return; 1057 1.1 rkujawa } 1058 1.1 rkujawa 1059 1.1 rkujawa aprint_normal_dev(sc->sc_dev, "using EDID mode %dx%d (%d kHz)\n", 1060 1.1 rkujawa m->hdisplay, m->vdisplay, m->dot_clock); 1061 1.1 rkujawa sc->sc_videomode = m; 1062 1.1 rkujawa } 1063 1.1 rkujawa 1064 1.1 rkujawa /* 1065 1.1 rkujawa * Initialize the Bt485-compatible RAMDAC core for 8bpp indexed 1066 1.1 rkujawa */ 1067 1.1 rkujawa static void 1068 1.1 rkujawa veritefb_init_dac(struct veritefb_softc *sc) 1069 1.1 rkujawa { 1070 1.1 rkujawa vfb_write1(sc, VFB_DACCOMMAND0, 1071 1.1 rkujawa VFB_DACCMD0_EXTENDED | VFB_DACCMD0_8BITDAC); 1072 1.1 rkujawa vfb_write1(sc, VFB_DACCOMMAND1, 1073 1.1 rkujawa VFB_DACCMD1_8BPP | VFB_DACCMD1_PORT_AB); 1074 1.1 rkujawa vfb_write1(sc, VFB_DACCOMMAND2, 1075 1.1 rkujawa VFB_DACCMD2_PIXEL_INPUT_GATE | VFB_DACCMD2_DISABLE_CURSOR); 1076 1.1 rkujawa 1077 1.1 rkujawa /* Command register 3 is indexed through the write address. */ 1078 1.1 rkujawa vfb_write1(sc, VFB_DACRAMWRITEADR, VFB_DACCMD3_INDEX); 1079 1.1 rkujawa vfb_write1(sc, VFB_DACCOMMAND3, 0); 1080 1.1 rkujawa 1081 1.1 rkujawa vfb_write1(sc, VFB_DACPIXELMSK, 0xff); 1082 1.1 rkujawa } 1083 1.1 rkujawa 1084 1.1 rkujawa /* 1085 1.1 rkujawa * Wait for vertical sync so palette updates do not tear. 1086 1.1 rkujawa */ 1087 1.1 rkujawa static void 1088 1.1 rkujawa veritefb_wait_vsync(struct veritefb_softc *sc) 1089 1.1 rkujawa { 1090 1.1 rkujawa int i; 1091 1.1 rkujawa 1092 1.1 rkujawa for (i = 0; i < VFB_VSYNCPOLL; i++) { 1093 1.1 rkujawa if ((vfb_read4(sc, VFB_CRTCSTATUS) & 1094 1.1 rkujawa VFB_CRTCSTATUS_VERT_MASK) == VFB_CRTCSTATUS_VERT_SYNC) 1095 1.1 rkujawa break; 1096 1.1 rkujawa delay(1); 1097 1.1 rkujawa } 1098 1.1 rkujawa } 1099 1.1 rkujawa 1100 1.1 rkujawa static void 1101 1.1 rkujawa veritefb_set_dac_entry(struct veritefb_softc *sc, int index, 1102 1.1 rkujawa uint8_t r, uint8_t g, uint8_t b) 1103 1.1 rkujawa { 1104 1.1 rkujawa vfb_write1(sc, VFB_DACRAMWRITEADR, index); 1105 1.1 rkujawa vfb_write1(sc, VFB_DACRAMDATA, r); 1106 1.1 rkujawa vfb_write1(sc, VFB_DACRAMDATA, g); 1107 1.1 rkujawa vfb_write1(sc, VFB_DACRAMDATA, b); 1108 1.1 rkujawa } 1109 1.1 rkujawa 1110 1.1 rkujawa static void 1111 1.1 rkujawa veritefb_init_palette(struct veritefb_softc *sc) 1112 1.1 rkujawa { 1113 1.1 rkujawa int i, j; 1114 1.1 rkujawa 1115 1.1 rkujawa j = 0; 1116 1.1 rkujawa veritefb_wait_vsync(sc); 1117 1.1 rkujawa for (i = 0; i < 256; i++) { 1118 1.1 rkujawa sc->sc_cmap_red[i] = rasops_cmap[j]; 1119 1.1 rkujawa sc->sc_cmap_green[i] = rasops_cmap[j + 1]; 1120 1.1 rkujawa sc->sc_cmap_blue[i] = rasops_cmap[j + 2]; 1121 1.1 rkujawa veritefb_set_dac_entry(sc, i, rasops_cmap[j], 1122 1.1 rkujawa rasops_cmap[j + 1], rasops_cmap[j + 2]); 1123 1.1 rkujawa j += 3; 1124 1.1 rkujawa } 1125 1.1 rkujawa } 1126 1.1 rkujawa 1127 1.1 rkujawa static int 1128 1.1 rkujawa veritefb_getcmap(struct veritefb_softc *sc, struct wsdisplay_cmap *cm) 1129 1.1 rkujawa { 1130 1.1 rkujawa u_int index = cm->index; 1131 1.1 rkujawa u_int count = cm->count; 1132 1.1 rkujawa int error; 1133 1.1 rkujawa 1134 1.1 rkujawa if (index >= 256 || count > 256 || index + count > 256) 1135 1.1 rkujawa return EINVAL; 1136 1.1 rkujawa 1137 1.1 rkujawa error = copyout(&sc->sc_cmap_red[index], cm->red, count); 1138 1.1 rkujawa if (error) 1139 1.1 rkujawa return error; 1140 1.1 rkujawa error = copyout(&sc->sc_cmap_green[index], cm->green, count); 1141 1.1 rkujawa if (error) 1142 1.1 rkujawa return error; 1143 1.1 rkujawa error = copyout(&sc->sc_cmap_blue[index], cm->blue, count); 1144 1.1 rkujawa if (error) 1145 1.1 rkujawa return error; 1146 1.1 rkujawa 1147 1.1 rkujawa return 0; 1148 1.1 rkujawa } 1149 1.1 rkujawa 1150 1.1 rkujawa static int 1151 1.1 rkujawa veritefb_putcmap(struct veritefb_softc *sc, struct wsdisplay_cmap *cm) 1152 1.1 rkujawa { 1153 1.1 rkujawa u_char rbuf[256], gbuf[256], bbuf[256]; 1154 1.1 rkujawa u_int index = cm->index; 1155 1.1 rkujawa u_int count = cm->count; 1156 1.1 rkujawa int i, error; 1157 1.1 rkujawa 1158 1.1 rkujawa if (index >= 256 || count > 256 || index + count > 256) 1159 1.1 rkujawa return EINVAL; 1160 1.1 rkujawa 1161 1.1 rkujawa error = copyin(cm->red, &rbuf[index], count); 1162 1.1 rkujawa if (error) 1163 1.1 rkujawa return error; 1164 1.1 rkujawa error = copyin(cm->green, &gbuf[index], count); 1165 1.1 rkujawa if (error) 1166 1.1 rkujawa return error; 1167 1.1 rkujawa error = copyin(cm->blue, &bbuf[index], count); 1168 1.1 rkujawa if (error) 1169 1.1 rkujawa return error; 1170 1.1 rkujawa 1171 1.1 rkujawa memcpy(&sc->sc_cmap_red[index], &rbuf[index], count); 1172 1.1 rkujawa memcpy(&sc->sc_cmap_green[index], &gbuf[index], count); 1173 1.1 rkujawa memcpy(&sc->sc_cmap_blue[index], &bbuf[index], count); 1174 1.1 rkujawa 1175 1.1 rkujawa veritefb_wait_vsync(sc); 1176 1.1 rkujawa for (i = index; i < index + count; i++) 1177 1.1 rkujawa veritefb_set_dac_entry(sc, i, sc->sc_cmap_red[i], 1178 1.1 rkujawa sc->sc_cmap_green[i], sc->sc_cmap_blue[i]); 1179 1.1 rkujawa 1180 1.1 rkujawa return 0; 1181 1.1 rkujawa } 1182 1.1 rkujawa 1183 1.1 rkujawa static void 1184 1.1 rkujawa veritefb_init_screen(void *cookie, struct vcons_screen *scr, int existing, 1185 1.1 rkujawa long *defattr) 1186 1.1 rkujawa { 1187 1.1 rkujawa struct veritefb_softc *sc = cookie; 1188 1.1 rkujawa struct rasops_info *ri = &scr->scr_ri; 1189 1.1 rkujawa 1190 1.1 rkujawa wsfont_init(); 1191 1.1 rkujawa 1192 1.1 rkujawa ri->ri_depth = sc->sc_depth; 1193 1.1 rkujawa ri->ri_width = sc->sc_width; 1194 1.1 rkujawa ri->ri_height = sc->sc_height; 1195 1.1 rkujawa ri->ri_stride = sc->sc_linebytes; 1196 1.1 rkujawa ri->ri_flg = RI_CENTER; 1197 1.1 rkujawa 1198 1.1 rkujawa ri->ri_bits = (char *)bus_space_vaddr(sc->sc_memt, sc->sc_memh) + 1199 1.1 rkujawa sc->sc_fb_offset; 1200 1.1 rkujawa 1201 1.1 rkujawa scr->scr_flags |= VCONS_NO_CURSOR; 1202 1.1 rkujawa 1203 1.1 rkujawa rasops_init(ri, 0, 0); 1204 1.1 rkujawa ri->ri_caps = WSSCREEN_WSCOLORS; 1205 1.1 rkujawa rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight, 1206 1.1 rkujawa sc->sc_width / ri->ri_font->fontwidth); 1207 1.1 rkujawa 1208 1.1 rkujawa ri->ri_hw = scr; 1209 1.1 rkujawa 1210 1.1 rkujawa sc->sc_orig_eraserows = ri->ri_ops.eraserows; 1211 1.1 rkujawa sc->sc_orig_erasecols = ri->ri_ops.erasecols; 1212 1.1 rkujawa sc->sc_orig_copyrows = ri->ri_ops.copyrows; 1213 1.1 rkujawa sc->sc_orig_copycols = ri->ri_ops.copycols; 1214 1.1 rkujawa sc->sc_orig_putchar = ri->ri_ops.putchar; 1215 1.1 rkujawa ri->ri_ops.eraserows = veritefb_eraserows; 1216 1.1 rkujawa ri->ri_ops.erasecols = veritefb_erasecols; 1217 1.1 rkujawa ri->ri_ops.copyrows = veritefb_copyrows; 1218 1.1 rkujawa ri->ri_ops.copycols = veritefb_copycols; 1219 1.1 rkujawa ri->ri_ops.putchar = veritefb_putchar; 1220 1.1 rkujawa } 1221 1.1 rkujawa 1222 1.1 rkujawa static int 1223 1.1 rkujawa veritefb_ioctl(void *v, void *vs, u_long cmd, void *data, int flag, 1224 1.1 rkujawa struct lwp *l) 1225 1.1 rkujawa { 1226 1.1 rkujawa struct vcons_data *vd; 1227 1.1 rkujawa struct veritefb_softc *sc; 1228 1.1 rkujawa struct wsdisplay_fbinfo *wsfbi; 1229 1.1 rkujawa struct vcons_screen *ms; 1230 1.1 rkujawa 1231 1.1 rkujawa vd = v; 1232 1.1 rkujawa sc = vd->cookie; 1233 1.1 rkujawa ms = vd->active; 1234 1.1 rkujawa 1235 1.1 rkujawa switch (cmd) { 1236 1.1 rkujawa case WSDISPLAYIO_GTYPE: 1237 1.1 rkujawa *(u_int *)data = WSDISPLAY_TYPE_PCIMISC; 1238 1.1 rkujawa return 0; 1239 1.1 rkujawa 1240 1.1 rkujawa case PCI_IOC_CFGREAD: 1241 1.1 rkujawa case PCI_IOC_CFGWRITE: 1242 1.1 rkujawa return pci_devioctl(sc->sc_pc, sc->sc_pcitag, 1243 1.1 rkujawa cmd, data, flag, l); 1244 1.1 rkujawa 1245 1.1 rkujawa case WSDISPLAYIO_GET_BUSID: 1246 1.1 rkujawa return wsdisplayio_busid_pci(sc->sc_dev, sc->sc_pc, 1247 1.1 rkujawa sc->sc_pcitag, data); 1248 1.1 rkujawa 1249 1.1 rkujawa case WSDISPLAYIO_GINFO: 1250 1.1 rkujawa if (ms == NULL) 1251 1.1 rkujawa return ENODEV; 1252 1.1 rkujawa 1253 1.1 rkujawa wsfbi = (void *)data; 1254 1.1 rkujawa wsfbi->height = ms->scr_ri.ri_height; 1255 1.1 rkujawa wsfbi->width = ms->scr_ri.ri_width; 1256 1.1 rkujawa wsfbi->depth = ms->scr_ri.ri_depth; 1257 1.1 rkujawa wsfbi->cmsize = 256; 1258 1.1 rkujawa return 0; 1259 1.1 rkujawa 1260 1.1 rkujawa case WSDISPLAYIO_LINEBYTES: 1261 1.1 rkujawa *(u_int *)data = sc->sc_linebytes; 1262 1.1 rkujawa return 0; 1263 1.1 rkujawa 1264 1.1 rkujawa case WSDISPLAYIO_GETCMAP: 1265 1.1 rkujawa return veritefb_getcmap(sc, (struct wsdisplay_cmap *)data); 1266 1.1 rkujawa 1267 1.1 rkujawa case WSDISPLAYIO_PUTCMAP: 1268 1.1 rkujawa return veritefb_putcmap(sc, (struct wsdisplay_cmap *)data); 1269 1.1 rkujawa 1270 1.1 rkujawa case WSDISPLAYIO_SMODE: 1271 1.1 rkujawa { 1272 1.1 rkujawa int new_mode = *(int *)data; 1273 1.1 rkujawa if (new_mode != sc->sc_mode) { 1274 1.1 rkujawa sc->sc_mode = new_mode; 1275 1.1 rkujawa if (new_mode == WSDISPLAYIO_MODE_EMUL) { 1276 1.1 rkujawa /* 1277 1.1 rkujawa * reload and restart the microcode 1278 1.1 rkujawa */ 1279 1.1 rkujawa if (sc->sc_accel == VFB_ACCEL_ON || 1280 1.1 rkujawa (sc->sc_accel == VFB_ACCEL_OFF && 1281 1.1 rkujawa sc->sc_ucode != NULL)) 1282 1.1 rkujawa (void)veritefb_risc_init(sc); 1283 1.1 rkujawa if (sc->sc_gc_initted) 1284 1.1 rkujawa glyphcache_wipe(&sc->sc_gc); 1285 1.1 rkujawa veritefb_init_palette(sc); 1286 1.1 rkujawa vcons_redraw_screen(ms); 1287 1.1 rkujawa } else { 1288 1.1 rkujawa if (sc->sc_accel == VFB_ACCEL_ON) { 1289 1.1 rkujawa (void)veritefb_drain_outfifo( 1290 1.1 rkujawa sc); 1291 1.1 rkujawa veritefb_risc_hold(sc); 1292 1.1 rkujawa sc->sc_accel = VFB_ACCEL_OFF; 1293 1.1 rkujawa } 1294 1.1 rkujawa } 1295 1.1 rkujawa } 1296 1.1 rkujawa return 0; 1297 1.1 rkujawa } 1298 1.1 rkujawa 1299 1.1 rkujawa case WSDISPLAYIO_GET_FBINFO: 1300 1.1 rkujawa { 1301 1.1 rkujawa struct wsdisplayio_fbinfo *fbi = data; 1302 1.1 rkujawa struct rasops_info *ri; 1303 1.1 rkujawa 1304 1.1 rkujawa ri = &sc->vd.active->scr_ri; 1305 1.1 rkujawa return wsdisplayio_get_fbinfo(ri, fbi); 1306 1.1 rkujawa } 1307 1.1 rkujawa 1308 1.1 rkujawa #ifdef VERITEFB_DEBUG 1309 1.1 rkujawa /* RISC debug surface, VERITEFB_DEBUG kernels only. */ 1310 1.1 rkujawa case VERITEFB_DBG_DIAG: 1311 1.1 rkujawa { 1312 1.1 rkujawa struct veritefb_dbg_diag *dd = data; 1313 1.1 rkujawa unsigned i, n; 1314 1.1 rkujawa 1315 1.1 rkujawa dd->vd_accel = sc->sc_accel; 1316 1.1 rkujawa dd->vd_pc = veritefb_risc_samplepc(sc); 1317 1.1 rkujawa dd->vd_fifoinfree = vfb_read1(sc, VFB_FIFOINFREE) & 1318 1.1 rkujawa VFB_FIFOINFREE_MASK; 1319 1.1 rkujawa dd->vd_fifooutvalid = vfb_read1(sc, 1320 1.1 rkujawa VFB_FIFOOUTVALID) & VFB_FIFOOUTVALID_MASK; 1321 1.1 rkujawa dd->vd_debugreg = vfb_read1(sc, VFB_DEBUG); 1322 1.1 rkujawa dd->vd_ringcount = sc->sc_ring_count; 1323 1.1 rkujawa n = MIN(sc->sc_ring_count, VERITEFB_DIAG_RING); 1324 1.1 rkujawa memset(dd->vd_ring, 0, sizeof(dd->vd_ring)); 1325 1.1 rkujawa for (i = 0; i < n; i++) 1326 1.1 rkujawa dd->vd_ring[VERITEFB_DIAG_RING - n + i] = 1327 1.1 rkujawa sc->sc_ring[(sc->sc_ring_count - n + i) & 1328 1.1 rkujawa (VFB_RING_SIZE - 1)]; 1329 1.1 rkujawa 1330 1.1 rkujawa dd->vd_heartbeat = 1; 1331 1.1 rkujawa if (sc->sc_accel == VFB_ACCEL_ON) { 1332 1.1 rkujawa uint32_t word = 0; 1333 1.1 rkujawa 1334 1.1 rkujawa dd->vd_heartbeat = 2; 1335 1.1 rkujawa for (i = 0; i < VFB_DRAINPOLL; i++) { 1336 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOOUTVALID) & 1337 1.1 rkujawa VFB_FIFOOUTVALID_MASK) == 0) 1338 1.1 rkujawa break; 1339 1.1 rkujawa (void)vfb_fifo_read(sc); 1340 1.1 rkujawa } 1341 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOINFREE) & 1342 1.1 rkujawa VFB_FIFOINFREE_MASK) >= 1) { 1343 1.1 rkujawa vfb_fifo_write(sc, 1344 1.1 rkujawa VFB_CMDW(0, VCMD_PIXENGSYNC)); 1345 1.1 rkujawa for (i = 0; i < VFB_FIFOPOLL; i++) { 1346 1.1 rkujawa if ((vfb_read1(sc, 1347 1.1 rkujawa VFB_FIFOOUTVALID) & 1348 1.1 rkujawa VFB_FIFOOUTVALID_MASK) 1349 1.1 rkujawa != 0) { 1350 1.1 rkujawa word = 1351 1.1 rkujawa vfb_fifo_read(sc); 1352 1.1 rkujawa break; 1353 1.1 rkujawa } 1354 1.1 rkujawa delay(1); 1355 1.1 rkujawa } 1356 1.1 rkujawa if (word == VFB_SYNC_TOKEN) 1357 1.1 rkujawa dd->vd_heartbeat = 0; 1358 1.1 rkujawa } 1359 1.1 rkujawa } 1360 1.1 rkujawa return 0; 1361 1.1 rkujawa } 1362 1.1 rkujawa 1363 1.1 rkujawa case VERITEFB_DBG_HOLD: 1364 1.1 rkujawa veritefb_risc_hold(sc); 1365 1.1 rkujawa return 0; 1366 1.1 rkujawa 1367 1.1 rkujawa case VERITEFB_DBG_CONT: 1368 1.1 rkujawa veritefb_risc_continue(sc); 1369 1.1 rkujawa return 0; 1370 1.1 rkujawa 1371 1.1 rkujawa case VERITEFB_DBG_RDREG: 1372 1.1 rkujawa { 1373 1.1 rkujawa struct veritefb_dbg_rw *vr = data; 1374 1.1 rkujawa 1375 1.1 rkujawa if ((vfb_read1(sc, VFB_DEBUG) & 1376 1.1 rkujawa VFB_DEBUG_HOLDRISC) == 0) 1377 1.1 rkujawa return EBUSY; /* hold first */ 1378 1.1 rkujawa if (vr->vr_addr > 255) 1379 1.1 rkujawa return EINVAL; 1380 1.1 rkujawa vr->vr_val = veritefb_risc_readrf(sc, vr->vr_addr); 1381 1.1 rkujawa return 0; 1382 1.1 rkujawa } 1383 1.1 rkujawa 1384 1.1 rkujawa case VERITEFB_DBG_RDMEM: 1385 1.1 rkujawa { 1386 1.1 rkujawa struct veritefb_dbg_rw *vr = data; 1387 1.1 rkujawa 1388 1.1 rkujawa if ((vfb_read1(sc, VFB_DEBUG) & 1389 1.1 rkujawa VFB_DEBUG_HOLDRISC) == 0) 1390 1.1 rkujawa return EBUSY; /* hold first */ 1391 1.1 rkujawa vr->vr_val = veritefb_risc_readmem(sc, vr->vr_addr); 1392 1.1 rkujawa return 0; 1393 1.1 rkujawa } 1394 1.1 rkujawa 1395 1.1 rkujawa case VERITEFB_DBG_FAULT: 1396 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 1397 1.1 rkujawa "debug: deliberately sending an invalid command\n"); 1398 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VFB_CMD_BOGUS)); 1399 1.1 rkujawa return 0; 1400 1.1 rkujawa 1401 1.1 rkujawa case VERITEFB_DBG_RESET: 1402 1.1 rkujawa *(int *)data = veritefb_risc_init(sc) ? 1 : 0; 1403 1.1 rkujawa return 0; 1404 1.1 rkujawa 1405 1.1 rkujawa case VERITEFB_DBG_STATS: 1406 1.1 rkujawa memcpy(data, &sc->sc_stats, sizeof(sc->sc_stats)); 1407 1.1 rkujawa return 0; 1408 1.1 rkujawa 1409 1.1 rkujawa case VERITEFB_DBG_STATCLR: 1410 1.1 rkujawa memset(&sc->sc_stats, 0, sizeof(sc->sc_stats)); 1411 1.1 rkujawa return 0; 1412 1.1 rkujawa 1413 1.1 rkujawa case VERITEFB_DBG_RDIO: 1414 1.1 rkujawa { 1415 1.1 rkujawa struct veritefb_dbg_rw *vr = data; 1416 1.1 rkujawa 1417 1.1 rkujawa if ((vr->vr_addr & 1418 1.1 rkujawa ~(uint32_t)VERITEFB_DBG_IO_IOSPACE) > 0xff) 1419 1.1 rkujawa return EINVAL; 1420 1.1 rkujawa if (vr->vr_addr & VERITEFB_DBG_IO_IOSPACE) 1421 1.1 rkujawa vr->vr_val = bus_space_read_1(sc->sc_iot, 1422 1.1 rkujawa sc->sc_ioh, vr->vr_addr & 0xff); 1423 1.1 rkujawa else 1424 1.1 rkujawa vr->vr_val = vfb_read1(sc, vr->vr_addr); 1425 1.1 rkujawa return 0; 1426 1.1 rkujawa } 1427 1.1 rkujawa 1428 1.1 rkujawa case VERITEFB_DBG_WRIO: 1429 1.1 rkujawa { 1430 1.1 rkujawa struct veritefb_dbg_rw *vr = data; 1431 1.1 rkujawa 1432 1.1 rkujawa if ((vr->vr_addr & 1433 1.1 rkujawa ~(uint32_t)VERITEFB_DBG_IO_IOSPACE) > 0xff) 1434 1.1 rkujawa return EINVAL; 1435 1.1 rkujawa if (vr->vr_addr & VERITEFB_DBG_IO_IOSPACE) 1436 1.1 rkujawa bus_space_write_1(sc->sc_iot, sc->sc_ioh, 1437 1.1 rkujawa vr->vr_addr & 0xff, vr->vr_val); 1438 1.1 rkujawa else 1439 1.1 rkujawa vfb_write1(sc, vr->vr_addr, vr->vr_val); 1440 1.1 rkujawa return 0; 1441 1.1 rkujawa } 1442 1.1 rkujawa 1443 1.1 rkujawa #endif /* VERITEFB_DEBUG */ 1444 1.1 rkujawa } 1445 1.1 rkujawa return EPASSTHROUGH; 1446 1.1 rkujawa } 1447 1.1 rkujawa 1448 1.1 rkujawa static paddr_t 1449 1.1 rkujawa veritefb_mmap(void *v, void *vs, off_t offset, int prot) 1450 1.1 rkujawa { 1451 1.1 rkujawa struct vcons_data *vd; 1452 1.1 rkujawa struct veritefb_softc *sc; 1453 1.1 rkujawa 1454 1.1 rkujawa vd = v; 1455 1.1 rkujawa sc = vd->cookie; 1456 1.1 rkujawa 1457 1.1 rkujawa if (offset >= 0 && offset < sc->sc_memsize - sc->sc_fb_offset) 1458 1.1 rkujawa return bus_space_mmap(sc->sc_memt, 1459 1.1 rkujawa sc->sc_fb_paddr + sc->sc_fb_offset + offset, 1460 1.1 rkujawa 0, prot, BUS_SPACE_MAP_LINEAR); 1461 1.1 rkujawa 1462 1.1 rkujawa return -1; 1463 1.1 rkujawa } 1464 1.1 rkujawa 1465 1.1 rkujawa static void 1466 1.1 rkujawa veritefb_risc_continue(struct veritefb_softc *sc) 1467 1.1 rkujawa { 1468 1.1 rkujawa uint8_t debugreg; 1469 1.1 rkujawa 1470 1.1 rkujawa debugreg = vfb_read1(sc, VFB_DEBUG); 1471 1.1 rkujawa vfb_write1(sc, VFB_DEBUG, debugreg & ~VFB_DEBUG_HOLDRISC); 1472 1.1 rkujawa vfb_pacepoll4(sc, VFB_STATEDATA, 0, 0); 1473 1.1 rkujawa } 1474 1.1 rkujawa 1475 1.1 rkujawa /* 1476 1.1 rkujawa * Force one instruction into the RISC decoder and single-step it 1477 1.1 rkujawa */ 1478 1.1 rkujawa static void 1479 1.1 rkujawa veritefb_risc_forcestep(struct veritefb_softc *sc, uint32_t insn) 1480 1.1 rkujawa { 1481 1.1 rkujawa uint8_t debugreg, stateindex; 1482 1.1 rkujawa int i; 1483 1.1 rkujawa 1484 1.1 rkujawa debugreg = vfb_read1(sc, VFB_DEBUG); 1485 1.1 rkujawa stateindex = vfb_read1(sc, VFB_STATEINDEX); 1486 1.1 rkujawa 1487 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, VFB_STATEINDEX_IR); 1488 1.1 rkujawa vfb_pacepoll1(sc, VFB_STATEINDEX, VFB_STATEINDEX_IR, 0xff); 1489 1.1 rkujawa vfb_write4(sc, VFB_STATEDATA, insn); 1490 1.1 rkujawa vfb_pacepoll4(sc, VFB_STATEDATA, insn, 0xffffffff); 1491 1.1 rkujawa vfb_write1(sc, VFB_DEBUG, 1492 1.1 rkujawa debugreg | VFB_DEBUG_HOLDRISC | VFB_DEBUG_STEPRISC); 1493 1.1 rkujawa vfb_pacepoll4(sc, VFB_STATEDATA, 0, 0); 1494 1.1 rkujawa 1495 1.1 rkujawa for (i = 0; i < VFB_SHORTPOLL; i++) 1496 1.1 rkujawa if ((vfb_read1(sc, VFB_DEBUG) & 1497 1.1 rkujawa (VFB_DEBUG_HOLDRISC | VFB_DEBUG_STEPRISC)) == 1498 1.1 rkujawa VFB_DEBUG_HOLDRISC) 1499 1.1 rkujawa break; 1500 1.1 rkujawa 1501 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, stateindex); 1502 1.1 rkujawa } 1503 1.1 rkujawa 1504 1.1 rkujawa /* 1505 1.1 rkujawa * Set a register-file entry by force-feeding load-immediate sequences 1506 1.1 rkujawa */ 1507 1.1 rkujawa static void 1508 1.1 rkujawa veritefb_risc_writerf(struct veritefb_softc *sc, uint8_t idx, uint32_t data) 1509 1.1 rkujawa { 1510 1.1 rkujawa uint8_t special = 0; 1511 1.1 rkujawa 1512 1.1 rkujawa if (idx < 64) { 1513 1.1 rkujawa special = idx; 1514 1.1 rkujawa idx = VRISC_SP; 1515 1.1 rkujawa } 1516 1.1 rkujawa 1517 1.1 rkujawa if ((data & 0xff000000) == 0) { 1518 1.1 rkujawa veritefb_risc_forcestep(sc, 1519 1.1 rkujawa VRISC_LI(VRISC_LI_OP, idx, data & 0xffff)); 1520 1.1 rkujawa if (data & 0x00ff0000) 1521 1.1 rkujawa veritefb_risc_forcestep(sc, 1522 1.1 rkujawa VRISC_INT(VRISC_ADDIFI_OP, idx, idx, data >> 16)); 1523 1.1 rkujawa } else { 1524 1.1 rkujawa veritefb_risc_forcestep(sc, 1525 1.1 rkujawa VRISC_LI(VRISC_LUI_OP, idx, data >> 16)); 1526 1.1 rkujawa veritefb_risc_forcestep(sc, 1527 1.1 rkujawa VRISC_INT(VRISC_ADDSL8_OP, idx, idx, (data >> 8) & 0xff)); 1528 1.1 rkujawa veritefb_risc_forcestep(sc, 1529 1.1 rkujawa VRISC_INT(VRISC_ADDI_OP, idx, idx, data & 0xff)); 1530 1.1 rkujawa } 1531 1.1 rkujawa 1532 1.1 rkujawa if (special) { 1533 1.1 rkujawa veritefb_risc_forcestep(sc, 1534 1.1 rkujawa VRISC_INT(VRISC_ADD_OP, special, 0, VRISC_SP)); 1535 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1536 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1537 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1538 1.1 rkujawa } 1539 1.1 rkujawa } 1540 1.1 rkujawa 1541 1.1 rkujawa /* Read a register-file entry through the S1 operand bus */ 1542 1.1 rkujawa static uint32_t 1543 1.1 rkujawa veritefb_risc_readrf(struct veritefb_softc *sc, uint8_t idx) 1544 1.1 rkujawa { 1545 1.1 rkujawa uint32_t data, insn; 1546 1.1 rkujawa uint8_t debugreg, stateindex; 1547 1.1 rkujawa 1548 1.1 rkujawa debugreg = vfb_read1(sc, VFB_DEBUG); 1549 1.1 rkujawa stateindex = vfb_read1(sc, VFB_STATEINDEX); 1550 1.1 rkujawa 1551 1.1 rkujawa vfb_write1(sc, VFB_DEBUG, debugreg | VFB_DEBUG_HOLDRISC); 1552 1.1 rkujawa 1553 1.1 rkujawa /* add zero, zero, idx: puts RF[idx] on the S1 bus, no step needed */ 1554 1.1 rkujawa insn = VRISC_INT(VRISC_ADD_OP, 0, 0, idx); 1555 1.1 rkujawa vfb_write4(sc, VFB_STATEDATA, insn); 1556 1.1 rkujawa 1557 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, VFB_STATEINDEX_IR); 1558 1.1 rkujawa vfb_pacepoll4(sc, VFB_STATEDATA, insn, 0xffffffff); 1559 1.1 rkujawa 1560 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, VFB_STATEINDEX_S1); 1561 1.1 rkujawa vfb_pacepoll4(sc, VFB_STATEINDEX, 0, 0); 1562 1.1 rkujawa data = vfb_read4(sc, VFB_STATEDATA); 1563 1.1 rkujawa 1564 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, stateindex); 1565 1.1 rkujawa vfb_write1(sc, VFB_DEBUG, debugreg); 1566 1.1 rkujawa 1567 1.1 rkujawa return data; 1568 1.1 rkujawa } 1569 1.1 rkujawa 1570 1.1 rkujawa /* Word read/write through the RISC's own address space, RISC held. */ 1571 1.1 rkujawa static uint32_t 1572 1.1 rkujawa veritefb_risc_readmem(struct veritefb_softc *sc, uint32_t addr) 1573 1.1 rkujawa { 1574 1.1 rkujawa veritefb_risc_writerf(sc, VRISC_RA, addr); 1575 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_LD(VRISC_LW_OP, VRISC_SP, 0, 1576 1.1 rkujawa VRISC_RA)); 1577 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1578 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1579 1.1 rkujawa return veritefb_risc_readrf(sc, VRISC_SP); 1580 1.1 rkujawa } 1581 1.1 rkujawa 1582 1.1 rkujawa static void 1583 1.1 rkujawa veritefb_risc_writemem(struct veritefb_softc *sc, uint32_t addr, 1584 1.1 rkujawa uint32_t data) 1585 1.1 rkujawa { 1586 1.1 rkujawa veritefb_risc_writerf(sc, VRISC_RA, addr); 1587 1.1 rkujawa veritefb_risc_writerf(sc, VRISC_FP, data); 1588 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_ST(VRISC_SW_OP, 0, VRISC_FP, 1589 1.1 rkujawa VRISC_RA)); 1590 1.1 rkujawa } 1591 1.1 rkujawa 1592 1.1 rkujawa /* 1593 1.1 rkujawa * Flush the icache (and the pixel-engine line buffers in the 1594 1.1 rkujawa * dcache), returns with the icache enabled. 1595 1.1 rkujawa */ 1596 1.1 rkujawa static void 1597 1.1 rkujawa veritefb_risc_flushicache(struct veritefb_softc *sc) 1598 1.1 rkujawa { 1599 1.1 rkujawa uint32_t c, p1, p2; 1600 1.1 rkujawa 1601 1.1 rkujawa /* flush store accumulation buffers */ 1602 1.1 rkujawa p1 = veritefb_risc_readmem(sc, 0); 1603 1.1 rkujawa p2 = veritefb_risc_readmem(sc, 8); 1604 1.1 rkujawa veritefb_risc_writemem(sc, 0, p1); 1605 1.1 rkujawa veritefb_risc_writemem(sc, 8, p2); 1606 1.1 rkujawa (void)veritefb_risc_readmem(sc, 0); 1607 1.1 rkujawa (void)veritefb_risc_readmem(sc, 8); 1608 1.1 rkujawa 1609 1.1 rkujawa /* spri Sync, zero: flush pixel-engine line buffers */ 1610 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_INT(VRISC_SPRI_OP, 0, 0, 31)); 1611 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1612 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1613 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1614 1.1 rkujawa 1615 1.1 rkujawa /* set icache-off bits in the flag register */ 1616 1.1 rkujawa veritefb_risc_writerf(sc, VRISC_RA, VRISC_ICACHE_ONOFF_MASK); 1617 1.1 rkujawa veritefb_risc_forcestep(sc, 1618 1.1 rkujawa VRISC_INT(VRISC_OR_OP, VRISC_FLAG, VRISC_FLAG, VRISC_RA)); 1619 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1620 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1621 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1622 1.1 rkujawa 1623 1.1 rkujawa /* jump through two icache's worth of lines to flush it */ 1624 1.1 rkujawa for (c = 0; c < VRISC_ICACHESIZE * 2; c += VRISC_ICACHELINESIZE) 1625 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_JMP(c >> 2)); 1626 1.1 rkujawa 1627 1.1 rkujawa /* clear the icache-off bits again */ 1628 1.1 rkujawa veritefb_risc_writerf(sc, VRISC_RA, VRISC_ICACHE_ONOFF_MASK); 1629 1.1 rkujawa veritefb_risc_forcestep(sc, 1630 1.1 rkujawa VRISC_INT(VRISC_ANDN_OP, VRISC_FLAG, VRISC_FLAG, VRISC_RA)); 1631 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1632 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_JMP(0)); 1633 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1634 1.1 rkujawa } 1635 1.1 rkujawa 1636 1.1 rkujawa /* 1637 1.1 rkujawa * Start the RISC at pc: hold it, force-feed a jump (with NOPs for the 1638 1.1 rkujawa * pipeline and the delay slot), release. 1639 1.1 rkujawa */ 1640 1.1 rkujawa static void 1641 1.1 rkujawa veritefb_risc_start(struct veritefb_softc *sc, uint32_t pc) 1642 1.1 rkujawa { 1643 1.1 rkujawa veritefb_risc_hold(sc); 1644 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1645 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1646 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1647 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_JMP(pc >> 2)); 1648 1.1 rkujawa veritefb_risc_forcestep(sc, VRISC_NOP); 1649 1.1 rkujawa veritefb_risc_continue(sc); 1650 1.1 rkujawa } 1651 1.1 rkujawa 1652 1.1 rkujawa /* 1653 1.1 rkujawa * Sample the RISC program counter. 1654 1.1 rkujawa */ 1655 1.1 rkujawa static uint32_t 1656 1.1 rkujawa veritefb_risc_samplepc(struct veritefb_softc *sc) 1657 1.1 rkujawa { 1658 1.1 rkujawa uint32_t pc; 1659 1.1 rkujawa uint8_t debugreg, stateindex; 1660 1.1 rkujawa bool washeld; 1661 1.1 rkujawa 1662 1.1 rkujawa debugreg = vfb_read1(sc, VFB_DEBUG); 1663 1.1 rkujawa washeld = (debugreg & VFB_DEBUG_HOLDRISC) != 0; 1664 1.1 rkujawa if (!washeld) 1665 1.1 rkujawa veritefb_risc_hold(sc); 1666 1.1 rkujawa 1667 1.1 rkujawa stateindex = vfb_read1(sc, VFB_STATEINDEX); 1668 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, VFB_STATEINDEX_PC); 1669 1.1 rkujawa vfb_pacepoll1(sc, VFB_STATEINDEX, VFB_STATEINDEX_PC, 0xff); 1670 1.1 rkujawa pc = vfb_read4(sc, VFB_STATEDATA); 1671 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, stateindex); 1672 1.1 rkujawa 1673 1.1 rkujawa if (!washeld) 1674 1.1 rkujawa veritefb_risc_continue(sc); 1675 1.1 rkujawa return pc; 1676 1.1 rkujawa } 1677 1.1 rkujawa 1678 1.1 rkujawa /* 1679 1.1 rkujawa * The hang-signature catalog: classify a sampled PC against the known 1680 1.1 rkujawa * layout of the V2x00 2D blob (loaded at its link address). 1681 1.1 rkujawa */ 1682 1.1 rkujawa static const char * 1683 1.1 rkujawa veritefb_pc_signature(uint32_t pc) 1684 1.1 rkujawa { 1685 1.1 rkujawa if (pc >= VFB_UC_TRAP && pc < VFB_UC_TRAP_END) 1686 1.1 rkujawa return "invalid-command trap (host sent a bad command or " 1687 1.1 rkujawa "the stream desynced)"; 1688 1.1 rkujawa if (pc >= VFB_UC_BASE && pc <= VFB_UC_DISPATCH_END) 1689 1.1 rkujawa return "dispatch loop (idle, waiting for commands)"; 1690 1.1 rkujawa if (pc >= VFB_CSUCODE_BASE && pc < VFB_UC_BASE) 1691 1.1 rkujawa return "csucode monitor (parked/suspended)"; 1692 1.1 rkujawa if (pc >= VFB_UC_BASE && pc < VFB_UC_END) 1693 1.1 rkujawa return "inside a command handler"; 1694 1.1 rkujawa if (pc >= VFB_RISC_ROM_BASE) 1695 1.1 rkujawa return "boot ROM region"; 1696 1.1 rkujawa return "unknown region"; 1697 1.1 rkujawa } 1698 1.1 rkujawa 1699 1.1 rkujawa /* 1700 1.1 rkujawa * Permanently degrade to software rendering, duh. 1701 1.1 rkujawa */ 1702 1.1 rkujawa static void 1703 1.1 rkujawa veritefb_accel_fail(struct veritefb_softc *sc, const char *what) 1704 1.1 rkujawa { 1705 1.1 rkujawa uint32_t pc; 1706 1.1 rkujawa #ifdef VERITEFB_DEBUG 1707 1.1 rkujawa unsigned i, n; 1708 1.1 rkujawa #endif 1709 1.1 rkujawa 1710 1.1 rkujawa if (sc->sc_accel == VFB_ACCEL_SW) 1711 1.1 rkujawa return; 1712 1.1 rkujawa 1713 1.1 rkujawa sc->sc_accel = VFB_ACCEL_SW; 1714 1.1 rkujawa pc = veritefb_risc_samplepc(sc); 1715 1.1 rkujawa aprint_error_dev(sc->sc_dev, 1716 1.1 rkujawa "%s; disabling acceleration until reboot\n", what); 1717 1.1 rkujawa aprint_error_dev(sc->sc_dev, "RISC PC 0x%08x: %s\n", pc, 1718 1.1 rkujawa veritefb_pc_signature(pc)); 1719 1.1 rkujawa 1720 1.1 rkujawa #ifdef VERITEFB_DEBUG 1721 1.1 rkujawa n = MIN(sc->sc_ring_count, 8); 1722 1.1 rkujawa for (i = 0; i < n; i++) 1723 1.1 rkujawa aprint_error_dev(sc->sc_dev, " fifo[-%u] = 0x%08x\n", 1724 1.1 rkujawa n - i, sc->sc_ring[(sc->sc_ring_count - n + i) & 1725 1.1 rkujawa (VFB_RING_SIZE - 1)]); 1726 1.1 rkujawa #endif 1727 1.1 rkujawa 1728 1.1 rkujawa veritefb_risc_hold(sc); 1729 1.1 rkujawa } 1730 1.1 rkujawa 1731 1.1 rkujawa /* wait for n free input FIFO entries */ 1732 1.1 rkujawa static int 1733 1.1 rkujawa veritefb_waitfifo(struct veritefb_softc *sc, int n) 1734 1.1 rkujawa { 1735 1.1 rkujawa int i; 1736 1.1 rkujawa 1737 1.1 rkujawa for (i = 0; i < VFB_FIFOPOLL; i++) { 1738 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOINFREE) & VFB_FIFOINFREE_MASK) >= 1739 1.1 rkujawa n) 1740 1.1 rkujawa return 0; 1741 1.1 rkujawa delay(1); 1742 1.1 rkujawa } 1743 1.1 rkujawa veritefb_accel_fail(sc, "input FIFO timeout"); 1744 1.1 rkujawa return EBUSY; 1745 1.1 rkujawa } 1746 1.1 rkujawa 1747 1.1 rkujawa /* Discard stale output FIFO words. */ 1748 1.1 rkujawa static int 1749 1.1 rkujawa veritefb_drain_outfifo(struct veritefb_softc *sc) 1750 1.1 rkujawa { 1751 1.1 rkujawa int i; 1752 1.1 rkujawa 1753 1.1 rkujawa for (i = 0; i < VFB_FIFOPOLL; i++) { 1754 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOOUTVALID) & 1755 1.1 rkujawa VFB_FIFOOUTVALID_MASK) == 0) 1756 1.1 rkujawa return 0; 1757 1.1 rkujawa (void)vfb_fifo_read(sc); 1758 1.1 rkujawa } 1759 1.1 rkujawa veritefb_accel_fail(sc, "output FIFO never drained"); 1760 1.1 rkujawa return EBUSY; 1761 1.1 rkujawa } 1762 1.1 rkujawa 1763 1.1 rkujawa /* Wait for one word from the output FIFO. */ 1764 1.1 rkujawa static int 1765 1.1 rkujawa veritefb_read_outfifo(struct veritefb_softc *sc, uint32_t *wordp) 1766 1.1 rkujawa { 1767 1.1 rkujawa int i; 1768 1.1 rkujawa 1769 1.1 rkujawa for (i = 0; i < VFB_FIFOPOLL; i++) { 1770 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOOUTVALID) & 1771 1.1 rkujawa VFB_FIFOOUTVALID_MASK) != 0) { 1772 1.1 rkujawa *wordp = vfb_fifo_read(sc); 1773 1.1 rkujawa return 0; 1774 1.1 rkujawa } 1775 1.1 rkujawa delay(1); 1776 1.1 rkujawa } 1777 1.1 rkujawa veritefb_accel_fail(sc, "output FIFO timeout"); 1778 1.1 rkujawa return EBUSY; 1779 1.1 rkujawa } 1780 1.1 rkujawa 1781 1.1 rkujawa /* 1782 1.1 rkujawa * Copy the csucode monitor and the ELF microcode image into the 1783 1.1 rkujawa * reserved VRAM area. 1784 1.1 rkujawa */ 1785 1.1 rkujawa static bool 1786 1.1 rkujawa veritefb_ucode_to_vram(struct veritefb_softc *sc) 1787 1.1 rkujawa { 1788 1.1 rkujawa const uint8_t *u = sc->sc_ucode; 1789 1.1 rkujawa uint32_t entry, phoff, filesz, off, paddr, word; 1790 1.1 rkujawa uint16_t phentsize, phnum, ph; 1791 1.1 rkujawa uint8_t memendian; 1792 1.1 rkujawa size_t i; 1793 1.1 rkujawa 1794 1.1 rkujawa if (sc->sc_ucode_size < sizeof(Elf32_Ehdr) || 1795 1.1 rkujawa memcmp(u, ELFMAG, SELFMAG) != 0 || 1796 1.1 rkujawa u[EI_CLASS] != ELFCLASS32 || u[EI_DATA] != ELFDATA2MSB) { 1797 1.1 rkujawa aprint_error_dev(sc->sc_dev, "microcode is not a " 1798 1.1 rkujawa "big-endian ELF32 image\n"); 1799 1.1 rkujawa return false; 1800 1.1 rkujawa } 1801 1.1 rkujawa 1802 1.1 rkujawa entry = be32dec(u + offsetof(Elf32_Ehdr, e_entry)); 1803 1.1 rkujawa phoff = be32dec(u + offsetof(Elf32_Ehdr, e_phoff)); 1804 1.1 rkujawa phentsize = be16dec(u + offsetof(Elf32_Ehdr, e_phentsize)); 1805 1.1 rkujawa phnum = be16dec(u + offsetof(Elf32_Ehdr, e_phnum)); 1806 1.1 rkujawa 1807 1.1 rkujawa if (phnum == 0 || phentsize < sizeof(Elf32_Phdr) || 1808 1.1 rkujawa phoff + (uint32_t)phnum * phentsize > sc->sc_ucode_size) { 1809 1.1 rkujawa aprint_error_dev(sc->sc_dev, 1810 1.1 rkujawa "microcode program headers out of bounds\n"); 1811 1.1 rkujawa return false; 1812 1.1 rkujawa } 1813 1.1 rkujawa 1814 1.1 rkujawa memendian = vfb_read1(sc, VFB_MEMENDIAN); 1815 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, VFB_MEMENDIAN_NO); 1816 1.1 rkujawa 1817 1.1 rkujawa /* Context-switch monitor and its semaphores. */ 1818 1.1 rkujawa for (i = 0; i < __arraycount(veritefb_csucode); i++) 1819 1.1 rkujawa vfb_fb_write4(sc, VFB_CSUCODE_BASE + i * 4, 1820 1.1 rkujawa veritefb_csucode[i]); 1821 1.1 rkujawa vfb_fb_write4(sc, VFB_CSUCODE_SEM0, 0); 1822 1.1 rkujawa vfb_fb_write4(sc, VFB_CSUCODE_SEM1, 0); 1823 1.1 rkujawa 1824 1.1 rkujawa for (ph = 0; ph < phnum; ph++) { 1825 1.1 rkujawa const uint8_t *p = u + phoff + (uint32_t)ph * phentsize; 1826 1.1 rkujawa 1827 1.1 rkujawa if (be32dec(p + offsetof(Elf32_Phdr, p_type)) != PT_LOAD) 1828 1.1 rkujawa continue; 1829 1.1 rkujawa off = be32dec(p + offsetof(Elf32_Phdr, p_offset)); 1830 1.1 rkujawa filesz = be32dec(p + offsetof(Elf32_Phdr, p_filesz)); 1831 1.1 rkujawa paddr = be32dec(p + offsetof(Elf32_Phdr, p_paddr)); 1832 1.1 rkujawa 1833 1.1 rkujawa if (off + filesz > sc->sc_ucode_size || 1834 1.1 rkujawa paddr + filesz > VFB_MC_SIZE) { 1835 1.1 rkujawa aprint_error_dev(sc->sc_dev, 1836 1.1 rkujawa "microcode segment out of bounds " 1837 1.1 rkujawa "(paddr 0x%x size 0x%x)\n", paddr, filesz); 1838 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, memendian); 1839 1.1 rkujawa return false; 1840 1.1 rkujawa } 1841 1.1 rkujawa 1842 1.1 rkujawa for (i = 0; i + 4 <= filesz; i += 4) 1843 1.1 rkujawa vfb_fb_write4(sc, paddr + i, be32dec(u + off + i)); 1844 1.1 rkujawa if (i < filesz) { 1845 1.1 rkujawa word = 0; 1846 1.1 rkujawa for (; i < filesz; i++) 1847 1.1 rkujawa word = (word << 8) | u[off + i]; 1848 1.1 rkujawa word <<= 8 * (4 - (filesz & 3)); 1849 1.1 rkujawa vfb_fb_write4(sc, paddr + (filesz & ~3U), word); 1850 1.1 rkujawa } 1851 1.1 rkujawa } 1852 1.1 rkujawa 1853 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, memendian); 1854 1.1 rkujawa sc->sc_ucode_entry = entry; 1855 1.1 rkujawa return true; 1856 1.1 rkujawa } 1857 1.1 rkujawa 1858 1.1 rkujawa /* 1859 1.1 rkujawa * Full RISC bring-up: 1860 1.1 rkujawa * - load microcode 1861 1.1 rkujawa * - start the csucode monitor 1862 1.1 rkujawa * - feed it the init sequence 1863 1.1 rkujawa * - validate the command protocol 1864 1.1 rkujawa */ 1865 1.1 rkujawa static bool 1866 1.1 rkujawa veritefb_risc_init(struct veritefb_softc *sc) 1867 1.1 rkujawa { 1868 1.1 rkujawa uint32_t word, saved; 1869 1.1 rkujawa 1870 1.1 rkujawa if (sc->sc_ucode == NULL) 1871 1.1 rkujawa return false; 1872 1.1 rkujawa 1873 1.1 rkujawa sc->sc_accel = VFB_ACCEL_OFF; 1874 1.1 rkujawa 1875 1.1 rkujawa veritefb_risc_hold(sc); 1876 1.1 rkujawa if (!veritefb_ucode_to_vram(sc)) 1877 1.1 rkujawa return false; 1878 1.1 rkujawa 1879 1.1 rkujawa /* 1880 1.1 rkujawa * same VRAM words read through the host aperture and through 1881 1.1 rkujawa * injected RISC loads must agree 1882 1.1 rkujawa */ 1883 1.1 rkujawa { 1884 1.1 rkujawa static const uint32_t testaddr[] = 1885 1.1 rkujawa { VFB_UC_BASE, VFB_CSUCODE_BASE }; 1886 1.1 rkujawa uint32_t hostv, riscv; 1887 1.1 rkujawa uint8_t memendian; 1888 1.1 rkujawa size_t t; 1889 1.1 rkujawa 1890 1.1 rkujawa memendian = vfb_read1(sc, VFB_MEMENDIAN); 1891 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, VFB_MEMENDIAN_NO); 1892 1.1 rkujawa for (t = 0; t < __arraycount(testaddr); t++) { 1893 1.1 rkujawa hostv = vfb_fb_read4(sc, testaddr[t]); 1894 1.1 rkujawa riscv = veritefb_risc_readmem(sc, testaddr[t]); 1895 1.1 rkujawa if (hostv != riscv) { 1896 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, memendian); 1897 1.1 rkujawa aprint_error_dev(sc->sc_dev, 1898 1.1 rkujawa "dual-view self-test failed @0x%x: " 1899 1.1 rkujawa "host 0x%08x vs RISC 0x%08x\n", 1900 1.1 rkujawa testaddr[t], hostv, riscv); 1901 1.1 rkujawa return false; 1902 1.1 rkujawa } 1903 1.1 rkujawa } 1904 1.1 rkujawa vfb_write1(sc, VFB_MEMENDIAN, memendian); 1905 1.1 rkujawa aprint_debug_dev(sc->sc_dev, "dual-view self-test passed\n"); 1906 1.1 rkujawa } 1907 1.1 rkujawa 1908 1.1 rkujawa veritefb_risc_flushicache(sc); 1909 1.1 rkujawa veritefb_risc_start(sc, VFB_CSUCODE_BASE); 1910 1.1 rkujawa 1911 1.1 rkujawa if (veritefb_waitfifo(sc, 4) != 0) 1912 1.1 rkujawa return false; 1913 1.1 rkujawa vfb_fifo_write(sc, VFB_CSUCODE_INIT); 1914 1.1 rkujawa vfb_fifo_write(sc, 0); /* context store area */ 1915 1.1 rkujawa vfb_fifo_write(sc, 0); 1916 1.1 rkujawa vfb_fifo_write(sc, sc->sc_ucode_entry); 1917 1.1 rkujawa 1918 1.1 rkujawa if (veritefb_drain_outfifo(sc) != 0) 1919 1.1 rkujawa return false; 1920 1.1 rkujawa if (veritefb_waitfifo(sc, 1) != 0) 1921 1.1 rkujawa return false; 1922 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VCMD_PIXENGSYNC)); 1923 1.1 rkujawa if (veritefb_read_outfifo(sc, &word) != 0) 1924 1.1 rkujawa return false; 1925 1.1 rkujawa if (word != VFB_SYNC_TOKEN) { 1926 1.1 rkujawa veritefb_accel_fail(sc, "bad sync token from microcode"); 1927 1.1 rkujawa return false; 1928 1.1 rkujawa } 1929 1.1 rkujawa 1930 1.1 rkujawa if (veritefb_waitfifo(sc, 6) != 0) 1931 1.1 rkujawa return false; 1932 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VCMD_SETUP)); 1933 1.1 rkujawa /* 1934 1.1 rkujawa * Word 1 programs the pixel-engine scissor. 1935 1.1 rkujawa * It MUST span the whole VRAM working area. 1936 1.1 rkujawa */ 1937 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(sc->sc_width, 1938 1.1 rkujawa (sc->sc_memsize - sc->sc_fb_offset) / sc->sc_linebytes)); 1939 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(sc->sc_depth, VFB_PIXFMT_8I)); 1940 1.1 rkujawa vfb_fifo_write(sc, (uint32_t)sc->sc_fb_offset); 1941 1.1 rkujawa vfb_fifo_write(sc, sc->sc_linebytes); 1942 1.1 rkujawa vfb_fifo_write(sc, ((uint32_t)sc->sc_stride1 << 12) | 1943 1.1 rkujawa ((uint32_t)sc->sc_stride0 << 8)); 1944 1.1 rkujawa 1945 1.1 rkujawa /* Second sync proves Setup consumed exactly six words. */ 1946 1.1 rkujawa if (veritefb_waitfifo(sc, 1) != 0) 1947 1.1 rkujawa return false; 1948 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VCMD_PIXENGSYNC)); 1949 1.1 rkujawa if (veritefb_read_outfifo(sc, &word) != 0) 1950 1.1 rkujawa return false; 1951 1.1 rkujawa if (word != VFB_SYNC_TOKEN) { 1952 1.1 rkujawa veritefb_accel_fail(sc, "FIFO desync after Setup"); 1953 1.1 rkujawa return false; 1954 1.1 rkujawa } 1955 1.1 rkujawa 1956 1.1 rkujawa /* 1957 1.1 rkujawa * GetPixel round-trip: place the same magic byte in the first 1958 1.1 rkujawa * four framebuffer pixels through the aperture (immune to the 1959 1.1 rkujawa * MEMENDIAN byte-lane setting) and ask the RISC for pixel (0,0). 1960 1.1 rkujawa */ 1961 1.1 rkujawa saved = vfb_fb_read4(sc, sc->sc_fb_offset); 1962 1.1 rkujawa vfb_fb_write4(sc, sc->sc_fb_offset, VFB_GETPIXEL_PATTERN); 1963 1.1 rkujawa if (veritefb_waitfifo(sc, 2) != 0) 1964 1.1 rkujawa return false; 1965 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VCMD_GETPIXEL)); 1966 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(0, 0)); 1967 1.1 rkujawa if (veritefb_read_outfifo(sc, &word) != 0) 1968 1.1 rkujawa return false; 1969 1.1 rkujawa vfb_fb_write4(sc, sc->sc_fb_offset, saved); 1970 1.1 rkujawa if ((word & 0xff) != (VFB_GETPIXEL_PATTERN & 0xff)) { 1971 1.1 rkujawa veritefb_accel_fail(sc, "GetPixel round-trip mismatch"); 1972 1.1 rkujawa return false; 1973 1.1 rkujawa } 1974 1.1 rkujawa 1975 1.1 rkujawa sc->sc_accel = VFB_ACCEL_ON; 1976 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 1977 1.1 rkujawa "RISC running 2D microcode (entry 0x%x), handshake passed\n", 1978 1.1 rkujawa sc->sc_ucode_entry); 1979 1.1 rkujawa return true; 1980 1.1 rkujawa } 1981 1.1 rkujawa 1982 1.1 rkujawa /* 1983 1.1 rkujawa * The microcode ships as a firmware file, so it can only be pulled in 1984 1.1 rkujawa * once the root filesystem exists. 1985 1.1 rkujawa */ 1986 1.1 rkujawa static void 1987 1.1 rkujawa veritefb_load_firmware(device_t self) 1988 1.1 rkujawa { 1989 1.1 rkujawa struct veritefb_softc *sc = device_private(self); 1990 1.1 rkujawa firmware_handle_t fh; 1991 1.1 rkujawa size_t size; 1992 1.1 rkujawa int error; 1993 1.1 rkujawa 1994 1.1 rkujawa error = firmware_open("veritefb", VFB_FIRMWARE_NAME, &fh); 1995 1.1 rkujawa if (error != 0) { 1996 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 1997 1.1 rkujawa "no microcode (firmware veritefb/%s), " 1998 1.1 rkujawa "running unaccelerated\n", VFB_FIRMWARE_NAME); 1999 1.1 rkujawa return; 2000 1.1 rkujawa } 2001 1.1 rkujawa 2002 1.1 rkujawa size = firmware_get_size(fh); 2003 1.1 rkujawa if (size == 0 || size > VFB_MAXUCODE) { 2004 1.1 rkujawa aprint_error_dev(sc->sc_dev, 2005 1.1 rkujawa "implausible microcode size %zu\n", size); 2006 1.1 rkujawa firmware_close(fh); 2007 1.1 rkujawa return; 2008 1.1 rkujawa } 2009 1.1 rkujawa 2010 1.1 rkujawa sc->sc_ucode = firmware_malloc(size); 2011 1.1 rkujawa sc->sc_ucode_size = size; 2012 1.1 rkujawa error = firmware_read(fh, 0, sc->sc_ucode, size); 2013 1.1 rkujawa firmware_close(fh); 2014 1.1 rkujawa if (error != 0) { 2015 1.1 rkujawa aprint_error_dev(sc->sc_dev, "microcode read failed: %d\n", 2016 1.1 rkujawa error); 2017 1.1 rkujawa firmware_free(sc->sc_ucode, size); 2018 1.1 rkujawa sc->sc_ucode = NULL; 2019 1.1 rkujawa return; 2020 1.1 rkujawa } 2021 1.1 rkujawa 2022 1.1 rkujawa (void)veritefb_risc_init(sc); 2023 1.1 rkujawa } 2024 1.1 rkujawa 2025 1.1 rkujawa /* 2026 1.1 rkujawa * Barrier after every accelerated operation 2027 1.1 rkujawa */ 2028 1.1 rkujawa static void 2029 1.1 rkujawa veritefb_sync(struct veritefb_softc *sc) 2030 1.1 rkujawa { 2031 1.1 rkujawa uint32_t word; 2032 1.1 rkujawa 2033 1.1 rkujawa if (veritefb_drain_outfifo(sc) != 0) 2034 1.1 rkujawa return; 2035 1.1 rkujawa if (veritefb_waitfifo(sc, 1) != 0) 2036 1.1 rkujawa return; 2037 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VCMD_PIXENGSYNC)); 2038 1.1 rkujawa if (veritefb_read_outfifo(sc, &word) != 0) 2039 1.1 rkujawa return; 2040 1.1 rkujawa if (word != VFB_SYNC_TOKEN) 2041 1.1 rkujawa veritefb_accel_fail(sc, "bad sync token after operation"); 2042 1.1 rkujawa } 2043 1.1 rkujawa 2044 1.1 rkujawa /* FillRectSolidRop */ 2045 1.1 rkujawa static bool 2046 1.1 rkujawa veritefb_rectfill(struct veritefb_softc *sc, int x, int y, int w, int h, 2047 1.1 rkujawa uint32_t color) 2048 1.1 rkujawa { 2049 1.1 rkujawa if (veritefb_waitfifo(sc, 4) != 0) 2050 1.1 rkujawa return false; 2051 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(VFB_ROP_COPY, VCMD_FILLRECTSOLIDROP)); 2052 1.1 rkujawa vfb_fifo_write(sc, color); 2053 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(x, y)); 2054 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(w, h)); 2055 1.1 rkujawa veritefb_sync(sc); 2056 1.1 rkujawa return sc->sc_accel == VFB_ACCEL_ON; 2057 1.1 rkujawa } 2058 1.1 rkujawa 2059 1.1 rkujawa /* ScreenBlt */ 2060 1.1 rkujawa static bool 2061 1.1 rkujawa veritefb_bitblt(struct veritefb_softc *sc, int sx, int sy, int dx, int dy, 2062 1.1 rkujawa int w, int h) 2063 1.1 rkujawa { 2064 1.1 rkujawa if (veritefb_waitfifo(sc, 5) != 0) 2065 1.1 rkujawa return false; 2066 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VCMD_SCREENBLT)); 2067 1.1 rkujawa vfb_fifo_write(sc, VFB_ROP_COPY); 2068 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(sx, sy)); 2069 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(w, h)); 2070 1.1 rkujawa vfb_fifo_write(sc, VFB_P2(dx, dy)); 2071 1.1 rkujawa veritefb_sync(sc); 2072 1.1 rkujawa return sc->sc_accel == VFB_ACCEL_ON; 2073 1.1 rkujawa } 2074 1.1 rkujawa 2075 1.1 rkujawa static inline bool 2076 1.1 rkujawa veritefb_accel_op_ok(struct veritefb_softc *sc) 2077 1.1 rkujawa { 2078 1.1 rkujawa return sc->sc_accel == VFB_ACCEL_ON && 2079 1.1 rkujawa sc->sc_mode == WSDISPLAYIO_MODE_EMUL; 2080 1.1 rkujawa } 2081 1.1 rkujawa 2082 1.1 rkujawa #ifdef VERITEFB_DEBUG 2083 1.1 rkujawa static void 2084 1.1 rkujawa vfb_stat(struct veritefb_softc *sc, int idx, const struct timeval *t0) 2085 1.1 rkujawa { 2086 1.1 rkujawa struct timeval t1; 2087 1.1 rkujawa 2088 1.1 rkujawa microuptime(&t1); 2089 1.1 rkujawa sc->sc_stats.vs_count[idx]++; 2090 1.1 rkujawa sc->sc_stats.vs_us[idx] += 2091 1.1 rkujawa (uint64_t)(t1.tv_sec - t0->tv_sec) * 1000000 + 2092 1.1 rkujawa (t1.tv_usec - t0->tv_usec); 2093 1.1 rkujawa } 2094 1.1 rkujawa #define VFB_T0() struct timeval t0_; microuptime(&t0_) 2095 1.1 rkujawa #define VFB_STAT(sc, idx) vfb_stat(sc, idx, &t0_) 2096 1.1 rkujawa #else 2097 1.1 rkujawa #define VFB_T0() do { } while (0) 2098 1.1 rkujawa #define VFB_STAT(sc, idx) do { } while (0) 2099 1.1 rkujawa #endif 2100 1.1 rkujawa 2101 1.1 rkujawa static void 2102 1.1 rkujawa veritefb_eraserows(void *cookie, int row, int nrows, long fillattr) 2103 1.1 rkujawa { 2104 1.1 rkujawa struct rasops_info *ri = cookie; 2105 1.1 rkujawa struct vcons_screen *scr = ri->ri_hw; 2106 1.1 rkujawa struct veritefb_softc *sc = scr->scr_cookie; 2107 1.1 rkujawa int x, y, w, h; 2108 1.1 rkujawa VFB_T0(); 2109 1.1 rkujawa 2110 1.1 rkujawa if (!veritefb_accel_op_ok(sc)) { 2111 1.1 rkujawa sc->sc_orig_eraserows(cookie, row, nrows, fillattr); 2112 1.1 rkujawa VFB_STAT(sc, VFB_STAT_FILL); 2113 1.1 rkujawa return; 2114 1.1 rkujawa } 2115 1.1 rkujawa 2116 1.1 rkujawa if (row == 0 && nrows == ri->ri_rows) { 2117 1.1 rkujawa x = y = 0; 2118 1.1 rkujawa w = ri->ri_width; 2119 1.1 rkujawa h = ri->ri_height; 2120 1.1 rkujawa } else { 2121 1.1 rkujawa x = ri->ri_xorigin; 2122 1.1 rkujawa y = ri->ri_yorigin + row * ri->ri_font->fontheight; 2123 1.1 rkujawa w = ri->ri_emuwidth; 2124 1.1 rkujawa h = nrows * ri->ri_font->fontheight; 2125 1.1 rkujawa } 2126 1.1 rkujawa if (!veritefb_rectfill(sc, x, y, w, h, 2127 1.1 rkujawa ri->ri_devcmap[(fillattr >> 16) & 0xf])) 2128 1.1 rkujawa sc->sc_orig_eraserows(cookie, row, nrows, fillattr); 2129 1.1 rkujawa VFB_STAT(sc, VFB_STAT_FILL); 2130 1.1 rkujawa } 2131 1.1 rkujawa 2132 1.1 rkujawa static void 2133 1.1 rkujawa veritefb_erasecols(void *cookie, int row, int startcol, int ncols, 2134 1.1 rkujawa long fillattr) 2135 1.1 rkujawa { 2136 1.1 rkujawa struct rasops_info *ri = cookie; 2137 1.1 rkujawa struct vcons_screen *scr = ri->ri_hw; 2138 1.1 rkujawa struct veritefb_softc *sc = scr->scr_cookie; 2139 1.1 rkujawa int x, y, w, h; 2140 1.1 rkujawa 2141 1.1 rkujawa if (!veritefb_accel_op_ok(sc)) { 2142 1.1 rkujawa sc->sc_orig_erasecols(cookie, row, startcol, ncols, 2143 1.1 rkujawa fillattr); 2144 1.1 rkujawa return; 2145 1.1 rkujawa } 2146 1.1 rkujawa 2147 1.1 rkujawa x = ri->ri_xorigin + startcol * ri->ri_font->fontwidth; 2148 1.1 rkujawa y = ri->ri_yorigin + row * ri->ri_font->fontheight; 2149 1.1 rkujawa w = ncols * ri->ri_font->fontwidth; 2150 1.1 rkujawa h = ri->ri_font->fontheight; 2151 1.1 rkujawa if (!veritefb_rectfill(sc, x, y, w, h, 2152 1.1 rkujawa ri->ri_devcmap[(fillattr >> 16) & 0xf])) 2153 1.1 rkujawa sc->sc_orig_erasecols(cookie, row, startcol, ncols, 2154 1.1 rkujawa fillattr); 2155 1.1 rkujawa } 2156 1.1 rkujawa 2157 1.1 rkujawa static void 2158 1.1 rkujawa veritefb_copyrows(void *cookie, int srcrow, int dstrow, int nrows) 2159 1.1 rkujawa { 2160 1.1 rkujawa struct rasops_info *ri = cookie; 2161 1.1 rkujawa struct vcons_screen *scr = ri->ri_hw; 2162 1.1 rkujawa struct veritefb_softc *sc = scr->scr_cookie; 2163 1.1 rkujawa int x, sy, dy, w, h; 2164 1.1 rkujawa VFB_T0(); 2165 1.1 rkujawa 2166 1.1 rkujawa if (!veritefb_accel_op_ok(sc)) { 2167 1.1 rkujawa sc->sc_orig_copyrows(cookie, srcrow, dstrow, nrows); 2168 1.1 rkujawa VFB_STAT(sc, VFB_STAT_BLT); 2169 1.1 rkujawa return; 2170 1.1 rkujawa } 2171 1.1 rkujawa 2172 1.1 rkujawa x = ri->ri_xorigin; 2173 1.1 rkujawa sy = ri->ri_yorigin + srcrow * ri->ri_font->fontheight; 2174 1.1 rkujawa dy = ri->ri_yorigin + dstrow * ri->ri_font->fontheight; 2175 1.1 rkujawa w = ri->ri_emuwidth; 2176 1.1 rkujawa h = nrows * ri->ri_font->fontheight; 2177 1.1 rkujawa if (!veritefb_bitblt(sc, x, sy, x, dy, w, h)) 2178 1.1 rkujawa sc->sc_orig_copyrows(cookie, srcrow, dstrow, nrows); 2179 1.1 rkujawa VFB_STAT(sc, VFB_STAT_BLT); 2180 1.1 rkujawa } 2181 1.1 rkujawa 2182 1.1 rkujawa static void 2183 1.1 rkujawa veritefb_copycols(void *cookie, int row, int srccol, int dstcol, int ncols) 2184 1.1 rkujawa { 2185 1.1 rkujawa struct rasops_info *ri = cookie; 2186 1.1 rkujawa struct vcons_screen *scr = ri->ri_hw; 2187 1.1 rkujawa struct veritefb_softc *sc = scr->scr_cookie; 2188 1.1 rkujawa int sx, dx, y, w, h; 2189 1.1 rkujawa 2190 1.1 rkujawa if (!veritefb_accel_op_ok(sc)) { 2191 1.1 rkujawa sc->sc_orig_copycols(cookie, row, srccol, dstcol, ncols); 2192 1.1 rkujawa return; 2193 1.1 rkujawa } 2194 1.1 rkujawa 2195 1.1 rkujawa sx = ri->ri_xorigin + srccol * ri->ri_font->fontwidth; 2196 1.1 rkujawa dx = ri->ri_xorigin + dstcol * ri->ri_font->fontwidth; 2197 1.1 rkujawa y = ri->ri_yorigin + row * ri->ri_font->fontheight; 2198 1.1 rkujawa w = ncols * ri->ri_font->fontwidth; 2199 1.1 rkujawa h = ri->ri_font->fontheight; 2200 1.1 rkujawa if (!veritefb_bitblt(sc, sx, y, dx, y, w, h)) 2201 1.1 rkujawa sc->sc_orig_copycols(cookie, row, srccol, dstcol, ncols); 2202 1.1 rkujawa } 2203 1.1 rkujawa 2204 1.1 rkujawa /* Blit-within-VRAM for the glyph cache. */ 2205 1.1 rkujawa static void 2206 1.1 rkujawa veritefb_gc_bitblt(void *cookie, int xs, int ys, int xd, int yd, int wi, 2207 1.1 rkujawa int he, int rop) 2208 1.1 rkujawa { 2209 1.1 rkujawa struct veritefb_softc *sc = cookie; 2210 1.1 rkujawa 2211 1.1 rkujawa (void)veritefb_bitblt(sc, xs, ys, xd, yd, wi, he); 2212 1.1 rkujawa } 2213 1.1 rkujawa 2214 1.1 rkujawa /* 2215 1.1 rkujawa * Glyph-cached putchar 2216 1.1 rkujawa */ 2217 1.1 rkujawa static void 2218 1.1 rkujawa veritefb_putchar(void *cookie, int row, int col, u_int c, long attr) 2219 1.1 rkujawa { 2220 1.1 rkujawa struct rasops_info *ri = cookie; 2221 1.1 rkujawa struct vcons_screen *scr = ri->ri_hw; 2222 1.1 rkujawa struct veritefb_softc *sc = scr->scr_cookie; 2223 1.1 rkujawa struct wsdisplay_font *font = PICK_FONT(ri, c); 2224 1.1 rkujawa uint32_t fg, bg; 2225 1.1 rkujawa int x, y, wi, he, rv; 2226 1.1 rkujawa VFB_T0(); 2227 1.1 rkujawa 2228 1.1 rkujawa /* Anything drawn before firmload lands here. */ 2229 1.1 rkujawa if (!veritefb_accel_op_ok(sc) || !sc->sc_gc_initted) { 2230 1.1 rkujawa sc->sc_orig_putchar(cookie, row, col, c, attr); 2231 1.1 rkujawa VFB_STAT(sc, VFB_STAT_CHAR_SW); 2232 1.1 rkujawa return; 2233 1.1 rkujawa } 2234 1.1 rkujawa 2235 1.1 rkujawa if (!CHAR_IN_FONT(c, font)) 2236 1.1 rkujawa return; 2237 1.1 rkujawa 2238 1.1 rkujawa wi = font->fontwidth; 2239 1.1 rkujawa he = font->fontheight; 2240 1.1 rkujawa x = ri->ri_xorigin + col * wi; 2241 1.1 rkujawa y = ri->ri_yorigin + row * he; 2242 1.1 rkujawa fg = ri->ri_devcmap[(attr >> 24) & 0xf]; 2243 1.1 rkujawa bg = ri->ri_devcmap[(attr >> 16) & 0xf]; 2244 1.1 rkujawa 2245 1.1 rkujawa if (c == ' ') { 2246 1.1 rkujawa if (!veritefb_rectfill(sc, x, y, wi, he, bg)) { 2247 1.1 rkujawa sc->sc_orig_putchar(cookie, row, col, c, attr); 2248 1.1 rkujawa return; 2249 1.1 rkujawa } 2250 1.1 rkujawa if (attr & WSATTR_UNDERLINE) 2251 1.1 rkujawa (void)veritefb_rectfill(sc, 2252 1.1 rkujawa x, y + he - VFB_UNDERLINE_OFF, wi, 1, fg); 2253 1.1 rkujawa VFB_STAT(sc, VFB_STAT_CHAR_SPACE); 2254 1.1 rkujawa return; 2255 1.1 rkujawa } 2256 1.1 rkujawa 2257 1.1 rkujawa rv = glyphcache_try(&sc->sc_gc, c, x, y, attr); 2258 1.1 rkujawa if (rv == GC_OK) { 2259 1.1 rkujawa VFB_STAT(sc, VFB_STAT_CHAR_HIT); 2260 1.1 rkujawa return; 2261 1.1 rkujawa } 2262 1.1 rkujawa 2263 1.1 rkujawa /* 2264 1.1 rkujawa * Every accelerated op above ends in a sync, so the engine is 2265 1.1 rkujawa * idle by the time the software renderer scribbles into VRAM. 2266 1.1 rkujawa */ 2267 1.1 rkujawa sc->sc_orig_putchar(cookie, row, col, c, attr & 2268 1.1 rkujawa ~(long)(WSATTR_REVERSE | WSATTR_HILIT | WSATTR_BLINK | 2269 1.1 rkujawa WSATTR_UNDERLINE)); 2270 1.1 rkujawa 2271 1.1 rkujawa if (rv == GC_ADD) { 2272 1.1 rkujawa glyphcache_add(&sc->sc_gc, c, x, y); 2273 1.1 rkujawa } else if (attr & WSATTR_UNDERLINE) 2274 1.1 rkujawa (void)veritefb_rectfill(sc, 2275 1.1 rkujawa x, y + he - VFB_UNDERLINE_OFF, wi, 1, fg); 2276 1.1 rkujawa VFB_STAT(sc, VFB_STAT_CHAR_ADD); 2277 1.1 rkujawa } 2278 1.1 rkujawa 2279 1.1 rkujawa #if defined(DDB) && defined(VERITEFB_DEBUG) 2280 1.1 rkujawa /* 2281 1.1 rkujawa * ddb 'verite*' commands, wrappers over the RISC debug port. 2282 1.1 rkujawa * 'veriteregs' leaves the RISC held and clobbers the decoder IR, 2283 1.1 rkujawa * resume with 'veritereset', not 'veritecont'. 2284 1.1 rkujawa */ 2285 1.1 rkujawa 2286 1.1 rkujawa static struct veritefb_softc *veritefb_ddb_sc; 2287 1.1 rkujawa 2288 1.1 rkujawa static const char * 2289 1.1 rkujawa veritefb_db_regname(int idx) 2290 1.1 rkujawa { 2291 1.1 rkujawa switch (idx) { 2292 1.1 rkujawa case VRISC_FLAG: return "flag"; 2293 1.1 rkujawa case 176: return "cmd-param"; 2294 1.1 rkujawa case 177: return "cmd-index"; 2295 1.1 rkujawa case 224: return "DispatchTable"; 2296 1.1 rkujawa case 225: return "code-base"; 2297 1.1 rkujawa case 227: return "shadow/fb-base"; 2298 1.1 rkujawa case 235: return "load-bias"; 2299 1.1 rkujawa case VRISC_SP: return "SP(dbg-scratch)"; 2300 1.1 rkujawa case VRISC_RA: return "RA(dbg-scratch)"; 2301 1.1 rkujawa case VRISC_FP: return "FP(dbg-scratch)"; 2302 1.1 rkujawa default: return NULL; 2303 1.1 rkujawa } 2304 1.1 rkujawa } 2305 1.1 rkujawa 2306 1.1 rkujawa static void 2307 1.1 rkujawa veritefb_db_diag(db_expr_t addr, bool have_addr, db_expr_t count, 2308 1.1 rkujawa const char *modif) 2309 1.1 rkujawa { 2310 1.1 rkujawa struct veritefb_softc *sc = veritefb_ddb_sc; 2311 1.1 rkujawa uint32_t pc, word; 2312 1.1 rkujawa unsigned i, n; 2313 1.1 rkujawa 2314 1.1 rkujawa if (sc == NULL) { 2315 1.1 rkujawa db_printf("veritefb not attached\n"); 2316 1.1 rkujawa return; 2317 1.1 rkujawa } 2318 1.1 rkujawa 2319 1.1 rkujawa db_printf("accel state: %s\n", 2320 1.1 rkujawa sc->sc_accel == VFB_ACCEL_ON ? "ON" : 2321 1.1 rkujawa sc->sc_accel == VFB_ACCEL_SW ? "SW (degraded)" : "OFF"); 2322 1.1 rkujawa db_printf("FIFOINFREE %u/31, FIFOOUTVALID %u, DEBUG 0x%02x\n", 2323 1.1 rkujawa vfb_read1(sc, VFB_FIFOINFREE) & VFB_FIFOINFREE_MASK, 2324 1.1 rkujawa vfb_read1(sc, VFB_FIFOOUTVALID) & VFB_FIFOOUTVALID_MASK, 2325 1.1 rkujawa vfb_read1(sc, VFB_DEBUG)); 2326 1.1 rkujawa 2327 1.1 rkujawa pc = veritefb_risc_samplepc(sc); 2328 1.1 rkujawa db_printf("RISC PC 0x%08x: %s\n", pc, veritefb_pc_signature(pc)); 2329 1.1 rkujawa 2330 1.1 rkujawa n = MIN(sc->sc_ring_count, 16); 2331 1.1 rkujawa db_printf("last %u FIFO words (oldest first):\n", n); 2332 1.1 rkujawa for (i = 0; i < n; i++) 2333 1.1 rkujawa db_printf(" [-%2u] 0x%08x\n", n - i, 2334 1.1 rkujawa sc->sc_ring[(sc->sc_ring_count - n + i) & 2335 1.1 rkujawa (VFB_RING_SIZE - 1)]); 2336 1.1 rkujawa 2337 1.1 rkujawa /* Heartbeat, only if we believe the engine is alive. */ 2338 1.1 rkujawa if (sc->sc_accel == VFB_ACCEL_ON) { 2339 1.1 rkujawa for (i = 0; i < VFB_DRAINPOLL; i++) { 2340 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOOUTVALID) & 2341 1.1 rkujawa VFB_FIFOOUTVALID_MASK) == 0) 2342 1.1 rkujawa break; 2343 1.1 rkujawa (void)vfb_fifo_read(sc); 2344 1.1 rkujawa delay(1); 2345 1.1 rkujawa } 2346 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOINFREE) & 2347 1.1 rkujawa VFB_FIFOINFREE_MASK) < 1) { 2348 1.1 rkujawa db_printf("heartbeat: input FIFO full - RISC " 2349 1.1 rkujawa "not consuming (wedged)\n"); 2350 1.1 rkujawa return; 2351 1.1 rkujawa } 2352 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VCMD_PIXENGSYNC)); 2353 1.1 rkujawa for (i = 0; i < VFB_FIFOPOLL; i++) { 2354 1.1 rkujawa if ((vfb_read1(sc, VFB_FIFOOUTVALID) & 2355 1.1 rkujawa VFB_FIFOOUTVALID_MASK) != 0) 2356 1.1 rkujawa break; 2357 1.1 rkujawa delay(1); 2358 1.1 rkujawa } 2359 1.1 rkujawa if (i == VFB_FIFOPOLL) { 2360 1.1 rkujawa db_printf("heartbeat: no sync token (RISC or " 2361 1.1 rkujawa "pixel engine wedged)\n"); 2362 1.1 rkujawa } else { 2363 1.1 rkujawa word = vfb_fifo_read(sc); 2364 1.1 rkujawa db_printf("heartbeat: token 0x%08x (%s)\n", word, 2365 1.1 rkujawa word == VFB_SYNC_TOKEN ? "healthy" : "BAD"); 2366 1.1 rkujawa } 2367 1.1 rkujawa } 2368 1.1 rkujawa } 2369 1.1 rkujawa 2370 1.1 rkujawa static void 2371 1.1 rkujawa veritefb_db_regs(db_expr_t addr, bool have_addr, db_expr_t count, 2372 1.1 rkujawa const char *modif) 2373 1.1 rkujawa { 2374 1.1 rkujawa struct veritefb_softc *sc = veritefb_ddb_sc; 2375 1.1 rkujawa const char *name; 2376 1.1 rkujawa uint32_t val; 2377 1.1 rkujawa int i; 2378 1.1 rkujawa 2379 1.1 rkujawa if (sc == NULL) { 2380 1.1 rkujawa db_printf("veritefb not attached\n"); 2381 1.1 rkujawa return; 2382 1.1 rkujawa } 2383 1.1 rkujawa 2384 1.1 rkujawa veritefb_risc_hold(sc); 2385 1.1 rkujawa db_printf("register file snapshot (RISC left held; IR clobbered - " 2386 1.1 rkujawa "use veritereset to resume):\n"); 2387 1.1 rkujawa for (i = 0; i < 256; i++) { 2388 1.1 rkujawa val = veritefb_risc_readrf(sc, i); 2389 1.1 rkujawa name = veritefb_db_regname(i); 2390 1.1 rkujawa db_printf("%%%-3d 0x%08x%s%s%s", i, val, 2391 1.1 rkujawa name ? " (" : "", name ? name : "", name ? ")" : ""); 2392 1.1 rkujawa db_printf((i & 3) == 3 ? "\n" : " "); 2393 1.1 rkujawa } 2394 1.1 rkujawa vfb_write1(sc, VFB_STATEINDEX, VFB_STATEINDEX_PC); 2395 1.1 rkujawa db_printf("PC 0x%08x\n", vfb_read4(sc, VFB_STATEDATA)); 2396 1.1 rkujawa } 2397 1.1 rkujawa 2398 1.1 rkujawa static void 2399 1.1 rkujawa veritefb_db_reset(db_expr_t addr, bool have_addr, db_expr_t count, 2400 1.1 rkujawa const char *modif) 2401 1.1 rkujawa { 2402 1.1 rkujawa struct veritefb_softc *sc = veritefb_ddb_sc; 2403 1.1 rkujawa 2404 1.1 rkujawa if (sc == NULL || sc->sc_ucode == NULL) { 2405 1.1 rkujawa db_printf("veritefb not attached or no microcode\n"); 2406 1.1 rkujawa return; 2407 1.1 rkujawa } 2408 1.1 rkujawa 2409 1.1 rkujawa db_printf("reloading microcode and restarting RISC...\n"); 2410 1.1 rkujawa db_printf("%s\n", veritefb_risc_init(sc) ? 2411 1.1 rkujawa "handshake passed, acceleration restored" : 2412 1.1 rkujawa "bring-up FAILED, staying in software rendering"); 2413 1.1 rkujawa } 2414 1.1 rkujawa 2415 1.1 rkujawa static void 2416 1.1 rkujawa veritefb_db_fault(db_expr_t addr, bool have_addr, db_expr_t count, 2417 1.1 rkujawa const char *modif) 2418 1.1 rkujawa { 2419 1.1 rkujawa struct veritefb_softc *sc = veritefb_ddb_sc; 2420 1.1 rkujawa 2421 1.1 rkujawa if (sc == NULL) { 2422 1.1 rkujawa db_printf("veritefb not attached\n"); 2423 1.1 rkujawa return; 2424 1.1 rkujawa } 2425 1.1 rkujawa 2426 1.1 rkujawa db_printf("deliberately sending an invalid command (trap slot), " 2427 1.1 rkujawa "run veritediag to observe, veritereset to recover\n"); 2428 1.1 rkujawa vfb_fifo_write(sc, VFB_CMDW(0, VFB_CMD_BOGUS)); 2429 1.1 rkujawa } 2430 1.1 rkujawa 2431 1.1 rkujawa static void 2432 1.1 rkujawa veritefb_db_cont(db_expr_t addr, bool have_addr, db_expr_t count, 2433 1.1 rkujawa const char *modif) 2434 1.1 rkujawa { 2435 1.1 rkujawa struct veritefb_softc *sc = veritefb_ddb_sc; 2436 1.1 rkujawa 2437 1.1 rkujawa if (sc == NULL) { 2438 1.1 rkujawa db_printf("veritefb not attached\n"); 2439 1.1 rkujawa return; 2440 1.1 rkujawa } 2441 1.1 rkujawa veritefb_risc_continue(sc); 2442 1.1 rkujawa db_printf("RISC released\n"); 2443 1.1 rkujawa } 2444 1.1 rkujawa 2445 1.1 rkujawa static const struct db_command veritefb_db_commands[] = { 2446 1.1 rkujawa { DDB_ADD_CMD("veritediag", veritefb_db_diag, 0, 2447 1.1 rkujawa "veritefb: PC signature, FIFO gauges, ring, heartbeat", 2448 1.1 rkujawa NULL, NULL) }, 2449 1.1 rkujawa { DDB_ADD_CMD("veriteregs", veritefb_db_regs, 0, 2450 1.1 rkujawa "veritefb: RISC register file snapshot (leaves RISC held)", 2451 1.1 rkujawa NULL, NULL) }, 2452 1.1 rkujawa { DDB_ADD_CMD("veritereset", veritefb_db_reset, 0, 2453 1.1 rkujawa "veritefb: reload microcode, restart RISC, re-handshake", 2454 1.1 rkujawa NULL, NULL) }, 2455 1.1 rkujawa { DDB_ADD_CMD("veritefault", veritefb_db_fault, 0, 2456 1.1 rkujawa "veritefb: deliberately wedge the RISC (recovery test)", 2457 1.1 rkujawa NULL, NULL) }, 2458 1.1 rkujawa { DDB_ADD_CMD("veritecont", veritefb_db_cont, 0, 2459 1.1 rkujawa "veritefb: release the RISC hold bit", 2460 1.1 rkujawa NULL, NULL) }, 2461 1.1 rkujawa { DDB_END_CMD }, 2462 1.1 rkujawa }; 2463 1.1 rkujawa 2464 1.1 rkujawa static void 2465 1.1 rkujawa veritefb_ddb_attach(struct veritefb_softc *sc) 2466 1.1 rkujawa { 2467 1.1 rkujawa if (veritefb_ddb_sc != NULL) 2468 1.1 rkujawa return; 2469 1.1 rkujawa veritefb_ddb_sc = sc; 2470 1.1 rkujawa (void)db_register_tbl(DDB_BASE_CMD, veritefb_db_commands); 2471 1.1 rkujawa } 2472 1.1 rkujawa #endif /* DDB && VERITEFB_DEBUG */ 2473 1.1 rkujawa 2474