veritefb.c revision 1.1 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