Home | History | Annotate | Line # | Download | only in pci
      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