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