Home | History | Annotate | Line # | Download | only in dev
      1  1.7    andvar /*	$NetBSD: mq200debug.c,v 1.7 2024/07/05 19:28:35 andvar Exp $	*/
      2  1.1  takemura 
      3  1.1  takemura /*-
      4  1.1  takemura  * Copyright (c) 2001 TAKEMURA Shin
      5  1.1  takemura  * All rights reserved.
      6  1.1  takemura  *
      7  1.1  takemura  * Redistribution and use in source and binary forms, with or without
      8  1.1  takemura  * modification, are permitted provided that the following conditions
      9  1.1  takemura  * are met:
     10  1.1  takemura  * 1. Redistributions of source code must retain the above copyright
     11  1.1  takemura  *    notice, this list of conditions and the following disclaimer.
     12  1.1  takemura  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  takemura  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  takemura  *    documentation and/or other materials provided with the distribution.
     15  1.1  takemura  * 3. The name of the author may not be used to endorse or promote products
     16  1.1  takemura  *    derived from this software without specific prior written permission.
     17  1.1  takemura  *
     18  1.1  takemura  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     19  1.1  takemura  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     20  1.1  takemura  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     21  1.1  takemura  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     22  1.1  takemura  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     23  1.1  takemura  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     24  1.1  takemura  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     25  1.1  takemura  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     26  1.1  takemura  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     27  1.1  takemura  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     28  1.1  takemura  * SUCH DAMAGE.
     29  1.1  takemura  *
     30  1.1  takemura  */
     31  1.1  takemura 
     32  1.1  takemura #ifdef _KERNEL
     33  1.2     lukem #include <sys/cdefs.h>
     34  1.7    andvar __KERNEL_RCSID(0, "$NetBSD: mq200debug.c,v 1.7 2024/07/05 19:28:35 andvar Exp $");
     35  1.2     lukem 
     36  1.1  takemura #include <sys/param.h>
     37  1.1  takemura #include <sys/kernel.h>
     38  1.1  takemura #include <sys/systm.h>
     39  1.1  takemura #include <sys/device.h>
     40  1.1  takemura #else
     41  1.1  takemura #include <stdio.h>
     42  1.1  takemura #endif
     43  1.1  takemura #include <sys/types.h>
     44  1.1  takemura 
     45  1.1  takemura #include <machine/platid.h>
     46  1.1  takemura #include <machine/platid_mask.h>
     47  1.1  takemura 
     48  1.1  takemura #include "opt_mq200.h"
     49  1.1  takemura #include "mq200var.h"
     50  1.1  takemura #include "mq200reg.h"
     51  1.1  takemura #include "mq200priv.h"
     52  1.1  takemura 
     53  1.1  takemura #define ENABLE(b)	((b)?"enable":"disable")
     54  1.1  takemura 
     55  1.4        he const char *mq200_clknames[] = { "BUS", "PLL1", "PLL2", "PLL3" };
     56  1.3        tv 
     57  1.1  takemura #ifdef MQ200_DEBUG
     58  1.1  takemura 
     59  1.1  takemura void
     60  1.1  takemura mq200_dump_pll(struct mq200_softc *sc)
     61  1.1  takemura {
     62  1.1  takemura 	int n, m;
     63  1.1  takemura 	u_int32_t reg, pm00r;
     64  1.1  takemura 	int clocks[4];
     65  1.1  takemura 	int memclock, geclock;
     66  1.4        he 	static const char *clknames[] = { "BUS", "PLL1", "PLL2", "PLL3" };
     67  1.4        he 	static const char *fd_names[] = { "1", "1.5", "2.5", "3.5", "4.5", "5.5", "6.5" };
     68  1.1  takemura 	static int fd_vals[] = { 10, 15, 25, 35, 45, 55, 65 };
     69  1.1  takemura #define FIXEDFLOAT1000(a)	(a)/1000, (a)%1000
     70  1.1  takemura 
     71  1.1  takemura 	/* PM00R */
     72  1.1  takemura 	pm00r = mq200_read(sc, MQ200_PMCR);
     73  1.1  takemura 	geclock = (pm00r&MQ200_PMC_GE_CLK_MASK)>>MQ200_PMC_GE_CLK_SHIFT;
     74  1.1  takemura 
     75  1.1  takemura 	/* MM01R */
     76  1.1  takemura 	reg = mq200_read(sc, MQ200_MMR(1));
     77  1.1  takemura 	memclock = (reg & MQ200_MM01_CLK_PLL2) ? 2 : 1;
     78  1.1  takemura 
     79  1.1  takemura 	/* bus clock */
     80  1.1  takemura 	clocks[0] = 0;
     81  1.1  takemura 
     82  1.1  takemura 	/* PLL1 */
     83  1.1  takemura 	reg = mq200_read(sc, MQ200_DCMISCR);
     84  1.1  takemura 	m = ((reg & MQ200_PLL_M_MASK) >> MQ200_PLL_M_SHIFT) + 1;
     85  1.1  takemura 	n = ((((reg & MQ200_PLL_N_MASK) >> MQ200_PLL_N_SHIFT) + 1) |
     86  1.1  takemura 	    ((pm00r & MQ200_PMC_PLL1_N) << MQ200_PMC_PLL1_N_SHIFT));
     87  1.1  takemura 	n <<= ((reg & MQ200_PLL_P_MASK) >> MQ200_PLL_P_SHIFT);
     88  1.1  takemura 	printf("  PLL1:%3d.%03dMHz(0x%08x, %d.%03dMHzx%3d/%3d)\n",
     89  1.1  takemura 	    FIXEDFLOAT1000(sc->sc_baseclock*m/n),
     90  1.1  takemura 	    reg, FIXEDFLOAT1000(sc->sc_baseclock), m, n);
     91  1.1  takemura 	clocks[1] = sc->sc_baseclock*m/n;
     92  1.1  takemura 
     93  1.1  takemura 	/* PLL2 */
     94  1.1  takemura 	if (pm00r & MQ200_PMC_PLL2_ENABLE) {
     95  1.1  takemura 		reg = mq200_read(sc, MQ200_PLL2R);
     96  1.1  takemura 		m = ((reg & MQ200_PLL_M_MASK) >> MQ200_PLL_M_SHIFT) + 1;
     97  1.1  takemura 		n = ((((reg & MQ200_PLL_N_MASK) >> MQ200_PLL_N_SHIFT) +1) <<
     98  1.1  takemura 		    ((reg & MQ200_PLL_P_MASK) >> MQ200_PLL_P_SHIFT));
     99  1.1  takemura 		clocks[2] = sc->sc_baseclock*m/n;
    100  1.1  takemura 		printf("  PLL2:%3d.%03dMHz(0x%08x, %d.%03dMHzx%3d/%3d)\n",
    101  1.1  takemura 		    FIXEDFLOAT1000(sc->sc_baseclock*m/n),
    102  1.1  takemura 		    reg, FIXEDFLOAT1000(sc->sc_baseclock), m, n);
    103  1.1  takemura 	} else {
    104  1.1  takemura 		printf("  PLL2: disable\n");
    105  1.1  takemura 		clocks[2] = 0;
    106  1.1  takemura 	}
    107  1.1  takemura 
    108  1.1  takemura 	/* PLL3 */
    109  1.1  takemura 	if (pm00r & MQ200_PMC_PLL3_ENABLE) {
    110  1.1  takemura 		reg = mq200_read(sc, MQ200_PLL3R);
    111  1.1  takemura 		m = (((reg & MQ200_PLL_M_MASK) >> MQ200_PLL_M_SHIFT) + 1);
    112  1.1  takemura 		n = ((((reg & MQ200_PLL_N_MASK) >> MQ200_PLL_N_SHIFT) + 1) <<
    113  1.1  takemura 		    ((reg & MQ200_PLL_P_MASK) >> MQ200_PLL_P_SHIFT));
    114  1.1  takemura 		clocks[3] = sc->sc_baseclock*m/n;
    115  1.1  takemura 		printf("  PLL3:%3d.%03dMHz(0x%08x, %d.%03dMHzx%3d/%3d)\n",
    116  1.1  takemura 		    FIXEDFLOAT1000(sc->sc_baseclock*m/n),
    117  1.1  takemura 		    reg, FIXEDFLOAT1000(sc->sc_baseclock), m, n);
    118  1.1  takemura 	} else {
    119  1.1  takemura 		printf("  PLL3: disable\n");
    120  1.1  takemura 		clocks[3] = 0;
    121  1.1  takemura 	}
    122  1.1  takemura 
    123  1.1  takemura 	printf("   MEM:%3d.%03dMHz(%s)\n",
    124  1.1  takemura 	    FIXEDFLOAT1000(clocks[memclock]),
    125  1.1  takemura 	    clknames[memclock]);
    126  1.1  takemura 	printf("    GE:%3d.%03dMHz(%s)\n",
    127  1.1  takemura 	    FIXEDFLOAT1000(clocks[geclock]),
    128  1.1  takemura 	    clknames[geclock]);
    129  1.1  takemura 
    130  1.1  takemura 	/* GC1 */
    131  1.1  takemura 	reg = mq200_read(sc, MQ200_GCCR(MQ200_GC1));
    132  1.1  takemura 	if (reg & MQ200_GCC_ENABLE) {
    133  1.1  takemura 		int fd, sd, rc;
    134  1.1  takemura 		rc = (reg&MQ200_GCC_RCLK_MASK)>>MQ200_GCC_RCLK_SHIFT;
    135  1.1  takemura 		fd = (reg&MQ200_GCC_MCLK_FD_MASK)>>MQ200_GCC_MCLK_FD_SHIFT;
    136  1.1  takemura 		sd = (reg&MQ200_GCC_MCLK_SD_MASK)>>MQ200_GCC_MCLK_SD_SHIFT;
    137  1.1  takemura 		printf("   GC1:%3d.%03dMHz(%s/%s/%d)",
    138  1.1  takemura 		    FIXEDFLOAT1000(clocks[rc]*10/fd_vals[fd]/sd),
    139  1.1  takemura 		    clknames[rc], fd_names[fd], sd);
    140  1.1  takemura 		/* GC01R */
    141  1.1  takemura 		reg = mq200_read(sc, MQ200_GC1CRTCR);
    142  1.1  takemura 		if (reg&MQ200_GC1CRTC_DACEN)
    143  1.1  takemura 			printf(", CRT");
    144  1.1  takemura 		reg = mq200_read(sc, MQ200_FPCR);
    145  1.1  takemura 		if ((reg & MQ200_FPC_ENABLE) && !(reg & MQ200_FPC_GC2))
    146  1.1  takemura 			printf(", LCD");
    147  1.1  takemura 		printf("\n");
    148  1.1  takemura 	} else {
    149  1.1  takemura 		printf("   GC1: disable\n");
    150  1.1  takemura 	}
    151  1.1  takemura 
    152  1.1  takemura 	/* GC2 */
    153  1.1  takemura 	reg = mq200_read(sc, MQ200_GCCR(MQ200_GC2));
    154  1.1  takemura 	if (reg & MQ200_GCC_ENABLE) {
    155  1.1  takemura 		int fd, sd, rc;
    156  1.1  takemura 		rc = (reg&MQ200_GCC_RCLK_MASK)>>MQ200_GCC_RCLK_SHIFT;
    157  1.1  takemura 		fd = (reg&MQ200_GCC_MCLK_FD_MASK)>>MQ200_GCC_MCLK_FD_SHIFT;
    158  1.1  takemura 		sd = (reg&MQ200_GCC_MCLK_SD_MASK)>>MQ200_GCC_MCLK_SD_SHIFT;
    159  1.1  takemura 		printf("   GC2:%3d.%03dMHz(%s/%s/%d)",
    160  1.1  takemura 		    FIXEDFLOAT1000(clocks[rc]*10/fd_vals[fd]/sd),
    161  1.1  takemura 		    clknames[rc], fd_names[fd], sd);
    162  1.1  takemura 		reg = mq200_read(sc, MQ200_FPCR);
    163  1.1  takemura 		if ((reg & MQ200_FPC_ENABLE) && (reg & MQ200_FPC_GC2))
    164  1.1  takemura 			printf(", FP");
    165  1.1  takemura 		printf("\n");
    166  1.1  takemura 	} else {
    167  1.1  takemura 		printf("   GC2: disable\n");
    168  1.1  takemura 	}
    169  1.1  takemura }
    170  1.1  takemura 
    171  1.1  takemura struct {
    172  1.4        he 	const char *name;
    173  1.1  takemura 	u_int32_t base;
    174  1.1  takemura 	int start, end;
    175  1.1  takemura } regs[] = {
    176  1.1  takemura 	{ "GC",	MQ200_GCR(0),	0x00,	0x13 },
    177  1.1  takemura 	{ "GC",	MQ200_GCR(0),	0x20,	0x33 },
    178  1.1  takemura 	{ "FP",	MQ200_FP,	0x00,	0x0f },
    179  1.1  takemura 	{ "CC",	MQ200_CC,	0x00,	0x01 },
    180  1.1  takemura 	{ "PC",	MQ200_PC,	0x00,	0x05 },
    181  1.1  takemura 	{ "MM",	MQ200_MM,	0x00,	0x04 },
    182  1.1  takemura 	{ "DC",	MQ200_DC,	0x00,	0x03 },
    183  1.1  takemura 	{ "PM",	MQ200_PM,	0x00,	0x03 },
    184  1.1  takemura 	{ "PM",	MQ200_PM,	0x06,	0x07 },
    185  1.1  takemura 	{ "IN",	MQ200_IN,	0x00,	0x03 },
    186  1.1  takemura };
    187  1.1  takemura 
    188  1.1  takemura char *
    189  1.1  takemura mq200_regname(struct mq200_softc *sc, int offset, char *buf, int bufsize)
    190  1.1  takemura {
    191  1.1  takemura 	int i;
    192  1.1  takemura 
    193  1.1  takemura 	for (i = 0; i < sizeof(regs)/sizeof(*regs); i++)
    194  1.1  takemura 		if (regs[i].base + regs[i].start * 4 <= offset &&
    195  1.1  takemura 		    offset <= regs[i].base + regs[i].end * 4) {
    196  1.6  christos 			snprintf(buf, bufsize, "%s%02XR", regs[i].name,
    197  1.1  takemura 			    (offset - regs[i].base) / 4);
    198  1.1  takemura 			return (buf);
    199  1.1  takemura 		}
    200  1.6  christos 	snprintf(buf, bufsize, "OFFSET %02X", offset);
    201  1.1  takemura 	return (buf);
    202  1.1  takemura }
    203  1.1  takemura 
    204  1.1  takemura void
    205  1.1  takemura mq200_dump_all(struct mq200_softc *sc)
    206  1.1  takemura {
    207  1.1  takemura 	int i, j;
    208  1.1  takemura 
    209  1.1  takemura 	for (i = 0; i < sizeof(regs)/sizeof(*regs); i++)
    210  1.1  takemura 		for (j = regs[i].start; j <= regs[i].end; j++)
    211  1.1  takemura 			printf("%s%02XR: %08x\n",
    212  1.1  takemura 			    regs[i].name, j,
    213  1.1  takemura 			    mq200_read(sc, regs[i].base + (j * 4)));
    214  1.1  takemura }
    215  1.1  takemura 
    216  1.1  takemura void
    217  1.1  takemura mq200_write(struct mq200_softc *sc, int offset, u_int32_t data)
    218  1.1  takemura {
    219  1.1  takemura 	int i;
    220  1.1  takemura 	char buf[32];
    221  1.1  takemura 
    222  1.1  takemura 	for (i = 0; i < MQ200_I_MAX; i++) {
    223  1.1  takemura 	    if (sc->sc_regctxs[i].offset == offset)
    224  1.1  takemura 		printf("mq200_write: WARNING: raw access %s\n",
    225  1.1  takemura 		    mq200_regname(sc, offset, buf, sizeof(buf)));
    226  1.1  takemura 	}
    227  1.1  takemura 
    228  1.1  takemura 	mq200_writex(sc, offset, data);
    229  1.1  takemura }
    230  1.1  takemura 
    231  1.1  takemura #if 0
    232  1.1  takemura void
    233  1.1  takemura mq200_dump_gc(struct mq200_softc *sc, int gc)
    234  1.1  takemura {
    235  1.1  takemura 	u_int32_t reg;
    236  1.1  takemura 	char *depth_names[] = {
    237  1.1  takemura 		"1bpp with CLUT",
    238  1.1  takemura 		"2bpp with CLUT",
    239  1.1  takemura 		"4bpp with CLUT",
    240  1.1  takemura 		"8bpp with CLUT",
    241  1.1  takemura 		"16bpp with CLUT",
    242  1.1  takemura 		"24bpp with CLUT",
    243  1.1  takemura 		"32bpp(RGB) with CLUT",
    244  1.1  takemura 		"32bpp(BGR) with CLUT",
    245  1.1  takemura 		"1bpp w/o CLUT",
    246  1.1  takemura 		"2bpp w/o CLUT",
    247  1.1  takemura 		"4bpp w/o CLUT",
    248  1.1  takemura 		"8bpp w/o CLUT",
    249  1.1  takemura 		"16bpp w/o CLUT",
    250  1.1  takemura 		"24bpp w/o CLUT",
    251  1.1  takemura 		"32bpp(RGB) w/o CLUT",
    252  1.1  takemura 		"32bpp(BGR) w/o CLUT",
    253  1.1  takemura 	};
    254  1.1  takemura 	char *rc_names[] = { "BUS", "PLL1", "PLL2", "PLL3" };
    255  1.1  takemura 	char *fd_names[] = { "1", "1.5", "2.5", "3.5", "4.5", "5.5", "6.5" };
    256  1.1  takemura 
    257  1.1  takemura 	/*
    258  1.1  takemura 	 * GC00R	Graphics Controller Control
    259  1.1  takemura 	 */
    260  1.1  takemura 	reg = mq200_read(sc, MQ200_GCCR(gc));
    261  1.1  takemura 	printf("GC00R=0x%08x: ", reg);
    262  1.1  takemura 	printf("%s %s%s%s%s%s\n",
    263  1.1  takemura 	    ENABLE(reg & MQ200_GCC_ENABLE),
    264  1.1  takemura 	    (reg & MQ200_GCC_HCRESET)?"HC_reset ":"",
    265  1.1  takemura 	    (reg & MQ200_GCC_VCRESET)?"VC_reset ":"",
    266  1.1  takemura 	    (reg & MQ200_GCC_HCEN)?"cursor_enable ":"",
    267  1.1  takemura 	    (reg & MQ200_GCC_TESTMODE0)?"test_mode0 ":"",
    268  1.1  takemura 	    (reg & MQ200_GCC_TESTMODE1)?"test_mode1 ":"");
    269  1.1  takemura 	printf("  window: %s %s\n",
    270  1.1  takemura 	    ENABLE(reg & MQ200_GCC_WINEN),
    271  1.1  takemura 	    depth_names[(reg&MQ200_GCC_DEPTH_MASK)>>MQ200_GCC_DEPTH_SHIFT]);
    272  1.1  takemura 	printf("  altwin: %s %s\n",
    273  1.1  takemura 	    ENABLE(reg & MQ200_GCC_ALTEN),
    274  1.1  takemura 	    depth_names[(reg&MQ200_GCC_ALTDEPTH_MASK)>>MQ200_GCC_ALTDEPTH_SHIFT]);
    275  1.1  takemura 	printf("   clock: root_clock/first_div/second_div = %s/%s/%d\n",
    276  1.1  takemura 	    rc_names[(reg&MQ200_GCC_RCLK_MASK)>>MQ200_GCC_RCLK_SHIFT],
    277  1.1  takemura 	    fd_names[(reg&MQ200_GCC_MCLK_FD_MASK)>>MQ200_GCC_MCLK_FD_SHIFT],
    278  1.1  takemura 	    (reg&MQ200_GCC_MCLK_SD_MASK)>>MQ200_GCC_MCLK_SD_SHIFT);
    279  1.1  takemura 
    280  1.1  takemura 	if (gc == 0) {
    281  1.1  takemura 		/*
    282  1.1  takemura 		 * GC01R	Graphics Controller CRT Control
    283  1.1  takemura 		 */
    284  1.1  takemura 		reg = mq200_read(sc, MQ200_GC1CRTCR);
    285  1.1  takemura 		printf("GC01R=0x%08x:\n", reg);
    286  1.1  takemura 		printf("  CRT DAC: %s\n",
    287  1.1  takemura 		    ENABLE(reg&MQ200_GC1CRTC_DACEN));
    288  1.1  takemura 
    289  1.1  takemura 		printf("  power down mode: H-sync=");
    290  1.1  takemura 		switch (reg & MQ200_GC1CRTC_HSYNC_PMMASK) {
    291  1.1  takemura 		case MQ200_GC1CRTC_HSYNC_PMNORMAL:
    292  1.1  takemura 			if (reg & MQ200_GC1CRTC_HSYNC_PMCLK)
    293  1.1  takemura 				printf("PMCLK");
    294  1.1  takemura 			else
    295  1.1  takemura 				printf("LOW");
    296  1.1  takemura 			break;
    297  1.1  takemura 		case MQ200_GC1CRTC_HSYNC_PMLOW:
    298  1.1  takemura 			printf("LOW");
    299  1.1  takemura 			break;
    300  1.1  takemura 		case MQ200_GC1CRTC_HSYNC_PMHIGH:
    301  1.1  takemura 			printf("HIGH");
    302  1.1  takemura 			break;
    303  1.1  takemura 		default:
    304  1.1  takemura 			printf("???");
    305  1.1  takemura 			break;
    306  1.1  takemura 		}
    307  1.1  takemura 
    308  1.1  takemura 		printf("  V-sync=");
    309  1.1  takemura 		switch (reg & MQ200_GC1CRTC_VSYNC_PMMASK) {
    310  1.1  takemura 		case MQ200_GC1CRTC_VSYNC_PMNORMAL:
    311  1.1  takemura 			if (reg & MQ200_GC1CRTC_VSYNC_PMCLK)
    312  1.1  takemura 				printf("PMCLK");
    313  1.1  takemura 			else
    314  1.1  takemura 				printf("LOW");
    315  1.1  takemura 			break;
    316  1.1  takemura 		case MQ200_GC1CRTC_VSYNC_PMLOW:
    317  1.1  takemura 			printf("LOW");
    318  1.1  takemura 			break;
    319  1.1  takemura 		case MQ200_GC1CRTC_VSYNC_PMHIGH:
    320  1.1  takemura 			printf("HIGH");
    321  1.1  takemura 			break;
    322  1.1  takemura 		default:
    323  1.1  takemura 			printf("???");
    324  1.1  takemura 			break;
    325  1.1  takemura 		}
    326  1.1  takemura 		printf("\n");
    327  1.1  takemura 
    328  1.1  takemura 		printf("  sync active: H=%s  V=%s\n",
    329  1.1  takemura 		    (reg & MQ200_GC1CRTC_HSYNC_ACTVLOW)?"low":"high",
    330  1.1  takemura 		    (reg & MQ200_GC1CRTC_VSYNC_ACTVLOW)?"low":"high");
    331  1.1  takemura 		printf("  other: ");
    332  1.1  takemura 		if (reg & MQ200_GC1CRTC_SYNC_PEDESTAL_EN)
    333  1.1  takemura 			printf("Sync_pedestal ");
    334  1.1  takemura 		if (reg & MQ200_GC1CRTC_BLANK_PEDESTAL_EN)
    335  1.1  takemura 			printf("Blank_pedestal ");
    336  1.1  takemura 		if (reg & MQ200_GC1CRTC_COMPOSITE_SYNC_EN)
    337  1.1  takemura 			printf("Conposite_sync ");
    338  1.1  takemura 		if (reg & MQ200_GC1CRTC_VREF_EXTR)
    339  1.1  takemura 			printf("External_VREF ");
    340  1.1  takemura 		if (reg & MQ200_GC1CRTC_MONITOR_SENCE_EN) {
    341  1.1  takemura 			if (reg & MQ200_GC1CRTC_CONSTANT_OUTPUT_EN)
    342  1.1  takemura 				printf("Monitor_sence=%s%s%s/- ",
    343  1.1  takemura 				    (reg & MQ200_GC1CRTC_BLUE_NOTLOADED)?"":"B",
    344  1.1  takemura 				    (reg & MQ200_GC1CRTC_RED_NOTLOADED)?"":"R",
    345  1.1  takemura 				    (reg & MQ200_GC1CRTC_GREEN_NOTLOADED)?"":"G");
    346  1.1  takemura 			else
    347  1.1  takemura 				printf("Monitor_sence=%s%s%s/0x%02x ",
    348  1.1  takemura 				    (reg & MQ200_GC1CRTC_BLUE_NOTLOADED)?"":"B",
    349  1.1  takemura 				    (reg & MQ200_GC1CRTC_RED_NOTLOADED)?"":"R",
    350  1.1  takemura 				    (reg & MQ200_GC1CRTC_GREEN_NOTLOADED)?"":"G",
    351  1.1  takemura 				    (reg & MQ200_GC1CRTC_OUTPUT_LEVEL_MASK)>>MQ200_GC1CRTC_OUTPUT_LEVEL_SHIFT);
    352  1.1  takemura 		}
    353  1.1  takemura 		if (reg & MQ200_GC1CRTC_MONO)
    354  1.1  takemura 			printf("Mono_monitor ");
    355  1.1  takemura 		printf("\n");
    356  1.1  takemura 	}
    357  1.1  takemura 
    358  1.1  takemura 	/*
    359  1.1  takemura 	 * GC02R	Horizontal Display Control
    360  1.1  takemura 	 */
    361  1.1  takemura 	reg = mq200_read(sc, MQ200_GCHDCR(gc));
    362  1.1  takemura 	if (gc == 0) {
    363  1.1  takemura 		printf("GC02R=0x%08x: Horizontal display total=%03d end=%03d\n", reg,
    364  1.1  takemura 		    (reg&MQ200_GC1HDC_TOTAL_MASK)>>MQ200_GC1HDC_TOTAL_SHIFT,
    365  1.1  takemura 		    (reg&MQ200_GCHDC_END_MASK)>>MQ200_GCHDC_END_SHIFT);
    366  1.1  takemura 	} else {
    367  1.1  takemura 		printf("GC02R=0x%08x: Horizontal display end=%03d\n", reg,
    368  1.1  takemura 		    (reg&MQ200_GCHDC_END_MASK)>>MQ200_GCHDC_END_SHIFT);
    369  1.1  takemura 	}
    370  1.1  takemura 
    371  1.1  takemura 	/*
    372  1.1  takemura 	 * GC03R	Vertical Display Control
    373  1.1  takemura 	 */
    374  1.1  takemura 	reg = mq200_read(sc, MQ200_GCVDCR(gc));
    375  1.1  takemura 	if (gc == 0) {
    376  1.1  takemura 		printf("GC03R=0x%08x:   Vertical display total=%03d end=%03d\n", reg,
    377  1.1  takemura 		    (reg&MQ200_GC1VDC_TOTAL_MASK)>>MQ200_GC1VDC_TOTAL_SHIFT,
    378  1.1  takemura 		    (reg&MQ200_GCVDC_END_MASK)>>MQ200_GCVDC_END_SHIFT);
    379  1.1  takemura 	} else {
    380  1.1  takemura 		printf("GC03R=0x%08x:   Vertical display end=%03d\n", reg,
    381  1.1  takemura 		    (reg&MQ200_GCVDC_END_MASK)>>MQ200_GCVDC_END_SHIFT);
    382  1.1  takemura 	}
    383  1.1  takemura 
    384  1.1  takemura 	/*
    385  1.1  takemura 	 * GC04R	Horizontal Sync Control
    386  1.1  takemura 	 */
    387  1.1  takemura 	reg = mq200_read(sc, MQ200_GCHSCR(gc));
    388  1.1  takemura 	printf("GC04R=0x%08x: Horizontal    sync start=%03d end=%03d\n", reg,
    389  1.1  takemura 	    (reg&MQ200_GCHSC_START_MASK)>>MQ200_GCHSC_START_SHIFT,
    390  1.1  takemura 	    (reg&MQ200_GCHSC_END_MASK)>>MQ200_GCHSC_END_SHIFT);
    391  1.1  takemura 
    392  1.1  takemura 	/*
    393  1.1  takemura 	 * GC05R	Vertical Sync Control
    394  1.1  takemura 	 */
    395  1.1  takemura 	reg = mq200_read(sc, MQ200_GCVSCR(gc));
    396  1.1  takemura 	printf("GC05R=0x%08x:   Vertical    sync start=%03d end=%03d\n", reg,
    397  1.1  takemura 	    (reg&MQ200_GCVSC_START_MASK)>>MQ200_GCVSC_START_SHIFT,
    398  1.1  takemura 	    (reg&MQ200_GCVSC_END_MASK)>>MQ200_GCVSC_END_SHIFT);
    399  1.1  takemura 
    400  1.1  takemura 	if (gc == 0) {
    401  1.1  takemura 		/*
    402  1.1  takemura 		 * GC07R	Vertical Display Count
    403  1.1  takemura 		 */
    404  1.1  takemura 		reg = mq200_read(sc, MQ200_GC1VDCNTR);
    405  1.1  takemura 		printf("GC07R=0x%08x: Vertical Display Count=%d\n", reg,
    406  1.1  takemura 		    (reg&MQ200_GC1VDCNT_MASK));
    407  1.1  takemura 	}
    408  1.1  takemura 
    409  1.1  takemura 	/*
    410  1.1  takemura 	 * GC08R	Window Horizontal Control
    411  1.1  takemura 	 */
    412  1.1  takemura 	reg = mq200_read(sc, MQ200_GCWHCR(gc));
    413  1.1  takemura 	printf("GC08R=0x%08x: Window Horizontal start=%03d width=%03d",
    414  1.1  takemura 	    reg,
    415  1.1  takemura 	    (reg&MQ200_GCWHC_START_MASK)>> MQ200_GCWHC_START_SHIFT,
    416  1.1  takemura 	    (reg&MQ200_GCWHC_WIDTH_MASK)>> MQ200_GCWHC_WIDTH_SHIFT);
    417  1.1  takemura 	if (gc == 0) {
    418  1.1  takemura 		printf(" add=%03x",
    419  1.1  takemura 		    (reg&MQ200_GC1WHC_ALD_MASK)>> MQ200_GC1WHC_ALD_SHIFT);
    420  1.1  takemura 	}
    421  1.1  takemura 	printf("\n");
    422  1.1  takemura 
    423  1.1  takemura 	/*
    424  1.1  takemura 	 * GC09R	Window Vertical Control
    425  1.1  takemura 	 */
    426  1.1  takemura 	reg = mq200_read(sc, MQ200_GCWVCR(gc));
    427  1.7    andvar 	printf("GC09R=0x%08x:   Window Vertical start=%03d height=%03d\n",
    428  1.1  takemura 	    reg,
    429  1.1  takemura 	    (reg&MQ200_GCWVC_START_MASK)>> MQ200_GCWVC_START_SHIFT,
    430  1.1  takemura 	    (reg&MQ200_GCWVC_HEIGHT_MASK)>> MQ200_GCWVC_HEIGHT_SHIFT);
    431  1.1  takemura 
    432  1.1  takemura 	/*
    433  1.1  takemura 	 * GC0AR	Alternate Window Horizontal Control
    434  1.1  takemura 	 */
    435  1.1  takemura 	reg = mq200_read(sc, MQ200_GCAWHCR(gc));
    436  1.1  takemura 	printf("GC0AR=0x%08x: Altwin Horizontal start=%03d width=%03d",
    437  1.1  takemura 	    reg,
    438  1.1  takemura 	    (reg&MQ200_GCAWHC_START_MASK)>> MQ200_GCAWHC_START_SHIFT,
    439  1.1  takemura 	    (reg&MQ200_GCAWHC_WIDTH_MASK)>> MQ200_GCAWHC_WIDTH_SHIFT);
    440  1.1  takemura 	if (gc == 0) {
    441  1.1  takemura 		printf(" add=%03d",
    442  1.1  takemura 		    (reg&MQ200_GC1AWHC_ALD_MASK)>> MQ200_GC1AWHC_ALD_SHIFT);
    443  1.1  takemura 	}
    444  1.1  takemura 	printf("\n");
    445  1.1  takemura 
    446  1.1  takemura 	/*
    447  1.1  takemura 	 * GC0BR	Alternate Window Vertical Control
    448  1.1  takemura 	 */
    449  1.1  takemura 	reg = mq200_read(sc, MQ200_GCAWVCR(gc));
    450  1.7    andvar 	printf("GC0BR=0x%08x:   Altwin Vertical start=%03d height=%03d\n",
    451  1.1  takemura 	    reg,
    452  1.1  takemura 	    (reg&MQ200_GCAWVC_START_MASK)>> MQ200_GCAWVC_START_SHIFT,
    453  1.1  takemura 	    (reg&MQ200_GCAWVC_HEIGHT_MASK)>> MQ200_GCAWVC_HEIGHT_SHIFT);
    454  1.1  takemura 
    455  1.1  takemura 	/*
    456  1.1  takemura 	 * GC0CR	Window Start Address
    457  1.1  takemura 	 */
    458  1.1  takemura 	reg = mq200_read(sc, MQ200_GCWSAR(gc));
    459  1.1  takemura 	printf("GC0CR=0x%08x: Window start address=0x%08x\n",
    460  1.1  takemura 	    reg, (reg&MQ200_GCWSA_MASK));
    461  1.1  takemura 
    462  1.1  takemura 	/*
    463  1.1  takemura 	 * GC0DR	Alternate Window Start Address
    464  1.1  takemura 	 */
    465  1.1  takemura 	reg = mq200_read(sc, MQ200_GCAWSAR(gc));
    466  1.1  takemura 	printf("GC0DR=0x%08x: Altwin start address=0x%08x palette_index=%02d\n",
    467  1.1  takemura 	    reg, (reg&MQ200_GCAWSA_MASK),
    468  1.1  takemura 	    (reg&MQ200_GCAWPI_MASK)>>MQ200_GCAWPI_SHIFT);
    469  1.1  takemura 
    470  1.1  takemura 	/*
    471  1.1  takemura 	 * GC0ER	Windows Stride
    472  1.1  takemura 	 */
    473  1.1  takemura 	reg = mq200_read(sc, MQ200_GCWSTR(gc));
    474  1.1  takemura 	printf("GC0ER=0x%08x: Stride window=%04d  altwin=%04d\n",
    475  1.1  takemura 	    reg,
    476  1.1  takemura 	    (reg&MQ200_GCWST_MASK)>>MQ200_GCWST_SHIFT,
    477  1.1  takemura 	    (reg&MQ200_GCAWST_MASK)>>MQ200_GCAWST_SHIFT);
    478  1.1  takemura 
    479  1.1  takemura 	/*
    480  1.1  takemura 	 * GC10R	Hardware Cursor Position
    481  1.1  takemura 	 */
    482  1.1  takemura 	reg = mq200_read(sc, MQ200_GCHCPR(gc));
    483  1.1  takemura 	printf("GC10R=0x%08x: Hardware Cursor Position %d,%d\n",
    484  1.1  takemura 	    reg,
    485  1.1  takemura 	    (reg&MQ200_GCHCP_HSTART_MASK)>>MQ200_GCHCP_HSTART_SHIFT,
    486  1.1  takemura 	    (reg&MQ200_GCHCP_VSTART_MASK)>>MQ200_GCHCP_VSTART_SHIFT);
    487  1.1  takemura 
    488  1.1  takemura 	/*
    489  1.1  takemura 	 * GC11R	Hardware Cursor Start Address and Offset
    490  1.1  takemura 	 */
    491  1.1  takemura 	reg = mq200_read(sc, MQ200_GCHCAOR(gc));
    492  1.1  takemura 	printf("GC11R=0x%08x: Hardware Cursor Start Address and Offset\n",
    493  1.1  takemura 	    reg);
    494  1.1  takemura 
    495  1.1  takemura 	/*
    496  1.1  takemura 	 * GC12R	Hardware Cursor Foreground Color
    497  1.1  takemura 	 */
    498  1.1  takemura 	reg = mq200_read(sc, MQ200_GCHCFCR(gc));
    499  1.1  takemura 	printf("GC12R=0x%08x: Hardware Cursor Foreground Color\n", reg);
    500  1.1  takemura 
    501  1.1  takemura 	/*
    502  1.1  takemura 	 * GC13R	Hardware Cursor Background Color
    503  1.1  takemura 	 */
    504  1.1  takemura 	reg = mq200_read(sc, MQ200_GCHCBCR(gc));
    505  1.1  takemura 	printf("GC13R=0x%08x: Hardware Cursor Background Color\n", reg);
    506  1.1  takemura 
    507  1.1  takemura }
    508  1.1  takemura 
    509  1.1  takemura void
    510  1.1  takemura mq200_dump_fp(struct mq200_softc *sc)
    511  1.1  takemura {
    512  1.1  takemura 	u_int32_t reg;
    513  1.1  takemura #define I(type)	((type)>>MQ200_FPC_TYPE_SHIFT)
    514  1.1  takemura 	static char *panel_type_names[64] = {
    515  1.1  takemura 		[I(MQ200_FPC_TFT4MONO)] = 	"TFT 4bit mono",
    516  1.1  takemura 		[I(MQ200_FPC_TFT12)] = 		"TFT 12bit color",
    517  1.1  takemura 		[I(MQ200_FPC_SSTN4)] = 		"S-STN 4bit color",
    518  1.1  takemura 		[I(MQ200_FPC_DSTN8)] = 		"D-STN 8bit color",
    519  1.1  takemura 		[I(MQ200_FPC_TFT6MONO)] = 	"TFT 6bit mono",
    520  1.1  takemura 		[I(MQ200_FPC_TFT18)] = 		"TFT 18bit color",
    521  1.1  takemura 		[I(MQ200_FPC_SSTN8)] = 		"S-STN 8bit color",
    522  1.1  takemura 		[I(MQ200_FPC_DSTN16)] = 	"D-STN 16bit color",
    523  1.1  takemura 		[I(MQ200_FPC_TFT8MONO)] = 	"TFT 8bit mono",
    524  1.1  takemura 		[I(MQ200_FPC_TFT24)] =	 	"TFT 24bit color",
    525  1.1  takemura 		[I(MQ200_FPC_SSTN12)] = 	"S-STN 12bit color",
    526  1.1  takemura 		[I(MQ200_FPC_DSTN24)] = 	"D-STN 24bit color",
    527  1.1  takemura 		[I(MQ200_FPC_SSTN16)] = 	"S-STN 16bit color",
    528  1.1  takemura 		[I(MQ200_FPC_SSTN24)] = 	"S-STN 24bit color",
    529  1.1  takemura 	};
    530  1.1  takemura 
    531  1.1  takemura 	reg = mq200_read(sc, MQ200_FPCR);
    532  1.1  takemura 	printf("FP00R=0x%08x: Flat Panel Control\n", reg);
    533  1.1  takemura 	printf("  %s, driven by %s, %s\n",
    534  1.1  takemura 	    ENABLE(reg & MQ200_FPC_ENABLE),
    535  1.1  takemura 	    (reg & MQ200_FPC_GC2) ? "GC2" : "GC1",
    536  1.1  takemura 	    panel_type_names[(reg & MQ200_FPC_TYPE_MASK) >> MQ200_FPC_TYPE_SHIFT]);
    537  1.1  takemura 	reg = mq200_read(sc, MQ200_FPPCR);
    538  1.1  takemura 	printf("FP01R=0x%08x: Flat Panel Output Pin Control\n", reg);
    539  1.1  takemura }
    540  1.1  takemura 
    541  1.1  takemura void
    542  1.1  takemura mq200_dump_dc(struct mq200_softc *sc)
    543  1.1  takemura {
    544  1.1  takemura 	u_int32_t reg;
    545  1.1  takemura 
    546  1.1  takemura 	reg = 0;
    547  1.1  takemura }
    548  1.1  takemura #endif /* 0 */
    549  1.1  takemura 
    550  1.1  takemura #endif /* MQ200_DEBUG */
    551