diff --git a/Makefile.am b/Makefile.am index 5f5c6a8..0e897ab 100644 --- a/Makefile.am +++ b/Makefile.am @@ -18,12 +18,17 @@ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -AUTOMAKE_OPTIONS = foreign SUBDIRS = src man tools +MAINTAINERCLEANFILES = ChangeLog INSTALL -EXTRA_DIST = COPYING NEWS README +EXTRA_DIST = COPYING NEWS README OldChangeLog + +.PHONY: ChangeLog INSTALL + +INSTALL: + $(INSTALL_CMD) ChangeLog: $(CHANGELOG_CMD) -dist-hook: ChangeLog +dist-hook: ChangeLog INSTALL diff --git a/ChangeLog b/OldChangeLog similarity index 100% rename from ChangeLog rename to OldChangeLog diff --git a/configure.ac b/configure.ac index b751558..b2497ef 100644 --- a/configure.ac +++ b/configure.ac @@ -21,9 +21,9 @@ # Process this file with autoconf to produce a configure script # Initialize Autoconf -AC_PREREQ(2.57) +AC_PREREQ([2.60]) AC_INIT([xf86-video-openchrome], - [0.6.0], + [0.6.225], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/openchrome], [xf86-video-openchrome]) @@ -42,7 +42,12 @@ AC_CONFIG_HEADERS([config.h]) AC_CONFIG_AUX_DIR(.) AM_INIT_AUTOMAKE([foreign dist-bzip2]) -AM_MAINTAINER_MODE + +# Require xorg-macros: XORG_DEFAULT_OPTIONS +m4_ifndef([XORG_MACROS_VERSION], + [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.3) +XORG_DEFAULT_OPTIONS # Initialize libtool AC_DISABLE_STATIC @@ -52,22 +57,22 @@ AC_SYS_LARGEFILE AH_TOP([#include "xorg-server.h"]) AC_ARG_WITH(xorg-module-dir, - AC_HELP_STRING([--with-xorg-module-dir=DIR], + AS_HELP_STRING([--with-xorg-module-dir=DIR], [Default xorg module directory [[default=$libdir/xorg/modules]]]), [moduledir="$withval"], [moduledir="$libdir/xorg/modules"]) -AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], +AC_ARG_ENABLE(debug, AS_HELP_STRING([--enable-debug], [Enable debugging support [[default=no]]]), [DEBUG="$enableval"], [DEBUG=no]) -AC_ARG_ENABLE(xv-debug, AC_HELP_STRING([--enable-xv-debug], +AC_ARG_ENABLE(xv-debug, AS_HELP_STRING([--enable-xv-debug], [Enable XVideo debugging support [[default=no]]]), [XV_DEBUG="$enableval"], [XV_DEBUG=no]) -AC_ARG_ENABLE(viaregtool, AC_HELP_STRING([--enable-viaregtool], +AC_ARG_ENABLE(viaregtool, AS_HELP_STRING([--enable-viaregtool], [Enable build of registers dumper tool [[default=no]]]), [TOOLS="$enableval"], [TOOLS=no]) @@ -88,8 +93,6 @@ AM_CONDITIONAL(HAVE_XEXTPROTO_71, [ test "$HAVE_XEXTPROTO_71" = "yes" ]) # Checks for libraries. -# Checks for header files. -AC_HEADER_STDC save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$XORG_CFLAGS $CPPFLAGS" @@ -158,28 +161,20 @@ if test "$TOOLS" = yes; then AC_DEFINE(TOOLS,1,[Enable build of registers dumper tool]) fi +AC_DEFINE(X_USE_REGION_NULL, 1, [Compatibility define for older Xen]) +AC_DEFINE(X_NEED_I2CSTART, 1, [Compatibility define for older Xen]) + AC_SUBST([DRI_CFLAGS]) -AC_SUBST([XORG_CFLAGS]) AC_SUBST([moduledir]) DRIVER_NAME=openchrome AC_SUBST([DRIVER_NAME]) -AC_DEFINE(X_USE_LINEARFB,1,[Compatibility define for older Xen]) -AC_DEFINE(X_USE_REGION_NULL,1,[Compatibility define for older Xen]) -AC_DEFINE(X_HAVE_XAAGETROP,1,[Compatibility define for older Xen]) -AC_DEFINE(X_NEED_I2CSTART,1,[Compatibility define for older Xen]) - -DRIVER_MAN_SUFFIX="4" -AC_SUBST([DRIVER_MAN_SUFFIX]) - -XORG_MANPAGE_SECTIONS -XORG_RELEASE_VERSION - -AC_OUTPUT([ - Makefile - src/xvmc/Makefile - src/Makefile - man/Makefile - tools/Makefile +AC_CONFIG_FILES([ + Makefile + src/xvmc/Makefile + src/Makefile + man/Makefile + tools/Makefile ]) +AC_OUTPUT diff --git a/man/Makefile.am b/man/Makefile.am index a16c387..31906f2 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -1,35 +1,31 @@ -# $Id: Makefile.am,v 1.4 2005/10/18 00:01:55 alanc Exp $ # # Copyright 2005 Sun Microsystems, Inc. All rights reserved. -# -# Permission to use, copy, modify, distribute, and sell this software and its -# documentation for any purpose is hereby granted without fee, provided that -# the above copyright notice appear in all copies and that both that -# copyright notice and this permission notice appear in supporting -# documentation. -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -# IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR -# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, -# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -# OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the copyright holders shall -# not be used in advertising or otherwise to promote the sale, use or -# other dealings in this Software without prior written authorization -# from the copyright holders. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice (including the next +# paragraph) shall be included in all copies or substantial portions of the +# Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. # -drivermandir = $(mandir)/man$(DRIVER_MAN_SUFFIX) +drivermandir = $(DRIVER_MAN_DIR) -driverman_MANFILES = @DRIVER_NAME@.man +driverman_PRE = @DRIVER_NAME@.man -driverman_DATA = $(driverman_MANFILES:man=@DRIVER_MAN_SUFFIX@) +driverman_DATA = $(driverman_PRE:man=@DRIVER_MAN_SUFFIX@) EXTRA_DIST = @DRIVER_NAME@.man diff --git a/src/Makefile.am b/src/Makefile.am index 68d75c7..553b9ab 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -29,7 +29,7 @@ SUBDIRS = xvmc BUILT_SOURCES = version.h EXTRA_DIST = version.h CONFIG_CLEAN_FILES= version.h -AM_CFLAGS = @XORG_CFLAGS@ @LIBUDEV_CFLAGS@ @DRI_CFLAGS@ +AM_CFLAGS = @XORG_CFLAGS@ $(CWARNFLAGS) @LIBUDEV_CFLAGS@ @DRI_CFLAGS@ openchrome_drv_la_LTLIBRARIES = openchrome_drv.la openchrome_drv_la_LDFLAGS = -module -avoid-version @LIBUDEV_LIBS@ openchrome_drv_ladir = @moduledir@/drivers @@ -53,13 +53,13 @@ openchrome_drv_la_SOURCES = \ via_driver.c \ via_driver.h \ via_i2c.c \ - via_id.c \ via_fp.c \ + via_fp.h \ via_memcpy.c \ via_memmgr.h \ via_memmgr.c \ + via_options.c \ via_outputs.c \ - via_mode.h \ via_priv.h \ via_regs.h \ via_sii164.c \ diff --git a/src/via_analog.c b/src/via_analog.c index 682ae20..473b7aa 100644 --- a/src/via_analog.c +++ b/src/via_analog.c @@ -42,62 +42,85 @@ /* - * Enables or disables analog VGA output by controlling DAC - * (Digital to Analog Converter) output state. + * Enables or disables analog (VGA) output. */ static void -viaAnalogOutput(ScrnInfoPtr pScrn, Bool outputState) +viaAnalogPower(ScrnInfoPtr pScrn, Bool outputState) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaAnalogOutput.\n")); + "Entered viaAnalogPower.\n")); - /* This register controls analog VGA DAC output state. */ - /* 3X5.47[2] - DACOFF Backdoor Register - * 0: DAC on - * 1: DAC off */ - ViaCrtcMask(hwp, 0x47, outputState ? 0x00 : 0x04, 0x04); + viaAnalogSetPower(pScrn, outputState); xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Analog VGA Output: %s\n", + "Analog (VGA) Power: %s\n", outputState ? "On" : "Off"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaAnalogOutput.\n")); + "Exiting viaAnalogPower.\n")); +} + +/* + * Set analog (VGA) sync polarity. + */ +static void +viaAnalogSyncPolarity(ScrnInfoPtr pScrn, unsigned int flags) +{ + CARD8 syncPolarity = 0x00; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaAnalogSyncPolarity.\n")); + + if (flags & V_NHSYNC) { + syncPolarity |= BIT(0); + } + + if (flags & V_NVSYNC) { + syncPolarity |= BIT(1); + } + + viaAnalogSetSyncPolarity(pScrn, syncPolarity); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+"); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaAnalogSyncPolarity.\n")); } /* * Specifies IGA1 or IGA2 for analog VGA DAC source. */ static void -viaAnalogSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +viaAnalogDisplaySource(ScrnInfoPtr pScrn, int index) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 value = displaySource; + CARD8 displaySource = index; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaAnalogSetDisplaySource.\n")); + "Entered viaAnalogDisplaySource.\n")); - ViaSeqMask(hwp, 0x16, value << 6, 0x40); + viaAnalogSetDisplaySource(pScrn, displaySource & 0x01); xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Analog VGA Display Output Source: IGA%d\n", - (value & 0x01) + 1); + "Analog (VGA) Display Source: IGA%d\n", + (displaySource & 0x01) + 1); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaAnalogSetDisplaySource.\n")); + "Exiting viaAnalogDisplaySource.\n")); } /* * Intializes analog VGA related registers. */ static void -viaAnalogInit(ScrnInfoPtr pScrn) +viaAnalogInitReg(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaAnalogInit.\n")); + "Entered viaAnalogInitReg.\n")); /* 3X5.37[7] - DAC Power Save Control 1 * 0: Depend on Rx3X5.37[5:4] setting @@ -120,50 +143,109 @@ viaAnalogInit(ScrnInfoPtr pScrn) case VIA_VX800: case VIA_VX855: case VIA_VX900: - /* 3C5.5E[0] - CRT DACOFF Setting - * 1: CRT DACOFF controlled by 3C5.01[5] */ - ViaSeqMask(hwp, 0x5E, 0x01, 0x01); + /* Make sure 3C5.01[5] does not turn off analog (VGA) DAC. */ + viaAnalogSetDACOff(pScrn, FALSE); + break; default: break; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaAnalogInit.\n")); + "Exiting viaAnalogInitReg.\n")); } /* - * Sets the polarity of horizontal synchronization and vertical - * synchronization. + * Detect a VGA connector. + * + * The code here was borrowed from VIA Technologies X.Org X Server + * DDX code. (In particular, from viaDetectCRTVsync function + * inside via_output.c.) */ -static void -viaAnalogSetSyncPolarity(ScrnInfoPtr pScrn, DisplayModePtr mode) +static Bool +viaAnalogDetectConnector(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 miscRegister; + VIAPtr pVia = VIAPTR(pScrn); + Bool connectorDetected = FALSE; + CARD8 sr40, cr36, cr37, cr43, cr44, cr47; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaAnalogSetSyncPolarity.\n")); + "Entered viaAnalogDetectConnector.\n")); + + sr40 = hwp->readSeq(hwp, 0x40); + cr36 = hwp->readCrtc(hwp, 0x36); + cr37 = hwp->readCrtc(hwp, 0x37); + cr43 = hwp->readCrtc(hwp, 0x43); + cr44 = hwp->readCrtc(hwp, 0x44); + cr47 = hwp->readCrtc(hwp, 0x47); + + if ((pVia->Chipset == VIA_CX700) + || (pVia->Chipset == VIA_VX800) + || (pVia->Chipset == VIA_VX855) + || (pVia->Chipset == VIA_VX900)) { + ViaCrtcMask(hwp, 0x43, 0x90, BIT(7) | BIT(6) | BIT(5) | BIT(4)); + hwp->writeCrtc(hwp, 0x44, 0x00); + } -/* Set certain bits of miscellaneous output register - * meant for IGA1. */ - miscRegister = hwp->readMiscOut(hwp); - if (mode->Flags & V_NHSYNC) { - miscRegister |= 0x40; - } else { - miscRegister &= (~0x40); + /* Turn on DAC. */ + ViaCrtcMask(hwp, 0x37, 0x04, 0xff); + ViaCrtcMask(hwp, 0x47, 0x00, BIT(2)); + + /* Power On DPMS. */ + ViaCrtcMask(hwp, 0x36, 0x00, BIT(7) | BIT(6) | BIT(5) | BIT(4)); + + /* Wait for vblank. */ + usleep(16); + + /* Enable CRT Sense. */ + ViaSeqMask(hwp, 0x40, BIT(7), BIT(7)); + + if ((pVia->Chipset == VIA_CX700) + || (pVia->Chipset == VIA_VX800) + || (pVia->Chipset == VIA_VX855) + || (pVia->Chipset == VIA_VX900)) { + ViaSeqMask(hwp, 0x40, 0x00, BIT(7)); } - if (mode->Flags & V_NVSYNC) { - miscRegister |= 0x80; + /* + VT3324, VT3353: SR40[7]=1 --> SR40[7] = 0 --> check 3C2[4] + other: SR40[7]=1 --> check 3C2[4] --> SR40[7]=0 + */ + if (ViaVgahwIn(hwp, 0x3C2) & BIT(4)) { + connectorDetected = TRUE; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VGA connector detected.\n")); } else { - miscRegister &= (~0x80); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VGA connector not detected.\n")); + } + + if ((pVia->Chipset != VIA_CX700) + && (pVia->Chipset != VIA_VX800) + && (pVia->Chipset != VIA_VX855) + && (pVia->Chipset != VIA_VX900)) { + ViaSeqMask(hwp, 0x40, 0x00, BIT(7)); + } + + /* Restore */ + hwp->writeCrtc(hwp, 0x47, cr47); + + if ((pVia->Chipset == VIA_CX700) + || (pVia->Chipset == VIA_VX800) + || (pVia->Chipset == VIA_VX855) + || (pVia->Chipset == VIA_VX900)) { + hwp->writeCrtc(hwp, 0x44, cr44); + hwp->writeCrtc(hwp, 0x43, cr43); } - hwp->writeMiscOut(hwp, miscRegister); + hwp->writeCrtc(hwp, 0x37, cr37); + hwp->writeCrtc(hwp, 0x36, cr36); + hwp->writeSeq(hwp, 0x40, sr40); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaAnalogSetSyncPolarity.\n")); + "Exiting viaAnalogDetectConnector.\n")); + return connectorDetected; } @@ -182,14 +264,25 @@ via_analog_dpms(xf86OutputPtr output, int mode) switch (mode) { case DPMSModeOn: - viaAnalogOutput(pScrn, TRUE); + viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_ON); + viaAnalogPower(pScrn, TRUE); break; case DPMSModeStandby: + viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_STANDBY); + viaAnalogPower(pScrn, TRUE); + break; case DPMSModeSuspend: + viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_SUSPEND); + viaAnalogPower(pScrn, TRUE); + break; case DPMSModeOff: - viaAnalogOutput(pScrn, FALSE); + viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_OFF); + viaAnalogPower(pScrn, FALSE); break; default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Invalid DPMS Mode: %d\n", + mode); break; } @@ -227,13 +320,31 @@ via_analog_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, static void via_analog_prepare(xf86OutputPtr output) { - via_analog_dpms(output, DPMSModeOff); + ScrnInfoPtr pScrn = output->scrn; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_analog_prepare.\n")); + + viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_OFF); + viaAnalogPower(pScrn, FALSE); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_analog_prepare.\n")); } static void via_analog_commit(xf86OutputPtr output) { - via_analog_dpms(output, DPMSModeOn); + ScrnInfoPtr pScrn = output->scrn; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_analog_commit.\n")); + + viaAnalogSetDPMSControl(pScrn, VIA_ANALOG_DPMS_ON); + viaAnalogPower(pScrn, TRUE); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_analog_commit.\n")); } static void @@ -247,9 +358,9 @@ via_analog_mode_set(xf86OutputPtr output, DisplayModePtr mode, "Entered via_analog_mode_set.\n")); if (output->crtc) { - viaAnalogInit(pScrn); - viaAnalogSetSyncPolarity(pScrn, adjusted_mode); - viaAnalogSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); + viaAnalogInitReg(pScrn); + viaAnalogSyncPolarity(pScrn, adjusted_mode->Flags); + viaAnalogDisplaySource(pScrn, iga->index); } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -259,84 +370,84 @@ via_analog_mode_set(xf86OutputPtr output, DisplayModePtr mode, static xf86OutputStatus via_analog_detect(xf86OutputPtr output) { - xf86OutputStatus status = XF86OutputStatusDisconnected; ScrnInfoPtr pScrn = output->scrn; - VIAPtr pVia = VIAPTR(pScrn); - xf86MonPtr mon; + xf86OutputStatus status = XF86OutputStatusDisconnected; + Bool connectorDetected; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_analog_detect.\n")); - /* Probe I2C Bus 1 to see if a VGA monitor is connected. */ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Probing for a VGA monitor on I2C Bus 1.\n"); - mon = xf86OutputGetEDID(output, pVia->pI2CBus1); - if (mon && (!mon->features.input_type)) { - xf86OutputSetEDID(output, mon); - status = XF86OutputStatusConnected; + "Probing for a VGA connector . . .\n"); + + connectorDetected = viaAnalogDetectConnector(pScrn); + if (!connectorDetected) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Detected a VGA monitor on I2C Bus 1.\n"); + "VGA connector not detected.\n"); + goto exit; + } + + status = XF86OutputStatusConnected; + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "VGA connector detected.\n"); +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_analog_detect.\n")); + return status; +} + +static DisplayModePtr +via_analog_get_modes(xf86OutputPtr output) +{ + ScrnInfoPtr pScrn = output->scrn; + xf86MonPtr pMon; + DisplayModePtr pDisplay_Mode = NULL; + I2CBusPtr pI2CBus; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIAAnalogPtr pVIAAnalog = (VIAAnalogPtr) output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_analog_get_modes.\n")); + + if (pVIAAnalog->i2cBus & VIA_I2C_BUS1) { + pI2CBus = pVIADisplay->pI2CBus1; } else { - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Did not detect a VGA monitor on I2C Bus 1.\n"); + pI2CBus = NULL; + } - /* Probe I2C Bus 2 to see if a VGA monitor is connected. */ - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Probing for a VGA monitor on I2C Bus 2.\n"); - mon = xf86OutputGetEDID(output, pVia->pI2CBus2); - if (mon && (!mon->features.input_type)) { - xf86OutputSetEDID(output, mon); - status = XF86OutputStatusConnected; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Detected a VGA monitor on I2C Bus 2.\n"); - } else { + if (pI2CBus) { + pMon = xf86OutputGetEDID(output, pI2CBus); + if (pMon && (!pMon->features.input_type)) { + xf86OutputSetEDID(output, pMon); + pDisplay_Mode = xf86OutputGetEDIDModes(output); xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Did not detect a VGA monitor on I2C Bus 2.\n"); + "Detected a monitor connected to VGA.\n"); + goto exit; + } + } + + if (pVIAAnalog->i2cBus & VIA_I2C_BUS2) { + pI2CBus = pVIADisplay->pI2CBus2; + } else { + pI2CBus = NULL; + } - /* Perform manual detection of a VGA monitor since */ - /* it was not detected via I2C buses. */ + if (pI2CBus) { + pMon = xf86OutputGetEDID(output, pI2CBus); + if (pMon && (!pMon->features.input_type)) { + xf86OutputSetEDID(output, pMon); + pDisplay_Mode = xf86OutputGetEDIDModes(output); xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Now perform manual detection of a VGA " - "monitor.\n"); - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 SR01 = hwp->readSeq(hwp, 0x01); - CARD8 SR40 = hwp->readSeq(hwp, 0x40); - CARD8 CR36 = hwp->readCrtc(hwp, 0x36); - - /* We have to power on the display to detect it */ - ViaSeqMask(hwp, 0x01, 0x00, 0x20); - ViaCrtcMask(hwp, 0x36, 0x00, 0xF0); - - /* Wait for vblank */ - usleep(16); - - /* Detect the load on pins */ - ViaSeqMask(hwp, 0x40, 0x80, 0x80); - - if ((VIA_CX700 == pVia->Chipset) || - (VIA_VX800 == pVia->Chipset) || - (VIA_VX855 == pVia->Chipset) || - (VIA_VX900 == pVia->Chipset)) - ViaSeqMask(hwp, 0x40, 0x00, 0x80); - - if (ViaVgahwIn(hwp, 0x3C2) & 0x20) { - status = XF86OutputStatusConnected; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Detected a VGA monitor using manual " - "detection method.\n"); - } - - if ((VIA_CX700 == pVia->Chipset) || - (VIA_VX800 == pVia->Chipset) || - (VIA_VX855 == pVia->Chipset) || - (VIA_VX900 == pVia->Chipset)) - ViaSeqMask(hwp, 0x40, 0x00, 0x80); - - /* Restore previous state */ - hwp->writeSeq(hwp, 0x40, SR40); - hwp->writeSeq(hwp, 0x01, SR01); - hwp->writeCrtc(hwp, 0x36, CR36); + "Detected a monitor connected to VGA.\n"); + goto exit; } } - return status; +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_analog_get_modes.\n")); + return pDisplay_Mode; } #ifdef RANDR_12_INTERFACE @@ -372,7 +483,7 @@ static const xf86OutputFuncsRec via_analog_funcs = { .commit = via_analog_commit, .mode_set = via_analog_mode_set, .detect = via_analog_detect, - .get_modes = xf86OutputGetEDIDModes, + .get_modes = via_analog_get_modes, #ifdef RANDR_12_INTERFACE .set_property = via_analog_set_property, #endif @@ -383,28 +494,102 @@ static const xf86OutputFuncsRec via_analog_funcs = { }; void -via_analog_init(ScrnInfoPtr pScrn) +viaAnalogProbe(ScrnInfoPtr pScrn) { + vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; - xf86OutputPtr output = NULL; - char outputNameBuffer[32]; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + CARD8 sr13, sr5a; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered via_analog_init.\n")); + "Entered viaAnalogProbe.\n")); - if (!pVia->pI2CBus1 || !pVia->pI2CBus2) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "I2C Bus 1 or I2C Bus 2 does not exist.\n"); + /* Detect the presence of VGA. */ + switch (pVia->Chipset) { + case VIA_CX700: + case VIA_VX800: + case VIA_VX855: + case VIA_VX900: + sr5a = hwp->readSeq(hwp, 0x5A); + + /* Setting SR5A[0] to 1. + * This allows the reading out the alternative + * pin strapping information from SR12 and SR13. */ + ViaSeqMask(hwp, 0x5A, BIT(0), BIT(0)); + + sr13 = hwp->readSeq(hwp, 0x13); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "SR13: 0x%02X\n", sr13)); + if (!(sr13 & BIT(2))) { + pVIADisplay->analogPresence = TRUE; + pVIADisplay->analogI2CBus = VIA_I2C_BUS2 | VIA_I2C_BUS1; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2 | VIA_I2C_BUS1; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Detected the presence of VGA.\n")); + } else { + pVIADisplay->analogPresence = FALSE; + pVIADisplay->analogI2CBus = VIA_I2C_NONE; + } + + hwp->writeSeq(hwp, 0x5A, sr5a); + break; + default: + /* For all other devices, assume VGA presence. */ + pVIADisplay->analogPresence = TRUE; + pVIADisplay->analogI2CBus = VIA_I2C_BUS2 | VIA_I2C_BUS1; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2 | VIA_I2C_BUS1; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting via_analog_init.\n")); - return; + "Detected the presence of VGA.\n")); + break; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaAnalogProbe.\n")); +} + +void +viaAnalogInit(ScrnInfoPtr pScrn) +{ + xf86OutputPtr output; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIAAnalogPtr pVIAAnalog; + char outputNameBuffer[32]; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaAnalogInit.\n")); + + if (!pVIADisplay->analogPresence) { + goto exit; } + pVIAAnalog = (VIAAnalogPtr) xnfcalloc(1, sizeof(VIAAnalogRec)); + if (!pVIAAnalog) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate storage for " + "analog (VGA).\n")); + goto exit; + } + /* The code to dynamically designate the output name for * xrandr was borrowed from xf86-video-r128 DDX. */ - sprintf(outputNameBuffer, "VGA-%d", (pVia->numberVGA + 1)); + sprintf(outputNameBuffer, "VGA-%d", (pVIADisplay->numberVGA + 1)); output = xf86OutputCreate(pScrn, &via_analog_funcs, outputNameBuffer); + if (!output) { + free(pVIAAnalog); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate X Server display output " + "record for analog (VGA).\n"); + goto exit; + } + + /* Increment the number of analog VGA connectors. */ + pVIADisplay->numberVGA++; + + /* Hint about which I2C bus to access for obtaining EDID. */ + pVIAAnalog->i2cBus = pVIADisplay->analogI2CBus; + + output->driver_private = pVIAAnalog; /* While there are two (2) display controllers registered with the * X.Org Server, it is often desirable to fix the analog VGA output @@ -414,16 +599,13 @@ via_analog_init(ScrnInfoPtr pScrn) * With this arrangement, DVI should end up getting assigned to IGA2 * since DVI can go to either display controller without limitations. * This should be the case for TV as well. */ - output->possible_crtcs = (1 << 0); + output->possible_crtcs = BIT(1) | BIT(0); output->possible_clones = 0; - output->interlaceAllowed = TRUE; + output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; - pBIOSInfo->analog = output; - - /* Increment the number of analog VGA connectors. */ - pVia->numberVGA++; +exit: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting via_analog_init.\n")); + "Exiting viaAnalogInit.\n")); } diff --git a/src/via_ch7xxx.c b/src/via_ch7xxx.c index 48689a6..20c15b9 100644 --- a/src/via_ch7xxx.c +++ b/src/via_ch7xxx.c @@ -40,14 +40,14 @@ static void CH7xxxPrintRegs(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; CARD8 i, buf; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for %s\n", - pBIOSInfo->TVI2CDev->DevName); + pVIADisplay->TVI2CDev->DevName); - for (i = 0; i < pBIOSInfo->TVNumRegs; i++) { - xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &buf); + for (i = 0; i < pVIADisplay->TVNumRegs; i++) { + xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &buf); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, buf); } @@ -61,7 +61,7 @@ CH7xxxPrintRegs(ScrnInfoPtr pScrn) I2CDevPtr ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; I2CDevPtr pDev = xf86CreateI2CDevRec(); CARD8 buf; @@ -86,40 +86,40 @@ ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address) switch (buf) { case 0x17: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7011 TV Encoder\n"); - pBIOSInfo->TVEncoder = VIA_CH7011; + pVIADisplay->TVEncoder = VIA_CH7011; pDev->DevName="CH7011"; break; case 0x19: xf86I2CReadByte(pDev, 0x4A, &buf); if (buf == 0x81) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7019A LVDS Transmitter/TV Encoder\n"); - pBIOSInfo->TVEncoder = VIA_CH7019A; + pVIADisplay->TVEncoder = VIA_CH7019A; pDev->DevName="CH7019A"; } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7019B LVDS Transmitter/TV Encoder\n"); - pBIOSInfo->TVEncoder = VIA_CH7019B; + pVIADisplay->TVEncoder = VIA_CH7019B; pDev->DevName="CH7019B"; } break; case 0x1B: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7017 LVDS Transmitter\n"); - pBIOSInfo->TVEncoder = VIA_CH7017; + pVIADisplay->TVEncoder = VIA_CH7017; pDev->DevName="CH7017"; break; case 0x3A: /* single init table --> single channel LVDS transmitter ? */ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7304 LVDS Transmitter\n"); - pBIOSInfo->TVEncoder = VIA_CH7304; + pVIADisplay->TVEncoder = VIA_CH7304; pDev->DevName="CH7304"; break; case 0x3B: /* dual init table --> dual channel LVDS transmitter ? */ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7305 LVDS Transmitter\n"); - pBIOSInfo->TVEncoder = VIA_CH7305; + pVIADisplay->TVEncoder = VIA_CH7305; pDev->DevName="CH7305"; break; default: - pBIOSInfo->TVEncoder = VIA_NONETV; + pVIADisplay->TVEncoder = VIA_NONETV; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown CH7xxx" " device found. [%x:0x1B contains %x]\n", Address, buf); @@ -140,12 +140,12 @@ static void CH7xxxSave(ScrnInfoPtr pScrn) { int i; - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxSave\n")); - for (i = 0; i < pBIOSInfo->TVNumRegs; i++) - xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &(pBIOSInfo->TVRegs[i])); + for (i = 0; i < pVIADisplay->TVNumRegs; i++) + xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &(pVIADisplay->TVRegs[i])); } @@ -153,12 +153,12 @@ static void CH7xxxRestore(ScrnInfoPtr pScrn) { int i; - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxRestore\n")); - for (i = 0; i < pBIOSInfo->TVNumRegs; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]); + for (i = 0; i < pVIADisplay->TVNumRegs; i++) + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, pVIADisplay->TVRegs[i]); } static CARD8 @@ -201,17 +201,17 @@ CH7xxxDACSenseI2C(I2CDevPtr pDev) static Bool CH7xxxDACSense(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxDACDetect\n")); /* is this needed? IH */ - if (!pBIOSInfo->TVI2CDev || - !pBIOSInfo->TVEncoder) + if (!pVIADisplay->TVI2CDev || + !pVIADisplay->TVEncoder) return FALSE; - sense = CH7xxxDACSenseI2C(pBIOSInfo->TVI2CDev); + sense = CH7xxxDACSenseI2C(pVIADisplay->TVI2CDev); /* I'm sure these case values are correct, * but we should get something in any case. @@ -220,27 +220,27 @@ CH7xxxDACSense(ScrnInfoPtr pScrn) */ switch (sense) { case 0x10: - pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: Composite connected.\n"); return TRUE; case 0x0C: - pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + pVIADisplay->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: S-Video connected.\n"); return TRUE; case 0x02: - pBIOSInfo->TVOutput = TVOUTPUT_SC; + pVIADisplay->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CHxxx: Composite+S-Video connected.\n"); return TRUE; case 0x04: - pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; + pVIADisplay->TVOutput = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CHxxx: YcBcR Connected.\n"); return TRUE; case 0x00: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: Nothing connected.\n"); return FALSE; default: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CH7xxx: Unknown cable combination: 0x0%2X.\n",sense); return FALSE; } @@ -249,14 +249,14 @@ CH7xxxDACSense(ScrnInfoPtr pScrn) static CARD8 CH7011ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7011ModeIndex\n")); for (i = 0; CH7011Table[i].Width; i++) { if ((CH7011Table[i].Width == mode->CrtcHDisplay) && (CH7011Table[i].Height == mode->CrtcVDisplay) && - (CH7011Table[i].Standard == pBIOSInfo->TVType) && + (CH7011Table[i].Standard == pVIADisplay->TVType) && !(strcmp(CH7011Table[i].name, mode->name))) return i; } @@ -268,14 +268,14 @@ CH7011ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) static CARD8 CH7019ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7019ModeIndex\n")); for (i = 0; CH7019Table[i].Width; i++) { if ((CH7019Table[i].Width == mode->CrtcHDisplay) && (CH7019Table[i].Height == mode->CrtcVDisplay) && - (CH7019Table[i].Standard == pBIOSInfo->TVType) && + (CH7019Table[i].Standard == pVIADisplay->TVType) && !(strcmp(CH7019Table[i].name, mode->name))) return i; } @@ -290,7 +290,7 @@ CH7019ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) static ModeStatus CH7xxxModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxModeValid\n")); @@ -301,17 +301,17 @@ CH7xxxModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) return MODE_BAD; } - if ((pBIOSInfo->TVType == TVTYPE_NTSC) && + if ((pVIADisplay->TVType == TVTYPE_NTSC) && (mode->Private != (void *) &CH7xxxModePrivateNTSC)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_PAL) && + } else if ((pVIADisplay->TVType == TVTYPE_PAL) && (mode->Private != (void *) &CH7xxxModePrivatePAL)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); return MODE_BAD; } - if (pBIOSInfo->TVEncoder == VIA_CH7011) + if (pVIADisplay->TVEncoder == VIA_CH7011) { if (CH7011ModeIndex(pScrn, mode) != 0xFF) return MODE_OK; @@ -328,14 +328,14 @@ static void CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; CARD8 i, j; VIABIOSTVMASKTableRec Mask; struct CH7xxxTableRec Table; - if (pBIOSInfo->TVEncoder == VIA_CH7011) + if (pVIADisplay->TVEncoder == VIA_CH7011) { Table = CH7011Table[CH7011ModeIndex(pScrn, mode)]; Mask = ch7011MaskTable; @@ -348,19 +348,19 @@ CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7011ModeI2C\n")); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3E); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1E, 0xD0); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3E); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1E, 0xD0); for (i = 0,j = 0; (j < Mask.numTV) && (i < VIA_BIOS_TABLE_NUM_TV_REG); i++) { if (Mask.TV[i] == 0xFF) { - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV[i]); j++; } else { - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, pVIADisplay->TVRegs[i]); } } - if ((pBIOSInfo->TVType == TVTYPE_NTSC) && pBIOSInfo->TVDotCrawl) { + if ((pVIADisplay->TVType == TVTYPE_NTSC) && pVIADisplay->TVDotCrawl) { CARD16 *DotCrawl = Table.DotCrawlNTSC; CARD8 address, save; @@ -368,25 +368,25 @@ CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) address = (CARD8)(DotCrawl[i] & 0xFF); save = (CARD8)(DotCrawl[i] >> 8); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, address, save); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, address, save); } } /* * Only Composite and SVideo have been tested. */ - switch(pBIOSInfo->TVOutput){ + switch(pVIADisplay->TVOutput){ case TVOUTPUT_COMPOSITE: - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x2E); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x2E); break; case TVOUTPUT_SVIDEO: - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x32); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x32); break; case TVOUTPUT_SC: - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3C); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3C); break; case TVOUTPUT_YCBCR: - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3A); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3A); break; default: break; @@ -395,7 +395,7 @@ CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) if (pVia->IsSecondary) { /* Patch as setting 2nd path */ j = (CARD8)(Mask.misc2 >> 5); for (i = 0; i < j; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, Table.Patch2[i] & 0xFF, Table.Patch2[i] >> 8); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, Table.Patch2[i] & 0xFF, Table.Patch2[i] >> 8); } } @@ -405,14 +405,14 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; CARD8 *CRTC, *Misc; int i, j; VIABIOSTVMASKTableRec Mask; struct CH7xxxTableRec Table; - if (pBIOSInfo->TVEncoder == VIA_CH7011) + if (pVIADisplay->TVEncoder == VIA_CH7011) { Table = CH7011Table[CH7011ModeIndex(pScrn, mode)]; Mask = ch7011MaskTable; @@ -449,7 +449,7 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) } if (Mask.misc2 & 0x18) { - pBIOSInfo->Clock = (Misc[3] << 8) & Misc[4]; + pVIADisplay->Clock = (Misc[3] << 8) & Misc[4]; /* VIASetUseExternalClock(hwp); */ } @@ -488,9 +488,9 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) /* CLE266Ax use 2x XCLK */ if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) - pBIOSInfo->Clock = 0x471C; + pVIADisplay->Clock = 0x471C; else - pBIOSInfo->Clock = (Misc[4] << 8) | Misc[5]; + pVIADisplay->Clock = (Misc[4] << 8) | Misc[5]; } ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); @@ -508,22 +508,22 @@ CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) static void CH7xxxTVPower(ScrnInfoPtr pScrn, Bool On) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; if (On){ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxTVPower: On\n")); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x20); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x20); }else{ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxTVPower: Off\n")); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3E); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1E, 0xD0); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x49, 0x3E); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1E, 0xD0); } } static void CH7019LCDPower(ScrnInfoPtr pScrn, Bool On) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; CARD8 W_Buffer[2], R_Buffer[1]; int i; @@ -531,45 +531,45 @@ CH7019LCDPower(ScrnInfoPtr pScrn, Bool On) DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxLCDPower: On\n")); W_Buffer[0] = 0x63; W_Buffer[1] = 0x4B; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); W_Buffer[0] = 0x66; W_Buffer[1] = 0x20; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); for (i = 0; i < 10; i++) { W_Buffer[0] = 0x63; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1); usleep(100); W_Buffer[0] = 0x63; W_Buffer[1] = (R_Buffer[0] | 0x40); - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxxLCDPower: [%d]write 0x63 = %X!\n", i+1, W_Buffer[1])); usleep(1); W_Buffer[0] = 0x63; W_Buffer[1] &= ~0x40; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxxLCDPower: [%d]write 0x63 = %X!\n", i+1, W_Buffer[1])); usleep(100); W_Buffer[0] = 0x66; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1); if (((R_Buffer[0] & 0x44) == 0x44) || (i >= 9)) { /* PLL lock OK, Turn on VDD */ usleep(500); W_Buffer[1] = R_Buffer[0] | 0x01; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxxLCDPower: CH7019 PLL lock ok!\n")); /* reset data path */ W_Buffer[0] = 0x48; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1); W_Buffer[1] = R_Buffer[0] & ~0x08; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); usleep(1); W_Buffer[1] = R_Buffer[0]; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); break; } @@ -582,15 +582,15 @@ CH7019LCDPower(ScrnInfoPtr pScrn, Bool On) DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxLCDPower: Off\n")); /* Turn off VDD (Turn off backlignt only) */ W_Buffer[0] = 0x66; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1); W_Buffer[1] &= ~0x01; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); usleep(100); /* Turn off LVDS path */ W_Buffer[0] = 0x63; - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,1, R_Buffer,1); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,1, R_Buffer,1); W_Buffer[1] = (R_Buffer[0] | 0x40); - xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); + xf86I2CWriteRead(pVIADisplay->TVI2CDev, W_Buffer,2, NULL,0); } } @@ -600,42 +600,42 @@ CH7019LCDPower(ScrnInfoPtr pScrn, Bool On) void ViaCH7xxxInit(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaCH7xxxInit\n")); - switch (pBIOSInfo->TVEncoder) { + switch (pVIADisplay->TVEncoder) { case VIA_CH7011: - pBIOSInfo->TVSave = CH7xxxSave; - pBIOSInfo->TVRestore = CH7xxxRestore; - pBIOSInfo->TVDACSense = CH7xxxDACSense; - pBIOSInfo->TVModeValid = CH7xxxModeValid; - pBIOSInfo->TVModeI2C = CH7xxxModeI2C; - pBIOSInfo->TVModeCrtc = CH7xxxModeCrtc; - pBIOSInfo->TVPower = CH7xxxTVPower; - pBIOSInfo->TVModes = CH7011Modes; - pBIOSInfo->TVNumModes = sizeof(CH7011Modes) / sizeof(DisplayModeRec); - pBIOSInfo->LCDPower = NULL; - pBIOSInfo->TVNumRegs = CH_7011_MAX_NUM_REG; + pVIADisplay->TVSave = CH7xxxSave; + pVIADisplay->TVRestore = CH7xxxRestore; + pVIADisplay->TVDACSense = CH7xxxDACSense; + pVIADisplay->TVModeValid = CH7xxxModeValid; + pVIADisplay->TVModeI2C = CH7xxxModeI2C; + pVIADisplay->TVModeCrtc = CH7xxxModeCrtc; + pVIADisplay->TVPower = CH7xxxTVPower; + pVIADisplay->TVModes = CH7011Modes; + pVIADisplay->TVNumModes = sizeof(CH7011Modes) / sizeof(DisplayModeRec); + pVIADisplay->LCDPower = NULL; + pVIADisplay->TVNumRegs = CH_7011_MAX_NUM_REG; #ifdef HAVE_DEBUG - pBIOSInfo->TVPrintRegs = CH7xxxPrintRegs; + pVIADisplay->TVPrintRegs = CH7xxxPrintRegs; #endif break; case VIA_CH7019A: case VIA_CH7019B: - pBIOSInfo->TVDACSense = CH7xxxDACSense; - pBIOSInfo->TVSave = CH7xxxSave; - pBIOSInfo->TVRestore = CH7xxxRestore; - pBIOSInfo->TVModeValid = CH7xxxModeValid; - pBIOSInfo->TVModeI2C = CH7xxxModeI2C; - pBIOSInfo->TVModeCrtc = CH7xxxModeCrtc; - pBIOSInfo->TVPower = CH7xxxTVPower; - pBIOSInfo->TVModes = CH7019Modes; - pBIOSInfo->TVNumModes = sizeof(CH7019Modes) / sizeof(DisplayModeRec); - pBIOSInfo->LCDPower = CH7019LCDPower; - pBIOSInfo->TVNumRegs = CH_7019_MAX_NUM_REG; + pVIADisplay->TVDACSense = CH7xxxDACSense; + pVIADisplay->TVSave = CH7xxxSave; + pVIADisplay->TVRestore = CH7xxxRestore; + pVIADisplay->TVModeValid = CH7xxxModeValid; + pVIADisplay->TVModeI2C = CH7xxxModeI2C; + pVIADisplay->TVModeCrtc = CH7xxxModeCrtc; + pVIADisplay->TVPower = CH7xxxTVPower; + pVIADisplay->TVModes = CH7019Modes; + pVIADisplay->TVNumModes = sizeof(CH7019Modes) / sizeof(DisplayModeRec); + pVIADisplay->LCDPower = CH7019LCDPower; + pVIADisplay->TVNumRegs = CH_7019_MAX_NUM_REG; #ifdef HAVE_DEBUG - pBIOSInfo->TVPrintRegs = CH7xxxPrintRegs; + pVIADisplay->TVPrintRegs = CH7xxxPrintRegs; #endif break; default: @@ -644,6 +644,6 @@ ViaCH7xxxInit(ScrnInfoPtr pScrn) } /* Save before continuing */ - if (pBIOSInfo->TVSave) - pBIOSInfo->TVSave(pScrn); + if (pVIADisplay->TVSave) + pVIADisplay->TVSave(pScrn); } diff --git a/src/via_ch7xxx.h b/src/via_ch7xxx.h index f54ac5e..11da93d 100644 --- a/src/via_ch7xxx.h +++ b/src/via_ch7xxx.h @@ -116,7 +116,7 @@ typedef struct _VIATVMASKTABLE { } VIABIOSTVMASKTableRec, *VIABIOSTVMASKTablePtr; struct CH7xxxTableRec { - char* name; + const char* name; CARD16 Width; CARD16 Height; int Standard; diff --git a/src/via_display.c b/src/via_display.c index 141ce03..696251f 100644 --- a/src/via_display.c +++ b/src/via_display.c @@ -86,73 +86,6 @@ ViaPrintMode(ScrnInfoPtr pScrn, DisplayModePtr mode) } -/* - * Sets IGA1 or IGA2 for palette LUT access. - * This function should be called before changing the - * contents of the palette. - */ -static void -viaSetPaletteLUTAccess(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaSetPaletteLUTAccess.\n")); - - ViaSeqMask(hwp, 0x1A, displaySource, 0x01); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Palette LUT Access: IGA%d\n", - (displaySource & 0x01) + 1); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaSetPaletteLUTAccess.\n")); -} - -/* - * Resets IGA1 hardware. - */ -static void -viaIGA1HWReset(ScrnInfoPtr pScrn, CARD8 resetState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaIGA1HWReset.\n")); - - /* 3X5.17[7] - IGA1 HW Reset - * 0: Reset - * 1: Normal Operation */ - ViaCrtcMask(hwp, 0x17, resetState << 7, 0x80); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "IGA1 HW Reset: %s\n", - (resetState & 0x01) ? "Off" : "On"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaIGA1HWReset.\n")); -} - -/* - * Controls IGA1 DPMS State. - */ -static void -viaIGA1DPMSControl(ScrnInfoPtr pScrn, CARD8 dpmsControl) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaIGA1DPMSControl.\n")); - - /* 3X5.36[5:4] - DPMS Control - * 00: On - * 01: Stand-by - * 10: Suspend - * 11: Off */ - ViaCrtcMask(hwp, 0x36, dpmsControl << 4, 0x30); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaIGA1DPMSControl.\n")); -} - /* * Sets IGA1 color depth. */ @@ -206,30 +139,6 @@ viaIGA1SetColorDepth(ScrnInfoPtr pScrn, CARD8 bitsPerPixel) "Exiting viaIGA1SetColorDepth.\n")); } -/* - * Sets IGA1 palette LUT resolution. (6-bit or 8-bit) - */ -static void -viaIGA1SetPaletteLUTResolution(ScrnInfoPtr pScrn, CARD8 paletteLUT) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaIGA1SetPaletteLUTResolution.\n")); - - /* Set the palette LUT resolution for IGA1. */ - /* 3C5.15[7] - IGA1 6 / 8 Bit LUT - * 0: 6-bit - * 1: 8-bit */ - ViaSeqMask(hwp, 0x15, paletteLUT << 7, 0x80); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "IGA1 Palette LUT Resolution: %s bit\n", - (paletteLUT & 0x01) ? "8" : "6"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaIGA1SetPaletteLUTResolution.\n")); -} - /* * Controls IGA1 gamma correction state. */ @@ -272,7 +181,6 @@ viaIGA1InitHI(ScrnInfoPtr pScrn) VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { - case VIA_PM800: case VIA_CX700: case VIA_P4M890: case VIA_P4M900: @@ -307,7 +215,6 @@ viaIGA1SetHIStartingAddress(xf86CrtcPtr crtc) VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { - case VIA_PM800: case VIA_CX700: case VIA_P4M890: case VIA_P4M900: @@ -333,7 +240,6 @@ viaIGA1DisplayHI(ScrnInfoPtr pScrn, Bool HI_Status) CARD32 temp; switch(pVia->Chipset) { - case VIA_PM800: case VIA_CX700: case VIA_P4M890: case VIA_P4M900: @@ -366,7 +272,6 @@ viaIGA1SetHIDisplayLocation(ScrnInfoPtr pScrn, VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { - case VIA_PM800: case VIA_CX700: case VIA_P4M890: case VIA_P4M900: @@ -406,29 +311,6 @@ viaIGA2HWReset(ScrnInfoPtr pScrn, CARD8 resetState) "Exiting viaIGA2HWReset.\n")); } -/* - * Controls IGA2 display output on or off state. - */ -static void -viaIGA2DisplayOutput(ScrnInfoPtr pScrn, Bool outputState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaIGA2DisplayOutput.\n")); - - /* 3X5.6B[2] - IGA2 Screen Off - * 0: Screen on - * 1: Screen off */ - ViaCrtcMask(hwp, 0x6B, outputState ? 0x00 : 0x04, 0x04); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "IGA2 Display Output: %s\n", - outputState ? "On" : "Off"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaIGA2DisplayOutput.\n")); -} - /* * Controls IGA2 display channel state. */ @@ -501,30 +383,6 @@ viaIGA2SetColorDepth(ScrnInfoPtr pScrn, CARD8 bitsPerPixel) "Exiting viaIGA2SetColorDepth.\n")); } -/* - * Sets IGA2 palette LUT resolution. (6-bit or 8-bit) - */ -static void -viaIGA2SetPaletteLUTResolution(ScrnInfoPtr pScrn, CARD8 paletteLUT) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaIGA2SetPaletteLUTResolution.\n")); - - /* Set the palette LUT resolution for IGA2. */ - /* 3X5.6A[5] - IGA2 6 / 8 Bit LUT - * 0: 6-bit - * 1: 8-bit */ - ViaCrtcMask(hwp, 0x6A, paletteLUT << 5, 0x20); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "IGA2 Palette LUT Resolution: %s bit\n", - (paletteLUT & 0x01) ? "8" : "6"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaIGA2SetPaletteLUTResolution.\n")); -} - /* * Controls IGA2 gamma correction state. */ @@ -554,7 +412,6 @@ viaIGA2InitHI(ScrnInfoPtr pScrn) VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { - case VIA_PM800: case VIA_CX700: case VIA_P4M890: case VIA_P4M900: @@ -597,7 +454,6 @@ viaIGA2DisplayHI(ScrnInfoPtr pScrn, Bool HI_Status) CARD32 temp; switch(pVia->Chipset) { - case VIA_PM800: case VIA_CX700: case VIA_P4M890: case VIA_P4M900: @@ -630,7 +486,6 @@ viaIGA2SetHIDisplayLocation(ScrnInfoPtr pScrn, VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { - case VIA_PM800: case VIA_CX700: case VIA_P4M890: case VIA_P4M900: @@ -647,48 +502,7 @@ viaIGA2SetHIDisplayLocation(ScrnInfoPtr pScrn, } } -/* - * Initial settings for displays. - */ -void -viaDisplayInit(ScrnInfoPtr pScrn) -{ - VIAPtr pVia = VIAPTR(pScrn); - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDisplayInit.\n")); - - ViaCrtcMask(hwp, 0x6A, 0x00, 0x3D); - hwp->writeCrtc(hwp, 0x6B, 0x00); - hwp->writeCrtc(hwp, 0x6C, 0x00); - hwp->writeCrtc(hwp, 0x79, 0x00); - - /* (IGA1 Timing Plus 2, added in VT3259 A3 or later) */ - if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) - ViaCrtcMask(hwp, 0x47, 0x00, 0xC8); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDisplayInit.\n")); -} - -/* - * Sets the primary or secondary display stream on internal TMDS. - */ -void -ViaDisplaySetStreamOnDFP(ScrnInfoPtr pScrn, Bool primary) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplaySetStreamOnDFP\n")); - - if (primary) - ViaCrtcMask(hwp, 0x99, 0x00, 0x10); - else - ViaCrtcMask(hwp, 0x99, 0x10, 0x10); -} - -void +static void VIALoadRgbLut(ScrnInfoPtr pScrn, int start, int numColors, LOCO *colors) { vgaHWPtr hwp = VGAHWPTR(pScrn); @@ -773,10 +587,9 @@ viaIGAInitCommon(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 i; -#ifdef HAVE_DEBUG - CARD8 temp; -#endif + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIARegPtr Regs = &pVIADisplay->SavedReg; + CARD8 i, temp; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaIGAInitCommon.\n")); @@ -789,7 +602,7 @@ viaIGAInitCommon(ScrnInfoPtr pScrn) temp = hwp->readMiscOut(hwp); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Misc. Register: 0x%02X\n", temp)); - hwp->writeMiscOut(hwp, temp | 0x22); + hwp->writeMiscOut(hwp, temp | 0x23); temp = hwp->readEnable(hwp); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -922,6 +735,13 @@ viaIGAInitCommon(ScrnInfoPtr pScrn) temp = hwp->readCrtc(hwp, 0x3F); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CR3F: 0x%02X\n", temp)); + + if (pVia->Chipset == VIA_VX900) { + temp = hwp->readCrtc(hwp, 0x45); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "CR45: 0x%02X\n", temp)); + } + temp = hwp->readCrtc(hwp, 0x47); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CR47: 0x%02X\n", temp)); @@ -1089,6 +909,25 @@ viaIGAInitCommon(ScrnInfoPtr pScrn) * 11: Clock on/off according to each engine IDLE status */ ViaSeqMask(hwp, 0x3F, 0xFF, 0xFF); + /* + * Initialize frame buffer size and GTI for VX800, VX855, and + * VX900 chipsets. This code is really necessary for standby + * resume to work properly on VIA Embedded EPIA-M830 mainboard. + */ + if ((pVia->Chipset == VIA_VX800) || + (pVia->Chipset == VIA_VX855) || + (pVia->Chipset == VIA_VX900)) { + hwp->writeSeq(hwp, 0x14, Regs->SR[0x14]); + hwp->writeSeq(hwp, 0x68, Regs->SR[0x68]); + hwp->writeSeq(hwp, 0x69, Regs->SR[0x69]); + hwp->writeSeq(hwp, 0x6A, Regs->SR[0x6A]); + hwp->writeSeq(hwp, 0x6B, Regs->SR[0x6B]); + hwp->writeSeq(hwp, 0x6C, Regs->SR[0x6C]); + hwp->writeSeq(hwp, 0x6D, Regs->SR[0x6D]); + hwp->writeSeq(hwp, 0x6E, Regs->SR[0x6E]); + hwp->writeSeq(hwp, 0x6F, Regs->SR[0x6F]); + } + /* 3X5.36[7] - DPMS VSYNC Output * 3X5.36[6] - DPMS HSYNC Output * 3X5.36[5:4] - DPMS Control @@ -1105,12 +944,16 @@ viaIGAInitCommon(ScrnInfoPtr pScrn) * 1: Enable */ ViaCrtcMask(hwp, 0x36, 0x01, 0x01); + if (pVia->Chipset == VIA_VX900) { + ViaCrtcMask(hwp, 0x45, 0x00, 0x01); + } + /* 3X5.3B through 3X5.3F are scratch pad registers. */ - ViaCrtcMask(hwp, 0x3B, pVia->originalCR3B, 0xFF); - ViaCrtcMask(hwp, 0x3C, pVia->originalCR3C, 0xFF); - ViaCrtcMask(hwp, 0x3D, pVia->originalCR3D, 0xFF); - ViaCrtcMask(hwp, 0x3E, pVia->originalCR3E, 0xFF); - ViaCrtcMask(hwp, 0x3F, pVia->originalCR3F, 0xFF); + ViaCrtcMask(hwp, 0x3B, Regs->CR[0x3B], 0xFF); + ViaCrtcMask(hwp, 0x3C, Regs->CR[0x3C], 0xFF); + ViaCrtcMask(hwp, 0x3D, Regs->CR[0x3D], 0xFF); + ViaCrtcMask(hwp, 0x3E, Regs->CR[0x3E], 0xFF); + ViaCrtcMask(hwp, 0x3F, Regs->CR[0x3F], 0xFF); /* 3X5.47[5] - Peep at the PCI-bus * 0: Disable @@ -1146,6 +989,9 @@ viaIGAInitCommon(ScrnInfoPtr pScrn) ViaCrtcMask(hwp, 0x6C, 0x00, 0x01); } + /* Disable display scaling. */ + viaSetDisplayScaling(pScrn, FALSE); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaIGAInitCommon.\n")); } @@ -1343,8 +1189,10 @@ viaIGA1SetFBStartingAddress(xf86CrtcPtr crtc, int x, int y) vgaHWPtr hwp = VGAHWPTR(pScrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; - CARD32 Base; + unsigned long Base; +#ifdef HAVE_DEBUG CARD8 cr0c, cr0d, cr34, cr48; +#endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaIGA1SetFBStartingAddress.\n")); @@ -1370,23 +1218,19 @@ viaIGA1SetFBStartingAddress(xf86CrtcPtr crtc, int x, int y) #ifdef HAVE_DEBUG cr0d = hwp->readCrtc(hwp, 0x0D); - cr0c = hwp->readCrtc(hwp, 0x0C); - cr34 = hwp->readCrtc(hwp, 0x34); - if (!(pVia->Chipset == VIA_CLE266 && CLE266_REV_IS_AX(pVia->ChipRev))) { - cr48 = hwp->readCrtc(hwp, 0x48); - } - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CR0D: 0x%02X\n", cr0d)); + cr0c = hwp->readCrtc(hwp, 0x0C); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CR0C: 0x%02X\n", cr0c)); + cr34 = hwp->readCrtc(hwp, 0x34); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CR34: 0x%02X\n", cr34)); if (!(pVia->Chipset == VIA_CLE266 && CLE266_REV_IS_AX(pVia->ChipRev))) { + cr48 = hwp->readCrtc(hwp, 0x48); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CR48: 0x%02X\n", cr48)); } - #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -1996,288 +1840,45 @@ ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode) hwp->writeSeq(hwp, 0x16, 0x90); /* 320/4 = 80 = 0x50 */ /* Formula for {SR18,0,5},{SR18,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */ hwp->writeSeq(hwp, 0x18, 0x90); /* 320/4 = 80 = 0x50 */ - hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4 = 40 = 0x28 */ - break; - case VIA_VX900: - hwp->writeSeq(hwp, 0x17, 0xC7); /* 400/2-1 = 199 = 0xC7 */ - /* Formula for {SR16,0,5},{SR16,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */ - hwp->writeSeq(hwp, 0x16, 0x90); /* 320/4 = 80 = 0x50 */ - /* Formula for {SR18,0,5},{SR18,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */ - hwp->writeSeq(hwp, 0x18, 0x90); /* 320/4 = 80 = 0x50 */ - hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4 = 40 = 0x28 */ - break; - default: - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaSetPrimaryFIFO: " - "Chipset %d not implemented\n", pVia->Chipset); - break; - } -} - -/* - * Turn off the primary FIFO only for CLE266A. - */ -static void -ViaDisablePrimaryFIFO(ScrnInfoPtr pScrn) -{ - VIAPtr pVia = VIAPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisablePrimaryFIFO\n")); - - /* Needed because exiting from X-Window will dump back register values. - * Other chipsets have no need to set extended FIFO values. */ - if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev) && - ((pScrn->currentMode->HDisplay > 1024) || pVia->HasSecondary)) - ViaSetCLE266APrimaryFIFO(pScrn, FALSE); -} - -void -viaIGA1Save(ScrnInfoPtr pScrn) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - VIARegPtr Regs = &pVia->SavedReg; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaIGA1Save.\n")); - - vgaHWProtect(pScrn, TRUE); - - vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Saving sequencer registers.\n")); - - /* Unlock extended registers. */ - hwp->writeSeq(hwp, 0x10, 0x01); - - Regs->SR[0x14] = hwp->readSeq(hwp, 0x14); - Regs->SR[0x15] = hwp->readSeq(hwp, 0x15); - Regs->SR[0x16] = hwp->readSeq(hwp, 0x16); - Regs->SR[0x17] = hwp->readSeq(hwp, 0x17); - Regs->SR[0x18] = hwp->readSeq(hwp, 0x18); - Regs->SR[0x19] = hwp->readSeq(hwp, 0x19); - - /* PCI Bus Control */ - Regs->SR[0x1A] = hwp->readSeq(hwp, 0x1A); - - Regs->SR[0x1B] = hwp->readSeq(hwp, 0x1B); - Regs->SR[0x1C] = hwp->readSeq(hwp, 0x1C); - Regs->SR[0x1D] = hwp->readSeq(hwp, 0x1D); - Regs->SR[0x1E] = hwp->readSeq(hwp, 0x1E); - Regs->SR[0x1F] = hwp->readSeq(hwp, 0x1F); - - Regs->SR[0x20] = hwp->readSeq(hwp, 0x20); - Regs->SR[0x21] = hwp->readSeq(hwp, 0x21); - Regs->SR[0x22] = hwp->readSeq(hwp, 0x22); - - /* Registers 3C5.23 through 3C5.25 are not used by Chrome9. - * Registers 3C5.27 through 3C5.29 are not used by Chrome9. */ - switch (pVia->Chipset) { - case VIA_CLE266: - case VIA_KM400: - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - Regs->SR[0x23] = hwp->readSeq(hwp, 0x23); - Regs->SR[0x24] = hwp->readSeq(hwp, 0x24); - Regs->SR[0x25] = hwp->readSeq(hwp, 0x25); - - Regs->SR[0x27] = hwp->readSeq(hwp, 0x27); - Regs->SR[0x28] = hwp->readSeq(hwp, 0x28); - Regs->SR[0x29] = hwp->readSeq(hwp, 0x29); - break; - default: - break; - } - - Regs->SR[0x26] = hwp->readSeq(hwp, 0x26); - - Regs->SR[0x2A] = hwp->readSeq(hwp, 0x2A); - Regs->SR[0x2B] = hwp->readSeq(hwp, 0x2B); - Regs->SR[0x2D] = hwp->readSeq(hwp, 0x2D); - Regs->SR[0x2E] = hwp->readSeq(hwp, 0x2E); - - /* Save PCI Configuration Memory Base Shadow 0 and 1. - * These registers are available only in UniChrome, UniChrome Pro, - * and UniChrome Pro II. */ - switch (pVia->Chipset) { - case VIA_CLE266: - case VIA_KM400: - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - Regs->SR[0x2F] = hwp->readSeq(hwp, 0x2F); - Regs->SR[0x30] = hwp->readSeq(hwp, 0x30); - break; - default: - break; - } - - /* Save PLL settings and several miscellaneous registers. - * For UniChrome, register 3C5.44 through 3C5.4B are saved. - * For UniChrome Pro and Chrome9, register 3C5.44 through 3C5.4C - * are saved. */ - Regs->SR[0x44] = hwp->readSeq(hwp, 0x44); - Regs->SR[0x45] = hwp->readSeq(hwp, 0x45); - Regs->SR[0x46] = hwp->readSeq(hwp, 0x46); - Regs->SR[0x47] = hwp->readSeq(hwp, 0x47); - Regs->SR[0x48] = hwp->readSeq(hwp, 0x48); - Regs->SR[0x49] = hwp->readSeq(hwp, 0x49); - Regs->SR[0x4A] = hwp->readSeq(hwp, 0x4A); - Regs->SR[0x4B] = hwp->readSeq(hwp, 0x4B); - - switch (pVia->Chipset) { - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - Regs->SR[0x4C] = hwp->readSeq(hwp, 0x4C); - - /* Save register 3C5.4D. - * According to CX700 / VX700 (UniChrome Pro II) Open Graphics - * Programming Manual Part I: Graphics Core / 2D, - * this register is called Dual Channel Memory Control. - * According to VX800 / VX855 / VX900 (Chrome9 HC3 / HCM / HD) - * Open Graphics Programming Manual Part I: Graphics Core / 2D, - * this register is called Preemptive Arbiter Control. - * It is likely that this register is also supported in UniChrome Pro. */ - Regs->SR[0x4D] = hwp->readSeq(hwp, 0x4D); - - Regs->SR[0x4E] = hwp->readSeq(hwp, 0x4E); - Regs->SR[0x4F] = hwp->readSeq(hwp, 0x4F); - break; - default: - break; - } - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Finished saving sequencer registers.\n")); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Saving IGA1 registers.\n")); - - /* UniChrome Pro or later */ - switch (pVia->Chipset) { - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - /* Display Fetch Blocking Control */ - Regs->CR[0x30] = hwp->readCrtc(hwp, 0x30); - - /* Half Line Position */ - Regs->CR[0x31] = hwp->readCrtc(hwp, 0x31); - break; - default: - break; - } - - Regs->CR[0x32] = hwp->readCrtc(hwp, 0x32); - Regs->CR[0x33] = hwp->readCrtc(hwp, 0x33); - Regs->CR[0x35] = hwp->readCrtc(hwp, 0x35); - Regs->CR[0x36] = hwp->readCrtc(hwp, 0x36); - - /* UniChrome Pro or later */ - switch (pVia->Chipset) { - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - /* DAC Control Register */ - Regs->CR[0x37] = hwp->readCrtc(hwp, 0x37); - break; - default: - break; - } - - Regs->CR[0x38] = hwp->readCrtc(hwp, 0x38); - Regs->CR[0x39] = hwp->readCrtc(hwp, 0x39); - Regs->CR[0x3A] = hwp->readCrtc(hwp, 0x3A); - Regs->CR[0x3B] = hwp->readCrtc(hwp, 0x3B); - Regs->CR[0x3C] = hwp->readCrtc(hwp, 0x3C); - Regs->CR[0x3D] = hwp->readCrtc(hwp, 0x3D); - Regs->CR[0x3E] = hwp->readCrtc(hwp, 0x3E); - Regs->CR[0x3F] = hwp->readCrtc(hwp, 0x3F); - - Regs->CR[0x40] = hwp->readCrtc(hwp, 0x40); - - /* UniChrome Pro or later */ - switch (pVia->Chipset) { - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - Regs->CR[0x43] = hwp->readCrtc(hwp, 0x43); - Regs->CR[0x45] = hwp->readCrtc(hwp, 0x45); - break; - default: - break; - } - - Regs->CR[0x46] = hwp->readCrtc(hwp, 0x46); - Regs->CR[0x47] = hwp->readCrtc(hwp, 0x47); - - /* Starting Address */ - /* Start Address High */ - Regs->CR[0x0C] = hwp->readCrtc(hwp, 0x0C); - - /* Start Address Low */ - Regs->CR[0x0D] = hwp->readCrtc(hwp, 0x0D); - - /* UniChrome Pro or later */ - switch (pVia->Chipset) { - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - /* Starting Address Overflow[28:24] */ - Regs->CR[0x48] = hwp->readCrtc(hwp, 0x48); - break; - default: - break; + hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4 = 40 = 0x28 */ + break; + case VIA_VX900: + hwp->writeSeq(hwp, 0x17, 0xC7); /* 400/2-1 = 199 = 0xC7 */ + /* Formula for {SR16,0,5},{SR16,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */ + hwp->writeSeq(hwp, 0x16, 0x90); /* 320/4 = 80 = 0x50 */ + /* Formula for {SR18,0,5},{SR18,7,7} is: (0x50 & 0x3F) | ((0x50 & 0x40) << 1) = 0x90 */ + hwp->writeSeq(hwp, 0x18, 0x90); /* 320/4 = 80 = 0x50 */ + hwp->writeSeq(hwp, 0x22, 0x28); /* 160/4 = 40 = 0x28 */ + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaSetPrimaryFIFO: " + "Chipset %d not implemented\n", pVia->Chipset); + break; } +} + +/* + * Turn off the primary FIFO only for CLE266A. + */ +static void +ViaDisablePrimaryFIFO(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); - /* Starting Address Overflow[23:16] */ - Regs->CR[0x34] = hwp->readCrtc(hwp, 0x34); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisablePrimaryFIFO\n")); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Finished saving IGA1 registers.\n")); + /* Needed because exiting from X-Window will dump back register values. + * Other chipsets have no need to set extended FIFO values. */ + if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev) && + ((pScrn->currentMode->HDisplay > 1024) || pVia->HasSecondary)) + ViaSetCLE266APrimaryFIFO(pScrn, FALSE); +} - vgaHWProtect(pScrn, FALSE); +void +viaIGA1Save(ScrnInfoPtr pScrn) +{ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaIGA1Save.\n")); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaIGA1Save.\n")); @@ -2288,7 +1889,8 @@ viaIGA1Restore(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIARegPtr Regs = &pVia->SavedReg; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIARegPtr Regs = &pVIADisplay->SavedReg; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaIGA1Restore.\n")); @@ -2332,7 +1934,6 @@ viaIGA1Restore(ScrnInfoPtr pScrn) case VIA_P4M890: hwp->writeSeq(hwp, 0x23, Regs->SR[0x23]); hwp->writeSeq(hwp, 0x24, Regs->SR[0x24]); - hwp->writeSeq(hwp, 0x25, Regs->SR[0x25]); hwp->writeSeq(hwp, 0x27, Regs->SR[0x27]); hwp->writeSeq(hwp, 0x28, Regs->SR[0x28]); @@ -2342,11 +1943,13 @@ viaIGA1Restore(ScrnInfoPtr pScrn) break; } - hwp->writeSeq(hwp, 0x26, Regs->SR[0x26]); - hwp->writeSeq(hwp, 0x2A, Regs->SR[0x2A]); hwp->writeSeq(hwp, 0x2B, Regs->SR[0x2B]); + hwp->writeSeq(hwp, 0x2C, + (hwp->readSeq(hwp, 0x2C) & (~0x01)) | + (Regs->SR[0x2C] & 0x01)); + hwp->writeSeq(hwp, 0x2D, Regs->SR[0x2D]); hwp->writeSeq(hwp, 0x2E, Regs->SR[0x2E]); @@ -2368,6 +1971,10 @@ viaIGA1Restore(ScrnInfoPtr pScrn) break; } + hwp->writeSeq(hwp, 0x3D, + (hwp->readSeq(hwp, 0x3D) & (~0x01)) | + (Regs->SR[0x3D] & 0x01)); + /* Restore PLL settings and several miscellaneous registers. * For UniChrome, register 3C5.44 through 3C5.4B are restored. * For UniChrome Pro and Chrome 9, register 3C5.44 through 3C5.4C @@ -2734,8 +2341,11 @@ viaIGA2SetFBStartingAddress(xf86CrtcPtr crtc, int x, int y) vgaHWPtr hwp = VGAHWPTR(pScrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; - CARD32 Base, tmp; + unsigned long Base; + unsigned long tmp; +#ifdef HAVE_DEBUG CARD8 cr62, cr63, cr64, cra3; +#endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaIGA2SetFBStartingAddress.\n")); @@ -3309,131 +2919,9 @@ ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode) void viaIGA2Save(ScrnInfoPtr pScrn) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - VIARegPtr Regs = &pVia->SavedReg; - int i; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaIGA2Save.\n")); - vgaHWProtect(pScrn, TRUE); - - vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Saving IGA2 registers.\n")); - - /* Unlock extended registers. */ - hwp->writeSeq(hwp, 0x10, 0x01); - - for (i = 0; i < (0x88 - 0x50 + 1); i++) { - Regs->CR[i + 0x50] = hwp->readCrtc(hwp, i + 0x50); - } - - for (i = 0; i < (0x92 - 0x8A + 1); i++) { - Regs->CR[i + 0x8A] = hwp->readCrtc(hwp, i + 0x8A); - } - - for (i = 0; i < (0xA3 - 0x94 + 1); i++) { - Regs->CR[i + 0x94] = hwp->readCrtc(hwp, i + 0x94); - } - - Regs->CR[0xA4] = hwp->readCrtc(hwp, 0xA4); - - for (i = 0; i < (0xAC - 0xA5 + 1); i++) { - Regs->CR[i + 0xA5] = hwp->readCrtc(hwp, i + 0xA5); - } - - /* Chrome 9 */ - switch (pVia->Chipset) { - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - Regs->CR[0xAF] = hwp->readCrtc(hwp, 0xAF); - break; - default: - break; - } - - /* Chrome 9, Chrome 9 HC, and Chrome 9 HC3 */ - switch (pVia->Chipset) { - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - for (i = 0; i < (0xCD - 0xB0 + 1); i++) { - Regs->CR[i + 0xB0] = hwp->readCrtc(hwp, i + 0xB0); - } - - break; - default: - break; - } - - switch (pVia->Chipset) { - - /* UniChrome Pro and UniChrome Pro II */ - case VIA_PM800: - case VIA_K8M800: - case VIA_P4M800PRO: - case VIA_CX700: - case VIA_P4M890: - for (i = 0; i < (0xD7 - 0xD0 + 1); i++) { - Regs->CR[i + 0xD0] = hwp->readCrtc(hwp, i + 0xD0); - } - - break; - - /* Chrome 9 */ - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - for (i = 0; i < (0xEC - 0xD0 + 1); i++) { - Regs->CR[i + 0xD0] = hwp->readCrtc(hwp, i + 0xD0); - } - - break; - default: - break; - } - - /* Chrome 9 */ - switch (pVia->Chipset) { - case VIA_K8M890: - case VIA_P4M900: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - for (i = 0; i < (0xF5 - 0xF0 + 1); i++) { - Regs->CR[i + 0xF0] = hwp->readCrtc(hwp, i + 0xF0); - } - - break; - default: - break; - } - - /* Chrome 9 HCM and Chrome 9 HD */ - if ((pVia->Chipset == VIA_VX855) || (pVia->Chipset == VIA_VX900)) { - for (i = 0; i < (0xFC - 0xF6 + 1); i++) { - Regs->CR[i + 0xF6] = hwp->readCrtc(hwp, i + 0xF6); - } - } - - /* Chrome 9 HD */ - if (pVia->Chipset == VIA_VX900) { - Regs->CR[0xFD] = hwp->readCrtc(hwp, 0xFD); - } - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Finished saving IGA2 registers.\n")); - - vgaHWProtect(pScrn, FALSE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaIGA2Save.\n")); } @@ -3443,7 +2931,8 @@ viaIGA2Restore(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIARegPtr Regs = &pVia->SavedReg; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIARegPtr Regs = &pVIADisplay->SavedReg; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -3598,11 +3087,11 @@ viaIGA2Restore(ScrnInfoPtr pScrn) void ViaShadowCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) { - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaShadowCRTCSetMode\n")); - vgaHWPtr hwp = VGAHWPTR(pScrn); CARD16 temp; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaShadowCRTCSetMode\n")); + temp = (mode->CrtcHTotal >> 3) - 5; hwp->writeCrtc(hwp, 0x6D, temp & 0xFF); ViaCrtcMask(hwp, 0x71, temp >> 5, 0x08); @@ -3643,27 +3132,16 @@ iga1_crtc_dpms(xf86CrtcPtr crtc, int mode) switch (mode) { case DPMSModeOn: - viaIGA1DPMSControl(pScrn, 0x00); - break; - case DPMSModeStandby: - viaIGA1DPMSControl(pScrn, 0x01); - break; - case DPMSModeSuspend: - viaIGA1DPMSControl(pScrn, 0x02); + viaIGA1SetDisplayOutput(pScrn, TRUE); break; - case DPMSModeOff: - viaIGA1DPMSControl(pScrn, 0x03); + viaIGA1SetDisplayOutput(pScrn, FALSE); break; - default: - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS Mode: %d\n", - mode); break; } - //vgaHWSaveScreen(pScrn->pScreen, mode); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting iga1_crtc_dpms.\n")); @@ -3723,10 +3201,10 @@ iga1_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, temp = mode->CrtcHDisplay * mode->CrtcVDisplay * mode->VRefresh * (pScrn->bitsPerPixel >> 3); - if (pVia->pBIOSInfo->Bandwidth < temp) { + if (pVia->pVIADisplay->Bandwidth < temp) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Required bandwidth is not available. (%u > %u)\n", - (unsigned)temp, (unsigned)pVia->pBIOSInfo->Bandwidth); + (unsigned)temp, (unsigned)pVia->pVIADisplay->Bandwidth); return FALSE; } @@ -3756,7 +3234,7 @@ iga1_crtc_prepare(xf86CrtcPtr crtc) "Entered iga1_crtc_prepare.\n")); /* Turn off IGA1. */ - viaIGA1DPMSControl(pScrn, 0x03); + viaIGA1SetDisplayOutput(pScrn, FALSE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting iga1_crtc_prepare.\n")); @@ -3785,13 +3263,13 @@ iga1_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered iga1_crtc_mode_set.\n")); /* Put IGA1 into a reset state. */ - viaIGA1HWReset(pScrn, 0x00); + viaIGA1HWReset(pScrn, TRUE); if (!vgaHWInit(pScrn, adjusted_mode)) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -3802,9 +3280,6 @@ iga1_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, viaIGAInitCommon(pScrn); viaIGA1Init(pScrn); - /* Disable IGA1 */ - ViaSeqMask(hwp, 0x59, 0x00, 0x80); - ViaPrintMode(pScrn, adjusted_mode); /* Set color depth. */ @@ -3815,21 +3290,18 @@ iga1_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, ViaSetPrimaryFIFO(pScrn, adjusted_mode); - pBIOSInfo->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode); - pBIOSInfo->ClockExternal = FALSE; - ViaSetPrimaryDotclock(pScrn, pBIOSInfo->Clock); + pVIADisplay->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode); + pVIADisplay->ClockExternal = FALSE; + ViaSetPrimaryDotclock(pScrn, pVIADisplay->Clock); ViaSetUseExternalClock(hwp); ViaCrtcMask(hwp, 0x6B, 0x00, 0x01); - /* Enable IGA1 */ - ViaSeqMask(hwp, 0x59, 0x80, 0x80); - viaIGA1SetFBStartingAddress(crtc, x, y); VIAVidAdjustFrame(pScrn, x, y); exit: /* Put IGA1 back into a normal operating state. */ - viaIGA1HWReset(pScrn, 0x01); + viaIGA1HWReset(pScrn, FALSE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting iga1_crtc_mode_set.\n")); @@ -3839,16 +3311,12 @@ static void iga1_crtc_commit(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; - VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entering iga1_crtc_commit.\n")); - if (crtc->scrn->pScreen != NULL && pVia->drmmode.hwcursor) - xf86_reload_cursors(crtc->scrn->pScreen); - /* Turn on IGA1. */ - viaIGA1DPMSControl(pScrn, 0x00); + viaIGA1SetDisplayOutput(pScrn, TRUE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting iga1_crtc_commit.\n")); @@ -3872,7 +3340,7 @@ iga1_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, } /* Set palette LUT to 8-bit mode. */ - viaIGA1SetPaletteLUTResolution(pScrn, 0x01); + viaIGA1SetPaletteLUTResolution(pScrn, TRUE); switch (pScrn->bitsPerPixel) { case 8: @@ -3938,28 +3406,38 @@ iga1_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) and in all other bpps the fg and bg are in 8-8-8 RGB format. */ static void -iga1_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg) +iga_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg) { ScrnInfoPtr pScrn = crtc->scrn; + drmmode_crtc_private_ptr iga = crtc->driver_private; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); if (xf86_config->cursor_fg) return; - /* Don't recolour the image if we don't have to. */ - if (fg == xf86_config->cursor_fg && bg == xf86_config->cursor_bg) + /* + * Don't recolour the image if we don't have to. + */ + if ((fg == xf86_config->cursor_fg) && + (bg == xf86_config->cursor_bg)) { return; + } - viaIGA1DisplayHI(pScrn, FALSE); + if (!iga->index) { + viaIGA1DisplayHI(pScrn, FALSE); + } else { + viaIGA2DisplayHI(pScrn, FALSE); + } xf86_config->cursor_fg = fg; xf86_config->cursor_bg = bg; } static void -iga1_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) +iga_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; + drmmode_crtc_private_ptr iga = crtc->driver_private; unsigned xoff, yoff; if (x < 0) { @@ -3976,30 +3454,44 @@ iga1_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) yoff = 0; } - viaIGA1SetHIDisplayLocation(pScrn, x, xoff, y, yoff); + if (!iga->index) { + viaIGA1SetHIDisplayLocation(pScrn, x, xoff, y, yoff); + } else { + viaIGA2SetHIDisplayLocation(pScrn, x, xoff, y, yoff); + } } static void -iga1_crtc_show_cursor(xf86CrtcPtr crtc) +iga_crtc_show_cursor(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; + drmmode_crtc_private_ptr iga = crtc->driver_private; - viaIGA1DisplayHI(pScrn, TRUE); + if (!iga->index) { + viaIGA1DisplayHI(pScrn, TRUE); + } else { + viaIGA2DisplayHI(pScrn, TRUE); + } } static void -iga1_crtc_hide_cursor(xf86CrtcPtr crtc) +iga_crtc_hide_cursor(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; + drmmode_crtc_private_ptr iga = crtc->driver_private; - viaIGA1DisplayHI(pScrn, FALSE); + if (!iga->index) { + viaIGA1DisplayHI(pScrn, FALSE); + } else { + viaIGA2DisplayHI(pScrn, FALSE); + } } static void -iga1_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image) +iga_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image) { - drmmode_crtc_private_ptr iga = crtc->driver_private; ScrnInfoPtr pScrn = crtc->scrn; + drmmode_crtc_private_ptr iga = crtc->driver_private; void *dst; dst = drm_bo_map(pScrn, iga->cursor_bo); @@ -4007,8 +3499,13 @@ iga1_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image) memcpy(dst, image, iga->cursor_bo->size); drm_bo_unmap(pScrn, iga->cursor_bo); - viaIGA1InitHI(pScrn); - viaIGA1SetHIStartingAddress(crtc); + if (!iga->index) { + viaIGA1InitHI(pScrn); + viaIGA1SetHIStartingAddress(crtc); + } else { + viaIGA2InitHI(pScrn); + viaIGA2SetHIStartingAddress(crtc); + } } static void @@ -4032,11 +3529,11 @@ const xf86CrtcFuncsRec iga1_crtc_funcs = { .shadow_create = iga1_crtc_shadow_create, .shadow_allocate = iga1_crtc_shadow_allocate, .shadow_destroy = iga1_crtc_shadow_destroy, - .set_cursor_colors = iga1_crtc_set_cursor_colors, - .set_cursor_position = iga1_crtc_set_cursor_position, - .show_cursor = iga1_crtc_show_cursor, - .hide_cursor = iga1_crtc_hide_cursor, - .load_cursor_argb = iga1_crtc_load_cursor_argb, + .set_cursor_colors = iga_crtc_set_cursor_colors, + .set_cursor_position = iga_crtc_set_cursor_position, + .show_cursor = iga_crtc_show_cursor, + .hide_cursor = iga_crtc_hide_cursor, + .load_cursor_argb = iga_crtc_load_cursor_argb, #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2 .set_origin = iga1_crtc_set_origin, #endif @@ -4053,15 +3550,13 @@ iga2_crtc_dpms(xf86CrtcPtr crtc, int mode) switch (mode) { case DPMSModeOn: - viaIGA2DisplayOutput(pScrn, TRUE); + viaIGA2SetDisplayOutput(pScrn, TRUE); break; - case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: - viaIGA2DisplayOutput(pScrn, FALSE); + viaIGA2SetDisplayOutput(pScrn, FALSE); break; - default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS mode: %d\n", mode); @@ -4139,10 +3634,10 @@ iga2_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, temp = mode->CrtcHDisplay * mode->CrtcVDisplay * mode->VRefresh * (pScrn->bitsPerPixel >> 3); - if (pVia->pBIOSInfo->Bandwidth < temp) { + if (pVia->pVIADisplay->Bandwidth < temp) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Required bandwidth is not available. (%u > %u)\n", - (unsigned)temp, (unsigned)pVia->pBIOSInfo->Bandwidth); + (unsigned)temp, (unsigned)pVia->pVIADisplay->Bandwidth); return FALSE; } @@ -4172,7 +3667,7 @@ iga2_crtc_prepare(xf86CrtcPtr crtc) "Entered iga2_crtc_prepare.\n")); /* Turn off IGA2. */ - viaIGA2DisplayOutput(pScrn, FALSE); + viaIGA2SetDisplayOutput(pScrn, FALSE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting iga2_crtc_prepare.\n")); @@ -4200,7 +3695,7 @@ iga2_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered iga2_crtc_mode_set.\n")); @@ -4223,9 +3718,9 @@ iga2_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, viaIGA2SetDisplayRegister(pScrn, adjusted_mode); ViaSetSecondaryFIFO(pScrn, adjusted_mode); - pBIOSInfo->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode); - pBIOSInfo->ClockExternal = FALSE; - ViaSetSecondaryDotclock(pScrn, pBIOSInfo->Clock); + pVIADisplay->Clock = ViaModeDotClockTranslate(pScrn, adjusted_mode); + pVIADisplay->ClockExternal = FALSE; + ViaSetSecondaryDotclock(pScrn, pVIADisplay->Clock); ViaSetUseExternalClock(hwp); viaIGA2SetFBStartingAddress(crtc, x, y); @@ -4245,16 +3740,12 @@ static void iga2_crtc_commit(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; - VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entering iga2_crtc_commit.\n")); - if (crtc->scrn->pScreen != NULL && pVia->drmmode.hwcursor) - xf86_reload_cursors(crtc->scrn->pScreen); - /* Turn on IGA2. */ - viaIGA2DisplayOutput(pScrn, TRUE); + viaIGA2SetDisplayOutput(pScrn, TRUE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting iga2_crtc_commit.\n")); @@ -4337,98 +3828,6 @@ iga2_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) { } -/* - Set the cursor foreground and background colors. In 8bpp, fg and - bg are indices into the current colormap unless the - HARDWARE_CURSOR_TRUECOLOR_AT_8BPP flag is set. In that case - and in all other bpps the fg and bg are in 8-8-8 RGB format. -*/ -static void -iga2_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg) -{ - drmmode_crtc_private_ptr iga = crtc->driver_private; - ScrnInfoPtr pScrn = crtc->scrn; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int height = 64, width = 64, i; - CARD32 pixel, *dst; - - if (xf86_config->cursor_fg) - return; - - fg |= 0xff000000; - bg |= 0xff000000; - - /* Don't recolour the image if we don't have to. */ - if (fg == xf86_config->cursor_fg && bg == xf86_config->cursor_bg) - return; - - viaIGA2DisplayHI(pScrn, FALSE); - - dst = drm_bo_map(pScrn, iga->cursor_bo); - for (i = 0; i < width * height; i++, dst++) - if ((pixel = *dst)) - *dst = (pixel == xf86_config->cursor_fg) ? fg : bg; - drm_bo_unmap(pScrn, iga->cursor_bo); - - xf86_config->cursor_fg = fg; - xf86_config->cursor_bg = bg; -} - -static void -iga2_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y) -{ - ScrnInfoPtr pScrn = crtc->scrn; - unsigned xoff, yoff; - - if (x < 0) { - xoff = ((-x) & 0xFE); - x = 0; - } else { - xoff = 0; - } - - if (y < 0) { - yoff = ((-y) & 0xFE); - y = 0; - } else { - yoff = 0; - } - - viaIGA2SetHIDisplayLocation(pScrn, x, xoff, y, yoff); -} - -static void -iga2_crtc_show_cursor(xf86CrtcPtr crtc) -{ - ScrnInfoPtr pScrn = crtc->scrn; - - viaIGA2DisplayHI(pScrn, TRUE); -} - -static void -iga2_crtc_hide_cursor(xf86CrtcPtr crtc) -{ - ScrnInfoPtr pScrn = crtc->scrn; - - viaIGA2DisplayHI(pScrn, FALSE); -} - -static void -iga2_crtc_load_cursor_argb(xf86CrtcPtr crtc, CARD32 *image) -{ - drmmode_crtc_private_ptr iga = crtc->driver_private; - ScrnInfoPtr pScrn = crtc->scrn; - void *dst; - - dst = drm_bo_map(pScrn, iga->cursor_bo); - memset(dst, 0x00, iga->cursor_bo->size); - memcpy(dst, image, iga->cursor_bo->size); - drm_bo_unmap(pScrn, iga->cursor_bo); - - viaIGA2InitHI(pScrn); - viaIGA2SetHIStartingAddress(crtc); -} - const xf86CrtcFuncsRec iga2_crtc_funcs = { .dpms = iga2_crtc_dpms, .save = iga2_crtc_save, @@ -4443,11 +3842,11 @@ const xf86CrtcFuncsRec iga2_crtc_funcs = { .shadow_create = iga2_crtc_shadow_create, .shadow_allocate = iga2_crtc_shadow_allocate, .shadow_destroy = iga2_crtc_shadow_destroy, - .set_cursor_colors = iga2_crtc_set_cursor_colors, - .set_cursor_position = iga2_crtc_set_cursor_position, - .show_cursor = iga2_crtc_show_cursor, - .hide_cursor = iga2_crtc_hide_cursor, - .load_cursor_argb = iga2_crtc_load_cursor_argb, + .set_cursor_colors = iga_crtc_set_cursor_colors, + .set_cursor_position = iga_crtc_set_cursor_position, + .show_cursor = iga_crtc_show_cursor, + .hide_cursor = iga_crtc_hide_cursor, + .load_cursor_argb = iga_crtc_load_cursor_argb, #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2 .set_origin = iga2_crtc_set_origin, #endif diff --git a/src/via_dri.c b/src/via_dri.c index b42ae11..ec46fa0 100644 --- a/src/via_dri.c +++ b/src/via_dri.c @@ -76,8 +76,8 @@ typedef struct static char VIAKernelDriverName[] = "via"; static char VIAClientDriverName[] = "unichrome"; -static const ViaDRMVersion drmExpected = { 1, 3, 0 }; -static const ViaDRMVersion drmCompat = { 2, 0, 0 }; + +static char SWRastClientDriverName[] = "swrast"; static Bool VIAInitVisualConfigs(ScreenPtr pScreen); static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia); @@ -548,7 +548,7 @@ VIADRI1ScreenInit(ScreenPtr pScreen) case VIA_VX800: case VIA_VX855: case VIA_VX900: - pDRIInfo->clientDriverName = "swrast"; + pDRIInfo->clientDriverName = SWRastClientDriverName; break; default: pDRIInfo->clientDriverName = VIAClientDriverName; @@ -618,6 +618,13 @@ VIADRI1ScreenInit(ScreenPtr pScreen) return FALSE; } + if ((pVia->driSize > (pVia->maxDriSize * 1024)) && + (pVia->maxDriSize > 0)) { + pVia->driSize = pVia->maxDriSize * 1024; + } else { + pVia->driSize = (pVia->FBFreeEnd - pVia->FBFreeStart) >> 2; + } + if (!(VIAInitVisualConfigs(pScreen))) { VIADRICloseScreen(pScreen); return FALSE; diff --git a/src/via_driver.c b/src/via_driver.c index 439313c..3289e74 100644 --- a/src/via_driver.c +++ b/src/via_driver.c @@ -65,8 +65,9 @@ typedef struct int patchlevel; } ViaDRMVersion; -static const ViaDRMVersion drmExpected = { 1, 3, 0 }; -static const ViaDRMVersion drmCompat = { 3, 1, 0 }; +static const ViaDRMVersion drmVIADRMExpected = { 1, 3, 0 }; +static const ViaDRMVersion drmVIADRMCompat = { 3, 0, 0 }; +static const ViaDRMVersion drmOpenChromeDRMVersion = { 3, 0, 0 }; /* Prototypes. */ static void VIAIdentify(int flags); @@ -78,10 +79,11 @@ static Bool via_pci_probe(DriverPtr drv, int entity_num, static Bool VIAProbe(DriverPtr drv, int flags); #endif -static Bool VIASetupDefaultOptions(ScrnInfoPtr pScrn); -static Bool viaPreInit(ScrnInfoPtr pScrn, int flags); +static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags); static Bool VIAScreenInit(SCREEN_INIT_ARGS_DECL); -static const OptionInfoRec *VIAAvailableOptions(int chipid, int busid); + + +int gVIAEntityIndex = -1; #ifdef HAVE_PCIACCESS @@ -128,7 +130,7 @@ _X_EXPORT DriverRec VIA = { /* Supported chipsets */ static SymTabRec VIAChipsets[] = { {VIA_CLE266, "CLE266"}, - {VIA_KM400, "KM400 / KM400A / KN400 / P4M800"}, + {VIA_KM400, "KM400(A) / KN400(A) / P4M800"}, {VIA_K8M800, "K8M800 / K8N800"}, {VIA_PM800, "PM800 / PN800 / PM880 / CN333 / CN400"}, {VIA_P4M800PRO, "P4M800 Pro / VN800 / CN700"}, @@ -159,66 +161,8 @@ static PciChipsets VIAPciChipsets[] = { {-1, -1, VIA_RES_UNDEF} }; -typedef enum -{ -#ifdef HAVE_DEBUG - OPTION_PRINTVGAREGS, - OPTION_PRINTTVREGS, - OPTION_I2CSCAN, -#endif - OPTION_NOACCEL, - OPTION_EXA_NOCOMPOSITE, - OPTION_EXA_SCRATCH_SIZE, - OPTION_SWCURSOR, - OPTION_SHADOW_FB, - OPTION_ROTATION_TYPE, - OPTION_ROTATE, - OPTION_VIDEORAM, - OPTION_I2CDEVICES, - OPTION_CENTER, - OPTION_TVDOTCRAWL, - OPTION_TVTYPE, - OPTION_TVOUTPUT, - OPTION_DISABLEVQ, - OPTION_DISABLEIRQ, - OPTION_TVDEFLICKER, - OPTION_AGP_DMA, - OPTION_2D_DMA, - OPTION_XV_DMA, - OPTION_MAX_DRIMEM, - OPTION_AGPMEM, - OPTION_DISABLE_XV_BW_CHECK -} VIAOpts; - -static OptionInfoRec VIAOptions[] = { -#ifdef HAVE_DEBUG /* Don't document these three. */ - {OPTION_PRINTVGAREGS, "PrintVGARegs", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_PRINTTVREGS, "PrintTVRegs", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_I2CSCAN, "I2CScan", OPTV_BOOLEAN, {0}, FALSE}, -#endif - {OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_EXA_NOCOMPOSITE, "ExaNoComposite", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_EXA_SCRATCH_SIZE, "ExaScratchSize", OPTV_INTEGER, {0}, FALSE}, - {OPTION_SWCURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_ROTATION_TYPE, "RotationType", OPTV_ANYSTR, {0}, FALSE}, - {OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, - {OPTION_VIDEORAM, "VideoRAM", OPTV_INTEGER, {0}, FALSE}, - {OPTION_TVDOTCRAWL, "TVDotCrawl", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_TVDEFLICKER, "TVDeflicker", OPTV_INTEGER, {0}, FALSE}, - {OPTION_TVTYPE, "TVType", OPTV_ANYSTR, {0}, FALSE}, - {OPTION_TVOUTPUT, "TVOutput", OPTV_ANYSTR, {0}, FALSE}, - {OPTION_DISABLEVQ, "DisableVQ", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_DISABLEIRQ, "DisableIRQ", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_AGP_DMA, "EnableAGPDMA", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_2D_DMA, "NoAGPFor2D", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_XV_DMA, "NoXVDMA", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_DISABLE_XV_BW_CHECK, "DisableXvBWCheck", OPTV_BOOLEAN, {0}, FALSE}, - {OPTION_MAX_DRIMEM, "MaxDRIMem", OPTV_INTEGER, {0}, FALSE}, - {OPTION_AGPMEM, "AGPMem", OPTV_INTEGER, {0}, FALSE}, - {OPTION_I2CDEVICES, "I2CDevices", OPTV_ANYSTR, {0}, FALSE}, - {-1, NULL, OPTV_NONE, {0}, FALSE} -}; +static char strEXAOptionName[] = "MigrationHeuristic"; +static char strEXAValue[] = "greedy"; #ifdef XFree86LOADER static MODULESETUPPROTO(VIASetup); @@ -269,12 +213,6 @@ VIASetup(pointer module, pointer opts, int *errmaj, int *errmin) #endif /* XFree86LOADER */ -static const OptionInfoRec * -VIAAvailableOptions(int chipid, int busid) -{ - return VIAOptions; -} - static Bool VIASwitchMode(SWITCH_MODE_ARGS_DECL) { @@ -306,29 +244,36 @@ VIAEnterVT_internal(ScrnInfoPtr pScrn, int flags) VIAPtr pVia = VIAPTR(pScrn); int i; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAEnterVT\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; - if (crtc->funcs->save) + if (crtc->funcs->save) { crtc->funcs->save(crtc); + } } for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; - if (output->funcs->save) + if (output->funcs->save) { output->funcs->save(output); + } } - if (!xf86SetDesiredModes(pScrn)) + if (!xf86SetDesiredModes(pScrn)) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); return FALSE; + } if (!flags) { /* Restore video status. */ - if (!pVia->IsSecondary) + if ((!pVia->IsSecondary) && (!pVia->KMS)) { viaRestoreVideo(pScrn); + } #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { @@ -339,6 +284,9 @@ VIAEnterVT_internal(ScrnInfoPtr pScrn, int flags) } #endif } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); return TRUE; } @@ -350,69 +298,87 @@ VIAEnterVT(VT_FUNC_ARGS_DECL) } static void -VIALeaveVT(VT_FUNC_ARGS_DECL) +VIALeaveVT_internal(ScrnInfoPtr pScrn, int flags) { - SCRN_INFO_PTR(arg); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); int i; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIALeaveVT\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + if (!flags) { #ifdef HAVE_DRI - if (pVia->directRenderingType == DRI_1) { - volatile drm_via_sarea_t *saPriv = (drm_via_sarea_t *) DRIGetSAREAPrivate(pScrn->pScreen); + if (pVia->directRenderingType == DRI_1) { + volatile drm_via_sarea_t *saPriv = (drm_via_sarea_t *) DRIGetSAREAPrivate(pScrn->pScreen); - DRILock(xf86ScrnToScreen(pScrn), 0); - saPriv->ctxOwner = ~0; + DRILock(xf86ScrnToScreen(pScrn), 0); + saPriv->ctxOwner = ~0; - viaAccelSync(pScrn); + viaAccelSync(pScrn); - VIADRIRingBufferCleanup(pScrn); - viaDRIOffscreenSave(pScrn); + VIADRIRingBufferCleanup(pScrn); + viaDRIOffscreenSave(pScrn); - if (pVia->VQEnable) - viaDisableVQ(pScrn); - } + if ((pVia->VQEnable) && (!pVia->KMS)) { + viaDisableVQ(pScrn); + } + } #endif - /* Save video status and turn off all video activities. */ - if (!pVia->IsSecondary) - viaSaveVideo(pScrn); + /* Save video status and turn off all video activities. */ + if ((!pVia->IsSecondary) && (!pVia->KMS)){ + viaSaveVideo(pScrn); + } + } for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; - if (output->funcs->restore) + if (output->funcs->restore) { output->funcs->restore(output); + } } for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; - if (crtc->funcs->restore) + if (crtc->funcs->restore) { crtc->funcs->restore(crtc); + } } + pScrn->vtSema = FALSE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); +} + +static void +VIALeaveVT(VT_FUNC_ARGS_DECL) +{ + SCRN_INFO_PTR(arg); + VIALeaveVT_internal(pScrn, 0); } static void VIAFreeRec(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFreeRec\n")); if (!pScrn->driverPrivate) return; - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + pVIADisplay = pVia->pVIADisplay; - if (pBIOSInfo) { - if (pBIOSInfo->TVI2CDev) - xf86DestroyI2CDevRec(pBIOSInfo->TVI2CDev, TRUE); + if (pVIADisplay) { + if (pVIADisplay->TVI2CDev) + xf86DestroyI2CDevRec(pVIADisplay->TVI2CDev, TRUE); - pVia->pBIOSInfo = NULL; - free(pBIOSInfo); + pVia->pVIADisplay = NULL; + free(pVIADisplay); } if (pVia->VideoRegs) @@ -430,6 +396,7 @@ static void VIAFreeScreen(FREE_SCREEN_ARGS_DECL) { SCRN_INFO_PTR(arg); + VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFreeScreen\n")); @@ -437,6 +404,10 @@ VIAFreeScreen(FREE_SCREEN_ARGS_DECL) vgaHWFreeHWRec(pScrn); } + if (!pVia->KMS) { + viaUMSDestroy(pScrn); + } + VIAFreeRec(pScrn); } @@ -453,7 +424,6 @@ via_pci_probe(DriverPtr driver, int entity_num, struct pci_device *device, intptr_t match_data) { ScrnInfoPtr scrn = NULL; - EntityInfoPtr entity; scrn = xf86ConfigPciEntity(scrn, 0, entity_num, VIAPciChipsets, NULL, NULL, NULL, NULL, NULL); @@ -464,9 +434,7 @@ via_pci_probe(DriverPtr driver, int entity_num, scrn->name = "CHROME"; scrn->Probe = NULL; - entity = xf86GetEntityInfo(entity_num); - - scrn->PreInit = viaPreInit; + scrn->PreInit = VIAPreInit; scrn->ScreenInit = VIAScreenInit; scrn->SwitchMode = VIASwitchMode; scrn->AdjustFrame = VIAAdjustFrame; @@ -538,7 +506,7 @@ VIAProbe(DriverPtr drv, int flags) pScrn->driverName = DRIVER_NAME; pScrn->name = "CHROME"; pScrn->Probe = VIAProbe; - pScrn->PreInit = viaPreInit; + pScrn->PreInit = VIAPreInit; pScrn->ScreenInit = VIAScreenInit; pScrn->SwitchMode = VIASwitchMode; pScrn->AdjustFrame = VIAAdjustFrame; @@ -624,92 +592,11 @@ LookupChipID(PciChipsets *pset, int ChipID) } static Bool -VIASetupDefaultOptions(ScrnInfoPtr pScrn) -{ - VIAPtr pVia = VIAPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASetupDefaultOptions - Setting up default chipset options.\n")); - - pVia->shadowFB = FALSE; - pVia->NoAccel = FALSE; - pVia->noComposite = FALSE; - pVia->useEXA = TRUE; - pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024; - pVia->drmmode.hwcursor = TRUE; - pVia->VQEnable = TRUE; - pVia->DRIIrqEnable = TRUE; - pVia->agpEnable = TRUE; - pVia->dma2d = TRUE; - pVia->dmaXV = TRUE; -#ifdef HAVE_DEBUG - pVia->disableXvBWCheck = FALSE; -#endif - pVia->maxDriSize = 0; - pVia->agpMem = AGP_SIZE / 1024; - pVia->I2CDevices = VIA_I2C_BUS1 | VIA_I2C_BUS2 | VIA_I2C_BUS3; - pVia->VideoEngine = VIDEO_ENGINE_CLE; -#ifdef HAVE_DEBUG - pVia->PrintVGARegs = FALSE; -#endif - - /* Disable vertical interpolation because the size of */ - /* line buffer (limited to 800) is too small to do interpolation. */ - pVia->swov.maxWInterp = 800; - pVia->swov.maxHInterp = 600; - - switch (pVia->Chipset) { - case VIA_CLE266: - break; - case VIA_KM400: - /* IRQ is not broken on KM400A, but testing (pVia->ChipRev < 0x80) - * is not enough to make sure we have an older, broken KM400. */ - pVia->DRIIrqEnable = FALSE; - break; - case VIA_K8M800: - pVia->DRIIrqEnable = FALSE; - break; - case VIA_PM800: - pVia->VideoEngine = VIDEO_ENGINE_CME; - break; - case VIA_P4M800PRO: - break; - case VIA_CX700: - pVia->VideoEngine = VIDEO_ENGINE_CME; - pVia->swov.maxWInterp = 1920; - pVia->swov.maxHInterp = 1080; - break; - case VIA_P4M890: - pVia->VideoEngine = VIDEO_ENGINE_CME; - pVia->dmaXV = FALSE; - break; - case VIA_K8M890: - pVia->VideoEngine = VIDEO_ENGINE_CME; - pVia->agpEnable = FALSE; - pVia->dmaXV = FALSE; - break; - case VIA_P4M900: - pVia->VideoEngine = VIDEO_ENGINE_CME; - pVia->agpEnable = FALSE; - /* FIXME: this needs to be tested */ - pVia->dmaXV = FALSE; - break; - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - pVia->VideoEngine = VIDEO_ENGINE_CME; - pVia->agpEnable = FALSE; - pVia->dmaXV = FALSE; - break; - } - - return TRUE; -} - -Bool VIAGetRec(ScrnInfoPtr pScrn) { Bool ret = FALSE; VIAPtr pVia; + VIADisplayPtr pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetRec\n")); @@ -719,15 +606,15 @@ VIAGetRec(ScrnInfoPtr pScrn) /* allocate VIARec */ pVia = (VIARec *) xnfcalloc(sizeof(VIARec), 1); if (pVia) { - pVia->pBIOSInfo = xnfcalloc(sizeof(VIABIOSInfoRec), 1); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + pVia->pVIADisplay = xnfcalloc(sizeof(VIADisplayRec), 1); + pVIADisplay = pVia->pVIADisplay; - if (pBIOSInfo) { - pBIOSInfo->TVI2CDev = NULL; + if (pVIADisplay) { + pVIADisplay->TVI2CDev = NULL; pVia->VideoRegs = (video_via_regs *) xnfcalloc(sizeof(video_via_regs), 1); if (!pVia->VideoRegs) { - free(pBIOSInfo); + free(pVIADisplay); free(pVia); } else { pScrn->driverPrivate = pVia; @@ -738,86 +625,123 @@ VIAGetRec(ScrnInfoPtr pScrn) return ret; } /* VIAGetRec */ -static int -map_legacy_formats(int bpp, int depth) +static unsigned int +viaConvertDepthToBpp(int bpp, int depth) { - int fmt = DRM_FORMAT_XRGB8888; - - switch (bpp) { - case 8: - fmt = DRM_FORMAT_C8; - break; - case 16: - if (depth == 15) - fmt = DRM_FORMAT_XRGB1555; - else - fmt = DRM_FORMAT_RGB565; - break; - case 24: - fmt = DRM_FORMAT_RGB888; - break; - case 32: - if (depth == 24) - fmt = DRM_FORMAT_XRGB8888; - else if (depth == 30) - fmt = DRM_FORMAT_XRGB2101010; - default: - break; - } - return fmt; + unsigned int format = DRM_FORMAT_XRGB8888; + unsigned int bppSize; + + switch (bpp) { + case 8: + format = DRM_FORMAT_C8; + break; + case 16: + if (depth == 15) + format = DRM_FORMAT_XRGB1555; + else + format = DRM_FORMAT_RGB565; + break; + case 24: + format = DRM_FORMAT_RGB888; + break; + case 32: + if (depth == 24) + format = DRM_FORMAT_XRGB8888; + else if (depth == 30) + format = DRM_FORMAT_XRGB2101010; + break; + default: + break; + } + + switch (format) { + case DRM_FORMAT_C8: + bppSize = 1; + break; + case DRM_FORMAT_XRGB1555: + case DRM_FORMAT_RGB565: + bppSize = 2; + break; + case DRM_FORMAT_RGB888: + bppSize = 3; + break; + case DRM_FORMAT_XRGB2101010: + case DRM_FORMAT_XRGB8888: + bppSize = 4; + break; + default: + bppSize = 0; + break; + } + + return bppSize; } static Bool via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); - xf86CrtcPtr crtc = NULL; - ScreenPtr screen = scrn->pScreen; - VIAPtr pVia = VIAPTR(scrn); drmmode_crtc_private_ptr drmmode_crtc = xf86_config->crtc[0]->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; struct buffer_object *old_front = NULL; - void *new_pixels = NULL; - PixmapPtr ppix; - int old_width, old_height, old_displayWidth, old_fd; + Bool ret; + ScreenPtr screen; uint32_t old_fb_id; - int format, i; - Bool ret = FALSE; + int i; + int old_width, old_height, old_displayWidth; + int cpp = (scrn->bitsPerPixel + 7) / 8; + PixmapPtr ppix; + void *new_pixels; + VIAPtr pVia = VIAPTR(scrn); + xf86CrtcPtr crtc = NULL; + unsigned int bppSize, alignedPitch; DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Entered via_xf86crtc_resize.\n")); - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Now attempting to resize the screen . . .\n"); + "Entered %s.\n", __func__)); + + screen = xf86ScrnToScreen(scrn); + ppix = screen->GetScreenPixmap(screen); if ((scrn->virtualX == width) && (scrn->virtualY == height)) { - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "It was determined that there is no need to resize the " - "screen.\n"); DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Exiting via_xf86crtc_resize.\n")); + "Exiting %s.\n", __func__)); return TRUE; } - /* Preserve the old screen information just in case they need to + /* Preserve the old screen information just in case it needs to * be restored. */ old_width = scrn->virtualX; old_height = scrn->virtualY; old_displayWidth = scrn->displayWidth; - old_fd = drmmode->fd; old_fb_id = drmmode->fb_id; old_front = drmmode->front_bo; - format = map_legacy_formats(scrn->bitsPerPixel, scrn->depth); - drmmode->front_bo = drm_bo_alloc_surface(scrn, width, height, format, - 16, TTM_PL_FLAG_VRAM); + bppSize = viaConvertDepthToBpp(scrn->bitsPerPixel, + scrn->depth); + alignedPitch = width * bppSize; + alignedPitch = ALIGN_TO(alignedPitch, 16); + drmmode->front_bo = drm_bo_alloc(scrn, + alignedPitch * height, + 16, TTM_PL_FLAG_VRAM); if (!drmmode->front_bo) { goto fail; } + scrn->virtualX = width; + scrn->virtualY = height; + scrn->displayWidth = width; - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Allocated a new frame buffer: %dx%d\n", - width, height); +#ifdef HAVE_DRI + if (pVia->KMS) { + ret = drmModeAddFB(drmmode->fd, width, height, scrn->depth, + scrn->bitsPerPixel, width * cpp, + drmmode->front_bo->handle, + &drmmode->fb_id); + if (ret) { + goto fail; + } + } +#endif new_pixels = drm_bo_map(scrn, drmmode->front_bo); if (!new_pixels) { @@ -825,7 +749,8 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) } if (pVia->shadowFB) { - new_pixels = malloc(height * drmmode->front_bo->pitch); + new_pixels = malloc(scrn->displayWidth * scrn->virtualY * + ((scrn->bitsPerPixel + 7) >> 3)); if (!new_pixels) { goto fail; } @@ -834,17 +759,13 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) pVia->ShadowPtr = new_pixels; } - scrn->virtualX = width; - scrn->virtualY = height; - scrn->displayWidth = (drmmode->front_bo->pitch) - / ((scrn->bitsPerPixel + 7) >> 3); + screen->ModifyPixmapHeader(ppix, width, height, -1, -1, + width * cpp, new_pixels); + + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "Allocated a new frame buffer: %dx%d\n", + width, height); - ppix = screen->GetScreenPixmap(screen); - if (!screen->ModifyPixmapHeader(ppix, width, height, -1, -1, - drmmode->front_bo->pitch, - new_pixels)) { - goto fail; - } #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,9,99,1,0) scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr; @@ -871,11 +792,11 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) #ifdef HAVE_DRI if (pVia->KMS && old_fb_id) { - drmModeRmFB(old_fd, old_fb_id); + drmModeRmFB(drmmode->fd, old_fb_id); } #endif - if (old_front) { + if (old_fb_id) { drm_bo_unmap(scrn, old_front); drm_bo_free(scrn, old_front); } @@ -883,7 +804,7 @@ via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) xf86DrvMsg(scrn->scrnIndex, X_INFO, "Screen resize successful.\n"); DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Exiting via_xf86crtc_resize.\n")); + "Exiting %s.\n", __func__)); return TRUE; fail: @@ -895,21 +816,13 @@ fail: scrn->virtualX = old_width; scrn->virtualY = old_height; scrn->displayWidth = old_displayWidth; - -#ifdef HAVE_DRI - if (pVia->KMS && (old_fb_id != drmmode->fb_id)) { - drmModeRmFB(old_fd, old_fb_id); - } -#endif - - drmmode->fd = old_fd; drmmode->fb_id = old_fb_id; drmmode->front_bo = old_front; - xf86DrvMsg(scrn->scrnIndex, X_INFO, + xf86DrvMsg(scrn->scrnIndex, X_ERROR, "An error occurred during screen resize.\n"); DEBUG(xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Exiting via_xf86crtc_resize.\n")); + "Exiting %s.\n", __func__)); return FALSE; } @@ -919,29 +832,88 @@ xf86CrtcConfigFuncsRec via_xf86crtc_config_funcs = { }; static Bool -viaPreInit(ScrnInfoPtr pScrn, int flags) +VIAPreInit(ScrnInfoPtr pScrn, int flags) { - XF86OptionPtr option = xf86NewOption("MigrationHeuristic", "greedy"); EntityInfoPtr pEnt; VIAPtr pVia; - VIABIOSInfoPtr pBIOSInfo; MessageType from = X_DEFAULT; - const char *s = NULL; #ifdef HAVE_DRI char *busId = NULL; drmVersionPtr drmVer; #endif + rgb defaultWeight = {0, 0, 0}; + rgb defaultMask = {0, 0, 0}; + Gamma defaultGamma = {0.0, 0.0, 0.0}; + XF86OptionPtr option; + Bool status = FALSE; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "viaPreInit\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); - if (pScrn->numEntities > 1) - return FALSE; + pScrn->monitor = pScrn->confScreen->monitor; - if (flags & PROBE_DETECT) - return FALSE; + /* + * We support depths of 8, 16 and 24. + * We support bpp of 8, 16, and 32. + */ + if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support32bppFb)) { + goto exit; + } else { + switch (pScrn->depth) { + case 8: + case 16: + case 24: + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by this driver!\n", + pScrn->depth); + goto exit; + break; + } + } + + pScrn->rgbBits = 8; + + /* Print out the depth / bpp that was set. */ + xf86PrintDepthBpp(pScrn); + + if (pScrn->depth > 8) { + if (!xf86SetWeight(pScrn, defaultWeight, defaultMask)) { + goto exit; + } else { + /* TODO check weight returned is supported. */ + } + } + + if (!xf86SetDefaultVisual(pScrn, -1)) { + goto exit; + } else { + /* We don't currently support DirectColor at > 8bpp. */ + if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Given default visual (%s) is not supported " + "at depth %d.\n", + xf86GetVisualName(pScrn->defaultVisual), + pScrn->depth); + goto exit; + } + } + + /* If the driver supports gamma correction, set the gamma. */ + if (!xf86SetGamma(pScrn, defaultGamma)) { + goto exit; + } + + /* This driver uses a programmable clock. */ + pScrn->progClock = TRUE; + + if (pScrn->numEntities > 1) { + goto exit; + } if (!VIAGetRec(pScrn)) { - return FALSE; + goto exit; } pVia = VIAPTR(pScrn); @@ -950,8 +922,7 @@ viaPreInit(ScrnInfoPtr pScrn, int flags) #ifndef HAVE_PCIACCESS if (pEnt->resources) { free(pEnt); - VIAFreeRec(pScrn); - return FALSE; + goto free_rec; } #endif @@ -968,9 +939,9 @@ viaPreInit(ScrnInfoPtr pScrn, int flags) pVIAEnt = pPriv->ptr; if (pVIAEnt->BypassSecondary) { free(pEnt); - VIAFreeRec(pScrn); - return FALSE; + goto free_rec; } + pVIAEnt->pSecondaryScrn = pScrn; pVIAEnt->HasSecondary = TRUE; pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn); @@ -1039,468 +1010,143 @@ viaPreInit(ScrnInfoPtr pScrn, int flags) if (pEnt) free(pEnt); + xf86DrvMsg(pScrn->scrnIndex, from, "Chipset revision: %d\n", pVia->ChipRev); pVia->directRenderingType = DRI_NONE; pVia->KMS = FALSE; #ifdef HAVE_DRI busId = DRICreatePCIBusID(pVia->PciInfo); - pVia->drmmode.fd = drmOpen("via", busId); - if (pVia->drmmode.fd != -1) { - if (!drmCheckModesettingSupported(busId)) { - xf86DrvMsg(-1, X_INFO, "[drm] KMS supported\n"); - pVia->KMS = TRUE; - } else - xf86DrvMsg(-1, X_INFO, "[drm] KMS not enabled\n"); + /* Look for OpenChrome DRM first. */ + /* KMS supports needs to be present for OpenChrome DRM to + * function properly.*/ + pVia->drmmode.fd = drmOpen("openchrome", busId); + if (pVia->drmmode.fd != -1) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "OpenChrome DRM detected.\n"); drmVer = drmGetVersion(pVia->drmmode.fd); if (drmVer) { pVia->drmVerMajor = drmVer->version_major; pVia->drmVerMinor = drmVer->version_minor; - pVia->drmVerPL = drmVer->version_patchlevel; + pVia->drmVerPatchLevel = drmVer->version_patchlevel; drmFreeVersion(drmVer); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "[drm] via interface version: %d.%d.%d\n", - pVia->drmVerMajor, pVia->drmVerMinor, pVia->drmVerPL); - - /* DRI2 or DRI1 support */ - if ((pVia->drmVerMajor < drmExpected.major) || - (pVia->drmVerMajor > drmCompat.major) || - ((pVia->drmVerMajor == drmExpected.major) && - (pVia->drmVerMinor < drmExpected.minor))) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "[drm] Kernel drm is not compatible with this driver.\n" - "[drm] Kernel drm version is %d.%d.%d, " - "and I can work with versions %d.%d.x - %d.x.x.\n" - "[drm] Update either this 2D driver or your kernel DRM. " - "Disabling DRI.\n", pVia->drmVerMajor, pVia->drmVerMinor, - pVia->drmVerPL, drmExpected.major, drmExpected.minor, - drmCompat.major); - } else { - /* DRI2 or DRI1 support */ - if (pVia->drmVerMajor < drmCompat.major) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DRI 1 api supported\n"); - pVia->directRenderingType = DRI_1; - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DRI 2 api not supported yet\n"); + "OpenChrome DRM Version: %d.%d.%d\n", + pVia->drmVerMajor, pVia->drmVerMinor, + pVia->drmVerPatchLevel); + + if ((pVia->drmVerMajor > drmOpenChromeDRMVersion.major) || + ((pVia->drmVerMajor == drmOpenChromeDRMVersion.major) && + (pVia->drmVerMinor >= drmOpenChromeDRMVersion.minor))) { + if (!drmCheckModesettingSupported(busId)) { + pVia->KMS = TRUE; pVia->directRenderingType = DRI_2; pVia->NoAccel = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "KMS is supported by " + "OpenChrome DRM.\n"); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "KMS is not available.\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Disabling OpenChrome DRM support.\n"); } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Unsupported version of OpenChrome DRM " + "detected.\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Only OpenChrome DRM Version %d.%d or " + "later is supported.\n", + drmOpenChromeDRMVersion.major, + drmOpenChromeDRMVersion.minor); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Disabling OpenChrome DRM support.\n"); } } else { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Could not get DRM driver version\n"); - } - } else { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] Failed to open DRM device for %s: %s\n", - busId, strerror(errno)); - } - free(busId); -#endif - - /* After umsPreInit function succeeds, PCI hardware resources are - * memory mapped. If there is an error from this point on, they will - * need to be explicitly relinquished. */ - if (!umsPreInit(pScrn)) { - VIAFreeRec(pScrn); - return FALSE; - } - - /* Now handle the Display */ - if (flags & PROBE_DETECT) - return TRUE; - - pScrn->monitor = pScrn->confScreen->monitor; - - /* - * We support depths of 8, 16 and 24. - * We support bpp of 8, 16, and 32. - */ - - if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support32bppFb)) { - goto fail; - } else { - switch (pScrn->depth) { - case 8: - case 16: - case 24: - case 32: - /* OK */ - break; - default: - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Given depth (%d) is not supported by this driver\n", - pScrn->depth); - goto fail; - } - } - - xf86PrintDepthBpp(pScrn); - - if (pScrn->depth == 32) { - pScrn->depth = 24; - } - - if (pScrn->depth > 8) { - rgb zeros = { 0, 0, 0 }; - - if (!xf86SetWeight(pScrn, zeros, zeros)) { - goto fail; - } else { - /* TODO check weight returned is supported */ - } - } - - if (!xf86SetDefaultVisual(pScrn, -1)) { - goto fail; - } else { - /* We don't currently support DirectColor at > 8bpp */ - if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual" - " (%s) is not supported at depth %d.\n", - xf86GetVisualName(pScrn->defaultVisual), pScrn->depth); - goto fail; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Not able to obtain OpenChrome DRM version.\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Disabling OpenChrome DRM support.\n"); } } - /* We use a programmable clock */ - pScrn->progClock = TRUE; - - xf86CollectOptions(pScrn, option); - - /* Set the bits per RGB for 8bpp mode */ - if (pScrn->depth == 8) - pScrn->rgbBits = 6; - - if (!VIASetupDefaultOptions(pScrn)) { - goto fail; - } + free(busId); - xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, VIAOptions); - - if (xf86GetOptValInteger(VIAOptions, OPTION_VIDEORAM, &pScrn->videoRam)) - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "Setting amount of VideoRAM to %d kB\n", pScrn->videoRam); - - /* When rotating, switch shadow framebuffer on and acceleration off. */ - if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATION_TYPE))) { - if (!xf86NameCmp(s, "SWRandR")) { - pVia->shadowFB = TRUE; - pVia->NoAccel = TRUE; - pVia->RandRRotation = TRUE; - pVia->rotate = RR_Rotate_0; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen " - "RandR enabled, acceleration disabled\n"); - } else if (!xf86NameCmp(s, "HWRandR")) { - pVia->shadowFB = TRUE; - pVia->NoAccel = TRUE; - pVia->RandRRotation = TRUE; - pVia->rotate = RR_Rotate_0; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Hardware accelerated " - "rotating screen is not implemented. Using SW RandR.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid" - "value for Option \"RotationType\".\n", s); + /* Now, check for "legacy" DRI1 VIA DRM. */ + if (!pVia->KMS) { + busId = DRICreatePCIBusID(pVia->PciInfo); + pVia->drmmode.fd = drmOpen("via", busId); + if (pVia->drmmode.fd != -1) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Valid options are \"SWRandR\" and \"HWRandR\".\n"); - } - } - - /* When rotating, switch shadow framebuffer on and acceleration off. */ - if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATE))) { - if (!xf86NameCmp(s, "CW")) { - pVia->shadowFB = TRUE; - pVia->NoAccel = TRUE; - pVia->RandRRotation = TRUE; - pVia->rotate = RR_Rotate_270; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen " - "clockwise -- acceleration is disabled.\n"); - } else if (!xf86NameCmp(s, "CCW")) { - pVia->shadowFB = TRUE; - pVia->NoAccel = TRUE; - pVia->RandRRotation = TRUE; - pVia->rotate = RR_Rotate_90; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen " - "counterclockwise -- acceleration is disabled.\n"); - } else if (!xf86NameCmp(s, "UD")) { - pVia->shadowFB = TRUE; - pVia->NoAccel = TRUE; - pVia->RandRRotation = TRUE; - pVia->rotate = RR_Rotate_180; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen " - "upside-down -- acceleration is disabled.\n"); + "VIA DRM detected.\n"); + drmVer = drmGetVersion(pVia->drmmode.fd); + if (drmVer) { + pVia->drmVerMajor = drmVer->version_major; + pVia->drmVerMinor = drmVer->version_minor; + pVia->drmVerPatchLevel = drmVer->version_patchlevel; + drmFreeVersion(drmVer); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VIA DRM Version: %d.%d.%d\n", + pVia->drmVerMajor, pVia->drmVerMinor, + pVia->drmVerPatchLevel); + + if (((pVia->drmVerMajor > drmVIADRMExpected.major) && + (pVia->drmVerMajor < drmVIADRMCompat.major)) || + ((pVia->drmVerMajor == drmVIADRMExpected.major) && + (pVia->drmVerMinor >= drmVIADRMExpected.minor) && + (pVia->drmVerMajor < drmVIADRMCompat.major))) { + pVia->directRenderingType = DRI_1; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "This version of VIA DRM is " + "compatible with OpenChrome DDX.\n"); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "This version of VIA DRM is not " + "compatible with OpenChrome DDX.\n" + "OpenChrome DDX can work with " + "VIA DRM Version %d.%d to %d.%d.\n", + drmVIADRMExpected.major, + drmVIADRMExpected.minor, + drmVIADRMCompat.major, + drmVIADRMCompat.minor); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Disabling VIA DRM support.\n"); + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Not able to obtain VIA DRM version.\n"); + } } else { - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid" - "value for Option \"Rotate\".\n", s); xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Valid options are \"CW\", \"CCW\" or \"UD\".\n"); - } - } - - from = (xf86GetOptValBool(VIAOptions, OPTION_SHADOW_FB, &pVia->shadowFB) - ? X_CONFIG : X_DEFAULT); - xf86DrvMsg(pScrn->scrnIndex, from, "Shadow framebuffer is %s.\n", - pVia->shadowFB ? "enabled" : "disabled"); - - /* Use hardware acceleration, unless on shadow framebuffer. */ - from = (xf86GetOptValBool(VIAOptions, OPTION_NOACCEL, &pVia->NoAccel) - ? X_CONFIG : X_DEFAULT); - if (!pVia->NoAccel && pVia->shadowFB) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Acceleration is " - "not supported when using shadow framebuffer.\n"); - pVia->NoAccel = TRUE; - from = X_DEFAULT; - } - - /* Disable EXA for KMS case */ - if (pVia->KMS) - pVia->NoAccel = TRUE; - - xf86DrvMsg(pScrn->scrnIndex, from, "Hardware acceleration is %s.\n", - !pVia->NoAccel ? "enabled" : "disabled"); - - if (!pVia->NoAccel) { - from = X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, - "Using EXA acceleration architecture.\n"); - - //pVia->noComposite = FALSE; - if (pVia->useEXA) { - from = xf86GetOptValBool(VIAOptions, OPTION_EXA_NOCOMPOSITE, - &pVia->noComposite) ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, - "EXA composite acceleration %s.\n", - !pVia->noComposite ? "enabled" : "disabled"); - - //pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024; - from = xf86GetOptValInteger(VIAOptions, OPTION_EXA_SCRATCH_SIZE, - &pVia->exaScratchSize) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, - "EXA scratch area size is %d kB.\n", - pVia->exaScratchSize); + "OpenChrome DDX will now operate " + "without DRM.\n"); } - } - - /* Use a hardware cursor, unless on secondary or on shadow framebuffer. */ - from = X_DEFAULT; - if (pVia->IsSecondary || pVia->shadowFB) - pVia->drmmode.hwcursor = FALSE; - else if (xf86GetOptValBool(VIAOptions, OPTION_SWCURSOR, - &pVia->drmmode.hwcursor)) { - pVia->drmmode.hwcursor = !pVia->drmmode.hwcursor; - from = X_CONFIG; - } - if (pVia->drmmode.hwcursor) - xf86DrvMsg(pScrn->scrnIndex, from, "Using hardware two-color " - "cursors and software full-color cursors.\n"); - else - xf86DrvMsg(pScrn->scrnIndex, from, "Using software cursors.\n"); - - //pVia->VQEnable = TRUE; - from = xf86GetOptValBool(VIAOptions, OPTION_DISABLEVQ, &pVia->VQEnable) - ? X_CONFIG : X_DEFAULT; - if (from == X_CONFIG) - pVia->VQEnable = !pVia->VQEnable; - xf86DrvMsg(pScrn->scrnIndex, from, - "GPU virtual command queue will be %s.\n", - (pVia->VQEnable) ? "enabled" : "disabled"); - - //pVia->DRIIrqEnable = TRUE; - from = xf86GetOptValBool(VIAOptions, OPTION_DISABLEIRQ, &pVia->DRIIrqEnable) - ? X_CONFIG : X_DEFAULT; - if (from == X_CONFIG) - pVia->DRIIrqEnable = !pVia->DRIIrqEnable; - xf86DrvMsg(pScrn->scrnIndex, from, - "DRI IRQ will be %s if DRI is enabled.\n", - (pVia->DRIIrqEnable) ? "enabled" : "disabled"); - - //pVia->agpEnable = FALSE; - from = xf86GetOptValBool(VIAOptions, OPTION_AGP_DMA, &pVia->agpEnable) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, - "AGP DMA will be %s if DRI is enabled.\n", - (pVia->agpEnable) ? "enabled" : "disabled"); - - //pVia->dma2d = TRUE; - if (pVia->agpEnable) { - from = xf86GetOptValBool(VIAOptions, OPTION_2D_DMA, &pVia->dma2d) - ? X_CONFIG : X_DEFAULT; - if (from == X_CONFIG) - pVia->dma2d = !pVia->dma2d; - xf86DrvMsg(pScrn->scrnIndex, from, "AGP DMA will %sbe used for " - "2D acceleration.\n", (pVia->dma2d) ? "" : "not "); - } - //pVia->dmaXV = TRUE; - from = xf86GetOptValBool(VIAOptions, OPTION_XV_DMA, &pVia->dmaXV) - ? X_CONFIG : X_DEFAULT; - if (from == X_CONFIG) - pVia->dmaXV = !pVia->dmaXV; - xf86DrvMsg(pScrn->scrnIndex, from, "PCI DMA will %sbe used for XV " - "image transfer if DRI is enabled.\n", - (pVia->dmaXV) ? "" : "not "); -#ifdef HAVE_DEBUG - //pVia->disableXvBWCheck = FALSE; - from = xf86GetOptValBool(VIAOptions, OPTION_DISABLE_XV_BW_CHECK, - &pVia->disableXvBWCheck) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, "Xv Bandwidth check is %s.\n", - pVia->disableXvBWCheck ? "disabled" : "enabled"); - if (pVia->disableXvBWCheck) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "You may get a \"snowy\" screen" - " when using the Xv overlay.\n"); + free(busId); } #endif - //pVia->maxDriSize = 0; - from = xf86GetOptValInteger(VIAOptions, OPTION_MAX_DRIMEM, - &pVia->maxDriSize) - ? X_CONFIG : X_DEFAULT; - if (pVia->maxDriSize > 0) - xf86DrvMsg(pScrn->scrnIndex, from, - "Will impose a %d kB limit on video RAM reserved for DRI.\n", - pVia->maxDriSize); - else - xf86DrvMsg(pScrn->scrnIndex, from, - "Will not impose a limit on video RAM reserved for DRI.\n"); - - //pVia->agpMem = AGP_SIZE / 1024; - from = xf86GetOptValInteger(VIAOptions, OPTION_AGPMEM, &pVia->agpMem) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, - "Will try to allocate %d kB of AGP memory.\n", pVia->agpMem); - - pBIOSInfo = pVia->pBIOSInfo; - pBIOSInfo->TVDotCrawl = FALSE; - from = xf86GetOptValBool(VIAOptions, OPTION_TVDOTCRAWL, - &pBIOSInfo->TVDotCrawl) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, "TV dotCrawl is %s.\n", - pBIOSInfo->TVDotCrawl ? "enabled" : "disabled"); - - /* TV Deflicker */ - pBIOSInfo->TVDeflicker = 0; - from = xf86GetOptValInteger(VIAOptions, OPTION_TVDEFLICKER, - &pBIOSInfo->TVDeflicker) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, "TV deflicker is set to %d.\n", - pBIOSInfo->TVDeflicker); - - pBIOSInfo->TVType = TVTYPE_NONE; - if ((s = xf86GetOptValString(VIAOptions, OPTION_TVTYPE))) { - if (!xf86NameCmp(s, "NTSC")) { - pBIOSInfo->TVType = TVTYPE_NTSC; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is NTSC.\n"); - } else if (!xf86NameCmp(s, "PAL")) { - pBIOSInfo->TVType = TVTYPE_PAL; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is PAL.\n"); - } else if (!xf86NameCmp(s, "480P")) { - pBIOSInfo->TVType = TVTYPE_480P; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is SDTV 480P.\n"); - } else if (!xf86NameCmp(s, "576P")) { - pBIOSInfo->TVType = TVTYPE_576P; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is SDTV 576P.\n"); - } else if (!xf86NameCmp(s, "720P")) { - pBIOSInfo->TVType = TVTYPE_720P; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is HDTV 720P.\n"); - } else if (!xf86NameCmp(s, "1080I")) { - pBIOSInfo->TVType = TVTYPE_1080I; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Type is HDTV 1080i.\n"); - } - } else { - xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "No default TV type is set.\n"); - } - - /* TV output signal Option */ - pBIOSInfo->TVOutput = TVOUTPUT_NONE; - if ((s = xf86GetOptValString(VIAOptions, OPTION_TVOUTPUT))) { - if (!xf86NameCmp(s, "S-Video")) { - pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "TV Output Signal is S-Video.\n"); - } else if (!xf86NameCmp(s, "Composite")) { - pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "TV Output Signal is Composite.\n"); - } else if (!xf86NameCmp(s, "SC")) { - pBIOSInfo->TVOutput = TVOUTPUT_SC; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Signal is SC.\n"); - } else if (!xf86NameCmp(s, "RGB")) { - pBIOSInfo->TVOutput = TVOUTPUT_RGB; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "TV Output Signal is RGB.\n"); - } else if (!xf86NameCmp(s, "YCbCr")) { - pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, - "TV Output Signal is YCbCr.\n"); - } - } else { - xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, - "No default TV output signal type is set.\n"); - } - - VIAVidHWDiffInit(pScrn); - -#ifdef HAVE_DEBUG - //pVia->PrintVGARegs = FALSE; - from = xf86GetOptValBool(VIAOptions, OPTION_PRINTVGAREGS, - &pVia->PrintVGARegs) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, "Will %sprint VGA registers.\n", - pVia->PrintVGARegs ? "" : "not "); - if (pVia->PrintVGARegs) - ViaVgahwPrint(VGAHWPTR(pScrn)); /* Do this as early as possible */ - - pVia->I2CScan = FALSE; - from = xf86GetOptValBool(VIAOptions, OPTION_I2CSCAN, &pVia->I2CScan) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, "Will %sscan I2C buses.\n", - pVia->I2CScan ? "" : "not "); -#endif /* HAVE_DEBUG */ - - /* Checking for VIA Technologies NanoBook reference design. - Examples include Everex CloudBook and Sylvania g netbook. - It is also called FIC CE260 and CE261 by its ODM (Original - Design Manufacturer) name. - This device has its strapping resistors set to a wrong - setting to handle DVI. As a result, we need to make special - accommodations to handle DVI properly. */ - if ((pVia->Chipset == VIA_CX700) && - (SUBVENDOR_ID(pVia->PciInfo) == 0x1509) && - (SUBSYS_ID(pVia->PciInfo) == 0x2D30)) { - - pVia->isVIANanoBook = TRUE; - } else { - pVia->isVIANanoBook = FALSE; - } - + option = xf86NewOption(strEXAOptionName, strEXAValue); + xf86CollectOptions(pScrn, option); - /* Checking for OLPC XO-1.5. */ - if ((pVia->Chipset == VIA_VX855) && - (SUBVENDOR_ID(pVia->PciInfo) == 0x152D) && - (SUBSYS_ID(pVia->PciInfo) == 0x0833)) { + viaSetupDefaultOptions(pScrn); - pVia->IsOLPCXO15 = TRUE; - } else { - pVia->IsOLPCXO15 = FALSE; - } + viaProcessOptions(pScrn); - /* I2CDevices Option for I2C Initialization */ - if ((s = xf86GetOptValString(VIAOptions, OPTION_I2CDEVICES))) { - pVia->I2CDevices = 0; - if (strstr(s, "Bus1")) - pVia->I2CDevices |= VIA_I2C_BUS1; - if (strstr(s, "Bus2")) - pVia->I2CDevices |= VIA_I2C_BUS2; - if (strstr(s, "Bus3")) - pVia->I2CDevices |= VIA_I2C_BUS3; - } + VIAVidHWDiffInit(pScrn); - if (pVia->IsOLPCXO15) { - pVia->I2CDevices &= ~VIA_I2C_BUS2; + /* + * After viaUMSPreInit() succeeds, MMIO PCI hardware resources + * are memory mapped. If there is an error from this point on, + * they will need to be explicitly relinquished. + */ + if (!pVia->KMS) { + if (!viaUMSPreInit(pScrn)) { + goto free_rec; + } } /* CRTC handling */ @@ -1511,7 +1157,7 @@ viaPreInit(ScrnInfoPtr pScrn, int flags) goto fail; } } else { - if (!umsCrtcInit(pScrn)) { + if (!viaUMSCrtcInit(pScrn)) { goto fail; } } @@ -1526,16 +1172,6 @@ viaPreInit(ScrnInfoPtr pScrn, int flags) goto fail; } - /* Initialize the colormap */ - Gamma zeros = { 0.0, 0.0, 0.0 }; - if (!xf86SetGamma(pScrn, zeros)) { - goto fail; - } - - /* Set up screen parameters. */ - pVia->Bpp = pScrn->bitsPerPixel >> 3; - pVia->Bpl = pScrn->virtualX * pVia->Bpp; - /* Set the current mode to the first in the list */ pScrn->currentMode = pScrn->modes; @@ -1566,12 +1202,28 @@ viaPreInit(ScrnInfoPtr pScrn, int flags) } } - return TRUE; + /* + * Set up screen parameters. + */ + pVia->Bpl = pScrn->virtualX * (pScrn->bitsPerPixel / 8); + if (!pVia->KMS) { + viaUMSPreInitExit(pScrn); + } + + status = TRUE; + goto exit; fail: - viaUnmapMMIO(pScrn); + if (!pVia->KMS) { + viaUMSPreInitExit(pScrn); + } + +free_rec: VIAFreeRec(pScrn); - return FALSE; +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); + return status; } static void @@ -1630,6 +1282,12 @@ LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, } } +static void +viaUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf) +{ + shadowUpdatePacked(pScreen, pBuf); +} + static void * viaShadowWindow(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure) @@ -1668,14 +1326,12 @@ VIACreateScreenResources(ScreenPtr pScreen) if (pVia->shadowFB) surface = pVia->ShadowPtr; - if (!pScreen->ModifyPixmapHeader(rootPixmap, pScrn->virtualX, - pScrn->virtualY, -1, -1, - pVia->drmmode.front_bo->pitch, + if (!pScreen->ModifyPixmapHeader(rootPixmap, -1, -1, -1, -1, -1, surface)) return FALSE; if (pVia->shadowFB) { - if (!shadowAdd(pScreen, rootPixmap, shadowUpdatePackedWeak(), + if (!shadowAdd(pScreen, rootPixmap, viaUpdatePacked, viaShadowWindow, 0, NULL)) return FALSE; } @@ -1695,7 +1351,9 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL) if (pVia->directRenderingType != DRI_2) viaExitVideo(pScrn); - viaExitAccel(pScreen); + if (!pVia->NoAccel) { + viaExitAccel(pScreen); + } if (pVia->ShadowPtr) { shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); @@ -1712,14 +1370,6 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL) #endif xf86_cursors_fini(pScreen); - for (i = 0; i < xf86_config->num_crtc; i++) { - xf86CrtcPtr crtc = xf86_config->crtc[i]; - drmmode_crtc_private_ptr iga = crtc->driver_private; - - if (iga->cursor_bo) - drm_bo_free(pScrn, iga->cursor_bo); - } - if (pVia->drmmode.front_bo) { #ifdef HAVE_DRI if (pVia->KMS && pVia->drmmode.fb_id) @@ -1727,9 +1377,18 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL) #endif pVia->drmmode.fb_id = 0; + drm_bo_unmap(pScrn, pVia->drmmode.front_bo); drm_bo_free(pScrn, pVia->drmmode.front_bo); } + for (i = 0; i < xf86_config->num_crtc; i++) { + xf86CrtcPtr crtc = xf86_config->crtc[i]; + drmmode_crtc_private_ptr iga = crtc->driver_private; + + if (iga->cursor_bo) + drm_bo_free(pScrn, iga->cursor_bo); + } + #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) VIADRICloseScreen(pScreen); @@ -1744,6 +1403,10 @@ VIACloseScreen(CLOSE_SCREEN_ARGS_DECL) } #endif + if (!pVia->KMS) { + viaUMSDestroy(pScrn); + } + pScrn->vtSema = FALSE; pScreen->CloseScreen = pVia->CloseScreen; return (*pScreen->CloseScreen) (CLOSE_SCREEN_ARGS); @@ -1754,66 +1417,34 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); - int format; + unsigned int bppSize, alignedPitch; + unsigned long alignment; + xf86CrtcConfigPtr xf86_config; + struct buffer_object *bo; + int cursorWidth, cursorHeight, flags; + int cursorSize; + int i; - pScrn->pScreen = pScreen; pScrn->displayWidth = pScrn->virtualX; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit\n")); - -#ifdef HAVE_DRI - if (pVia->KMS) { - if (drmSetMaster(pVia->drmmode.fd)) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "drmSetMaster failed: %s\n", - strerror(errno)); - } - } - if (pVia->drmmode.fd != -1) { - if (pVia->directRenderingType == DRI_1) { - /* DRI2 or DRI1 support */ - if (VIADRI1ScreenInit(pScreen)) - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DRI1 ScreenInit commplete\n")); - else - pVia->directRenderingType = DRI_NONE; - } - } -#endif + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); - if (!drm_bo_manager_init(pScrn)) - return FALSE; + pScrn->pScreen = pScreen; - format = map_legacy_formats(pScrn->bitsPerPixel, pScrn->depth); - pVia->drmmode.front_bo = drm_bo_alloc_surface(pScrn, pScrn->virtualX, pScrn->virtualY, - format, 16, TTM_PL_FLAG_VRAM); - if (!pVia->drmmode.front_bo) - return FALSE; + miClearVisualTypes(); - if (!drm_bo_map(pScrn, pVia->drmmode.front_bo)) + if (!miSetVisualTypes(pScrn->depth, + (pScrn->bitsPerPixel > 8) && (!pVia->IsSecondary) ? + TrueColorMask : miGetDefaultVisualMask(pScrn->depth), + pScrn->rgbBits, pScrn->defaultVisual)) { return FALSE; + } - if (!pVia->NoAccel && !umsAccelInit(pScrn->pScreen)) + if (!miSetPixmapDepths()) { return FALSE; - - miClearVisualTypes(); - - if (pScrn->bitsPerPixel > 8 && !pVia->IsSecondary) { - if (!miSetVisualTypes(pScrn->depth, TrueColorMask, - pScrn->rgbBits, pScrn->defaultVisual)) - return FALSE; - if (!miSetPixmapDepths()) - return FALSE; - } else { - if (!miSetVisualTypes(pScrn->depth, - miGetDefaultVisualMask(pScrn->depth), - pScrn->rgbBits, pScrn->defaultVisual)) - return FALSE; - if (!miSetPixmapDepths()) - return FALSE; } - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Visuals set up\n")); - if (pVia->shadowFB) { int pitch = BitmapBytePad(pScrn->bitsPerPixel * pScrn->virtualX); @@ -1830,9 +1461,6 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL) pScrn->bitsPerPixel)) return FALSE; - xf86SetBlackWhitePixels(pScreen); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- B & W\n")); - if (pScrn->bitsPerPixel > 8) { VisualPtr visual; @@ -1852,54 +1480,123 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL) /* Must be after RGB ordering is fixed. */ fbPictureInit(pScreen, NULL, 0); - if (!pVia->NoAccel && !viaInitExa(pScreen)) - return FALSE; + if (!pVia->KMS) { + if (!viaUMSMapIOResources(pScrn)) { + return FALSE; + } + } + +#ifdef HAVE_DRI + if (pVia->KMS) { + if (drmSetMaster(pVia->drmmode.fd)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "drmSetMaster failed: %s\n", + strerror(errno)); + return FALSE; + } + } + + if (pVia->drmmode.fd != -1) { + if (pVia->directRenderingType == DRI_1) { + /* DRI2 or DRI1 support */ + if (VIADRI1ScreenInit(pScreen)) + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DRI1 ScreenInit complete.\n")); + else + pVia->directRenderingType = DRI_NONE; + } + } +#endif + +#ifdef HAVE_DRI + if (pVia->directRenderingType != DRI_2) +#endif /* HAVE_DRI */ + { + if (!viaUMSScreenInit(pScrn)) { + return FALSE; + } + } + + if ((!pVia->NoAccel) && + ((pVia->directRenderingType == DRI_NONE) +#ifdef HAVE_DRI + || (pVia->directRenderingType == DRI_1) +#endif /* HAVE_DRI */ + )) { + if (!viaUMSAccelInit(pScrn)) { + return FALSE; + } + } xf86SetBackingStore(pScreen); -#if 0 + xf86SetSilkenMouse(pScreen); -#endif - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Backing store set up\n")); + + xf86SetBlackWhitePixels(pScreen); miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- SW cursor set up\n")); if (pVia->drmmode.hwcursor) { - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int flags = (HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | - HARDWARE_CURSOR_TRUECOLOR_AT_8BPP); - int cursorSize, size, i = 0; + xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + cursorWidth = cursorHeight = 64; switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: - flags |= HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1; - size = 32; - cursorSize = ((size * size) >> 3) * 2; + flags = 0; break; default: - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "HWCursor ARGB enabled\n")); - flags |= (HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | HARDWARE_CURSOR_ARGB); - size = 64; - cursorSize = (size * size) << 2; + flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | + HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64 | + HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | + HARDWARE_CURSOR_ARGB; break; } + cursorSize = (cursorWidth * cursorHeight) * (32 / 8); + alignment = 1024; + + /* + * Set cursor location in frame buffer. + */ + bo = drm_bo_alloc(pScrn, cursorSize, alignment, + TTM_PL_FLAG_VRAM); + if (!bo) { + return FALSE; + } + for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; drmmode_crtc_private_ptr iga = crtc->driver_private; - /* Set cursor location in frame buffer. */ - iga->cursor_bo = drm_bo_alloc(pScrn, cursorSize, 16, TTM_PL_FLAG_VRAM); + /* + * Set cursor location in frame buffer. + */ + iga->cursor_bo = bo; } - if (!xf86_cursors_init(pScreen, size, size, flags)) { + if (!xf86_cursors_init(pScreen, + cursorWidth, cursorHeight, flags)) { pVia->drmmode.hwcursor = FALSE; xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Hardware cursor initialization failed\n"); + "Hardware cursor initialization failed.\n"); } } + bppSize = viaConvertDepthToBpp(pScrn->bitsPerPixel, + pScrn->depth); + alignedPitch = pScrn->virtualX * bppSize; + alignedPitch = ALIGN_TO(alignedPitch, 16); + pVia->drmmode.front_bo = drm_bo_alloc(pScrn, + alignedPitch * + pScrn->virtualY, + 16, TTM_PL_FLAG_VRAM); + if (!pVia->drmmode.front_bo) + return FALSE; + + if (!drm_bo_map(pScrn, pVia->drmmode.front_bo)) + return FALSE; + pScrn->vtSema = TRUE; pScreen->SaveScreen = xf86SaveScreen; pVia->CloseScreen = pScreen->CloseScreen; @@ -1912,18 +1609,13 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL) if (!miCreateDefColormap(pScreen)) return FALSE; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Def Color map set up\n")); if (!xf86HandleColormaps(pScreen, 256, 8, LoadPalette, NULL, CMAP_RELOAD_ON_MODE_SWITCH | CMAP_PALETTED_TRUECOLOR)) return FALSE; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Palette loaded\n")); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Color maps etc. set up\n")); - xf86DPMSInit(pScreen, xf86DPMSSet, 0); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- DPMS set up\n")); if (!VIAEnterVT_internal(pScrn, 1)) return FALSE; @@ -1932,10 +1624,12 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL) #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { if (!VIADRIFinishScreenInit(pScreen)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering disabled\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Direct rendering disabled.\n"); pVia->directRenderingType = DRI_NONE; } else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering enabled\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Direct rendering enabled.\n"); } #endif if (!pVia->NoAccel) @@ -1950,17 +1644,18 @@ VIAScreenInit(SCREEN_INIT_ARGS_DECL) #ifdef HAVE_DEBUG if (pVia->PrintVGARegs) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "VIAScreenInit: Printing VGA registers.\n"); + "Printing VGA registers.\n"); ViaVgahwPrint(VGAHWPTR(pScrn)); } if (pVia->PrintTVRegs) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "VIAScreenInit: Printing TV registers.\n"); + "Printing TV registers.\n"); ViaTVPrintRegs(pScrn); } #endif - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Done\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); return TRUE; } diff --git a/src/via_driver.h b/src/via_driver.h index a1ad2f5..011ede7 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -27,7 +27,6 @@ #define _VIA_DRIVER_H_ 1 //#define VIA_DEBUG_COMPOSITE 1 -#define HAVE_DEBUG 1 #ifdef HAVE_DEBUG #define DEBUG(x) x @@ -124,12 +123,7 @@ #define VIDEO_ENGINE_CLE 1 /* CLE First generation video engine */ #define VIDEO_ENGINE_CME 2 /* CME Second generation video engine */ -static int gVIAEntityIndex = -1; - -typedef struct { - CARD8 SR[256]; - CARD8 CR[256]; -} VIARegRec, *VIARegPtr; +extern int gVIAEntityIndex; /* * variables that need to be shared among different screens. @@ -195,8 +189,7 @@ typedef struct _twodContext { } ViaTwodContext; typedef struct _VIA { - VIARegRec SavedReg; - int Bpp, Bpl; + int Bpl; Bool KMS; Bool FirstInit; @@ -218,7 +211,7 @@ typedef struct _VIA { unsigned char* MpegMapBase; unsigned char* BltBase; unsigned char* MapBaseDense; - unsigned char* FBBase; + uint8_t* FBBase; CARD8 MemClk; /* Here are all the Options */ @@ -281,22 +274,8 @@ typedef struct _VIA { /* Rotation */ Bool RandRRotation; - /* BIOS Info Ptr */ - VIABIOSInfoPtr pBIOSInfo; - - /* VIA Technologies NanoBook reference design. - Examples include Everex CloudBook and Sylvania g netbook. - It is also called FIC CE260 and CE261 by its ODM (Original - Design Manufacturer) name. */ - Bool isVIANanoBook; - - /* OLPC XO-1.5 */ - Bool IsOLPCXO15; - - /* I2C & DDC */ - I2CBusPtr pI2CBus1; - I2CBusPtr pI2CBus2; - I2CBusPtr pI2CBus3; + /* Display Record Pointer */ + VIADisplayPtr pVIADisplay; /* MHS */ Bool IsSecondary; @@ -321,7 +300,7 @@ typedef struct _VIA { ViaXvMC xvmc; int drmVerMajor; int drmVerMinor; - int drmVerPL; + int drmVerPatchLevel; struct buffer_object *driOffScreenMem; void * driOffScreenSave; #endif @@ -349,30 +328,14 @@ typedef struct _VIA { void *displayMap; CARD32 displayOffset; - CARD8 I2CDevices; /* Option */ - #ifdef HAVE_DEBUG Bool disableXvBWCheck; Bool DumpVGAROM; Bool PrintVGARegs; Bool PrintTVRegs; - Bool I2CScan; #endif /* HAVE_DEBUG */ video_via_regs* VideoRegs; - - /* Keeping track of the number of analog VGA connectors. */ - unsigned int numberVGA; - - /* Keeping track of the number of DVI connectors. */ - unsigned int numberDVI; - - /* Keeping track of the number of FP (Flat Panel) connectors. */ - unsigned int numberFP; - - /* Shadow copy of CR3B through CR3F. */ - CARD8 originalCR3B, originalCR3C, originalCR3D, - originalCR3E, originalCR3F; } VIARec, *VIAPtr; #define VIAPTR(p) ((VIAPtr)((p)->driverPrivate)) @@ -393,13 +356,21 @@ typedef struct } VIAEntRec, *VIAEntPtr; -/* In via_display.c. */ -const xf86CrtcFuncsRec iga1_crtc_funcs; -const xf86CrtcFuncsRec iga2_crtc_funcs; +const OptionInfoRec *VIAAvailableOptions(int chipid, int busid); +void viaSetupDefaultOptions(ScrnInfoPtr pScrn); +void viaProcessOptions(ScrnInfoPtr pScrn); /* In via_exa.c. */ +int viaEXAOffscreenAlloc(ScrnInfoPtr pScrn, + struct buffer_object *obj, + unsigned long size, + unsigned long alignment); +Bool viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset); +Bool viaExaIsOffscreen(PixmapPtr pPix); Bool viaInitExa(ScreenPtr pScreen); Bool viaAccelSetMode(int bpp, ViaTwodContext * tdc); +void viaSetClippingRectangle(ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2); void viaAccelSync(ScrnInfoPtr); void viaExitAccel(ScreenPtr); void viaFinishInitAccel(ScreenPtr); @@ -463,23 +434,17 @@ void viaInitVideo(ScreenPtr pScreen); void viaExitVideo(ScrnInfoPtr pScrn); void viaSaveVideo(ScrnInfoPtr pScrn); void viaRestoreVideo(ScrnInfoPtr pScrn); -void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast, - Bool reset); +void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y); -/* In via_xv.c */ -void viaInitVideo(ScreenPtr pScreen); -void viaExitVideo(ScrnInfoPtr pScrn); -void viaSaveVideo(ScrnInfoPtr pScrn); -void viaRestoreVideo(ScrnInfoPtr pScrn); -void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast, - Bool reset); -void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y); +/* In via_xv_overlay.c */ +void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, + int brightness, int contrast, Bool reset); /* In via_memcpy.c */ typedef void (*vidCopyFunc)(unsigned char *, const unsigned char *, int, int, int, int); -extern vidCopyFunc viaVidCopyInit( char *copyType, ScreenPtr pScreen ); +extern vidCopyFunc viaVidCopyInit(const char *copyType, ScreenPtr pScreen ); /* In via_xwmc.c */ @@ -493,11 +458,6 @@ int viaXvMCInitXv(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt); unsigned long viaXvMCPutImageSize(ScrnInfoPtr pScrn); #endif -/* via_i2c.c */ -void ViaI2CInit(ScrnInfoPtr pScrn); -Bool xf86I2CMaskByte(I2CDevPtr d, I2CByte subaddr, - I2CByte value, I2CByte mask); - #ifdef HAVE_DRI Bool VIADRI1ScreenInit(ScreenPtr pScreen); void VIADRICloseScreen(ScreenPtr pScreen); @@ -510,11 +470,4 @@ Bool VIADRIBufferInit(ScrnInfoPtr pScrn); #endif /* HAVE_DRI */ -int viaOffScreenLinear(struct buffer_object *obj, ScrnInfoPtr pScrn, unsigned long size); -void viaShowCursor(ScrnInfoPtr pScrn); -void viaHideCursor(ScrnInfoPtr pScrn); -Bool viaHWCursorInit(ScreenPtr pScreen); -void ViaDisplaySetStreamOnCRT(ScrnInfoPtr pScrn, Bool primary); -void ViaDisplaySetStreamOnDFP(ScrnInfoPtr pScrn, Bool primary); - #endif /* _VIA_DRIVER_H_ */ diff --git a/src/via_exa.c b/src/via_exa.c index 0e464ea..d2c5762 100644 --- a/src/via_exa.c +++ b/src/via_exa.c @@ -42,7 +42,6 @@ #include "via_driver.h" #include "via_regs.h" #include "via_dmabuffer.h" -#include "via_rop.h" /* * Use PCI MMIO to flush the command buffer when AGP DMA is not available. @@ -62,7 +61,7 @@ viaDumpDMA(ViaCommandBuffer *cb) ErrorF("\n"); } -void +static void viaFlushPCI(ViaCommandBuffer *cb) { register CARD32 *bp = cb->buf; @@ -789,13 +788,73 @@ viaExaTexUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, #endif /* HAVE_DRI */ -#define EXAOPT_MIGRATION_HEURISTIC 0 +int +viaEXAOffscreenAlloc(ScrnInfoPtr pScrn, struct buffer_object *obj, + unsigned long size, unsigned long alignment) +{ + ExaOffscreenArea *pArea; + int newSize = size; + int newAlignment; + int ret = 0; + + newAlignment = alignment; + pArea = exaOffscreenAlloc(pScrn->pScreen, newSize, + newAlignment, TRUE, NULL, NULL); + if (!pArea) { + ret = -ENOMEM; + goto exit; + } + + obj->offset = pArea->offset; + obj->handle = (unsigned long) pArea; + obj->domain = TTM_PL_FLAG_VRAM; + obj->size = newSize; + +exit: + return ret; +} + +Bool +viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset) +{ +#ifdef HAVE_DRI + unsigned long offs; + + if (pVia->directRenderingType && !pVia->IsPCI) { + offs = ((unsigned long)pPix->devPrivate.ptr + - (unsigned long)pVia->agpMappedAddr); + + if ((offs - pVia->scratchOffset) < pVia->agpSize) { + *offset = offs + pVia->agpAddr; + return TRUE; + } + } +#endif + return FALSE; +} + +Bool +viaExaIsOffscreen(PixmapPtr pPix) +{ + ScrnInfoPtr pScrn = xf86ScreenToScrn(pPix->drawable.pScreen); + VIAPtr pVia = VIAPTR(pScrn); + uint8_t* addr_size; + uint8_t* front_bo; + Bool ret; + + front_bo = drm_bo_map(pScrn, pVia->drmmode.front_bo); + addr_size = (uint8_t*)pPix->devPrivate.ptr - + (unsigned long)front_bo; + ret = (addr_size < (uint8_t*)pVia->drmmode.front_bo->size) ? + TRUE : FALSE; + return ret; +} Bool viaInitExa(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); - ExaDriverPtr pExa = exaDriverAlloc(); + ExaDriverPtr pExa; Bool nPOTSupported = TRUE; VIAPtr pVia = VIAPTR(pScrn); @@ -817,10 +876,10 @@ viaInitExa(ScreenPtr pScreen) return FALSE; } - if (!pExa) + pExa = exaDriverAlloc(); + if (!pExa) { return FALSE; - - memset(pExa, 0, sizeof(*pExa)); + } pExa->exa_major = EXA_VERSION_MAJOR; pExa->exa_minor = EXA_VERSION_MINOR; diff --git a/src/via_exa_h2.c b/src/via_exa_h2.c index 8ecde2b..05f0d46 100644 --- a/src/via_exa_h2.c +++ b/src/via_exa_h2.c @@ -41,31 +41,6 @@ #include "via_dmabuffer.h" #include "via_rop.h" -/* - * Emit clipping borders to the command buffer and update the 2D context - * current command with clipping info. - */ -static int -viaAccelClippingHelper_H2(VIAPtr pVia, int refY) -{ - ViaTwodContext *tdc = &pVia->td; - - RING_VARS; - - if (tdc->clipping) { - refY = (refY < tdc->clipY1) ? refY : tdc->clipY1; - tdc->cmd |= VIA_GEC_CLIP_ENABLE; - BEGIN_RING(4); - OUT_RING_H1(VIA_REG_CLIPTL, - ((tdc->clipY1 - refY) << 16) | tdc->clipX1); - OUT_RING_H1(VIA_REG_CLIPBR, - ((tdc->clipY2 - refY) << 16) | tdc->clipX2); - } else { - tdc->cmd &= ~VIA_GEC_CLIP_ENABLE; - } - return refY; -} - /* * Check if we can use a planeMask and update the 2D context accordingly. */ @@ -262,6 +237,8 @@ viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; + RING_VARS; + if (!width || !height) return; @@ -276,8 +253,6 @@ viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, } val = VIA_PITCH_ENABLE | (dstPitch >> 3) << 16 | (tdc->srcPitch >> 3); - RING_VARS; - BEGIN_RING(16); OUT_RING_H1(VIA_REG_GEMODE, tdc->mode); OUT_RING_H1(VIA_REG_SRCBASE, tdc->srcOffset >> 3); @@ -362,35 +337,6 @@ viaExaCheckComposite_H2(int op, PicturePtr pSrcPicture, return FALSE; } -static Bool -viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset) -{ -#ifdef HAVE_DRI - unsigned long offs; - - if (pVia->directRenderingType && !pVia->IsPCI) { - offs = ((unsigned long)pPix->devPrivate.ptr - - (unsigned long)pVia->agpMappedAddr); - - if ((offs - pVia->scratchOffset) < pVia->agpSize) { - *offset = offs + pVia->agpAddr; - return TRUE; - } - } -#endif - return FALSE; -} - -static Bool -viaExaIsOffscreen(PixmapPtr pPix) -{ - ScrnInfoPtr pScrn = xf86ScreenToScrn(pPix->drawable.pScreen); - VIAPtr pVia = VIAPTR(pScrn); - - return ((unsigned long)pPix->devPrivate.ptr - - (unsigned long) drm_bo_map(pScrn, pVia->drmmode.front_bo)) < pVia->drmmode.front_bo->size; -} - Bool viaExaPrepareComposite_H2(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture, diff --git a/src/via_exa_h6.c b/src/via_exa_h6.c index 3e593a9..daf5c58 100644 --- a/src/via_exa_h6.c +++ b/src/via_exa_h6.c @@ -41,31 +41,6 @@ #include "via_dmabuffer.h" #include "via_rop.h" -/* - * Emit clipping borders to the command buffer and update the 2D context - * current command with clipping info. - */ -static int -viaAccelClippingHelper_H6(VIAPtr pVia, int refY) -{ - ViaTwodContext *tdc = &pVia->td; - - RING_VARS; - - if (tdc->clipping) { - refY = (refY < tdc->clipY1) ? refY : tdc->clipY1; - tdc->cmd |= VIA_GEC_CLIP_ENABLE; - BEGIN_RING(4); - OUT_RING_H1(VIA_REG_CLIPTL_M1, - ((tdc->clipY1 - refY) << 16) | tdc->clipX1); - OUT_RING_H1(VIA_REG_CLIPBR_M1, - ((tdc->clipY2 - refY) << 16) | tdc->clipX2); - } else { - tdc->cmd &= ~VIA_GEC_CLIP_ENABLE; - } - return refY; -} - /* * Check if we can use a planeMask and update the 2D context accordingly. */ @@ -263,11 +238,11 @@ viaExaCopy_H6(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; + RING_VARS; + if (!width || !height) return; - RING_VARS; - if (tdc->cmd & VIA_GEC_DECY) { srcY += height - 1; dstY += height - 1; @@ -375,35 +350,6 @@ viaExaCheckComposite_H6(int op, PicturePtr pSrcPicture, return FALSE; } -static Bool -viaIsAGP(VIAPtr pVia, PixmapPtr pPix, unsigned long *offset) -{ -#ifdef HAVE_DRI - unsigned long offs; - - if (pVia->directRenderingType && !pVia->IsPCI) { - offs = ((unsigned long)pPix->devPrivate.ptr - - (unsigned long)pVia->agpMappedAddr); - - if ((offs - pVia->scratchOffset) < pVia->agpSize) { - *offset = offs + pVia->agpAddr; - return TRUE; - } - } -#endif - return FALSE; -} - -static Bool -viaExaIsOffscreen(PixmapPtr pPix) -{ - ScrnInfoPtr pScrn = xf86ScreenToScrn(pPix->drawable.pScreen); - VIAPtr pVia = VIAPTR(pScrn); - - return ((unsigned long)pPix->devPrivate.ptr - - (unsigned long) drm_bo_map(pScrn, pVia->drmmode.front_bo)) < pVia->drmmode.front_bo->size; -} - Bool viaExaPrepareComposite_H6(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture, diff --git a/src/via_fp.c b/src/via_fp.c index dea6ec9..91ef73d 100644 --- a/src/via_fp.c +++ b/src/via_fp.c @@ -1,8 +1,9 @@ /* - * Copyright 2007-2015 The Openchrome Project + * Copyright 2017-2018 Kevin Brace. All Rights Reserved. + * Copyright 2007-2015 The OpenChrome Project * [https://www.freedesktop.org/wiki/Openchrome] - * Copyright 1998-2007 VIA Technologies, Inc. All Rights Reserved. - * Copyright 2001-2007 S3 Graphics, Inc. All Rights Reserved. + * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -33,21 +34,8 @@ #endif #include "via_driver.h" -#include "via_mode.h" #include - -/* - * Option handling. - */ -enum ViaPanelOpts { - OPTION_CENTER -}; - -static OptionInfoRec ViaPanelOptions[] = -{ - {OPTION_CENTER, "Center", OPTV_BOOLEAN, {0}, FALSE}, - {-1, NULL, OPTV_NONE, {0}, FALSE} -}; +#include "via_fp.h" /* These table values were copied from lcd.c of VIA Frame * Buffer device driver. */ @@ -63,7 +51,7 @@ static ViaPanelModeRec ViaPanelNativeModes[] = { {1280, 800, FALSE, TRUE}, { 800, 480, FALSE, TRUE}, {1024, 768, TRUE, TRUE}, - {1024, 768, FALSE, FALSE}, + {1366, 768, FALSE, FALSE}, {1024, 768, TRUE, FALSE}, {1280, 768, FALSE, FALSE}, {1280, 1024, TRUE, FALSE}, @@ -106,726 +94,557 @@ static DisplayModeRec OLPCMode = { #define TD3 25 /* - * Sets CX700 or later single chipset's LVDS1 I/O pad state. + * This software controlled FP power on / off sequence code is + * for CLE266's IGP which was codenamed Castle Rock. The code is + * untested. The turn on sequence and register access likely + * originated from the code VIA Technologies made open source around + * Year 2004. */ -void -viaLVDS1SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState) +static void +viaFPCastleRockSoftPowerSeq(ScrnInfoPtr pScrn, Bool powerState) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS1SetIOPadSetting.\n")); + "Entered viaFPCastleRockSoftPowerSeq.\n")); - /* Set LVDS1 I/O pad state. */ - /* 3C5.2A[1:0] - LVDS1 I/O Pad Control */ - ViaSeqMask(hwp, 0x2A, ioPadState, 0x03); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS1 I/O Pad State: %d\n", - (ioPadState & 0x03)); + if (powerState) { + /* Wait for 25 ms. */ + usleep(25); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS1SetIOPadSetting.\n")); -} + /* Turn on FP VDD rail. */ + viaFPSetPrimarySoftVDD(pScrn, TRUE); -/* - * Sets IGA1 or IGA2 as the display output source for VIA Technologies - * Chrome IGP LVDS1 integrated LVDS transmitter. - */ -static void -viaLVDS1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; + /* Wait for 510 ms. */ + usleep(510); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS1SetDisplaySource.\n")); + /* Turn on FP data transmission. */ + viaFPSetPrimarySoftData(pScrn, TRUE); - /* Set LVDS1 integrated LVDS transmitter display output source. */ - /* 3X5.99[4] - LVDS Channel 1 Data Source Selection - * 0: Primary Display - * 1: Secondary Display */ - ViaCrtcMask(hwp, 0x99, temp << 4, 0x10); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS1 Integrated LVDS Transmitter Display Output " - "Source: IGA%d\n", - (temp & 0x01) + 1); + /* Wait for 1 ms. */ + usleep(1); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS1SetDisplaySource.\n")); -} + /* Turn on FP VEE rail. */ + viaFPSetPrimarySoftVEE(pScrn, TRUE); -/* - * Sets LVDS1 (LVDS Channel 1) integrated LVDS transmitter format. - */ -static void -viaLVDS1SetFormat(ScrnInfoPtr pScrn, CARD8 format) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + /* Turn on FP back light. */ + viaFPSetPrimarySoftBackLight(pScrn, TRUE); + } else { + /* Wait for 1 ms. */ + usleep(1); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS1SetFormat.\n")); + /* Turn off FP back light. */ + viaFPSetPrimarySoftBackLight(pScrn, FALSE); - /* Set LVDS1 format. */ - /* 3X5.D2[1] - LVDS Channel 1 Format Selection - * 0: SPWG Mode - * 1: OPENLDI Mode */ - ViaCrtcMask(hwp, 0xD2, format << 1, 0x02); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS1 Format: %s\n", - (format & 0x01) ? "OPENLDI" : "SPWG"); + /* Turn off FP VEE rail. */ + viaFPSetPrimarySoftVEE(pScrn, FALSE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS1SetFormat.\n")); -} + /* Wait for 510 ms. */ + usleep(510); -/* - * Sets CX700 or later single chipset's LVDS2 I/O pad state. - */ -static void -viaLVDS2SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + /* Turn off FP data transmission. */ + viaFPSetPrimarySoftData(pScrn, FALSE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS2SetIOPadSetting.\n")); + /* Wait for 25 ms. */ + usleep(25); - /* Set LVDS2 I/O pad state. */ - /* 3C5.2A[3:2] - LVDS2 I/O Pad Control */ - ViaSeqMask(hwp, 0x2A, ioPadState << 2, 0x0C); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS2 I/O Pad State: %d\n", - (ioPadState & 0x03)); + /* Turn off FP VDD rail. */ + viaFPSetPrimarySoftVDD(pScrn, FALSE); + } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS2SetIOPadSetting.\n")); + "Exiting viaFPCastleRockSoftPowerSeq.\n")); } -/* - * Sets IGA1 or IGA2 as the display output source for VIA Technologies - * Chrome IGP LVDS2 integrated LVDS transmitter. - */ static void -viaLVDS2SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +viaFPPrimarySoftPowerSeq(ScrnInfoPtr pScrn, Bool powerState) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS2SetDisplaySource.\n")); + "Entered viaFPPrimarySoftPowerSeq.\n")); - /* Set LVDS2 integrated LVDS transmitter display output source. */ - /* 3X5.97[4] - LVDS Channel 2 Data Source Selection - * 0: Primary Display - * 1: Secondary Display */ - ViaCrtcMask(hwp, 0x97, temp << 4, 0x10); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS2 Integrated LVDS Transmitter Display Output " - "Source: IGA%d\n", - (temp & 0x01) + 1); + /* Turn off FP hardware power sequence. */ + viaFPSetPrimaryHardPower(pScrn, FALSE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS2SetDisplaySource.\n")); -} + /* Use software FP power sequence control. */ + viaFPSetPrimaryPowerSeqType(pScrn, FALSE); -/* - * Sets LVDS2 (LVDS Channel 2) integrated LVDS transmitter delay tap. - */ -static void -viaLVDS2SetDelayTap(ScrnInfoPtr pScrn, CARD8 delayTap) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + if (powerState) { + /* Turn on FP Display Period. */ + viaFPSetPrimaryDirectDisplayPeriod(pScrn, TRUE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS2SetDelayTap.\n")); + /* Wait for TD0 ms. */ + usleep(TD0); - /* Set LVDS2 delay tap. */ - /* 3X5.97[3:0] - LVDS2 Delay Tap */ - ViaCrtcMask(hwp, 0x97, delayTap, 0x0F); + /* Turn on FP VDD rail. */ + viaFPSetPrimarySoftVDD(pScrn, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS2 Delay Tap: %d\n", - (delayTap & 0x0F)); + /* Wait for TD1 ms. */ + usleep(TD1); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS2SetDelayTap.\n")); -} + /* Turn on FP data transmission. */ + viaFPSetPrimarySoftData(pScrn, TRUE); -/* - * Sets LVDS2 (LVDS Channel 2) integrated LVDS transmitter format. - */ -static void -viaLVDS2SetFormat(ScrnInfoPtr pScrn, CARD8 format) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + /* Wait for TD2 ms. */ + usleep(TD2); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS2SetFormat.\n")); + /* Turn on FP VEE rail. */ + viaFPSetPrimarySoftVEE(pScrn, TRUE); - /* Set LVDS2 format. */ - /* 3X5.D2[0] - LVDS Channel 2 Format Selection - * 0: SPWG Mode - * 1: OPENLDI Mode */ - ViaCrtcMask(hwp, 0xD2, format, 0x01); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS2 Format: %s\n", - (format & 0x01) ? "OPENLDI" : "SPWG"); + /* Wait for TD3 ms. */ + usleep(TD3); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS2SetFormat.\n")); -} + /* Turn on FP back light. */ + viaFPSetPrimarySoftBackLight(pScrn, TRUE); + } else { + /* Turn off FP back light. */ + viaFPSetPrimarySoftBackLight(pScrn, FALSE); -/* - * Sets IGA1 or IGA2 as the display output source for VIA Technologies - * Chrome IGP DFP (Digital Flat Panel) High interface. - */ -static void -viaDFPHighSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; + /* Wait for TD3 ms. */ + usleep(TD3); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDFPHighSetDisplaySource.\n")); + /* Turn off FP VEE rail. */ + viaFPSetPrimarySoftVEE(pScrn, FALSE); - /* Set DFP High display output source. */ - /* 3X5.97[4] - DFP High Data Source Selection - * 0: Primary Display - * 1: Secondary Display */ - ViaCrtcMask(hwp, 0x97, temp << 4, 0x10); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DFP High Display Output Source: IGA%d\n", - (temp & 0x01) + 1); + /* Wait for TD2 ms. */ + usleep(TD2); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDFPHighSetDisplaySource.\n")); -} + /* Turn off FP data transmission. */ + viaFPSetPrimarySoftData(pScrn, FALSE); -/* - * Sets DFP (Digital Flat Panel) Low interface delay tap. - */ -static void -viaDFPLowSetDelayTap(ScrnInfoPtr pScrn, CARD8 delayTap) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + /* Wait for TD1 ms. */ + usleep(TD1); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDFPLowSetDelayTap.\n")); + /* Turn off FP VDD rail. */ + viaFPSetPrimarySoftVDD(pScrn, FALSE); - /* Set DFP Low interface delay tap. */ - /* 3X5.99[3:0] - DFP Low Delay Tap */ - ViaCrtcMask(hwp, 0x99, delayTap, 0x0F); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DFP Low Delay Tap: %d\n", - (delayTap & 0x0F)); + /* Turn off FP Display Period. */ + viaFPSetPrimaryDirectDisplayPeriod(pScrn, FALSE); + } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDFPLowSetDelayTap.\n")); + "Exiting viaFPPrimarySoftPowerSeq.\n")); } -/* - * Sets DFP (Digital Flat Panel) High interface delay tap. - */ static void -viaDFPHighSetDelayTap(ScrnInfoPtr pScrn, CARD8 delayTap) +viaFPSecondarySoftPowerSeq(ScrnInfoPtr pScrn, Bool powerState) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDFPHighSetDelayTap.\n")); + "Entered viaFPSecondarySoftPowerSeq.\n")); - /* Set DFP High interface delay tap. */ - /* 3X5.97[3:0] - DFP High Delay Tap */ - ViaCrtcMask(hwp, 0x97, delayTap, 0x0F); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DFP High Delay Tap: %d\n", - (delayTap & 0x0F)); + /* Turn off hardware power sequence. */ + viaFPSetSecondaryHardPower(pScrn, FALSE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDFPHighSetDelayTap.\n")); -} + /* Use software FP power sequence control. */ + viaFPSetSecondaryPowerSeqType(pScrn, FALSE); -/* - * Turns LVDS2 output color dithering on or off. (18-bit color display vs. - * 24-bit color display) - */ -static void -viaLVDS2SetDithering(ScrnInfoPtr pScrn, CARD8 ditheringStatus) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + if (powerState) { + /* Turn on FP display period. */ + viaFPSetSecondaryDirectDisplayPeriod(pScrn, TRUE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS2SetDithering.\n")); + /* Wait for TD0 ms. */ + usleep(TD0); - /* Set LVDS2 output color dithering bit. */ - /* 3X5.D4[6] - LVDS Channel 2 Output Bits - * 0: 24 bits (dithering off) - * 1: 18 bits (dithering on) */ - ViaCrtcMask(hwp, 0xD4, ditheringStatus ? 0x40 : 0x00, 0x40); + /* Turn on FP VDD rail. */ + viaFPSetSecondarySoftVDD(pScrn, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS2 Output Color Dithering: %s\n", - ditheringStatus ? "On (18 bit)" : "Off (24 bit)"); + /* Wait for TD1 ms. */ + usleep(TD1); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS2SetDithering.\n")); -} + /* Turn on FP data transmission. */ + viaFPSetSecondarySoftData(pScrn, TRUE); -/* - * Sets output format of LVDS2 to rotation or sequential mode. - */ -static void -viaLVDS2SetOutputFormat(ScrnInfoPtr pScrn, CARD8 outputFormat) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + /* Wait for TD2 ms. */ + usleep(TD2); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDS2SetOutputFormat.\n")); + /* Turn on FP VEE rail. */ + viaFPSetSecondarySoftVEE(pScrn, TRUE); - /* Set LVDS2 output format. */ - /* 3X5.D4[7] - LVDS Channel 2 Output Format - * 0: Rotation - * 1: Sequential */ - ViaCrtcMask(hwp, 0xD4, outputFormat ? 0x80 : 0x00, 0x80); + /* Wait for TD3 ms. */ + usleep(TD3); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS2 Output Format: %s\n", - outputFormat ? "Sequential" : "Rotation"); + /* Turn on FP back light. */ + viaFPSetSecondarySoftBackLight(pScrn, TRUE); + } else { + /* Turn off FP back light. */ + viaFPSetSecondarySoftBackLight(pScrn, FALSE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDS2SetOutputFormat.\n")); -} + /* Wait for TD3 ms. */ + usleep(TD3); -/* - * Sets PCIe based 2 chip chipset's pin multiplexed DVP0 I/O pad state. - */ -static void -viaDVP0PCIeSetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); + /* Turn off FP VEE rail. */ + viaFPSetSecondarySoftVEE(pScrn, FALSE); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP0PCIeSetIOPadSetting.\n")); + /* Wait for TD2 ms. */ + usleep(TD2); - /* Set pin multiplexed DVP1 I/O pad state. */ - /* 3C5.2A[3:2] - DVP0 I/O Pad Control */ - ViaSeqMask(hwp, 0x2A, ioPadState << 2, 0x0C); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP0 I/O Pad State: %d\n", - (ioPadState & 0x03)); + /* Turn off FP data transmission. */ + viaFPSetSecondarySoftData(pScrn, FALSE); + + /* Wait for TD1 ms. */ + usleep(TD1); + + /* Turn off FP VDD rail. */ + viaFPSetSecondarySoftVDD(pScrn, FALSE); + + /* Turn off FP display period. */ + viaFPSetSecondaryDirectDisplayPeriod(pScrn, FALSE); + } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP0PCIeSetIOPadSetting.\n")); + "Exiting viaFPSecondarySoftPowerSeq.\n")); } -/* - * Sets PCIe based 2 chip chipset's pin multiplexed DVP1 I/O pad state. - */ static void -viaDVP1PCIeSetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState) +viaFPPrimaryHardPowerSeq(ScrnInfoPtr pScrn, Bool powerState) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP1PCIeSetIOPadSetting.\n")); + "Entered viaFPPrimaryHardPowerSeq.\n")); - /* Set pin multiplexed DVP0 I/O pad state. */ - /* 3C5.2A[1:0] - DVP1 I/O Pad Control */ - ViaSeqMask(hwp, 0x2A, ioPadState, 0x03); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP1 I/O Pad State: %d\n", - (ioPadState & 0x03)); + /* Use hardware FP power sequence control. */ + viaFPSetPrimaryPowerSeqType(pScrn, TRUE); + + if (powerState) { + /* Turn on FP display period. */ + viaFPSetPrimaryDirectDisplayPeriod(pScrn, TRUE); + + /* Turn on FP hardware power sequence. */ + viaFPSetPrimaryHardPower(pScrn, TRUE); + + /* Turn on FP back light. */ + viaFPSetPrimaryDirectBackLightCtrl(pScrn, TRUE); + + } else { + /* Turn off FP back light. */ + viaFPSetPrimaryDirectBackLightCtrl(pScrn, FALSE); + + /* Turn off FP hardware power sequence. */ + viaFPSetPrimaryHardPower(pScrn, FALSE); + + /* Turn on FP display period. */ + viaFPSetPrimaryDirectDisplayPeriod(pScrn, FALSE); + } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP1PCIeSetIOPadSetting.\n")); + "Entered viaFPPrimaryHardPowerSeq.\n")); } static void -viaFPIOPadSetting(ScrnInfoPtr pScrn, Bool ioPadOn) +viaFPSecondaryHardPowerSeq(ScrnInfoPtr pScrn, Bool powerState) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaFPIOPadSetting.\n")); + "Entered viaFPSecondaryHardPowerSeq.\n")); - if ((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) { + /* Use hardware FP power sequence control. */ + viaFPSetSecondaryPowerSeqType(pScrn, TRUE); - sr5a = hwp->readSeq(hwp, 0x5A); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR5A: 0x%02X\n", sr5a)); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Setting 3C5.5A[0] to 0.\n")); - ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01); + if (powerState) { + /* Turn on FP display period. */ + viaFPSetSecondaryDirectDisplayPeriod(pScrn, TRUE); + + /* Turn on FP hardware power sequence. */ + viaFPSetSecondaryHardPower(pScrn, TRUE); + + /* Turn on FP back light. */ + viaFPSetSecondaryDirectBackLightCtrl(pScrn, TRUE); + } else { + /* Turn off FP back light. */ + viaFPSetSecondaryDirectBackLightCtrl(pScrn, FALSE); + + /* Turn off FP hardware power sequence. */ + viaFPSetSecondaryHardPower(pScrn, FALSE); + + /* Turn off FP display period. */ + viaFPSetSecondaryDirectDisplayPeriod(pScrn, FALSE); } - sr12 = hwp->readSeq(hwp, 0x12); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR12: 0x%02X\n", sr12)); - sr13 = hwp->readSeq(hwp, 0x13); + "Exiting viaFPSecondaryHardPowerSeq.\n")); +} + +static void +viaFPPower(ScrnInfoPtr pScrn, int Chipset, uint32_t diPort, + Bool powerState) +{ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR13: 0x%02X\n", sr13)); + "Entered viaFPPower.\n")); - switch (pVia->Chipset) { + switch (Chipset) { case VIA_CLE266: + viaFPCastleRockSoftPowerSeq(pScrn, powerState); break; case VIA_KM400: - case VIA_K8M800: - case VIA_PM800: case VIA_P4M800PRO: - break; + case VIA_PM800: + case VIA_K8M800: case VIA_P4M890: case VIA_K8M890: case VIA_P4M900: - /* The tricky thing about VIA Technologies PCI Express based - * north bridge / south bridge 2 chip chipset is that - * it pin multiplexes DVP0 / DVP1 with north bridge's PCI - * Express x16 link. In particular, HP 2133 Mini-Note's WLAN - * is connected to north bridge's PCI Express Lane 0, but the - * Lane 0 is also pin multiplexed with DVP0. What this means is - * turning on DVP0 without probing the relevant strapping pin - * to determine the connected panel interface type will lead to - * the PCIe based WLAN to getting disabled by OpenChrome DDX - * when X.Org Server starts. - * The current remedy for this will be to turn on DVP0 - * only when an 18-bit / 24-bit interface flat panel is - * connected. */ - /* 3C5.12[4] - DVP0D4 pin strapping - * 0: Use DVP1 only for a flat panel. - * 1: Use DVP0 and DVP1 for a flat panel */ - if (sr12 & 0x10) { - /* Since an 18-bit / 24-bit flat panel is being used, actively - * control DVP0. */ - viaDVP0PCIeSetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); - } else { - /* Keep DVP0 powered down. Otherwise, it will interfere with - * PCIe Lane 0 through 7. */ - viaDVP0PCIeSetIOPadSetting(pScrn, 0x00); - } - - /* Control DVP1 for a flat panel. */ - viaDVP1PCIeSetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + viaFPPrimaryHardPowerSeq(pScrn, powerState); break; case VIA_CX700: case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - /* 3C5.13[7:6] - DVP1D15 and DVP1D14 pin strappings - * 00: LVDS1 + LVDS2 - * 01: DVI + LVDS2 - * 10: Dual LVDS (LVDS1 + LVDS2 used - * simultaneously) - * 11: DVI only */ - if ((((~(sr13 & 0x80)) && (~(sr13 & 0x40))) - || ((sr13 & 0x80) && (~(sr13 & 0x40)))) - && (!pVia->isVIANanoBook)) { - - viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + /* + * VX800, CX700 have HW issue, so we'd better use SW power sequence. + * Fix Ticket #308. + */ + if (diPort & VIA_DI_PORT_LVDS1) { + viaFPPrimarySoftPowerSeq(pScrn, powerState); + viaLVDS1SetPower(pScrn, powerState); } - if (((~(sr13 & 0x80)) || (~(sr13 & 0x40))) - || (pVia->isVIANanoBook)) { - - viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + if (diPort & VIA_DI_PORT_LVDS2) { + viaFPSecondarySoftPowerSeq(pScrn, powerState); + viaLVDS2SetPower(pScrn, powerState); } + + break; + case VIA_VX855: + case VIA_VX900: + viaFPPrimaryHardPowerSeq(pScrn, powerState); + viaLVDS1SetPower(pScrn, powerState); break; default: break; } - if ((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) { - - hwp->writeSeq(hwp, 0x5A, sr5a); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Restoring 3C5.5A[0].\n")); - } - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaFPIOPadSetting.\n")); + "Exiting viaFPPower.\n")); } static void -ViaLVDSSoftwarePowerFirstSequence(ScrnInfoPtr pScrn, Bool on) +viaFPIOPadState(ScrnInfoPtr pScrn, uint32_t diPort, Bool ioPadOn) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaLVDSSoftwarePowerFirstSequence: %d\n", on)); - if (on) { - - /* Software control power sequence ON*/ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0x7F); - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x01); - usleep(TD0); - - /* VDD ON*/ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x10); - usleep(TD1); - - /* DATA ON */ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x08); - usleep(TD2); - - /* VEE ON (unused on vt3353)*/ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x04); - usleep(TD3); - - /* Back-Light ON */ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) | 0x02); - } else { - /* Back-Light OFF */ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xFD); - usleep(TD3); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaFPIOPadState.\n")); - /* VEE OFF (unused on vt3353)*/ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xFB); - usleep(TD2); + switch(diPort) { + case VIA_DI_PORT_DVP0: + viaDVP0SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_DVP1: + viaDVP1SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_FPDPLOW: + viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_FPDPHIGH: + viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case (VIA_DI_PORT_FPDPLOW | + VIA_DI_PORT_FPDPHIGH): + viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_LVDS1: + viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_LVDS2: + viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case (VIA_DI_PORT_LVDS1 | + VIA_DI_PORT_LVDS2): + viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + break; + default: + break; + } - /* DATA OFF */ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xF7); - usleep(TD1); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP I/O Pad: %s\n", + ioPadOn ? "On": "Off"); - /* VDD OFF */ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xEF); - } + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaFPIOPadState.\n")); } static void -ViaLVDSSoftwarePowerSecondSequence(ScrnInfoPtr pScrn, Bool on) +viaFPFormat(ScrnInfoPtr pScrn, uint32_t diPort, CARD8 format) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaLVDSSoftwarePowerSecondSequence: %d\n", on)); - if (on) { - /* Secondary power hardware power sequence enable 0:off 1: on */ - hwp->writeCrtc(hwp, 0xD4, hwp->readCrtc(hwp, 0xD4) & 0xFD); - - /* Software control power sequence ON */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x01); - usleep(TD0); - - /* VDD ON*/ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x10); - usleep(TD1); - - /* DATA ON */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x08); - usleep(TD2); - - /* VEE ON (unused on vt3353)*/ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x04); - usleep(TD3); - - /* Back-Light ON */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) | 0x02); - } else { - /* Back-Light OFF */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xFD); - usleep(TD3); - - /* VEE OFF */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xFB); - /* Delay TD2 msec. */ - usleep(TD2); + CARD8 temp = format & 0x01; - /* DATA OFF */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xF7); - /* Delay TD1 msec. */ - usleep(TD1); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaFPFormat.\n")); - /* VDD OFF */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xEF); + switch(diPort) { + case VIA_DI_PORT_LVDS1: + viaLVDS1SetFormat(pScrn, temp); + break; + case VIA_DI_PORT_LVDS2: + viaLVDS2SetFormat(pScrn, temp); + break; + case (VIA_DI_PORT_LVDS1 | + VIA_DI_PORT_LVDS2): + viaLVDS1SetFormat(pScrn, temp); + viaLVDS2SetFormat(pScrn, temp); + break; + default: + break; } -} - -static void -ViaLVDSHardwarePowerFirstSequence(ScrnInfoPtr pScrn, Bool on) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - if (on) { - /* Use hardware control power sequence. */ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xFE); - /* Turn on back light. */ - hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0x3F); - /* Turn on hardware power sequence. */ - hwp->writeCrtc(hwp, 0x6A, hwp->readCrtc(hwp, 0x6A) | 0x08); - } else { - /* Turn off power sequence. */ - hwp->writeCrtc(hwp, 0x6A, hwp->readCrtc(hwp, 0x6A) & 0xF7); - usleep(1); - /* Turn off back light. */ - hwp->writeCrtc(hwp, 0x91, 0xC0); - } + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaFPFormat.\n")); } static void -ViaLVDSHardwarePowerSecondSequence(ScrnInfoPtr pScrn, Bool on) +viaFPOutputFormat(ScrnInfoPtr pScrn, uint32_t diPort, CARD8 outputFormat) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - - if (on) { - /* Use hardware control power sequence. */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xFE); - /* Turn on back light. */ - hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0x3F); - /* Turn on hardware power sequence. */ - hwp->writeCrtc(hwp, 0xD4, hwp->readCrtc(hwp, 0xD4) | 0x02); - } else { - /* Turn off power sequence. */ - hwp->writeCrtc(hwp, 0xD4, hwp->readCrtc(hwp, 0xD4) & 0xFD); - usleep(1); - /* Turn off back light. */ - hwp->writeCrtc(hwp, 0xD3, 0xC0); - } -} + CARD8 temp = outputFormat & 0x01; -static void -ViaLVDSPowerChannel(ScrnInfoPtr pScrn, Bool on) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 lvdsMask; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaFPOutputFormat.\n")); - if (on) { - /* LVDS0: 0x7F, LVDS1: 0xBF */ - lvdsMask = 0x7F & 0xBF; - hwp->writeCrtc(hwp, 0xD2, hwp->readCrtc(hwp, 0xD2) & lvdsMask); - } else { - /* LVDS0: 0x80, LVDS1: 0x40 */ - lvdsMask = 0x80 | 0x40; - hwp->writeCrtc(hwp, 0xD2, hwp->readCrtc(hwp, 0xD2) | lvdsMask); + switch(diPort) { + case VIA_DI_PORT_LVDS1: + viaLVDS1SetOutputFormat(pScrn, temp); + break; + case VIA_DI_PORT_LVDS2: + viaLVDS2SetOutputFormat(pScrn, temp); + break; + case (VIA_DI_PORT_LVDS1 | + VIA_DI_PORT_LVDS2): + viaLVDS1SetOutputFormat(pScrn, temp); + viaLVDS2SetOutputFormat(pScrn, temp); + break; + default: + break; } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaFPOutputFormat.\n")); } static void -ViaLVDSPower(ScrnInfoPtr pScrn, Bool Power_On) +viaFPDithering(ScrnInfoPtr pScrn, uint32_t diPort, Bool dithering) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - CARD8 crd2; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered ViaLVDSPower.\n")); + "Entered viaFPDithering.\n")); - /* - * VX800, CX700 have HW issue, so we'd better use SW power sequence - * Fix Ticket #308 - */ - switch (pVia->Chipset) { - case VIA_CX700: - case VIA_VX800: - - /* Is the integrated TMDS transmitter (DVI) not in use? */ - crd2 = hwp->readCrtc(hwp, 0xD2); - if (((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) - && (!(crd2 & 0x10))) { - ViaLVDSSoftwarePowerFirstSequence(pScrn, Power_On); - } - - ViaLVDSSoftwarePowerSecondSequence(pScrn, Power_On); + switch(diPort) { + case VIA_DI_PORT_LVDS1: + viaLVDS1SetDithering(pScrn, dithering); break; - - case VIA_VX855: - case VIA_VX900: - /* Is the integrated TMDS transmitter (DVI) not in use? */ - crd2 = hwp->readCrtc(hwp, 0xD2); - if (((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) - && (!(crd2 & 0x10))) { - ViaLVDSHardwarePowerFirstSequence(pScrn, Power_On); - } - - ViaLVDSHardwarePowerSecondSequence(pScrn, Power_On); + case VIA_DI_PORT_LVDS2: + viaLVDS2SetDithering(pScrn, dithering); + break; + case (VIA_DI_PORT_LVDS1 | + VIA_DI_PORT_LVDS2): + viaLVDS1SetDithering(pScrn, dithering); + viaLVDS2SetDithering(pScrn, dithering); break; default: - ViaLVDSHardwarePowerFirstSequence(pScrn, Power_On); - ViaLVDSHardwarePowerSecondSequence(pScrn, Power_On); break; } - ViaLVDSPowerChannel(pScrn, Power_On); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated LVDS Flat Panel Power: %s\n", - Power_On ? "On" : "Off"); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting ViaLVDSPower.\n")); + "Exiting viaFPDithering.\n")); } +/* + * Set FP sync polarity. + */ static void -ViaLCDPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRec Sequence) +viaFPSyncPolarity(ScrnInfoPtr pScrn, uint32_t diPort, unsigned int flags) { - int i; + CARD8 syncPolarity = 0x00; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaFPSyncPolarity.\n")); - for (i = 0; i < Sequence.numEntry; i++) { - ViaVgahwMask(hwp, 0x300 + Sequence.port[i], Sequence.offset[i], - 0x301 + Sequence.port[i], Sequence.data[i], - Sequence.mask[i]); - usleep(Sequence.delay[i]); + if (flags & V_NHSYNC) { + syncPolarity |= BIT(0); + } + + if (flags & V_NVSYNC) { + syncPolarity |= BIT(1); + } + + switch(diPort) { + case VIA_DI_PORT_DVP0: + viaDVP0SetSyncPolarity(pScrn, syncPolarity); + break; + case VIA_DI_PORT_DVP1: + viaDVP1SetSyncPolarity(pScrn, syncPolarity); + break; + case VIA_DI_PORT_FPDPLOW: + break; + case VIA_DI_PORT_FPDPHIGH: + break; + case (VIA_DI_PORT_FPDPLOW | + VIA_DI_PORT_FPDPHIGH): + break; + case VIA_DI_PORT_LVDS1: + viaLVDS1SetSyncPolarity(pScrn, syncPolarity); + break; + case VIA_DI_PORT_LVDS2: + viaLVDS2SetSyncPolarity(pScrn, syncPolarity); + break; + case (VIA_DI_PORT_LVDS1 | + VIA_DI_PORT_LVDS2): + viaLVDS1SetSyncPolarity(pScrn, syncPolarity); + viaLVDS2SetSyncPolarity(pScrn, syncPolarity); + break; + default: + break; } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+"); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaFPSyncPolarity.\n")); } static void -ViaLCDPower(xf86OutputPtr output, Bool Power_On) +viaFPDisplaySource(ScrnInfoPtr pScrn, uint32_t diPort, int index) { - ViaPanelInfoPtr Panel = output->driver_private; - ScrnInfoPtr pScrn = output->scrn; - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; - int i; + CARD8 displaySource = index & 0x01; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered ViaLCDPower.\n")); - - /* Enable LCD */ - if (Power_On) - ViaCrtcMask(hwp, 0x6A, 0x08, 0x08); - else - ViaCrtcMask(hwp, 0x6A, 0x00, 0x08); - - if (pBIOSInfo->LCDPower) - pBIOSInfo->LCDPower(pScrn, Power_On); - - /* Find Panel Size Index for PowerSeq Table */ - if (pVia->Chipset == VIA_CLE266) { - if (Panel->NativeModeIndex != VIA_PANEL_INVALID) { - for (i = 0; i < NumPowerOn; i++) { - if (lcdTable[Panel->PanelIndex].powerSeq - == powerOn[i].powerSeq) - break; - } - } else - i = 0; - } else - /* KM and K8M use PowerSeq Table index 2. */ - i = 2; - - usleep(1); - if (Power_On) - ViaLCDPowerSequence(hwp, powerOn[i]); - else - ViaLCDPowerSequence(hwp, powerOff[i]); - usleep(1); + "Entered viaFPDisplaySource.\n")); + switch(diPort) { + case VIA_DI_PORT_DVP0: + viaDVP0SetDisplaySource(pScrn, displaySource); + break; + case VIA_DI_PORT_DVP1: + viaDVP1SetDisplaySource(pScrn, displaySource); + break; + case VIA_DI_PORT_FPDPLOW: + viaFPDPLowSetDisplaySource(pScrn, displaySource); + viaDVP1SetDisplaySource(pScrn, displaySource); + break; + case VIA_DI_PORT_FPDPHIGH: + viaFPDPHighSetDisplaySource(pScrn, displaySource); + viaDVP0SetDisplaySource(pScrn, displaySource); + break; + case (VIA_DI_PORT_FPDPLOW | + VIA_DI_PORT_FPDPHIGH): + viaFPDPLowSetDisplaySource(pScrn, displaySource); + viaFPDPHighSetDisplaySource(pScrn, displaySource); + break; + case VIA_DI_PORT_LVDS1: + viaLVDS1SetDisplaySource(pScrn, displaySource); + break; + case VIA_DI_PORT_LVDS2: + viaLVDS2SetDisplaySource(pScrn, displaySource); + break; + case (VIA_DI_PORT_LVDS1 | + VIA_DI_PORT_LVDS2): + viaLVDS1SetDisplaySource(pScrn, displaySource); + viaLVDS2SetDisplaySource(pScrn, displaySource); + break; + default: + break; + } xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated LVDS Flat Panel Power: %s\n", - Power_On ? "On" : "Off"); + "FP Display Source: IGA%d\n", + displaySource + 1); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting ViaLCDPower.\n")); + "Exiting viaFPDisplaySource.\n")); } /* @@ -879,103 +698,40 @@ ViaPanelGetSizeFromEDID(ScrnInfoPtr pScrn, xf86MonPtr pMon, return FALSE; } -static Bool -ViaPanelGetSizeFromDDCv1(xf86OutputPtr output, int *width, int *height) -{ - ScrnInfoPtr pScrn = output->scrn; - VIAPtr pVia = VIAPTR(pScrn); - xf86MonPtr pMon; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered VIAGetPanelSizeFromDDCv1.\n")); - - if (!pVia->pI2CBus2) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "I2C Bus 2 does not exist.\n"); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting VIAGetPanelSizeFromDDCv1.\n")); - return FALSE; - } - - if (!xf86I2CProbeAddress(pVia->pI2CBus2, 0xA0)) { - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "I2C device on I2C Bus 2 does not support EDID.\n"); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting VIAGetPanelSizeFromDDCv1.\n")); - return FALSE; - } - - /* Probe I2C Bus 2 to see if a flat panel is connected. */ - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Probing for a flat panel on I2C Bus 2.\n"); - pMon = xf86OutputGetEDID(output, pVia->pI2CBus2); - if (pMon && DIGITAL(pMon->features.input_type)) { - xf86OutputSetEDID(output, pMon); - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Detected a flat panel on I2C Bus 2.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Did not detect a flat panel on I2C Bus 2.\n"); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting VIAGetPanelSizeFromDDCv1.\n")); - return FALSE; - - } - - if (!ViaPanelGetSizeFromEDID(pScrn, pMon, width, height)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unable to obtain panel size from EDID information.\n"); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting VIAGetPanelSizeFromDDCv1.\n")); - return FALSE; - } - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "VIAGetPanelSizeFromDDCv1: (%d X %d)\n", - *width, *height)); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting VIAGetPanelSizeFromDDCv1.\n")); - return TRUE; -} - /* * Gets the native panel resolution from scratch pad registers. */ static void -viaLVDSGetFPInfoFromScratchPad(xf86OutputPtr output) +viaFPGetFPInfoScratchPad(xf86OutputPtr output) { ScrnInfoPtr pScrn = output->scrn; - vgaHWPtr hwp = VGAHWPTR(pScrn); - ViaPanelInfoPtr panel = output->driver_private; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; + VIARegPtr Regs = &pVIADisplay->SavedReg; CARD8 index; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaLVDSGetFPInfoFromScratchPad.\n")); + "Entered %s.\n", __func__)); - index = hwp->readCrtc(hwp, 0x3F) & 0x0F; + index = Regs->CR[0x3F] & 0x0F; - panel->NativeModeIndex = index; - panel->NativeWidth = ViaPanelNativeModes[index].Width; - panel->NativeHeight = ViaPanelNativeModes[index].Height; - panel->useDualEdge = ViaPanelNativeModes[index].useDualEdge; - panel->useDithering = ViaPanelNativeModes[index].useDithering; + pVIAFP->NativeModeIndex = index; + pVIAFP->NativeWidth = ViaPanelNativeModes[index].Width; + pVIAFP->NativeHeight = ViaPanelNativeModes[index].Height; + pVIAFP->useDualEdge = ViaPanelNativeModes[index].useDualEdge; + pVIAFP->useDithering = ViaPanelNativeModes[index].useDithering; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIA Technologies VGA BIOS Scratch Pad Register " "Flat Panel Index: %d\n", - panel->NativeModeIndex); + pVIAFP->NativeModeIndex); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Flat Panel Native Resolution: %dx%d\n", - panel->NativeWidth, panel->NativeHeight); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Flat Panel Dual Edge Transfer: %s\n", - panel->useDualEdge ? "On" : "Off"); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Flat Panel Output Color Dithering: %s\n", - panel->useDithering ? "On (18 bit)" : "Off (24 bit)"); + pVIAFP->NativeWidth, pVIAFP->NativeHeight); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaLVDSGetFPInfoFromScratchPad.\n")); + "Exiting %s.\n", __func__)); } static void @@ -1111,87 +867,158 @@ ViaPanelScaleDisable(ScrnInfoPtr pScrn) ViaCrtcMask(hwp, 0xA2, 0x00, 0xC8); } +static int +viaGetClockRangeIndex(int Clock) +{ + if (Clock < VIA_DPA_CLK_30M) { + return VIA_DPA_CLK_RANGE_30M; + } else if ((Clock >= VIA_DPA_CLK_30M) && (Clock < VIA_DPA_CLK_50M)) { + return VIA_DPA_CLK_RANGE_30M_50M; + } else if ((Clock >= VIA_DPA_CLK_50M) && (Clock < VIA_DPA_CLK_70M)) { + return VIA_DPA_CLK_RANGE_50M_70M; + } else if ((Clock >= VIA_DPA_CLK_70M) && (Clock < VIA_DPA_CLK_100M)) { + return VIA_DPA_CLK_RANGE_70M_100M; + } else if ((Clock >= VIA_DPA_CLK_100M) && (Clock < VIA_DPA_CLK_150M)) { + return VIA_DPA_CLK_RANGE_100M_150M; + } else { + return VIA_DPA_CLK_RANGE_150M; + } +} + +static void +viaLoadDPA(ScrnInfoPtr pScrn, uint32_t diPort, VIADPAPtr pVIADPA) +{ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaLoadDPA.\n")); + + if (!pVIADPA) { + goto exit; + } + + switch (diPort) { + case VIA_DI_PORT_DVP0: + viaDVP0SetAdjustment(pScrn, pVIADPA->dvp0Adjustment); + viaDVP0SetClockDriveStrength(pScrn, pVIADPA->dvp0ClockDriveStrength); + viaDVP0SetDataDriveStrength(pScrn, pVIADPA->dvp0DataDriveStrength); + break; + case VIA_DI_PORT_DVP1: + viaDVP1SetAdjustment(pScrn, pVIADPA->dvp1Adjustment); + viaDVP1SetClockDriveStrength(pScrn, pVIADPA->dvp1ClockDriveStrength); + viaDVP1SetDataDriveStrength(pScrn, pVIADPA->dvp1DataDriveStrength); + break; + case VIA_DI_PORT_FPDPLOW: + viaFPDPLowSetAdjustment(pScrn, pVIADPA->fpdpLowAdjustment); + break; + case VIA_DI_PORT_FPDPHIGH: + viaFPDPHighSetAdjustment(pScrn, pVIADPA->fpdpHighAdjustment); + break; + case (VIA_DI_PORT_FPDPHIGH | + VIA_DI_PORT_FPDPLOW): + viaFPDPLowSetAdjustment(pScrn, pVIADPA->fpdpLowAdjustment); + viaFPDPHighSetAdjustment(pScrn, pVIADPA->fpdpHighAdjustment); + break; + default: + break; + } + +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaLoadDPA.\n")); +} + +static void +viaFPIOAdjustment(ScrnInfoPtr pScrn, + int Chipset, uint32_t diPort, int Clock) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIADPAInfoTablePtr pVIADPAInfoTable; + VIADPAPtr pVIADPA; + Bool isDPATableExist = FALSE; + int clockRangeIndex = 0; + int i = 0; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaFPIOAdjustment.\n")); + + for (i = 0; i < NUMBER_VIA_DPA_TABLE; i++) { + if (pVia->Chipset == viaDPAIndexTable[i].Chipset) { + isDPATableExist = TRUE; + break; + } + } + + if (isDPATableExist) { + if (viaDPAIndexTable[i].pFPDPATable) { + pVIADPAInfoTable = viaDPAIndexTable[i].pFPDPATable; + } + + clockRangeIndex = viaGetClockRangeIndex(Clock); + + /* Write the value to the register. */ + pVIADPA = pVIADPAInfoTable[clockRangeIndex].pDPASetting; + viaLoadDPA(pScrn, diPort, pVIADPA); + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaFPIOAdjustment.\n")); +} + static void -via_lvds_create_resources(xf86OutputPtr output) +via_fp_create_resources(xf86OutputPtr output) { } static void -via_lvds_dpms(xf86OutputPtr output, int mode) +via_fp_dpms(xf86OutputPtr output, int mode) { ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_fp_dpms.\n")); switch (mode) { case DPMSModeOn: - switch (pVia->Chipset) { - case VIA_PM800: - case VIA_P4M800PRO: - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_CX700: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - ViaLVDSPower(pScrn, TRUE); - break; - default: - ViaLCDPower(output, TRUE); - break; - } - - viaFPIOPadSetting(pScrn, TRUE); + viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, TRUE); + viaFPIOPadState(pScrn, pVIAFP->diPort, TRUE); break; - case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: - switch (pVia->Chipset) { - case VIA_PM800: - case VIA_P4M800PRO: - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_CX700: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - ViaLVDSPower(pScrn, FALSE); - break; - default: - ViaLCDPower(output, FALSE); - break; - } - - viaFPIOPadSetting(pScrn, FALSE); + viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, FALSE); + viaFPIOPadState(pScrn, pVIAFP->diPort, FALSE); + break; + default: break; } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_fp_dpms.\n")); } static void -via_lvds_save(xf86OutputPtr output) +via_fp_save(xf86OutputPtr output) { } static void -via_lvds_restore(xf86OutputPtr output) +via_fp_restore(xf86OutputPtr output) { - ViaLCDPower(output, TRUE); } static int -via_lvds_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) +via_fp_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) { ScrnInfoPtr pScrn = output->scrn; - ViaPanelInfoPtr Panel = output->driver_private; + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; - if (Panel->NativeWidth < pMode->HDisplay || - Panel->NativeHeight < pMode->VDisplay) + if (pVIAFP->NativeWidth < pMode->HDisplay || + pVIAFP->NativeHeight < pMode->VDisplay) return MODE_PANEL; - if (!Panel->Scale && Panel->NativeHeight != pMode->VDisplay && - Panel->NativeWidth != pMode->HDisplay) + if (!pVIAFP->Scale && pVIAFP->NativeHeight != pMode->VDisplay && + pVIAFP->NativeWidth != pMode->HDisplay) return MODE_PANEL; if (!ViaModeDotClockTranslate(pScrn, pMode)) @@ -1201,149 +1028,182 @@ via_lvds_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) } static Bool -via_lvds_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, +via_fp_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { - ViaPanelInfoPtr Panel = output->driver_private; + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; xf86SetModeCrtc(adjusted_mode, 0); - if (!Panel->Center && (mode->HDisplay < Panel->NativeWidth || - mode->VDisplay < Panel->NativeHeight)) { - Panel->Scale = TRUE; + if (!pVIAFP->Center && (mode->HDisplay < pVIAFP->NativeWidth || + mode->VDisplay < pVIAFP->NativeHeight)) { + pVIAFP->Scale = TRUE; } else { - Panel->Scale = FALSE; + pVIAFP->Scale = FALSE; ViaPanelCenterMode(mode, adjusted_mode); } return TRUE; } static void -via_lvds_prepare(xf86OutputPtr output) +via_fp_prepare(xf86OutputPtr output) { ScrnInfoPtr pScrn = output->scrn; + VIAPtr pVia = VIAPTR(pScrn); + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_fp_prepare.\n")); - via_lvds_dpms(output, DPMSModeOff); - viaFPIOPadSetting(pScrn, FALSE); + viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, FALSE); + viaFPIOPadState(pScrn, pVIAFP->diPort, FALSE); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_fp_prepare.\n")); } static void -via_lvds_commit(xf86OutputPtr output) +via_fp_commit(xf86OutputPtr output) { ScrnInfoPtr pScrn = output->scrn; + VIAPtr pVia = VIAPTR(pScrn); + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_fp_commit.\n")); + + viaFPPower(pScrn, pVia->Chipset, pVIAFP->diPort, TRUE); + viaFPIOPadState(pScrn, pVIAFP->diPort, TRUE); - via_lvds_dpms(output, DPMSModeOn); - viaFPIOPadSetting(pScrn, TRUE); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_fp_commit.\n")); } static void -via_lvds_mode_set(xf86OutputPtr output, DisplayModePtr mode, +via_fp_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { - ViaPanelInfoPtr Panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; drmmode_crtc_private_ptr iga = output->crtc->driver_private; VIAPtr pVia = VIAPTR(pScrn); + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; if (output->crtc) { - if (Panel->Scale) { + if (pVIAFP->Scale) { ViaPanelScale(pScrn, mode->HDisplay, mode->VDisplay, - Panel->NativeWidth, - Panel->NativeHeight); + pVIAFP->NativeWidth, + pVIAFP->NativeHeight); } else { ViaPanelScaleDisable(pScrn); } - switch (pVia->Chipset) { - case VIA_P4M900: - viaDFPLowSetDelayTap(pScrn, 0x08); - break; - case VIA_CX700: - viaLVDS2SetDelayTap(pScrn, 0x01); - break; - default: - break; - } - + viaFPIOAdjustment(pScrn, + pVia->Chipset, pVIAFP->diPort, + adjusted_mode->Clock); switch (pVia->Chipset) { - case VIA_KM400: - case VIA_K8M800: - case VIA_PM800: - case VIA_P4M800PRO: - viaDFPLowSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); - viaDFPHighSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); - break; - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - viaDFPLowSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); - viaDVP1SetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); - break; case VIA_CX700: case VIA_VX800: case VIA_VX855: case VIA_VX900: - viaLVDS2SetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); - - /* Set LVDS2 output color dithering. */ - viaLVDS2SetDithering(pScrn, Panel->useDithering ? TRUE : FALSE); + /* OPENLDI Mode */ + viaFPFormat(pScrn, pVIAFP->diPort, 0x01); - /* Set LVDS2 output format to sequential mode. */ - viaLVDS2SetOutputFormat(pScrn, 0x01); + /* Sequential Mode */ + viaFPOutputFormat(pScrn, pVIAFP->diPort, 0x01); - /* Set LVDS2 output to OPENLDI mode. */ - viaLVDS2SetFormat(pScrn, 0x01); + viaFPDithering(pScrn, pVIAFP->diPort, pVIAFP->useDithering); break; default: break; } + + viaFPSyncPolarity(pScrn, pVIAFP->diPort, adjusted_mode->Flags); + viaFPDisplaySource(pScrn, pVIAFP->diPort, iga->index); } } static xf86OutputStatus -via_lvds_detect(xf86OutputPtr output) +via_fp_detect(xf86OutputPtr output) { - xf86OutputStatus status = XF86OutputStatusDisconnected; ScrnInfoPtr pScrn = output->scrn; + xf86MonPtr pMon; + xf86OutputStatus status = XF86OutputStatusDisconnected; + I2CBusPtr pI2CBus; VIAPtr pVia = VIAPTR(pScrn); - ViaPanelInfoPtr panel = output->driver_private; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered via_lvds_detect.\n")); + "Entered via_fp_detect.\n")); /* Hardcode panel size for the OLPC XO-1.5. */ - if (pVia->IsOLPCXO15) { + if (pVIADisplay->isOLPCXO15) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Setting up OLPC XO-1.5 flat panel.\n"); - panel->NativeWidth = 1200; - panel->NativeHeight = 900; + pVIAFP->NativeWidth = 1200; + pVIAFP->NativeHeight = 900; status = XF86OutputStatusConnected; goto exit; } - /* For now, FP detection code will not scan the I2C bus - * in order to obtain EDID since it is often used by DVI - * as well. Hence, reading off the CRTC scratch pad register - * supplied by the VGA BIOS is the only method available - * to figure out the FP native screen resolution. */ - viaLVDSGetFPInfoFromScratchPad(output); - status = XF86OutputStatusConnected; + if (pVIAFP->i2cBus & VIA_I2C_BUS2) { + pI2CBus = pVIADisplay->pI2CBus2; + } else if (pVIAFP->i2cBus & VIA_I2C_BUS3) { + pI2CBus = pVIADisplay->pI2CBus3; + } else { + pI2CBus = NULL; + } + + if (pI2CBus) { + pMon = xf86OutputGetEDID(output, pI2CBus); + if (pMon && DIGITAL(pMon->features.input_type)) { + xf86OutputSetEDID(output, pMon); + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Detected a flat panel.\n"); + if (!ViaPanelGetSizeFromEDID(pScrn, pMon, &pVIAFP->NativeWidth, &pVIAFP->NativeHeight)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to obtain panel size from EDID.\n"); + goto exit; + } + + status = XF86OutputStatusConnected; + } else { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Could not obtain EDID from a flat " + "panel, but will obtain flat panel " + "information from scratch pad register.\n"); + + /* For FP without I2C bus connection, CRTC scratch pad + * register supplied by the VGA BIOS is the only method + * available to figure out the FP native screen resolution. */ + viaFPGetFPInfoScratchPad(output); + status = XF86OutputStatusConnected; + } + } else { + /* For FP without I2C bus connection, CRTC scratch pad + * register supplied by the VGA BIOS is the only method + * available to figure out the FP native screen resolution. */ + viaFPGetFPInfoScratchPad(output); + status = XF86OutputStatusConnected; + } exit: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting via_lvds_detect.\n")); + "Exiting via_fp_detect.\n")); return status; } static DisplayModePtr -via_lvds_get_modes(xf86OutputPtr output) +via_fp_get_modes(xf86OutputPtr output) { - ViaPanelInfoPtr pPanel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; DisplayModePtr pDisplay_Mode = NULL; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIAFPPtr pVIAFP = (VIAFPPtr) output->driver_private; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered via_lvds_get_modes.\n")); + "Entered via_fp_get_modes.\n")); if (output->status == XF86OutputStatusConnected) { if (!output->MonInfo) { @@ -1351,13 +1211,11 @@ via_lvds_get_modes(xf86OutputPtr output) * Generates a display mode for the native panel resolution, * using CVT. */ - if (pPanel->NativeWidth && pPanel->NativeHeight) { - VIAPtr pVia = VIAPTR(pScrn); - - if (pVia->IsOLPCXO15) { + if (pVIAFP->NativeWidth && pVIAFP->NativeHeight) { + if (pVIADisplay->isOLPCXO15) { pDisplay_Mode = xf86DuplicateMode(&OLPCMode); } else { - pDisplay_Mode = xf86CVTMode(pPanel->NativeWidth, pPanel->NativeHeight, + pDisplay_Mode = xf86CVTMode(pVIAFP->NativeWidth, pVIAFP->NativeHeight, 60.0f, FALSE, FALSE); } @@ -1385,131 +1243,340 @@ via_lvds_get_modes(xf86OutputPtr output) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Invalid Flat Panel Screen Resolution: " "%dx%d\n", - pPanel->NativeWidth, pPanel->NativeHeight); + pVIAFP->NativeWidth, pVIAFP->NativeHeight); } } else { pDisplay_Mode = xf86OutputGetEDIDModes(output); } } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting via_lvds_get_modes.\n")); + "Exiting via_fp_get_modes.\n")); return pDisplay_Mode; } #ifdef RANDR_12_INTERFACE static Bool -via_lvds_set_property(xf86OutputPtr output, Atom property, +via_fp_set_property(xf86OutputPtr output, Atom property, RRPropertyValuePtr value) { return FALSE; } static Bool -via_lvds_get_property(xf86OutputPtr output, Atom property) +via_fp_get_property(xf86OutputPtr output, Atom property) { return FALSE; } #endif static void -via_lvds_destroy(xf86OutputPtr output) +via_fp_destroy(xf86OutputPtr output) { if (output->driver_private) free(output->driver_private); output->driver_private = NULL; } -static const xf86OutputFuncsRec via_lvds_funcs = { - .create_resources = via_lvds_create_resources, - .dpms = via_lvds_dpms, - .save = via_lvds_save, - .restore = via_lvds_restore, - .mode_valid = via_lvds_mode_valid, - .mode_fixup = via_lvds_mode_fixup, - .prepare = via_lvds_prepare, - .commit = via_lvds_commit, - .mode_set = via_lvds_mode_set, - .detect = via_lvds_detect, - .get_modes = via_lvds_get_modes, +static const xf86OutputFuncsRec via_fp_funcs = { + .create_resources = via_fp_create_resources, + .dpms = via_fp_dpms, + .save = via_fp_save, + .restore = via_fp_restore, + .mode_valid = via_fp_mode_valid, + .mode_fixup = via_fp_mode_fixup, + .prepare = via_fp_prepare, + .commit = via_fp_commit, + .mode_set = via_fp_mode_set, + .detect = via_fp_detect, + .get_modes = via_fp_get_modes, #ifdef RANDR_12_INTERFACE - .set_property = via_lvds_set_property, + .set_property = via_fp_set_property, #endif #ifdef RANDR_13_INTERFACE - .get_property = via_lvds_get_property, + .get_property = via_fp_get_property, #endif - .destroy = via_lvds_destroy + .destroy = via_fp_destroy }; - void -via_lvds_init(ScrnInfoPtr pScrn) +viaFPProbe(ScrnInfoPtr pScrn) { - ViaPanelInfoPtr Panel = (ViaPanelInfoPtr) xnfcalloc(sizeof(ViaPanelInfoRec), 1); - OptionInfoPtr Options = xnfalloc(sizeof(ViaPanelOptions)); - MessageType from = X_DEFAULT; - VIAPtr pVia = VIAPTR(pScrn); - xf86OutputPtr output = NULL; vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 cr3b = 0x00; - CARD8 cr3b_mask = 0x00; - char outputNameBuffer[32]; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + CARD8 sr12, sr13, sr5a; + CARD8 cr3b; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); - if (!Panel) - return; + sr12 = hwp->readSeq(hwp, 0x12); + sr13 = hwp->readSeq(hwp, 0x13); + cr3b = hwp->readCrtc(hwp, 0x3B); - /* Apparently this is the way VIA Technologies passes */ - /* the presence of a flat panel to the device driver */ - /* via BIOS setup. */ - if (pVia->Chipset == VIA_CLE266) { - cr3b_mask = 0x08; - } else { - cr3b_mask = 0x02; - } + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "SR12: 0x%02X\n", sr12)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "SR13: 0x%02X\n", sr13)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "CR3B: 0x%02X\n", sr13)); + + /* Detect the presence of FPs. */ + switch (pVia->Chipset) { + case VIA_CLE266: + if ((sr12 & BIT(4)) || (cr3b & BIT(3))) { + pVIADisplay->intFP1Presence = TRUE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_DIP0; + } else { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + } + + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + break; + case VIA_KM400: + case VIA_K8M800: + case VIA_P4M800PRO: + case VIA_PM800: + /* 3C5.13[3] - DVP0D8 pin strapping + * 0: AGP pins are used for AGP + * 1: AGP pins are used by FPDP + * (Flat Panel Display Port) */ + if ((sr13 & BIT(3)) && (cr3b & BIT(1))) { + pVIADisplay->intFP1Presence = TRUE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPHIGH + | VIA_DI_PORT_FPDPLOW; + } else { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + } + + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + break; + case VIA_P4M890: + case VIA_K8M890: + case VIA_P4M900: + if (cr3b & BIT(1)) { + + /* 3C5.12[4] - DVP0D4 pin strapping + * 0: 12-bit FPDP (Flat Panel Display Port) + * 1: 24-bit FPDP (Flat Panel Display Port) */ + if (sr12 & BIT(4)) { + pVIADisplay->intFP1Presence = TRUE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPLOW | + VIA_DI_PORT_FPDPHIGH; + } else { + pVIADisplay->intFP1Presence = TRUE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_FPDPLOW; + } + } else { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + + } + + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + break; + case VIA_CX700: + case VIA_VX800: + case VIA_VX855: + case VIA_VX900: + sr5a = hwp->readSeq(hwp, 0x5A); + + /* Setting SR5A[0] to 1. + * This allows the reading out the alternative + * pin strapping information from SR12 and SR13. */ + ViaSeqMask(hwp, 0x5A, BIT(0), BIT(0)); - cr3b = hwp->readCrtc(hwp, 0x3B) & cr3b_mask; + sr13 = hwp->readSeq(hwp, 0x13); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "SR13: 0x%02X\n", sr13)); + + if (cr3b & BIT(1)) { + if (pVIADisplay->isVIANanoBook) { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + pVIADisplay->intFP2Presence = TRUE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2; + + } else if (pVIADisplay->isQuantaIL1) { + /* From the Quanta IL1 schematic. */ + pVIADisplay->intFP1Presence = TRUE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_DVP1; + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + + } else if (pVIADisplay->isSamsungNC20) { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + pVIADisplay->intFP2Presence = TRUE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2; + + /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select + * (DVP1D15-14 pin strapping) + * 00: LVDS1 + LVDS2 + * 01: DVI + LVDS2 + * 10: Dual LVDS Channel (High Resolution Panel) + * 11: One DVI only (decrease the clock jitter) */ + } else if ((!(sr13 & BIT(7))) && (!(sr13 & BIT(6)))) { + pVIADisplay->intFP1Presence = TRUE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_LVDS1; + + /* + * For now, don't support the second FP. + */ + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + } else if ((!(sr13 & BIT(7))) && (sr13 & BIT(6))) { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + pVIADisplay->intFP2Presence = TRUE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_LVDS2; + } else if ((sr13 & BIT(7)) && (!(sr13 & BIT(6)))) { + pVIADisplay->intFP1Presence = TRUE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_LVDS1 + | VIA_DI_PORT_LVDS2; + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + } else { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + } + } else { + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + } + + hwp->writeSeq(hwp, 0x5A, sr5a); + break; + default: + pVIADisplay->intFP1Presence = FALSE; + pVIADisplay->intFP1DIPort = VIA_DI_PORT_NONE; + pVIADisplay->intFP2Presence = FALSE; + pVIADisplay->intFP2DIPort = VIA_DI_PORT_NONE; + break; + } + + pVIADisplay->intFP1I2CBus = VIA_I2C_NONE; + pVIADisplay->intFP2I2CBus = VIA_I2C_NONE; - if (!cr3b) { - return; + if ((pVIADisplay->intFP1Presence) + && (!(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2))) { + pVIADisplay->intFP1I2CBus = VIA_I2C_BUS2; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2; } - memcpy(Options, ViaPanelOptions, sizeof(ViaPanelOptions)); - xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, Options); + if ((pVIADisplay->intFP2Presence) + && (!(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2))) { + pVIADisplay->intFP2I2CBus = VIA_I2C_BUS2; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); +} + +void +viaFPInit(ScrnInfoPtr pScrn) +{ + xf86OutputPtr output; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIAFPPtr pVIAFP; + char outputNameBuffer[32]; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entering viaFPInit.\n")); + + if (pVIADisplay->intFP1Presence) { + pVIAFP = (VIAFPPtr) xnfcalloc(1, sizeof(VIAFPRec)); + if (!pVIAFP) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate private storage for " + "FP.\n")); + goto exit; + } + + /* The code to dynamically designate a particular FP (i.e., FP-1, + * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */ + sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1)); + output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer); + if (!output) { + free(pVIAFP); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate X Server display output record for " + "FP.\n"); + goto exit; + } - Panel->NativeModeIndex = VIA_PANEL_INVALID; + /* Increment the number of FP connectors. */ + pVIADisplay->numberFP++; - /* LCD Center/Expend Option */ - Panel->Center = FALSE; - from = xf86GetOptValBool(Options, OPTION_CENTER, &Panel->Center) - ? X_CONFIG : X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, from, "LVDS-0 : DVI Center is %s.\n", - Panel->Center ? "enabled" : "disabled"); + pVIAFP->diPort = pVIADisplay->intFP1DIPort; - /* The code to dynamically designate a particular FP (i.e., FP-1, - * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */ - sprintf(outputNameBuffer, "FP-%d", (pVia->numberFP + 1)); - output = xf86OutputCreate(pScrn, &via_lvds_funcs, outputNameBuffer); + /* Hint about which I2C bus to access for obtaining EDID. */ + pVIAFP->i2cBus = pVIADisplay->intFP1I2CBus; - if (output) { - output->driver_private = Panel; + output->driver_private = pVIAFP; - /* While there are two (2) display controllers registered with the - * X.Org Server, it is often desirable to fix FP (Flat Panel) to - * IGA2 since only IGA2 contains panel resolution scaling - * functionality. IGA1 does not have this. */ - output->possible_crtcs = 1 << 1; + output->possible_crtcs = BIT(1) | BIT(0); output->possible_clones = 0; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; - /* Increment the number of FP connectors. */ - pVia->numberFP++; - - if (pVia->IsOLPCXO15) { + if (pVIADisplay->isOLPCXO15) { output->mm_height = 152; output->mm_width = 114; } - } else { - free(Panel); } + + if (pVIADisplay->intFP2Presence) { + pVIAFP = (VIAFPPtr) xnfcalloc(1, sizeof(VIAFPRec)); + if (!pVIAFP) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate private storage for " + "FP.\n")); + goto exit; + } + + /* The code to dynamically designate a particular FP (i.e., FP-1, + * FP-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */ + sprintf(outputNameBuffer, "FP-%d", (pVIADisplay->numberFP + 1)); + output = xf86OutputCreate(pScrn, &via_fp_funcs, outputNameBuffer); + if (!output) { + free(pVIAFP); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate X Server display output record for " + "FP.\n"); + goto exit; + } + + /* Increment the number of FP connectors. */ + pVIADisplay->numberFP++; + + pVIAFP->diPort = pVIADisplay->intFP2DIPort; + + /* Hint about which I2C bus to access for obtaining EDID. */ + pVIAFP->i2cBus = pVIADisplay->intFP2I2CBus; + + output->driver_private = pVIAFP; + + output->possible_crtcs = BIT(1) | BIT(0); + + output->possible_clones = 0; + output->interlaceAllowed = FALSE; + output->doubleScanAllowed = FALSE; + } + +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaFPInit.\n")); } diff --git a/src/via_fp.h b/src/via_fp.h new file mode 100644 index 0000000..afce38b --- /dev/null +++ b/src/via_fp.h @@ -0,0 +1,254 @@ +/* + * Copyright 2017-2018 Kevin Brace. All Rights Reserved. + * Copyright 2007-2015 OpenChrome Project + * [https://www.freedesktop.org/wiki/Openchrome] + * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/* + * via_fp.h + * + * Header file for via_fp.c. + */ + +#ifndef _VIA_FP_H_ +#define _VIA_FP_H_ 1 + + +/* + * These FP DPA parameters were copied from VIA Technologies + * xf86-video-via v83-44398 source code. + */ + + +/* + * P4M890 chipset FP DPA parameters default setting. + */ +static VIADPARec viaDPAP4M890ClockDefault[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x07, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x04, 0x08} +}; + +/* + * P4M890 chipset FP DPA parameters for dot clock at or above 50 MHz + * but below 70 MHz. + */ +static VIADPARec viaDPAP4M890Clock50M70M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x06, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x04, 0x08} +}; + +/* + * P4M890 chipset FP DPA parameters for dot clock at or above 70 MHz + * but below 100 MHz. + */ +static VIADPARec viaDPAP4M890Clock70M100M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x04, 0x08} +}; + +/* + * P4M890 chipset FP DPA parameters for dot clock at or above 100 MHz + * but below 150 MHz. + */ +static VIADPARec viaDPAP4M890Clock100M150M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x04, 0x01} +}; + +/* + * P4M890 chipset FP DPA parameters for dot clock at or above 150 MHz. + */ +static VIADPARec viaDPAP4M890Clock150M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x01, 0x02, 0x02, + 0x03, 0x00, 0x00, + 0x04, 0x0D} +}; + +/* + * P4M890 Chipset FP DPA (Digital Panel Adjustment?) Table + */ +static VIADPAInfoTableRec viaDPAFPP4M890[] = { + { VIA_DPA_CLK_RANGE_30M, viaDPAP4M890ClockDefault}, + { VIA_DPA_CLK_RANGE_30M_50M, viaDPAP4M890ClockDefault}, + { VIA_DPA_CLK_RANGE_50M_70M, viaDPAP4M890Clock50M70M}, + { VIA_DPA_CLK_RANGE_70M_100M, viaDPAP4M890Clock70M100M}, + { VIA_DPA_CLK_RANGE_100M_150M, viaDPAP4M890Clock100M150M}, + { VIA_DPA_CLK_RANGE_150M, viaDPAP4M890Clock150M} +}; + + +/* + * K8M890 chipset FP DPA parameters default setting. + */ +static VIADPARec viaDPAK8M890ClockDefault[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x04, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x04, 0x04} +}; + +/* + * K8M890 chipset FP DPA parameters for dot clock at or above 50 MHz + * but below 70 MHz. + */ +static VIADPARec viaDPAK8M890Clock50M70M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x06, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x04, 0x02} +}; + +/* + * K8M890 chipset FP DPA parameters for dot clock at or above 70 MHz + * but below 100 MHz. + */ +static VIADPARec viaDPAK8M890Clock70M100M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x02, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x02, 0x02} +}; + +/* + * K8M890 chipset FP DPA parameters for dot clock at or above 100 MHz + * but below 150 MHz. + */ +static VIADPARec viaDPAK8M890Clock100M150M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x02, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x02, 0x02} +}; + +/* + * K8M890 chipset FP DPA parameters for dot clock at or above 150 MHz. + */ +static VIADPARec viaDPAK8M890Clock150M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x03, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x02, 0x02} +}; + +/* + * K8M890 Chipset FP DPA (Digital Panel Adjustment?) Table + */ +static VIADPAInfoTableRec viaDPAFPK8M890[] = { + { VIA_DPA_CLK_RANGE_30M, viaDPAK8M890ClockDefault}, + { VIA_DPA_CLK_RANGE_30M_50M, viaDPAK8M890ClockDefault}, + { VIA_DPA_CLK_RANGE_50M_70M, viaDPAK8M890Clock50M70M}, + { VIA_DPA_CLK_RANGE_70M_100M, viaDPAK8M890Clock70M100M}, + { VIA_DPA_CLK_RANGE_100M_150M, viaDPAK8M890Clock100M150M}, + { VIA_DPA_CLK_RANGE_150M, viaDPAK8M890Clock150M} +}; + + +/* + * P4M900 chipset FP DPA parameters default setting. + */ +static VIADPARec viaDPAP4M900ClockDefault[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x07, 0x00, 0x00, + 0x03, 0x00, 0x00, + 0x08, 0x00} +}; + +/* + * P4M900 chipset FP DPA parameters for dot clock at or above 100 MHz + * but below 150 MHz. + */ +static VIADPARec viaDPAP4M900Clock100M150M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x03, 0x00, 0x01, + 0x03, 0x00, 0x00, + 0x08, 0x00} +}; + +/* + * P4M900 chipset FP DPA parameters for dot clock at or above 150 MHz. + */ +static VIADPARec viaDPAP4M900Clock150M[] = { + /* DVP0 Adjustment, DVP0 Clock Drive, DVP0 Data Drive, + * DVP1 Adjustment, DVP1 Clock Drive, DVP1 Data Drive, + * FPDP Low Adjustment, FPDP High Adjustment */ + { 0x01, 0x02, 0x01, + 0x03, 0x00, 0x00, + 0x08, 0x00} +}; + +/* + * P4M900 Chipset FP DPA (Digital Panel Adjustment?) Table + */ +static VIADPAInfoTableRec viaDPAFPP4M900[] = { + { VIA_DPA_CLK_RANGE_30M, viaDPAP4M900ClockDefault}, + { VIA_DPA_CLK_RANGE_30M_50M, viaDPAP4M900ClockDefault}, + { VIA_DPA_CLK_RANGE_50M_70M, viaDPAP4M900ClockDefault}, + { VIA_DPA_CLK_RANGE_70M_100M, viaDPAP4M900ClockDefault}, + { VIA_DPA_CLK_RANGE_100M_150M, viaDPAP4M900Clock100M150M}, + { VIA_DPA_CLK_RANGE_150M, viaDPAP4M900Clock150M} +}; + + +static VIA_DPA_INDEX_TABLE viaDPAIndexTable[] = { +// {VIA_CX700, NULL, NULL}, + {VIA_P4M890, NULL, viaDPAFPP4M890}, + {VIA_K8M890, NULL, viaDPAFPK8M890}, + {VIA_P4M900, NULL, viaDPAFPP4M900}, +// {VIA_VX800, NULL, NULL} +}; + +#endif /* _VIA_FP_H_ */ diff --git a/src/via_i2c.c b/src/via_i2c.c index c985dc2..91e1add 100644 --- a/src/via_i2c.c +++ b/src/via_i2c.c @@ -39,6 +39,12 @@ #define SDA_WRITE 0x10 #define SCL_WRITE 0x20 + +static char strI2CBus1[] = "I2C Bus 1"; +static char strI2CBus2[] = "I2C Bus 2"; +static char strI2CBus3[] = "I2C Bus 3"; + + /* * First I2C Bus: Typically used for detecting a VGA monitor. */ @@ -61,7 +67,10 @@ static void ViaI2C1GetBits(I2CBusPtr Bus, int *clock, int *data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; - CARD8 value = hwp->readSeq(hwp, 0x26); + CARD8 value; + + ViaSeqMask(hwp, 0x26, 0x01, 0x01); + value = hwp->readSeq(hwp, 0x26); *clock = (value & SCL_READ) != 0; *data = (value & SDA_READ) != 0; @@ -70,12 +79,13 @@ ViaI2C1GetBits(I2CBusPtr Bus, int *clock, int *data) static I2CBusPtr ViaI2CBus1Init(ScrnInfoPtr pScrn) { + vgaHWPtr hwp = VGAHWPTR(pScrn); + I2CBusPtr pI2CBus; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered ViaI2CBus1Init.\n")); - I2CBusPtr pI2CBus = xf86CreateI2CBusRec(); - vgaHWPtr hwp = VGAHWPTR(pScrn); - + pI2CBus = xf86CreateI2CBusRec(); if (!pI2CBus) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CreateI2CBusRec failed.\n")); @@ -86,15 +96,21 @@ ViaI2CBus1Init(ScrnInfoPtr pScrn) return NULL; } - pI2CBus->BusName = "I2C Bus 1"; + pI2CBus->BusName = strI2CBus1; pI2CBus->scrnIndex = pScrn->scrnIndex; + pI2CBus->I2CPutBits = ViaI2C1PutBits; pI2CBus->I2CGetBits = ViaI2C1GetBits; + pI2CBus->DriverPrivate.ptr = hwp; - pI2CBus->ByteTimeout = 2200; - pI2CBus->StartTimeout = 550; + pI2CBus->HoldTime = 40; + pI2CBus->BitTimeout = 40; + pI2CBus->ByteTimeout = 2200; + pI2CBus->AcknTimeout = 40; + pI2CBus->StartTimeout = 550; + pI2CBus->RiseFallTime = 20; if (!xf86I2CBusInit(pI2CBus)) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -135,7 +151,10 @@ static void ViaI2C2GetBits(I2CBusPtr Bus, int *clock, int *data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; - CARD8 value = hwp->readSeq(hwp, 0x31); + CARD8 value; + + ViaSeqMask(hwp, 0x31, 0x01, 0x01); + value = hwp->readSeq(hwp, 0x31); *clock = (value & SCL_READ) != 0; *data = (value & SDA_READ) != 0; @@ -144,12 +163,13 @@ ViaI2C2GetBits(I2CBusPtr Bus, int *clock, int *data) static I2CBusPtr ViaI2CBus2Init(ScrnInfoPtr pScrn) { + vgaHWPtr hwp = VGAHWPTR(pScrn); + I2CBusPtr pI2CBus; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered ViaI2CBus2Init.\n")); - I2CBusPtr pI2CBus = xf86CreateI2CBusRec(); - vgaHWPtr hwp = VGAHWPTR(pScrn); - + pI2CBus = xf86CreateI2CBusRec(); if (!pI2CBus) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CreateI2CBusRec failed.\n")); @@ -160,12 +180,22 @@ ViaI2CBus2Init(ScrnInfoPtr pScrn) return NULL; } - pI2CBus->BusName = "I2C Bus 2"; + pI2CBus->BusName = strI2CBus2; pI2CBus->scrnIndex = pScrn->scrnIndex; + pI2CBus->I2CPutBits = ViaI2C2PutBits; pI2CBus->I2CGetBits = ViaI2C2GetBits; + pI2CBus->DriverPrivate.ptr = hwp; + pI2CBus->HoldTime = 40; + + pI2CBus->BitTimeout = 40; + pI2CBus->ByteTimeout = 2200; + pI2CBus->AcknTimeout = 40; + pI2CBus->StartTimeout = 550; + pI2CBus->RiseFallTime = 20; + if (!xf86I2CBusInit(pI2CBus)) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86I2CBusInit failed.\n")); @@ -369,13 +399,13 @@ ViaI2C3SimpleGetBits(I2CBusPtr Bus, int *clock, int *data) static I2CBusPtr ViaI2CBus3Init(ScrnInfoPtr pScrn) { + vgaHWPtr hwp = VGAHWPTR(pScrn); + I2CBusPtr pI2CBus; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered ViaI2CBus3Init.\n")); - I2CBusPtr pI2CBus = xf86CreateI2CBusRec(); - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - + pI2CBus = xf86CreateI2CBusRec(); if (!pI2CBus) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CreateI2CBusRec failed.\n")); @@ -386,33 +416,29 @@ ViaI2CBus3Init(ScrnInfoPtr pScrn) return NULL; } - pI2CBus->BusName = "I2C Bus 3"; + pI2CBus->BusName = strI2CBus3; pI2CBus->scrnIndex = pScrn->scrnIndex; - pI2CBus->DriverPrivate.ptr = hwp; - switch (pVia->Chipset) { - case VIA_P4M800PRO: - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "using alternative PutBits/GetBits functions for I2C Bus 3\n")); - pI2CBus->I2CPutBits = ViaI2C3SimplePutBits; - pI2CBus->I2CGetBits = ViaI2C3SimpleGetBits; - break; - default: - pI2CBus->I2CAddress = ViaI2C3Address; + pI2CBus->I2CPutBits = ViaI2C3SimplePutBits; + pI2CBus->I2CGetBits = ViaI2C3SimpleGetBits; + #ifdef X_NEED_I2CSTART - pI2CBus->I2CStart = ViaI2C3Start; + pI2CBus->I2CStart = ViaI2C3Start; #endif - pI2CBus->I2CStop = ViaI2C3Stop; - pI2CBus->I2CPutByte = ViaI2C3PutByte; - pI2CBus->I2CGetByte = ViaI2C3GetByte; - pI2CBus->DriverPrivate.ptr = hwp; - - pI2CBus->BitTimeout = 10; - pI2CBus->ByteTimeout = 10; - pI2CBus->HoldTime = 10; - pI2CBus->StartTimeout = 10; - break; - } + pI2CBus->I2CAddress = ViaI2C3Address; + pI2CBus->I2CStop = ViaI2C3Stop; + pI2CBus->I2CPutByte = ViaI2C3PutByte; + pI2CBus->I2CGetByte = ViaI2C3GetByte; + + pI2CBus->DriverPrivate.ptr = hwp; + + pI2CBus->HoldTime = 40; + + pI2CBus->BitTimeout = 40; + pI2CBus->ByteTimeout = 2200; + pI2CBus->AcknTimeout = 40; + pI2CBus->StartTimeout = 550; + pI2CBus->RiseFallTime = 20; if (!xf86I2CBusInit(pI2CBus)) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -456,24 +482,25 @@ void ViaI2CInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered ViaI2CInit.\n")); - if (pVia->I2CDevices & VIA_I2C_BUS1) - pVia->pI2CBus1 = ViaI2CBus1Init(pScrn); - if (pVia->I2CDevices & VIA_I2C_BUS2) - pVia->pI2CBus2 = ViaI2CBus2Init(pScrn); - if (pVia->I2CDevices & VIA_I2C_BUS3) - pVia->pI2CBus3 = ViaI2CBus3Init(pScrn); + if (pVIADisplay->I2CDevices & VIA_I2C_BUS1) + pVIADisplay->pI2CBus1 = ViaI2CBus1Init(pScrn); + if (pVIADisplay->I2CDevices & VIA_I2C_BUS2) + pVIADisplay->pI2CBus2 = ViaI2CBus2Init(pScrn); + if (pVIADisplay->I2CDevices & VIA_I2C_BUS3) + pVIADisplay->pI2CBus3 = ViaI2CBus3Init(pScrn); #ifdef HAVE_DEBUG - if (pVia->I2CScan) { - if (pVia->pI2CBus2) - ViaI2CScan(pVia->pI2CBus2); - if (pVia->pI2CBus3) - ViaI2CScan(pVia->pI2CBus3); - } + if (pVIADisplay->pI2CBus1) + ViaI2CScan(pVIADisplay->pI2CBus1); + if (pVIADisplay->pI2CBus2) + ViaI2CScan(pVIADisplay->pI2CBus2); + if (pVIADisplay->pI2CBus3) + ViaI2CScan(pVIADisplay->pI2CBus3); #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, diff --git a/src/via_id.c b/src/via_id.c deleted file mode 100644 index 00c8720..0000000 --- a/src/via_id.c +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2005-2015 The Openchrome Project - * [https://www.freedesktop.org/wiki/Openchrome] - * Copyright 2004-2005 The Unichrome Project [unichrome.sf.net] - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sub license, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/* - * A big structure with card-ID information, plus some checking functions. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "via_driver.h" - -static void -ViaDoubleCheckCLE266Revision(ScrnInfoPtr pScrn) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - /* Crtc 0x4F is only defined in CLE266Cx */ - CARD8 tmp = hwp->readCrtc(hwp, 0x4F); - - hwp->writeCrtc(hwp, 0x4F, 0x55); - if (hwp->readCrtc(hwp, 0x4F) == 0x55) { - if (CLE266_REV_IS_AX(pVia->ChipRev)) - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CLE266 Revision seems" - " to be Cx, yet %d was detected previously.\n", - pVia->ChipRev); - } else { - if (CLE266_REV_IS_CX(pVia->ChipRev)) - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CLE266 Revision seems" - " to be Ax, yet %d was detected previously.\n", - pVia->ChipRev); - } - hwp->writeCrtc(hwp, 0x4F, tmp); -} diff --git a/src/via_kms.c b/src/via_kms.c index 2bb0a86..f414656 100644 --- a/src/via_kms.c +++ b/src/via_kms.c @@ -192,7 +192,8 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, if (drmmode->fb_id == 0) { ret = drmModeAddFB(drmmode->fd, pScrn->virtualX, pScrn->virtualY, pScrn->depth, pScrn->bitsPerPixel, - drmmode->front_bo->pitch, + pScrn->virtualX * + ((pScrn->bitsPerPixel + 7) >> 3), drmmode->front_bo->handle, &drmmode->fb_id); if (ret < 0) { @@ -227,8 +228,6 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, crtc->gamma_blue, crtc->gamma_size); #endif - if (pScrn->pScreen && drmmode->hwcursor) - xf86_reload_cursors(pScrn->pScreen); done: free(output_ids); return (ret < 0 ? FALSE : TRUE); @@ -400,7 +399,7 @@ drmmode_output_create_resources(xf86OutputPtr output) drmmode_prop = p->mode_prop; if (drmmode_prop->flags & DRM_MODE_PROP_RANGE) { - INT32 range[2]; + INT32 prop_range[2]; INT32 value = p->value; p->num_atoms = 1; @@ -408,12 +407,12 @@ drmmode_output_create_resources(xf86OutputPtr output) if (!p->atoms) continue; p->atoms[0] = MakeAtom(drmmode_prop->name, strlen(drmmode_prop->name), TRUE); - range[0] = drmmode_prop->values[0]; - range[1] = drmmode_prop->values[1]; + prop_range[0] = drmmode_prop->values[0]; + prop_range[1] = drmmode_prop->values[1]; err = RRConfigureOutputProperty(output->randr_output, p->atoms[0], FALSE, TRUE, drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE, - 2, range); + 2, prop_range); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRConfigureOutputProperty error, %d\n", err); @@ -739,7 +738,8 @@ out_free_encoders: drmModeFreeConnector(koutput); } -uint32_t find_clones(ScrnInfoPtr scrn, xf86OutputPtr output) +static uint32_t +find_clones(ScrnInfoPtr scrn, xf86OutputPtr output) { drmmode_output_private_ptr drmmode_output = output->driver_private, clone_drmout; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); diff --git a/src/via_memcpy.c b/src/via_memcpy.c index 85db0ef..d2f1d94 100644 --- a/src/via_memcpy.c +++ b/src/via_memcpy.c @@ -459,15 +459,15 @@ enum typedef struct { vidCopyFunc mFunc; - char *mName, **cpuFlag; + const char *mName, **cpuFlag; } McFuncData; -static char *libc_cpuflags[] = { " ", 0 }; -static char *kernel_cpuflags[] = { " ", 0 }; -static char *sse_cpuflags[] = { " sse ", 0 }; -static char *mmx_cpuflags[] = { " mmx ", 0 }; -static char *now_cpuflags[] = { " 3dnow ", 0 }; -static char *mmx2_cpuflags[] = { " mmxext ", " sse ", 0 }; +static const char *libc_cpuflags[] = { " ", 0 }; +static const char *kernel_cpuflags[] = { " ", 0 }; +static const char *sse_cpuflags[] = { " sse ", 0 }; +static const char *mmx_cpuflags[] = { " mmx ", 0 }; +static const char *now_cpuflags[] = { " 3dnow ", 0 }; +static const char *mmx2_cpuflags[] = { " mmxext ", " sse ", 0 }; static McFuncData mcFunctions[totNum] = { {libc_YUV42X, "libc", libc_cpuflags}, @@ -480,7 +480,7 @@ static McFuncData mcFunctions[totNum] = { static int -flagValid(const char *cpuinfo, char *flag) +flagValid(const char *cpuinfo, const char *flag) { const char *flagLoc, *nextProc; int located = 0; @@ -502,7 +502,7 @@ flagValid(const char *cpuinfo, char *flag) static int -cpuValid(const char *cpuinfo, char **flags) +cpuValid(const char *cpuinfo, const char **flags) { for (; *flags != 0; flags++) { if (flagValid(cpuinfo, *flags)) @@ -515,7 +515,7 @@ cpuValid(const char *cpuinfo, char **flags) * Benchmark the video copy routines and choose the fastest. */ vidCopyFunc -viaVidCopyInit(char *copyType, ScreenPtr pScreen) +viaVidCopyInit(const char *copyType, ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); @@ -638,7 +638,7 @@ viaVidCopyInit(char *copyType, ScreenPtr pScreen) #else vidCopyFunc -viaVidCopyInit(char *copyType, ScreenPtr pScreen) +viaVidCopyInit(const char *copyType, ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); diff --git a/src/via_memmgr.c b/src/via_memmgr.c index d87d075..70cf6ad 100644 --- a/src/via_memmgr.c +++ b/src/via_memmgr.c @@ -42,146 +42,155 @@ #include "drm_fourcc.h" #endif -/* - * Isolate the wonders of X memory allocation and DRI memory allocation - * and 4.3 or 4.4 differences in one abstraction. - * - * The pool code indicates who provided the memory: - * 0 - nobody - * 1 - xf86 linear - * 2 - DRM - */ -int -viaOffScreenLinear(struct buffer_object *obj, ScrnInfoPtr pScrn, - unsigned long size) +static int +viaOffScreenLinear(ScrnInfoPtr pScrn, struct buffer_object *obj, + unsigned long size, unsigned long alignment) { - int depth = pScrn->bitsPerPixel >> 3; FBLinearPtr linear; + int depth = pScrn->bitsPerPixel / 8; + int newAlignment; + int ret = 0; + newAlignment = alignment; linear = xf86AllocateOffscreenLinear(pScrn->pScreen, - (size + depth - 1) / depth, - 32, NULL, NULL, NULL); - if (!linear) - return BadAlloc; + (size + depth - 1) / depth, + newAlignment, + NULL, NULL, NULL); + if (!linear) { + ret = -ENOMEM; + goto exit; + } + obj->offset = linear->offset * depth; obj->handle = (unsigned long) linear; obj->domain = TTM_PL_FLAG_VRAM; obj->size = size; - return Success; -} - -struct buffer_object * -drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int width, unsigned int height, - int format, unsigned int alignment, int domain) -{ - struct buffer_object *obj = NULL; - int pitch; - - switch (format) { - case DRM_FORMAT_C8: - pitch = width; - break; - - case DRM_FORMAT_XRGB1555: - case DRM_FORMAT_RGB565: - pitch = width * 2; - break; - - case DRM_FORMAT_RGB888: - pitch = width * 3; - break; - case DRM_FORMAT_XRGB2101010: - case DRM_FORMAT_XRGB8888: - pitch = width * 4; - break; - } - - pitch = ALIGN_TO(pitch, alignment); - obj = drm_bo_alloc(pScrn, pitch * height, alignment, domain); - if (!obj->pitch) - obj->pitch = pitch; - return obj; +exit: + return ret; } struct buffer_object * -drm_bo_alloc(ScrnInfoPtr pScrn, unsigned int size, unsigned int alignment, int domain) +drm_bo_alloc(ScrnInfoPtr pScrn, unsigned long size, + unsigned long alignment, int domain) { struct buffer_object *obj = NULL; VIAPtr pVia = VIAPTR(pScrn); int ret = 0; obj = xnfcalloc(1, sizeof(*obj)); - if (obj) { - switch (domain) { - case TTM_PL_FLAG_TT: - case TTM_PL_FLAG_VRAM: - if (pVia->directRenderingType == DRI_NONE) { - if (Success != viaOffScreenLinear(obj, pScrn, size)) { - ErrorF("Linear memory allocation failed\n"); - ret = -ENOMEM; - } else - DEBUG(ErrorF("%lu bytes of Linear memory allocated at %lx, handle %lu\n", obj->size, obj->offset, obj->handle)); -#ifdef HAVE_DRI - } else if (pVia->directRenderingType == DRI_1) { - drm_via_mem_t drm; + if (!obj) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Allocation of a buffer object used for " + "memory allocation failed.\n")); + goto exit; + } - size = ALIGN_TO(size, alignment); - drm.context = DRIGetContext(pScrn->pScreen); - drm.size = size; - drm.type = (domain == TTM_PL_FLAG_TT ? VIA_MEM_AGP : VIA_MEM_VIDEO); - ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_ALLOCMEM, - &drm, sizeof(drm_via_mem_t)); - if (!ret && (size == drm.size)) { - if (domain == TTM_PL_FLAG_VRAM) - drm.offset -= pVia->FBFreeStart; - obj->offset = ALIGN_TO(drm.offset, alignment); - obj->handle = drm.index; - obj->domain = domain; - obj->size = drm.size; - DEBUG(ErrorF("%lu bytes of DRI memory allocated at %lx, handle %lu\n", - obj->size, obj->offset, obj->handle)); + switch (domain) { + case TTM_PL_FLAG_TT: + case TTM_PL_FLAG_VRAM: + if (pVia->directRenderingType == DRI_NONE) { + if (!pVia->useEXA) { + ret = viaOffScreenLinear(pScrn, obj, + size, alignment); + if (ret) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Linear memory allocation " + "failed.\n")); + } else { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "%lu bytes of linear memory " + "allocated at 0x%lx, handle " + "0x%lx.\n", + obj->size, obj->offset, + obj->handle)); } - } else if (pVia->directRenderingType == DRI_2) { - struct drm_via_gem_object args; - - /* Some day this will be moved to libdrm. */ - args.domains = domain; - args.alignment = alignment; - args.pitch = 0; - args.size = size; - ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_GEM_CREATE, - &args, sizeof(struct drm_via_gem_object)); - if (!ret) { - /* Okay the X server expects to know the offset because - * of non-KMS. Once we have KMS working the offset - * will not be valid. */ - obj->map_offset = args.map_handle; - obj->offset = args.offset; - obj->handle = args.handle; - obj->pitch = args.pitch; - obj->size = args.size; - obj->domain = domain; - DEBUG(ErrorF("%lu bytes of DRI2 memory allocated at %lx, handle %lu\n", - obj->size, obj->offset, obj->handle)); + } else { + ret = viaEXAOffscreenAlloc(pScrn, obj, + size, alignment); + if (ret) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "EXA offscreen memory " + "allocation failed.\n")); + } else { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "%lu bytes of EXA offscreen " + "memory allocated at 0x%lx, " + "handle 0x%lx.\n", + obj->size, obj->offset, + obj->handle)); } -#endif } - break; +#ifdef HAVE_DRI + } else if (pVia->directRenderingType == DRI_1) { + drm_via_mem_t drm; - case TTM_PL_FLAG_SYSTEM: - default: - ret = -ENXIO; - break; + size = ALIGN_TO(size, alignment); + drm.context = DRIGetContext(pScrn->pScreen); + drm.size = size; + drm.type = (domain == TTM_PL_FLAG_TT ? VIA_MEM_AGP : VIA_MEM_VIDEO); + ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_ALLOCMEM, + &drm, sizeof(drm_via_mem_t)); + if (!ret && (size == drm.size)) { + if (domain == TTM_PL_FLAG_VRAM) + drm.offset -= pVia->FBFreeStart; + obj->offset = ALIGN_TO(drm.offset, alignment); + obj->handle = drm.index; + obj->domain = domain; + obj->size = drm.size; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "%lu bytes of DRI memory " + "allocated at 0x%lx, " + "handle 0x%lx.\n", + obj->size, obj->offset, + obj->handle)); + } + } else if (pVia->directRenderingType == DRI_2) { + struct drm_via_gem_object args; + + /* Some day this will be moved to libdrm. */ + args.domains = domain; + args.alignment = alignment; + args.size = size; + ret = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_GEM_CREATE, + &args, sizeof(struct drm_via_gem_object)); + if (!ret) { + /* Okay the X server expects to know the offset because + * of non-KMS. Once we have KMS working the offset + * will not be valid. */ + obj->map_offset = args.map_handle; + obj->offset = args.offset; + obj->handle = args.handle; + obj->size = args.size; + obj->domain = domain; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "%lu bytes of DRI2 memory " + "allocated at 0x%lx, " + "handle 0x%lx.\n", + obj->size, obj->offset, + obj->handle)); + } +#endif } + break; - if (ret) { - DEBUG(ErrorF("DRM memory allocation failed %d\n", ret)); - free(obj); - obj = NULL; - }; + case TTM_PL_FLAG_SYSTEM: + default: + ret = -ENXIO; + break; } - return obj; + + if (ret) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "DRM memory allocation failed.\n" + "Error Code: %d\n", ret)); + free(obj); + obj = NULL; + goto exit; + } + +exit: + return obj; } void* @@ -200,11 +209,11 @@ drm_bo_map(ScrnInfoPtr pScrn, struct buffer_object *obj) switch (obj->domain) { #ifdef HAVE_DRI case TTM_PL_FLAG_TT: - obj->ptr = (pVia->agpMappedAddr + obj->offset); + obj->ptr = (uint8_t*)pVia->agpMappedAddr + obj->offset; break; #endif case TTM_PL_FLAG_VRAM: - obj->ptr = (pVia->FBBase + obj->offset); + obj->ptr = pVia->FBBase + obj->offset; break; default: obj->ptr = NULL; @@ -237,9 +246,16 @@ drm_bo_free(ScrnInfoPtr pScrn, struct buffer_object *obj) case TTM_PL_FLAG_VRAM: case TTM_PL_FLAG_TT: if (pVia->directRenderingType == DRI_NONE) { - FBLinearPtr linear = (FBLinearPtr) obj->handle; + if (!pVia->useEXA) { + FBLinearPtr linear = (FBLinearPtr) obj->handle; + + xf86FreeOffscreenLinear(linear); + } else { + ExaOffscreenArea *pArea = + (ExaOffscreenArea *)obj->handle; - xf86FreeOffscreenLinear(linear); + exaOffscreenFree(pScrn->pScreen, pArea); + } #ifdef HAVE_DRI } else if (pVia->directRenderingType == DRI_1) { drm_via_mem_t drm; @@ -264,19 +280,3 @@ drm_bo_free(ScrnInfoPtr pScrn, struct buffer_object *obj) free(obj); } } - -Bool -drm_bo_manager_init(ScrnInfoPtr pScrn) -{ - VIAPtr pVia = VIAPTR(pScrn); - Bool ret = TRUE; - - if (pVia->directRenderingType == DRI_2) - return ret; - ret = umsCreate(pScrn); -#ifdef HAVE_DRI - if (pVia->directRenderingType == DRI_1) - ret = VIADRIKernelInit(pScrn); -#endif - return ret; -} diff --git a/src/via_memmgr.h b/src/via_memmgr.h index e80cb84..54199f5 100644 --- a/src/via_memmgr.h +++ b/src/via_memmgr.h @@ -23,7 +23,6 @@ #ifndef _VIA_MEMMGR_H_ #define _VIA_MEMMGR_H_ -#include #include "xf86.h" #define TTM_PL_FLAG_SYSTEM 1 @@ -34,21 +33,16 @@ struct buffer_object { off_t map_offset; unsigned long handle; unsigned long offset; /* Offset into fb */ - unsigned long pitch; + unsigned long pitch; /* No longer used. */ unsigned long size; void *ptr; int domain; }; -/* In via_memory.c */ -Bool drm_bo_manager_init(ScrnInfoPtr pScrn); struct buffer_object * -drm_bo_alloc_surface(ScrnInfoPtr pScrn, unsigned int width, unsigned int height, - int format, unsigned int alignment, int domain); -struct buffer_object * -drm_bo_alloc(ScrnInfoPtr pScrn, unsigned int size, unsigned int alignment, - int domain); +drm_bo_alloc(ScrnInfoPtr pScrn, unsigned long size, + unsigned long alignment, int domain); void *drm_bo_map(ScrnInfoPtr pScrn, struct buffer_object *obj); void drm_bo_unmap(ScrnInfoPtr pScrn, struct buffer_object *obj); void drm_bo_free(ScrnInfoPtr pScrn, struct buffer_object *); diff --git a/src/via_mode.h b/src/via_mode.h deleted file mode 100644 index 5e18266..0000000 --- a/src/via_mode.h +++ /dev/null @@ -1,812 +0,0 @@ -/* - * Copyright 2004-2005 The Unichrome Project [unichrome.sf.net] - * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. - * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sub license, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -#ifndef _VIA_MODE_H_ -#define _VIA_MODE_H_ 1 - -/* - * Bandwidth - * - */ -#define VIA_BW_MIN 74000000 /* > 640x480@60Hz@32bpp */ -#define VIA_BW_DDR200 394000000 -#define VIA_BW_DDR400 553000000 /* > 1920x1200@60Hz@32bpp */ -#define VIA_BW_DDR667 922000000 -#define VIA_BW_DDR1066 922000000 - -union pllparams { - struct { - CARD32 dtz : 2; - CARD32 dr : 3; - CARD32 dn : 7; - CARD32 dm :10; - } params; - CARD32 packed; -}; - -/* - * simple lookup table for dotclocks - * - */ -static struct ViaDotClock { - int DotClock; - CARD16 UniChrome; - union pllparams UniChromePro; -} ViaDotClocks[] = { - { 25200, 0x513C, /* 0xa79004 */ { { 1, 4, 6, 169 } } }, - { 25312, 0xC763, /* 0xc49005 */ { { 1, 4, 7, 198 } } }, - { 26591, 0x471A, /* 0xce9005 */ { { 1, 4, 7, 208 } } }, - { 31500, 0xC558, /* 0xae9003 */ { { 1, 4, 5, 176 } } }, - { 31704, 0x471F, /* 0xaf9002 */ { { 1, 4, 4, 177 } } }, - { 32663, 0xC449, /* 0x479000 */ { { 1, 4, 2, 73 } } }, - { 33750, 0x4721, /* 0x959002 */ { { 1, 4, 4, 151 } } }, - { 35500, 0x5877, /* 0x759001 */ { { 1, 4, 3, 119 } } }, - { 36000, 0x5879, /* 0x9f9002 */ { { 1, 4, 4, 161 } } }, - { 39822, 0xC459, /* 0x578c02 */ { { 1, 3, 4, 89 } } }, - { 40000, 0x515F, /* 0x848c04 */ { { 1, 3, 6, 134 } } }, - { 41164, 0x4417, /* 0x2c8c00 */ { { 1, 3, 2, 46 } } }, - { 46981, 0x5069, /* 0x678c02 */ { { 1, 3, 4, 105 } } }, - { 49500, 0xC353, /* 0xa48c04 */ { { 3, 3, 5, 138 } } }, - { 50000, 0xC354, /* 0x368c00 */ { { 1, 3, 2, 56 } } }, - { 56300, 0x4F76, /* 0x3d8c00 */ { { 1, 3, 2, 63 } } }, - { 57275, 0, /* 0x3e8c00 */ { { 1, 3, 5, 157 } } }, /* For XO 1.5 no need for a unichrome clock */ - { 57284, 0x4E70, /* 0x3e8c00 */ { { 1, 3, 2, 64 } } }, - { 64995, 0x0D3B, /* 0x6b8c01 */ { { 1, 3, 3, 109 } } }, - { 65000, 0x0D3B, /* 0x6b8c01 */ { { 1, 3, 3, 109 } } }, /* Slightly unstable on PM800 */ - { 65028, 0x866D, /* 0x6b8c01 */ { { 1, 3, 3, 109 } } }, - { 74480, 0x156E, /* 0x288800 */ { { 1, 2, 2, 42 } } }, - { 75000, 0x156E, /* 0x288800 */ { { 1, 2, 2, 42 } } }, - { 78800, 0x442C, /* 0x2a8800 */ { { 1, 2, 2, 44 } } }, - { 81135, 0x0622, /* 0x428801 */ { { 1, 2, 3, 68 } } }, - { 81613, 0x4539, /* 0x708803 */ { { 1, 2, 5, 114 } } }, - { 94500, 0x4542, /* 0x4d8801 */ { { 1, 2, 3, 79 } } }, - { 108000, 0x0B53, /* 0x778802 */ { { 1, 2, 4, 121 } } }, - { 108280, 0x4879, /* 0x778802 */ { { 1, 2, 4, 121 } } }, - { 122000, 0x0D6F, /* 0x428800 */ { { 1, 2, 2, 68 } } }, - { 122726, 0x073C, /* 0x878802 */ { { 1, 2, 4, 137 } } }, - { 135000, 0x0742, /* 0x6f8801 */ { { 1, 2, 3, 113 } } }, - { 148500, 0x0853, /* 0x518800 */ { { 1, 2, 2, 83 } } }, - { 155800, 0x0857, /* 0x558402 */ { { 1, 1, 4, 87 } } }, - { 157500, 0x422C, /* 0x2a8400 */ { { 1, 1, 2, 44 } } }, - { 161793, 0x4571, /* 0x6f8403 */ { { 1, 1, 5, 113 } } }, - { 162000, 0x0A71, /* 0x6f8403 */ { { 1, 1, 5, 113 } } }, - { 175500, 0x4231, /* 0x2f8400 */ { { 1, 1, 2, 49 } } }, - { 189000, 0x0542, /* 0x4d8401 */ { { 1, 1, 3, 79 } } }, - { 202500, 0x0763, /* 0x6F8402 */ { { 1, 1, 4, 113 } } }, - { 204800, 0x0764, /* 0x548401 */ { { 1, 1, 3, 86 } } }, - { 218300, 0x043D, /* 0x3b8400 */ { { 1, 1, 2, 61 } } }, - { 229500, 0x0660, /* 0x3e8400 */ { { 1, 1, 2, 64 } } }, /* Not tested on Pro } */ - { 0, 0, { { 0, 0, 0, 0 } } } -}; - -/* - * - * Panel - * - */ - -#define VIA_RES_640X480 0 -#define VIA_RES_800X600 1 -#define VIA_RES_1024X768 2 -#define VIA_RES_1152X864 3 -#define VIA_RES_1280X1024 4 -#define VIA_RES_1600X1200 5 -#define VIA_RES_1440X1050 6 -#define VIA_RES_1280X768 7 -#define VIA_RES_1280X960 8 -#define VIA_RES_1920X1440 9 -#define VIA_RES_848X480 10 -#define VIA_RES_1400X1050 11 -#define VIA_RES_720X480 12 -#define VIA_RES_720X576 13 -#define VIA_RES_1024X512 14 -#define VIA_RES_856X480 15 -#define VIA_RES_1024X576 16 -#define VIA_RES_800X480 17 -#define VIA_RES_1280X800 18 -#define VIA_RES_1280X720 19 -#define VIA_RES_1920X1080 20 -#define VIA_RES_1366X768 22 -#define VIA_RES_1200X900 23 -#define VIA_RES_INVALID 0xFF - -#define VIA_BIOS_REG_LCD_MAX_NUM 48 -#define VIA_BIOS_NUM_LCD_SUPPORT_MASK 8 -#define VIA_BIOS_NUM_PANEL 7 -#define VIA_BIOS_MAX_NUM_MPATCH2 18 -#define VIA_BIOS_MAX_NUM_MPATCH1 9 -#define VIA_BIOS_MAX_NUM_CTREXP 5 - -typedef struct _VIALCDMODEENTRY { - CARD16 LCDClk; - CARD16 VClk; - CARD16 LCDClk_12Bit; - CARD16 VClk_12Bit; - CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM]; - CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM]; - CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM]; - int numEntry; -} VIALCDModeEntry, *VIALCDModeEntryPtr; - - -typedef struct _VIALCDMPATCHENTRY { - CARD8 Mode; - CARD16 LCDClk; - CARD16 VClk; - CARD16 LCDClk_12Bit; - CARD16 VClk_12Bit; - CARD8 port[VIA_BIOS_REG_LCD_MAX_NUM]; - CARD8 offset[VIA_BIOS_REG_LCD_MAX_NUM]; - CARD8 data[VIA_BIOS_REG_LCD_MAX_NUM]; - int numEntry; -} VIALCDMPatchEntry, *VIALCDMPatchEntryPtr; - - -typedef struct _VIALCDMODETABLE { - CARD8 fpIndex; - CARD8 fpSize; - CARD8 powerSeq; - int numMPatchDP2Ctr; - int numMPatchDP2Exp; - int numMPatchDP1Ctr; - int numMPatchDP1Exp; - CARD16 SuptMode[VIA_BIOS_NUM_LCD_SUPPORT_MASK]; - VIALCDModeEntry FPconfigTb; - VIALCDModeEntry InitTb; - VIALCDMPatchEntry MPatchDP2Ctr[VIA_BIOS_MAX_NUM_MPATCH2]; - VIALCDMPatchEntry MPatchDP2Exp[VIA_BIOS_MAX_NUM_MPATCH2]; - VIALCDMPatchEntry MPatchDP1Ctr[VIA_BIOS_MAX_NUM_MPATCH1]; - VIALCDMPatchEntry MPatchDP1Exp[VIA_BIOS_MAX_NUM_MPATCH1]; - VIALCDModeEntry LowResCtr; - VIALCDModeEntry LowResExp; - VIALCDModeEntry MCtr[VIA_BIOS_MAX_NUM_CTREXP]; - VIALCDModeEntry MExp[VIA_BIOS_MAX_NUM_CTREXP]; -} VIALCDModeTableRec, *VIALCDModePtr; - -static const VIALCDModeTableRec lcdTable[] = { - { 0, 0, 0X1, 13, 13, 5, 5, - { 0XE0FF, 0XF, 0XC0FC, 0X1B, 0, 0X7000, 0, 0X7000 }, - { 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7A, 0X7B, 0X7C, 0X7D, 0X7E, 0X7F, 0X80, 0X81, 0X82, 0X83, 0X84, 0X85, 0X86, 0X87, 0X88, 0X89, 0X8A, 0X8B, 0X8C, 0X8D, 0X8E, 0X8F, 0X90, 0X68, 0X69, 0X92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X2, 0X3, 0X4, 0X7, 0XA, 0XD, 0X13, 0X16, 0X19, 0X1C, 0X1D, 0X1E, 0X1F, 0, 0, 0X88, 0XD, 0X5D, 0X79, 0XFF, 0X10, 0XB, 0X67, 0, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 26 }, - { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X7F, 0X7F, 0X1F, 0X9A, 0X23, 0X87, 0XE7, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XE1, 0X23, 0XA0, 0X50, 0, 0X5F, 0X63, 0XB, 0XDF, 0X12, 0XDF, 0XC, 0X12, 0XE2, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, - { - { 0, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, - { 0X2, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X6, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XD, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, - { 0XE, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XF, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X10, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X13, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X30, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X5C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XC7, 0X53, 0X80, 0X9, 0X2, 0X55, 0X37, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X56, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X7C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XEF, 0X67, 0X94, 0X9, 0X2, 0X69, 0X2B, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0X6A, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X22, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X7, 0XA7, 0X92, 0X13, 0XF, 0X6F, 0X2B, 0X85, 0XB2, 0X9, 0XA, 0X87, 0X29, 0X64, 0X2B, 0X2B, 0X88, 0X1A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, - { 0X25, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3F, 0XDF, 0X92, 0X13, 0X47, 0XA7, 0X7F, 0XAF, 0XDC, 0X9, 0XA, 0XB1, 0X34, 0X80, 0X7F, 0X7F, 0XB2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, - { 0X2, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X6, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XD, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, - { 0XE, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XF, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X10, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X9E, 0XCB, 0X9, 0XA0, 0X22, 0X5D, 0X5D, 0XA1, 0X13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X13, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X30, 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X5C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XC7, 0X53, 0X80, 0X9, 0X2, 0X55, 0X37, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X56, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X7C, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XDF, 0X7F, 0X51, 0X13, 0XE7, 0X47, 0XEF, 0X67, 0X94, 0X9, 0X2, 0X69, 0X2B, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0X6A, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X22, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X7, 0XA7, 0X92, 0X13, 0XF, 0X6F, 0X2B, 0X85, 0XB2, 0X9, 0XA, 0X87, 0X29, 0X64, 0X2B, 0X2B, 0X88, 0X1A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, - { 0X25, 0XC763, 0XC763, 0X8763, 0X8763, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3F, 0XDF, 0X92, 0X13, 0X47, 0XA7, 0X7F, 0XAF, 0XDC, 0X9, 0XA, 0XB1, 0X34, 0X80, 0X7F, 0X7F, 0XB2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2, 0, 0, 0, 0, { 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X11, 0X4, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X6E, 0X52, 0X9E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2, 0, 0, 0, 0, { 0XC4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X11, 0X4, 0X5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X6E, 0X52, 0X9E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X3D, 0X89, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, - { 0X407, 0X407, 0X4523, 0X4523, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0XE4, 0X9, 0XB9, 0X3B, 0X2D, 0X31, 0X8F, 0X8F, 0XBA, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, - { - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - } - }, - { 0X1, 0X1, 0X1, 14, 13, 4, 4, - { 0XE0FF, 0XF, 0XC1FC, 0X37B, 0, 0X7000, 0, 0X7000 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X1F, 0X1F, 0XE3, 0X34, 0X47, 0XC7, 0X73, 0X57, 0X57, 0X73, 0X52, 0X12, 0X58, 0X5C, 0XC8, 0X6E, 0, 0X7F, 0X83, 0X72, 0X57, 0X22, 0X57, 0X73, 0X22, 0X59, 0X2D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, - { - { 0, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X25, 0XCF, 0XF7, 0XF7, 0XDA, 0X1F, 0X9F, 0XB4, 0X6E, 0X36, 0X3A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X2, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0XA2, 0X7F, 0X83, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13 }, - { 0X6, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XD, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0XE, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XF, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XDA, 0XF6, 0X49, 0XDB, 0X3F, 0X5D, 0X5D, 0XDC, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X10, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XDA, 0XF6, 0X49, 0XDB, 0X3F, 0XA2, 0X5D, 0X5D, 0XDC, 0X10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X13, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0XA2, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X28, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1C, 0XCF, 0XF7, 0XF7, 0XDA, 0X1F, 0X9F, 0XB4, 0X70, 0X74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X30, 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XF3, 0XF, 0X51, 0XF4, 0X38, 0X8F, 0X8F, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X5C, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X2F, 0X2F, 0X14, 0X57, 0XD7, 0XC7, 0X8F, 0XAB, 0X9, 0X2, 0X90, 0X34, 0X50, 0XC7, 0X2, 0XC7, 0X2, 0X91, 0X15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 }, - { 0X7C, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X2F, 0X2F, 0X14, 0X57, 0XD7, 0XEF, 0XA3, 0XBF, 0X9, 0X2, 0XA4, 0X28, 0X50, 0XEF, 0X2, 0XEF, 0X2, 0XA5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 }, - { 0X22, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X57, 0X57, 0X14, 0X7F, 0XFF, 0X2B, 0XC1, 0XDD, 0X9, 0XC2, 0X26, 0X64, 0X2B, 0X2B, 0XC3, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, - { 0X25, 0XC459, 0XC459, 0XC259, 0XC259, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X8F, 0X8F, 0X14, 0XB7, 0X37, 0X7F, 0XEB, 0X7, 0X51, 0XEC, 0X30, 0X80, 0X7F, 0X7F, 0XED, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0X8643, 0X86B9, 0X4643, 0X46B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X21, 0X21, 0XB4, 0X66, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, - { 0X2, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X66, 0X6D, 0X6E, 0X6F, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2F, 0X2F, 0X73, 0X61, 0X65, 0X72, 0X33, 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X6, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0XE, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0XF, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X10, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X13, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X28, 0X8643, 0X86B9, 0X4643, 0X46B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X21, 0X21, 0XB4, 0X72, 0X98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, - { 0X30, 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X5C, 0XC459, 0XC7BB, 0XC259, 0XC776, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X50, 0X5A, 0X2D, 0X31, 0X98, 0X54, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X7C, 0XC459, 0XC7BB, 0XC259, 0XC776, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X1F, 0X50, 0X55, 0X2D, 0X31, 0X98, 0X98, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X22, 0XC459, 0XC643, 0XC259, 0X8643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1B, 0X1B, 0X64, 0X5A, 0X3D, 0X41, 0, 0, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X25, 0XC459, 0X4511, 0XC259, 0X8544, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X23, 0X23, 0X80, 0X61, 0X4C, 0X50, 0X8E, 0X8E, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X4B, 0X9B, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X4B, 0X9B, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XCF, 0XCF, 0X9A, 0X24, 0XF7, 0X77, 0X8F, 0XF3, 0XF, 0X51, 0XA, 0XF4, 0X38, 0XA0, 0X68, 0X3D, 0X41, 0X8F, 0X12, 0X8F, 0X12, 0XF5, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, - { 0X8643, 0X86B2, 0X4643, 0X46B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2F, 0X2F, 0XA0, 0X5F, 0X2D, 0X31, 0X32, 0XAA, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { - { 0X8643, 0X8643, 0X4643, 0X4643, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XCF, 0XCF, 0X9A, 0X24, 0XF7, 0X77, 0XDF, 0X1B, 0X37, 0XA, 0X1C, 0X40, 0XA0, 0XDF, 0X12, 0XDF, 0X12, 0X1D, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X8643, 0X86B3, 0X4643, 0X46B3, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1A, 0X1A, 0XA0, 0X5F, 0X63, 0X33, 0X32, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - } - }, - { 0X2, 0X2, 0X1, 13, 14, 4, 4, - { 0XE0FF, 0XF, 0XC1FC, 0X6F7B, 0, 0X7000, 0, 0X7000 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XFF, 0XFF, 0X3F, 0X2B, 0X35, 0X17, 0X9F, 0X25, 0XFF, 0XFF, 0X25, 0X9A, 0X13, 0, 0X62, 0, 0X96, 0X4, 0XA3, 0XA7, 0X24, 0XFF, 0X23, 0XFF, 0X25, 0X23, 0X3, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, - { - { 0, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X45, 0XCF, 0X67, 0XA7, 0XE3, 0X7F, 0X7, 0X12, 0XB4, 0X87, 0X46, 0X4A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12 }, - { 0X2, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X66, 0X70, 0X72, 0X73, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X84, 0XD4, 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0XA0, 0X8E, 0X8E, 0X6E, 0X12, 0X4A, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, - { 0X6, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0XE, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0XF, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X10, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0XA2, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X13, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X28, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X45, 0XCF, 0X67, 0XA7, 0X7F, 0X7, 0X12, 0XB4, 0X91, 0X95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X30, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X5C, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X9F, 0XDF, 0X9A, 0X15, 0XB7, 0X3F, 0XC7, 0XE3, 0X9, 0X51, 0X3, 0XE6, 0X2C, 0X50, 0XC7, 0X3, 0XC7, 0X3, 0XE7, 0X1D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X7C, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X9F, 0XDF, 0X9A, 0X15, 0XB7, 0X3F, 0XEF, 0XF7, 0X1D, 0X51, 0X3, 0XFA, 0X20, 0X50, 0XEF, 0X3, 0XEF, 0X3, 0XFB, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X22, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0X7, 0XA2, 0X15, 0XDF, 0X67, 0X2B, 0X15, 0X3B, 0X18, 0X5E, 0X64, 0X2B, 0X2B, 0X19, 0X2F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, - { 0X25, 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XFF, 0X3F, 0XE2, 0X15, 0X17, 0X9F, 0X7F, 0X3F, 0X65, 0X42, 0X48, 0X80, 0X7F, 0X7F, 0X43, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0X86ED, 0X875A, 0X46ED, 0X475A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X43, 0X43, 0XB4, 0X82, 0X30, 0X34, 0XD0, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0X2, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X73, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X62, 0XA2, 0XFE, 0XFE, 0X24, 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0X6, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0XD, 0X86ED, 0XC5ED, 0X46ED, 0X85ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X66, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X4F, 0X4F, 0X82, 0X2E, 0X32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, - { 0XE, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0XF, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, - { 0X10, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X80, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, - { 0X13, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X80, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, - { 0X28, 0X86ED, 0X472B, 0X46ED, 0X72B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0XB4, 0X87, 0XD0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, - { 0X30, 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0X86ED, 0XC5B5, 0X46ED, 0X85B5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0X50, 0X78, 0X2C, 0X30, 0X40, 0XA, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X7C, 0X86ED, 0XC5B5, 0X46ED, 0X85B5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0X50, 0X7C, 0X2C, 0X30, 0X40, 0X40, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X22, 0X86ED, 0XC4B9, 0X46ED, 0X84B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X41, 0X41, 0X64, 0X73, 0X3D, 0X41, 0X90, 0X90, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X25, 0X86ED, 0XC447, 0X46ED, 0X8447, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3E, 0X3E, 0X80, 0X8E, 0X4D, 0X51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X57, 0X88, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X57, 0X88, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X3F, 0X7F, 0XE3, 0X25, 0X57, 0XDF, 0X8F, 0X47, 0X6D, 0X52, 0XB, 0X4A, 0X50, 0XA0, 0, 0X4F, 0X53, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, - { 0X86ED, 0X842B, 0X46ED, 0X442B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X47, 0X47, 0XA0, 0X7D, 0, 0X2D, 0X31, 0X80, 0X10, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { - { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X3F, 0X7F, 0XE3, 0X25, 0X57, 0XDF, 0XDF, 0X6F, 0X95, 0X52, 0XB, 0X72, 0X58, 0XA0, 0, 0XDF, 0X13, 0XDF, 0X13, 0X73, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, - { 0X86ED, 0X86ED, 0X46ED, 0X46ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X8F, 0XCF, 0XE3, 0XA7, 0X2F, 0X57, 0XAB, 0XD1, 0X12, 0XAE, 0X54, 0XC8, 0, 0X57, 0X57, 0XAF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X86ED, 0X874C, 0X46ED, 0X474C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X47, 0X47, 0XA0, 0X8C, 0, 0X60, 0X64, 0X81, 0X80, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X86ED, 0X84B9, 0X46ED, 0X44B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X37, 0X37, 0XC8, 0X8C, 0, 0X7E, 0X82, 0X21, 0X20, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - } - }, - { 0X3, 0X3, 0X1, 12, 13, 8, 4, - { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0, 0X70D0, 0, 0X7000 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0XFF, 0XFF, 0X97, 0X74, 0X46, 0X2F, 0X9F, 0X25, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0X40, 0XBE, 0X4, 0XCE, 0XD2, 0X24, 0XFF, 0X23, 0XFF, 0X25, 0X23, 0X3, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, - { - { 0, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0XE7, 0X7F, 0X2B, 0X17, 0X87, 0X92, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X2, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X52, 0X53, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XB7, 0X4F, 0X8F, 0X47, 0X6D, 0X4A, 0X4B, 0XA2, 0XCD, 0XD1, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, - { 0X6, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0XE, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0XF, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X10, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X2E, 0X54, 0X31, 0X57, 0XA2, 0X5D, 0X5D, 0X32, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X13, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0XA2, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X30, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0X6D, 0X4A, 0X50, 0X8F, 0X8F, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X5C, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XC7, 0XE3, 0X9, 0X51, 0X3, 0XE6, 0X2C, 0X50, 0XC7, 0X3, 0XC7, 0X3, 0XE7, 0X1D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X7C, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XEF, 0XF7, 0X1D, 0X51, 0X3, 0XFA, 0X20, 0X50, 0XEF, 0X3, 0XEF, 0X3, 0XFB, 0X11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X22, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0XDF, 0XE3, 0X16, 0X77, 0XE7, 0X2B, 0X15, 0X3B, 0X52, 0X18, 0X5E, 0X64, 0X2B, 0X2B, 0X19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, - { 0X25, 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X7F, 0X17, 0X16, 0X1F, 0X1F, 0X7F, 0X3F, 0X65, 0X42, 0X48, 0X80, 0X7F, 0X7F, 0X43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 15 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0X45B9, 0X853D, 0X5B9, 0X453D, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X91, 0XFF, 0XFF, 0X91, 0X74, 0X46, 0X2F, 0X9F, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0XB4, 0XA0, 0X2D, 0X31, 0XFF, 0X23, 0XFF, 0X23, 0X3, 0X39, 0X40, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 28 }, - { 0X2, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA9, 0XA9, 0XA2, 0XB8, 0X60, 0X64, 0X1, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X6, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X55, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X26, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0XD, 0X45B9, 0XC5ED, 0X5B9, 0X85ED, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAA, 0XFF, 0XFF, 0XAA, 0X74, 0X46, 0X2F, 0X9F, 0XFF, 0XFF, 0X25, 0XDA, 0X13, 0X2, 0X68, 0XA0, 0X2E, 0X32, 0XFF, 0X23, 0XFF, 0X23, 0X3, 0X39, 0X10, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 26 }, - { 0XE, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X75, 0X76, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X4, 0X49, 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, - { 0XF, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X10, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X1, 0XD2, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4 }, - { 0X13, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X67, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0, 0X1, 0X14, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 }, - { 0X30, 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0X45B9, 0X851B, 0X5B9, 0X85B6, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XA, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0X7C, 0X45B9, 0X851B, 0X5B9, 0X85B6, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0X40, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0X22, 0X45B9, 0XC4B9, 0X5B9, 0X84B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X99, 0X99, 0X64, 0XB0, 0X3D, 0X41, 0X40, 0X90, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X25, 0X45B9, 0X471F, 0X5B9, 0X877C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X4D, 0X51, 0X98, 0, 0X97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2A, 0, 0, 0, 0, { 0XD4, 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XC7, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0X47, 0X6D, 0X12, 0XB, 0X4A, 0X50, 0XA0, 0, 0X65, 0X69, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, - { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0X47, 0X6D, 0X12, 0XB, 0X4A, 0X50, 0XA0, 0, 0X65, 0X69, 0X8F, 0X13, 0X8F, 0X13, 0X4B, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, - { - { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0XDF, 0X6F, 0X95, 0X12, 0XB, 0X72, 0X58, 0XA0, 0, 0XDF, 0X13, 0XDF, 0X13, 0X73, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, - { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XF, 0XA7, 0X2C, 0X36, 0X3F, 0XAF, 0X57, 0XAB, 0XD1, 0X92, 0XAE, 0X54, 0XC8, 0, 0X57, 0X57, 0XAF, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, - { 0X45B9, 0X45B9, 0X5B9, 0X5B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X17, 0X34, 0X36, 0XAF, 0X1F, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X45B9, 0X451B, 0X5B9, 0X51B, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA9, 0XA9, 0XA0, 0XB8, 0, 0X60, 0X64, 0, 0X80, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X45B9, 0X84B9, 0X5B9, 0X44B9, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XBF, 0XC8, 0XBB, 0, 0X82, 0X86, 0X80, 0X20, 0XE7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X45B9, 0X8448, 0X5B9, 0X4448, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X65, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X74, 0X46, 0X2F, 0X9F, 0, 0, 0, 0XC3, 0X1B, 0, 0XA0, 0XA4, 0, 0X33, 0, 0X33, 0X34, 0XFF, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 23 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - } - }, - { 0X4, 0X4, 0X1, 14, 15, 8, 4, - { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X1B0, 0X7DD0, 0, 0X7000 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0XFF, 0XFF, 0X97, 0X74, 0X46, 0X2F, 0X9F, 0X29, 0XFF, 0XFF, 0X29, 0XE3, 0X1C, 0, 0X83, 0X40, 0XBE, 0X4, 0XCE, 0XD2, 0X28, 0XFF, 0X34, 0XFF, 0X29, 0X34, 0X1, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, - { - { 0, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X5C, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0XE7, 0X7F, 0X2B, 0X17, 0X87, 0X92, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X2, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0XA2, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X6, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XE, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XF, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XAE, 0XD8, 0X12, 0XAF, 0X52, 0X5D, 0X5D, 0XB0, 0X23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X10, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XAE, 0XD8, 0X12, 0XAF, 0X52, 0XA2, 0X5D, 0X5D, 0XB0, 0X23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X13, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0XA2, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X30, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XC7, 0XF1, 0X12, 0XC8, 0X4B, 0X8F, 0X8F, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XDF, 0X9, 0XE0, 0X63, 0XBF, 0XBF, 0XE1, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X5C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XC7, 0X63, 0X8D, 0X52, 0X4, 0X64, 0X47, 0X50, 0XC7, 0X4, 0XC7, 0X4, 0X65, 0X28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X7C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X1F, 0XB7, 0XE3, 0X16, 0X4F, 0XBF, 0XEF, 0X77, 0XA1, 0X52, 0X4, 0X78, 0X5B, 0X50, 0XEF, 0X4, 0XEF, 0X4, 0X79, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X22, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X47, 0XDF, 0XE3, 0X16, 0X77, 0XE7, 0X2B, 0X95, 0XBF, 0X52, 0X96, 0X59, 0X64, 0X2B, 0X2B, 0X97, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X25, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X7F, 0X17, 0X16, 0XAF, 0X1F, 0X7F, 0XBF, 0XE9, 0X12, 0XC0, 0X43, 0X80, 0X7F, 0X7F, 0XC1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0X8479, 0X8663, 0X4479, 0X4441, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X92, 0X92, 0XB4, 0XA8, 0X2E, 0X32, 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, - { 0X2, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XBF, 0XA2, 0XB5, 0X61, 0X65, 0X1, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0X6, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XAE, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0XD, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0XE, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0XF, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X10, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X5E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X13, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X30, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0X90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XDF, 0X9, 0XE0, 0X63, 0XBF, 0XBF, 0XE1, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X5C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X82, 0X2D, 0X31, 0XC8, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0X7C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X82, 0X2D, 0X31, 0XF0, 0X17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0X22, 0X8479, 0X4721, 0X4479, 0X4742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X64, 0X3D, 0X41, 0X40, 0X2C, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0X25, 0X8479, 0X4729, 0X4479, 0X4752, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0X4D, 0X51, 0X98, 0X7F, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X6A, 0X98, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0X8F, 0XC7, 0XF1, 0X12, 0XC, 0XC8, 0X4B, 0XA0, 0, 0X65, 0X69, 0X8F, 0X14, 0X8F, 0X14, 0XC9, 0X2C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, - { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0X91, 0, 0X2D, 0X31, 0X90, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XBF, 0X57, 0XEB, 0X26, 0XEF, 0X5F, 0XDF, 0XEF, 0X19, 0X1A, 0XC, 0XF0, 0X53, 0XA0, 0, 0XDF, 0X14, 0XDF, 0X14, 0XF1, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XF, 0XA7, 0X2C, 0X36, 0X3F, 0XAF, 0X57, 0X2B, 0X55, 0X9B, 0X14, 0X2C, 0X6F, 0XC8, 0, 0X57, 0X24, 0X57, 0X24, 0X2D, 0X30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X17, 0X34, 0X36, 0XAF, 0X1F, 0X7F, 0XA9, 0XDB, 0X14, 0X80, 0X63, 0, 0X24, 0X24, 0X81, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0XAA, 0, 0X5F, 0X63, 0XE0, 0X67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X8479, 0X721, 0X4479, 0X742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XC8, 0, 0X7F, 0X83, 0X81, 0X58, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X8479, 0X51E, 0X4479, 0X53C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X6D, 0X6E, 0X77, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0, 0XA3, 0XA7, 0X34, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - } - }, - { 0X5, 0X5, 0X1, 14, 14, 8, 10, - { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X1B0, 0X7DD0, 0X1C0, 0X7000 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X97, 0X77, 0X77, 0X97, 0X75, 0X56, 0XA7, 0X17, 0X29, 0X19, 0X19, 0X29, 0XA4, 0X24, 0X1A, 0X9D, 0X5E, 0XBE, 0X4, 0XCE, 0XD2, 0X28, 0X19, 0X44, 0X19, 0X29, 0X44, 0X1B, 0X4E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, - { - { 0, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9B, 0XCF, 0X23, 0X43, 0X2C, 0X53, 0XC3, 0XB4, 0X59, 0X5D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X2, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X6D, 0X6E, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XA2, 0XCD, 0XD1, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 14 }, - { 0X6, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X66, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XC3, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0XE, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0XF, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XBB, 0XCB, 0X92, 0XBC, 0X5F, 0X5D, 0X5D, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X10, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0XBB, 0XCB, 0X92, 0XBC, 0X5F, 0XA2, 0X5D, 0X5D, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X13, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0XA2, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X30, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XD4, 0XE4, 0X92, 0XD5, 0X58, 0X8F, 0X8F, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8C, 0X9C, 0XDB, 0X14, 0X8D, 0X70, 0X24, 0X24, 0X8E, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0XEC, 0XFC, 0XDB, 0XED, 0X70, 0XBF, 0XBF, 0XEE, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X5C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X5B, 0X7B, 0XE3, 0X16, 0X8B, 0XFB, 0XC7, 0X70, 0X80, 0X52, 0X4, 0X71, 0X54, 0X50, 0XC7, 0X4, 0XC7, 0X4, 0X72, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X7C, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X5B, 0X7B, 0XE3, 0X16, 0X8B, 0XFB, 0XEF, 0X84, 0X94, 0X52, 0X4, 0X85, 0X48, 0X50, 0XEF, 0X4, 0XEF, 0X4, 0X86, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X22, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X83, 0XA3, 0XE3, 0X16, 0XB3, 0X23, 0X2B, 0XA2, 0XB2, 0X12, 0XA3, 0X46, 0X64, 0X2B, 0X2B, 0XA4, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X25, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XBB, 0XDB, 0XE3, 0X16, 0XEB, 0X5B, 0X7F, 0XCC, 0XDC, 0X12, 0XCD, 0X50, 0X80, 0X7F, 0X7F, 0XCE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X6, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0XE, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0XF, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X10, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X13, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X30, 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X54, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCA, 0XEC, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, - { 0X58, 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X66, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCA, 0XA8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X5C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XEA, 0XC2, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, - { 0X7C, 0X8479, 0X4719, 0X4479, 0X87E4, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X8C, 0X2D, 0X31, 0XEA, 0XEA, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, - { 0X22, 0X8479, 0X4721, 0X4479, 0X4742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X64, 0XAA, 0X3D, 0X41, 0X24, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0X25, 0X8479, 0X4729, 0X4479, 0X4752, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X80, 0XAA, 0X4D, 0X51, 0X76, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X71, 0X9F, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X71, 0X9F, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X28, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X29, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2A, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2B, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X2C, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6C, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0XDE, 0X10, 0X40, 0XC9, 0XEC, 0XC7, 0XC7, 0XDF, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X11, 0, 0X1, 0X2, 0X3, 0X4, 0X5, 0X6, 0X7, 0X9, 0X10, 0X11, 0X12, 0X15, 0X16, 0X33, 0X35, 0X36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7, 0X2D, 0X27, 0X27, 0X91, 0X2A, 0X90, 0X5, 0X11, 0X40, 0XF5, 0X87, 0XEF, 0XEF, 0X6, 0X6, 0, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 } - }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9F, 0X7F, 0XFB, 0X1B, 0X2B, 0X26, 0X2B, 0X9B, 0X8F, 0XD4, 0XE4, 0X92, 0XC, 0XD5, 0X58, 0XA0, 0, 0X65, 0X69, 0X8F, 0X14, 0X8F, 0X14, 0XD6, 0X29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 25 }, - { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0XA0, 0, 0X2D, 0X31, 0XD4, 0X86, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0XFB, 0X1B, 0X2B, 0X26, 0X2B, 0X9B, 0XDF, 0XFC, 0XC, 0X9A, 0XC, 0XFD, 0X40, 0XA0, 0, 0XDF, 0X14, 0XDF, 0X14, 0XFE, 0X21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0X4B, 0X6B, 0X2C, 0X36, 0X7B, 0XEB, 0X57, 0X38, 0X48, 0X9B, 0X14, 0X39, 0X7C, 0XC8, 0, 0X57, 0X24, 0X57, 0X29, 0X24, 0X3A, 0X3D, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 23 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XBB, 0XDB, 0X2C, 0X36, 0XEB, 0X5B, 0XFF, 0X8C, 0X9C, 0XDB, 0X14, 0X8D, 0X70, 0, 0XFF, 0X24, 0XFF, 0X24, 0X8E, 0X31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X3B, 0X5B, 0X46, 0X6B, 0XDB, 0XFF, 0XC, 0X1C, 0XE4, 0X1C, 0XD, 0X90, 0X40, 0XFF, 0X34, 0XFF, 0X34, 0XE, 0X41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 20 } - }, - { - { 0X8479, 0X719, 0X4479, 0X7B2, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XA0, 0, 0X5F, 0X63, 0XD4, 0XD4, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X8479, 0X721, 0X4479, 0X742, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X67, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0XC8, 0, 0X7F, 0X83, 0X48, 0X48, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X8479, 0X51E, 0X4479, 0X53C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X53, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9D, 0X9D, 0, 0XC3, 0XA3, 0XA7, 0XEC, 0XEC, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X8479, 0X8479, 0X4479, 0X4479, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X66, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0XC9, 0XA8, 0XE6, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5 } - } - }, - { 0X6, 0X6, 0X1, 15, 15, 4, 4, - { 0XE0FF, 0XF, 0XC0FC, 0X6F7B, 0X37B0, 0X7DDD, 0X1C0, 0X7000 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X58, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X6F, 0X70, 0X71, 0X72, 0X73, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6F, 0X3F, 0X3F, 0, 0X86, 0X68, 0X7F, 0X3F, 0XE1, 0XAF, 0XAF, 0XE1, 0XE4, 0X24, 0XB0, 0X93, 0X90, 0XFA, 0X4, 0X9, 0XD, 0XE0, 0XAF, 0X4C, 0XAF, 0XE1, 0X44, 0XB1, 0X44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 32 }, - { - { 0, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X56, 0X57, 0X65, 0X6D, 0X6E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XCF, 0X87, 0XB7, 0X34, 0XC7, 0X87, 0XB4, 0X73, 0X77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X2, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X55, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA8, 0X8F, 0X1F, 0X51, 0X20, 0X73, 0XA2, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11 }, - { 0X6, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0XE, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0XF, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X6, 0X38, 0X7, 0X6A, 0X5D, 0X5D, 0X8, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X10, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5D, 0X6, 0X38, 0X7, 0X6A, 0XA2, 0X5D, 0X5D, 0X8, 0X3B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X13, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0XA2, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X30, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0X1F, 0X51, 0X20, 0X63, 0X8F, 0X8F, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0X54, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X71, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XD7, 0X9, 0XA3, 0X14, 0XD8, 0X7B, 0X2C, 0X24, 0XD9, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X58, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X59, 0X5A, 0X5B, 0X5E, 0X70, 0X72, 0X75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XBF, 0X37, 0X69, 0X38, 0XBF, 0XBF, 0X39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, - { 0X5C, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XBF, 0XEF, 0XEB, 0X18, 0XFF, 0XBF, 0XC7, 0XBB, 0XED, 0X12, 0X4, 0XBC, 0X5F, 0X50, 0XC7, 0XC, 0XC7, 0X4, 0XBD, 0X20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X7C, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0XBF, 0XEF, 0XEB, 0X18, 0XFF, 0XBF, 0XEF, 0XCF, 0X1, 0X1A, 0X4, 0XD0, 0X53, 0X50, 0XEF, 0XC, 0XEF, 0X4, 0XD1, 0X24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0X22, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8F, 0XE7, 0X17, 0X33, 0X18, 0X27, 0XE7, 0X2B, 0XED, 0X1F, 0X9A, 0XC, 0XEE, 0X51, 0X64, 0X2B, 0X2B, 0XEF, 0X22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 19 }, - { 0X25, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X1F, 0X4F, 0X18, 0X5F, 0X1F, 0X7F, 0X17, 0X49, 0X18, 0X7B, 0X80, 0X7F, 0X7F, 0X19, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16 }, - { 0X66, 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5E, 0X5F, 0X65, 0X70, 0X72, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X77, 0XDB, 0XFF, 0XBD, 0X58, 0X1B, 0XDB, 0X19, 0X64, 0X96, 0XA4, 0X65, 0X88, 0X5E, 0X19, 0X19, 0X66, 0X49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0, 0X4571, 0X8671, 0X571, 0X4671, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X66, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X3F, 0X3F, 0, 0X86, 0X68, 0X7F, 0X3F, 0XAF, 0XAF, 0XE1, 0XE4, 0X24, 0XB0, 0X93, 0XB4, 0XBE, 0X2D, 0X31, 0XAF, 0X44, 0XAF, 0X44, 0XB1, 0X44, 0XCC, 0X54, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 27 }, - { 0X2, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X9A, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 3 }, - { 0X6, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0XE, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0XF, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X10, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X2A, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X13, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XA2, 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X30, 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X54, 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X8E, 0XB7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2 }, - { 0X58, 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0X4571, 0X873D, 0X571, 0X877A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6D, 0X50, 0XC8, 0X2F, 0X33, 0XCC, 0XAA, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0X7C, 0X4571, 0X873D, 0X571, 0X877A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X6D, 0X50, 0XC8, 0X2F, 0X33, 0XCC, 0XCC, 0X7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0X22, 0X4571, 0XC56F, 0X571, 0X856F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0X64, 0XBE, 0X3D, 0X41, 0, 0, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0X25, 0X4571, 0X8760, 0X571, 0X4760, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X77, 0X78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X71, 0X80, 0XC8, 0X4D, 0X51, 0X46, 0X46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7 }, - { 0X66, 0X4571, 0X45E5, 0X571, 0X5E5, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X75, 0X5E, 0XED, 0XF1, 0X44, 0X80, 0X80, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { - { 0X2, 0, 0, 0, 0, { 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X5C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X7C, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0X22, 0, 0, 0, 0, { 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 1 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 } - }, - { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0X8F, 0X1F, 0X51, 0XDB, 0XC, 0X20, 0X63, 0XA0, 0, 0X82, 0X86, 0X8F, 0X14, 0X8F, 0X14, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, - { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X6D, 0X6E, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0X8F, 0X1F, 0X51, 0XDB, 0XC, 0X20, 0X63, 0XA0, 0, 0X82, 0X86, 0X8F, 0X14, 0X8F, 0X14, 0X21, 0X34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 24 }, - { - { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7F, 0X5F, 0X8F, 0X34, 0X28, 0X9F, 0X5F, 0XDF, 0X47, 0X79, 0XDB, 0XC, 0X48, 0X6B, 0XA0, 0, 0XDF, 0X1C, 0XDF, 0X14, 0X49, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, - { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X67, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X1F, 0XAF, 0XDF, 0X34, 0X38, 0XEF, 0XAF, 0X57, 0X83, 0XB5, 0XDB, 0X14, 0X84, 0X67, 0XC8, 0, 0X57, 0X2C, 0X57, 0X24, 0X85, 0X38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }, - { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X1F, 0X4F, 0X7D, 0X38, 0X5F, 0X1F, 0XFF, 0XD7, 0X9, 0XA3, 0X14, 0XD8, 0X7B, 0, 0XFF, 0X2C, 0XFF, 0X24, 0XD9, 0X3C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X4571, 0X4571, 0X571, 0X571, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X51, 0X52, 0X53, 0X54, 0X55, 0X56, 0X57, 0X59, 0X5A, 0X5B, 0X5C, 0X5D, 0X5E, 0X5F, 0X65, 0X70, 0X71, 0X72, 0X74, 0X75, 0X76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0X9F, 0XCF, 0X7D, 0X48, 0XDF, 0X9F, 0XFF, 0X57, 0X89, 0XA4, 0X1C, 0X58, 0X9B, 0X40, 0XFF, 0X3C, 0XFF, 0X34, 0X59, 0X4C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 21 } - }, - { - { 0X4571, 0XC47F, 0X571, 0X847F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X73, 0XA0, 0XD8, 0, 0X5A, 0X5E, 0X44, 0X98, 0X98, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10 }, - { 0X4571, 0X856F, 0X571, 0X456F, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X67, 0X6D, 0X6E, 0X71, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0XC8, 0XE1, 0, 0X7F, 0X83, 0X44, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 }, - { 0X4571, 0X454A, 0X571, 0X54A, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X66, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X65, 0, 0XF0, 0XAB, 0XAF, 0X44, 0X8E, 0X8E, 0XA7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9 }, - { 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0 }, - { 0X4571, 0X477C, 0X571, 0X77C, { 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0XD4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X50, 0X65, 0X6D, 0X6E, 0X71, 0X77, 0X78, 0X79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X7D, 0X40, 0XD0, 0XD4, 0X44, 0X32, 0X68, 0XF7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8 } - } - } -}; - -static const int NumPowerOn = 2; - -static const int NumPowerOff = 2; - -typedef struct _VIALCDPOWERSEQUENCE { - CARD8 powerSeq; - CARD8 port[4]; - CARD8 offset[4]; - CARD8 mask[4]; - CARD8 data[4]; - CARD16 delay[4]; - int numEntry; -} VIALCDPowerSeqRec, *VIALCDPowerSeqRecPtr; - -#define VIA_BIOS_NUM_LCD_POWER_SEQ 4 - -static const VIALCDPowerSeqRec powerOn[] = { - { 0, { 0XD4, 0XD4, 0, 0 }, { 0X91, 0X91, 0, 0 }, { 0X10, 0X8, 0, 0 }, { 0X10, 0X8, 0, 0 }, { 0X19, 0X64, 0, 0 }, 2 }, - { 1, { 0XD4, 0XD4, 0XD4, 0 }, { 0X91, 0X91, 0X91, 0 }, { 0X10, 0X8, 0X6, 0 }, { 0X10, 0X8, 0X6, 0 }, { 0X19, 0X1FE, 0X1, 0 }, 3 }, - { 2, { 0XC4, 0XD4, 0XC4, 0 }, { 0X3D, 0X91, 0X3D, 0 }, { 0X10, 0X8, 0X20, 0 }, { 0X10, 0X8, 0X20, 0 }, { 0X19, 0X1FE, 0X1, 0 }, 3 }, - { 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, 0 } -}; - -static const VIALCDPowerSeqRec powerOff[] = { - { 0, { 0XD4, 0, 0, 0 }, { 0X91, 0, 0, 0 }, { 0X18, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0X1, 0, 0, 0 }, 1 }, - { 1, { 0XD4, 0XD4, 0XD4, 0 }, { 0X91, 0X91, 0X91, 0 }, { 0X6, 0X8, 0X10, 0 }, { 0, 0, 0, 0 }, { 0XD2, 0X19, 0X1, 0 }, 3 }, - { 2, { 0XC4, 0XD4, 0XC4, 0 }, { 0X3D, 0X91, 0X3D, 0 }, { 0X20, 0X8, 0X10, 0 }, { 0, 0, 0, 0 }, { 0XD2, 0X19, 0X1, 0 }, 3 }, - { 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, 0 } -}; - -typedef struct _VIALCDMODEFIX { - CARD8 reqMode[32]; - CARD8 fixMode[32]; - int numEntry; -} VIALCDModeFixRec, *VIALCDModeFixRecPtr; - -static const VIALCDModeFixRec modeFix = { - { 0X1, 0X3, 0X7, 0X5, 0X2E, 0X2F, 0X52, 0X53, 0X56, 0X57, 0X5A, 0X5B, 0X67, 0X68, 0X5D, 0X5E, 0X7D, 0X7E, 0X23, 0X24, 0X26, 0X27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X2, 0X2, 0X4, 0X30, 0X30, 0X50, 0X50, 0X54, 0X54, 0X58, 0X58, 0X66, 0X66, 0X5C, 0X5C, 0X7C, 0X7C, 0X22, 0X22, 0X25, 0X25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 22 }; - - -#endif /* _VIA_MODE_H_ */ diff --git a/src/via_options.c b/src/via_options.c new file mode 100644 index 0000000..755b776 --- /dev/null +++ b/src/via_options.c @@ -0,0 +1,582 @@ +/* + * Copyright 2005-2019 OpenChrome Project + * [https://www.freedesktop.org/wiki/Openchrome] + * Copyright 2004-2006 Luc Verhaegen. + * Copyright 2004-2005 The Unichrome Project [unichrome.sf.net] + * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sub license, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including + * the next paragraph) shall be included in all copies or substantial + * portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "via_driver.h" + + +typedef enum +{ +#ifdef HAVE_DEBUG + OPTION_PRINTVGAREGS, + OPTION_PRINTTVREGS, +#endif + OPTION_NOACCEL, + OPTION_EXA_NOCOMPOSITE, + OPTION_EXA_SCRATCH_SIZE, + OPTION_SWCURSOR, + OPTION_SHADOW_FB, + OPTION_ROTATION_TYPE, + OPTION_ROTATE, + OPTION_CENTER, + OPTION_TVDOTCRAWL, + OPTION_TVTYPE, + OPTION_TVOUTPUT, + OPTION_DISABLEVQ, + OPTION_DISABLEIRQ, + OPTION_TVDEFLICKER, + OPTION_AGP_DMA, + OPTION_2D_DMA, + OPTION_XV_DMA, + OPTION_MAX_DRIMEM, + OPTION_AGPMEM, + OPTION_DISABLE_XV_BW_CHECK +} VIAOpts; + +static OptionInfoRec VIAOptions[] = { +#ifdef HAVE_DEBUG /* Don't document these three. */ + {OPTION_PRINTVGAREGS, "PrintVGARegs", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_PRINTTVREGS, "PrintTVRegs", OPTV_BOOLEAN, {0}, FALSE}, +#endif + {OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_EXA_NOCOMPOSITE, "ExaNoComposite", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_EXA_SCRATCH_SIZE, "ExaScratchSize", OPTV_INTEGER, {0}, FALSE}, + {OPTION_SWCURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_ROTATION_TYPE, "RotationType", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_TVDOTCRAWL, "TVDotCrawl", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_TVDEFLICKER, "TVDeflicker", OPTV_INTEGER, {0}, FALSE}, + {OPTION_TVTYPE, "TVType", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_TVOUTPUT, "TVOutput", OPTV_ANYSTR, {0}, FALSE}, + {OPTION_DISABLEVQ, "DisableVQ", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_DISABLEIRQ, "DisableIRQ", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_AGP_DMA, "EnableAGPDMA", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_2D_DMA, "NoAGPFor2D", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_XV_DMA, "NoXVDMA", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_DISABLE_XV_BW_CHECK, "DisableXvBWCheck", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_MAX_DRIMEM, "MaxDRIMem", OPTV_INTEGER, {0}, FALSE}, + {OPTION_AGPMEM, "AGPMem", OPTV_INTEGER, {0}, FALSE}, + {-1, NULL, OPTV_NONE, {0}, FALSE} +}; + +const OptionInfoRec * +VIAAvailableOptions(int chipid, int busid) +{ + return VIAOptions; +} + + +void +viaSetupDefaultOptions(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + pVia->shadowFB = FALSE; + pVia->NoAccel = FALSE; + pVia->noComposite = FALSE; + pVia->useEXA = TRUE; + pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024; + pVia->drmmode.hwcursor = TRUE; + pVia->VQEnable = TRUE; + pVia->DRIIrqEnable = TRUE; + pVia->agpEnable = TRUE; + pVia->dma2d = TRUE; + pVia->dmaXV = TRUE; +#ifdef HAVE_DEBUG + pVia->disableXvBWCheck = FALSE; +#endif + pVia->maxDriSize = 0; + pVia->agpMem = AGP_SIZE / 1024; + pVia->VideoEngine = VIDEO_ENGINE_CLE; +#ifdef HAVE_DEBUG + pVia->PrintVGARegs = FALSE; +#endif + + /* + * Disable vertical interpolation because the size of + * line buffer (limited to 800) is too small to do interpolation. + */ + pVia->swov.maxWInterp = 800; + pVia->swov.maxHInterp = 600; + + switch (pVia->Chipset) { + case VIA_CLE266: + break; + case VIA_KM400: + /* + * IRQ is not broken on KM400A, but testing + * (pVia->ChipRev < 0x80) is not enough to make sure we + * have an older, broken KM400. + */ + pVia->DRIIrqEnable = FALSE; + break; + case VIA_K8M800: + pVia->DRIIrqEnable = FALSE; + break; + case VIA_PM800: + pVia->VideoEngine = VIDEO_ENGINE_CME; + break; + case VIA_P4M800PRO: + break; + case VIA_CX700: + pVia->VideoEngine = VIDEO_ENGINE_CME; + pVia->swov.maxWInterp = 1920; + pVia->swov.maxHInterp = 1080; + break; + case VIA_P4M890: + pVia->VideoEngine = VIDEO_ENGINE_CME; + pVia->dmaXV = FALSE; + break; + case VIA_K8M890: + pVia->VideoEngine = VIDEO_ENGINE_CME; + pVia->agpEnable = FALSE; + pVia->dmaXV = FALSE; + break; + case VIA_P4M900: + pVia->VideoEngine = VIDEO_ENGINE_CME; + pVia->agpEnable = FALSE; + /* FIXME: this needs to be tested */ + pVia->dmaXV = FALSE; + break; + case VIA_VX800: + case VIA_VX855: + case VIA_VX900: + pVia->VideoEngine = VIDEO_ENGINE_CME; + pVia->agpEnable = FALSE; + pVia->dmaXV = FALSE; + break; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); +} + +static void +viaProcessUMSOptions(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + MessageType from = X_DEFAULT; + const char *s = NULL; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + +/* + pVia->VQEnable = TRUE; +*/ + from = xf86GetOptValBool(VIAOptions, + OPTION_DISABLEVQ, &pVia->VQEnable) ? + X_CONFIG : X_DEFAULT; + if (from == X_CONFIG) + pVia->VQEnable = !pVia->VQEnable; + xf86DrvMsg(pScrn->scrnIndex, from, + "GPU virtual command queue will be %s.\n", + (pVia->VQEnable) ? "enabled" : "disabled"); + +/* + pVia->DRIIrqEnable = TRUE; +*/ + from = xf86GetOptValBool(VIAOptions, + OPTION_DISABLEIRQ, + &pVia->DRIIrqEnable) ? + X_CONFIG : X_DEFAULT; + if (from == X_CONFIG) + pVia->DRIIrqEnable = !pVia->DRIIrqEnable; + xf86DrvMsg(pScrn->scrnIndex, from, + "DRI IRQ will be %s if DRI is enabled.\n", + (pVia->DRIIrqEnable) ? "enabled" : "disabled"); + +/* + pVia->agpEnable = FALSE; +*/ + from = xf86GetOptValBool(VIAOptions, + OPTION_AGP_DMA, &pVia->agpEnable) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "AGP DMA will be %s if DRI is enabled.\n", + (pVia->agpEnable) ? "enabled" : "disabled"); + +/* + pVia->dma2d = TRUE; +*/ + if (pVia->agpEnable) { + from = xf86GetOptValBool(VIAOptions, + OPTION_2D_DMA, &pVia->dma2d) ? + X_CONFIG : X_DEFAULT; + if (from == X_CONFIG) + pVia->dma2d = !pVia->dma2d; + xf86DrvMsg(pScrn->scrnIndex, from, + "AGP DMA will %sbe used for 2D acceleration.\n", + (pVia->dma2d) ? "" : "not "); + } + +/* + pVia->dmaXV = TRUE; +*/ + from = xf86GetOptValBool(VIAOptions, + OPTION_XV_DMA, &pVia->dmaXV) ? + X_CONFIG : X_DEFAULT; + if (from == X_CONFIG) + pVia->dmaXV = !pVia->dmaXV; + xf86DrvMsg(pScrn->scrnIndex, from, "PCI DMA will %sbe used for XV " + "image transfer if DRI is enabled.\n", + (pVia->dmaXV) ? "" : "not "); + +#ifdef HAVE_DEBUG +/* + pVia->disableXvBWCheck = FALSE; +*/ + from = xf86GetOptValBool(VIAOptions, + OPTION_DISABLE_XV_BW_CHECK, + &pVia->disableXvBWCheck) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "Xv Bandwidth check is %s.\n", + pVia->disableXvBWCheck ? "disabled" : "enabled"); + if (pVia->disableXvBWCheck) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "You may get a \"snowy\" screen when using the Xv " + "overlay.\n"); + } +#endif + +/* + pVia->maxDriSize = 0; +*/ + from = xf86GetOptValInteger(VIAOptions, + OPTION_MAX_DRIMEM, + &pVia->maxDriSize) ? + X_CONFIG : X_DEFAULT; + if (pVia->maxDriSize > 0) + xf86DrvMsg(pScrn->scrnIndex, from, + "Will impose a %d kB limit on video RAM reserved " + "for DRI.\n", + pVia->maxDriSize); + else + xf86DrvMsg(pScrn->scrnIndex, from, + "Will not impose a limit on video RAM reserved " + "for DRI.\n"); + +/* + pVia->agpMem = AGP_SIZE / 1024; +*/ + from = xf86GetOptValInteger(VIAOptions, + OPTION_AGPMEM, &pVia->agpMem) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "Will try to allocate %d KB of AGP memory.\n", + pVia->agpMem); + +#ifdef HAVE_DEBUG +/* + pVia->PrintVGARegs = FALSE; +*/ + from = xf86GetOptValBool(VIAOptions, + OPTION_PRINTVGAREGS, + &pVia->PrintVGARegs) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "Will %sprint VGA registers.\n", + pVia->PrintVGARegs ? "" : "not "); + if (pVia->PrintVGARegs) + /* + * Do this as early as possible. + */ + ViaVgahwPrint(VGAHWPTR(pScrn)); +#endif /* HAVE_DEBUG */ + + pVIADisplay->TVDotCrawl = FALSE; + from = xf86GetOptValBool(VIAOptions, + OPTION_TVDOTCRAWL, + &pVIADisplay->TVDotCrawl) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "TV dotCrawl is %s.\n", + pVIADisplay->TVDotCrawl ? "enabled" : "disabled"); + + /* + * TV Deflicker + */ + pVIADisplay->TVDeflicker = 0; + from = xf86GetOptValInteger(VIAOptions, OPTION_TVDEFLICKER, + &pVIADisplay->TVDeflicker) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "TV deflicker is set to %d.\n", + pVIADisplay->TVDeflicker); + + pVIADisplay->TVType = TVTYPE_NONE; + if ((s = xf86GetOptValString(VIAOptions, OPTION_TVTYPE))) { + if (!xf86NameCmp(s, "NTSC")) { + pVIADisplay->TVType = TVTYPE_NTSC; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Type is NTSC.\n"); + } else if (!xf86NameCmp(s, "PAL")) { + pVIADisplay->TVType = TVTYPE_PAL; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Type is PAL.\n"); + } else if (!xf86NameCmp(s, "480P")) { + pVIADisplay->TVType = TVTYPE_480P; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Type is SDTV 480P.\n"); + } else if (!xf86NameCmp(s, "576P")) { + pVIADisplay->TVType = TVTYPE_576P; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Type is SDTV 576P.\n"); + } else if (!xf86NameCmp(s, "720P")) { + pVIADisplay->TVType = TVTYPE_720P; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Type is HDTV 720P.\n"); + } else if (!xf86NameCmp(s, "1080I")) { + pVIADisplay->TVType = TVTYPE_1080I; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Type is HDTV 1080i.\n"); + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, + "No default TV type is set.\n"); + } + + /* + * TV output signal option + */ + pVIADisplay->TVOutput = TVOUTPUT_NONE; + if ((s = xf86GetOptValString(VIAOptions, OPTION_TVOUTPUT))) { + if (!xf86NameCmp(s, "S-Video")) { + pVIADisplay->TVOutput = TVOUTPUT_SVIDEO; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Output Signal is S-Video.\n"); + } else if (!xf86NameCmp(s, "Composite")) { + pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Output Signal is Composite.\n"); + } else if (!xf86NameCmp(s, "SC")) { + pVIADisplay->TVOutput = TVOUTPUT_SC; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Output Signal is SC.\n"); + } else if (!xf86NameCmp(s, "RGB")) { + pVIADisplay->TVOutput = TVOUTPUT_RGB; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Output Signal is RGB.\n"); + } else if (!xf86NameCmp(s, "YCbCr")) { + pVIADisplay->TVOutput = TVOUTPUT_YCBCR; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "TV Output Signal is YCbCr.\n"); + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, + "No default TV output signal type is set.\n"); + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); +} + +void +viaProcessOptions(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + MessageType from = X_DEFAULT; + const char *s = NULL; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Processing DDX options . . .\n"); + + xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, VIAOptions); + + /* + * When rotating, switch shadow frame buffer on and acceleration + * off. + */ + if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATION_TYPE))) { + if (!xf86NameCmp(s, "SWRandR")) { + pVia->shadowFB = TRUE; + pVia->NoAccel = TRUE; + pVia->RandRRotation = TRUE; + pVia->rotate = RR_Rotate_0; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Rotating screen RandR enabled, " + "acceleration disabled\n"); + } else if (!xf86NameCmp(s, "HWRandR")) { + pVia->shadowFB = TRUE; + pVia->NoAccel = TRUE; + pVia->RandRRotation = TRUE; + pVia->rotate = RR_Rotate_0; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Hardware accelerated rotating screen is not " + "implemented. Using SW RandR.\n"); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "\"%s\" is not a valid" + "value for Option \"RotationType\".\n", s); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Valid options are \"SWRandR\" and " + "\"HWRandR\".\n"); + } + } + + /* + * When rotating, switch shadow frame buffer on and acceleration + * off. + */ + if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATE))) { + if (!xf86NameCmp(s, "CW")) { + pVia->shadowFB = TRUE; + pVia->NoAccel = TRUE; + pVia->RandRRotation = TRUE; + pVia->rotate = RR_Rotate_270; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Rotating screen clockwise -- " + "acceleration is disabled.\n"); + } else if (!xf86NameCmp(s, "CCW")) { + pVia->shadowFB = TRUE; + pVia->NoAccel = TRUE; + pVia->RandRRotation = TRUE; + pVia->rotate = RR_Rotate_90; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Rotating screen counterclockwise -- " + "acceleration is disabled.\n"); + } else if (!xf86NameCmp(s, "UD")) { + pVia->shadowFB = TRUE; + pVia->NoAccel = TRUE; + pVia->RandRRotation = TRUE; + pVia->rotate = RR_Rotate_180; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Rotating screen upside-down -- " + "acceleration is disabled.\n"); + } else { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "\"%s\" is not a valid value for " + "Option \"Rotate\".\n", s); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Valid options are \"CW\", \"CCW\" " + "or \"UD\".\n"); + } + } + + from = (xf86GetOptValBool(VIAOptions, + OPTION_SHADOW_FB, &pVia->shadowFB) + ? X_CONFIG : X_DEFAULT); + xf86DrvMsg(pScrn->scrnIndex, from, + "Shadow framebuffer is %s.\n", + pVia->shadowFB ? "enabled" : "disabled"); + + /* + * Use hardware acceleration, unless on shadow frame buffer. + */ + from = (xf86GetOptValBool(VIAOptions, + OPTION_NOACCEL, &pVia->NoAccel) ? + X_CONFIG : X_DEFAULT); + if (!pVia->NoAccel && pVia->shadowFB) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Acceleration is not supported when using shadow " + "frame buffer.\n"); + pVia->NoAccel = TRUE; + from = X_DEFAULT; + } + + /* + * Disable EXA for KMS case + */ + if (pVia->KMS) + pVia->NoAccel = TRUE; + + xf86DrvMsg(pScrn->scrnIndex, from, + "Hardware acceleration is %s.\n", + !pVia->NoAccel ? "enabled" : "disabled"); + + if (!pVia->NoAccel) { + from = X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "Using EXA acceleration architecture.\n"); +/* + pVia->noComposite = FALSE; +*/ + if (pVia->useEXA) { + from = xf86GetOptValBool(VIAOptions, + OPTION_EXA_NOCOMPOSITE, + &pVia->noComposite) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "EXA composite acceleration %s.\n", + !pVia->noComposite ? "enabled" : "disabled"); + +/* + pVia->exaScratchSize = VIA_SCRATCH_SIZE / 1024; +*/ + from = xf86GetOptValInteger(VIAOptions, + OPTION_EXA_SCRATCH_SIZE, + &pVia->exaScratchSize) ? + X_CONFIG : X_DEFAULT; + xf86DrvMsg(pScrn->scrnIndex, from, + "EXA scratch area size is %d KB.\n", + pVia->exaScratchSize); + } + } + + /* + * Use a hardware cursor, unless on secondary or on shadow + * frame buffer. + */ + from = X_DEFAULT; + if (pVia->IsSecondary || pVia->shadowFB) + pVia->drmmode.hwcursor = FALSE; + else if (xf86GetOptValBool(VIAOptions, OPTION_SWCURSOR, + &pVia->drmmode.hwcursor)) { + pVia->drmmode.hwcursor = !pVia->drmmode.hwcursor; + from = X_CONFIG; + } + + if (pVia->drmmode.hwcursor) + xf86DrvMsg(pScrn->scrnIndex, from, + "Using hardware two-color cursors and software " + "full-color cursors.\n"); + else + xf86DrvMsg(pScrn->scrnIndex, from, + "Using software cursors.\n"); + + if (!pVia->KMS) { + viaProcessUMSOptions(pScrn); + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); +} diff --git a/src/via_outputs.c b/src/via_outputs.c index fa0e946..6641b7d 100644 --- a/src/via_outputs.c +++ b/src/via_outputs.c @@ -40,655 +40,47 @@ #include "via_driver.h" #include -/* - * Modetable nonsense. - * - */ -#include "via_mode.h" - -/* - * Sets IGA1 or IGA2 as the display output source for DIP0 - * (Digital Interface Port 0) interface for CLE266 only. - */ -void -viaDIP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDIP0SetDisplaySource.\n")); - - /* Set DIP0 display output source. */ - /* 3X5.6C[7] - DIP0 (Digital Interface Port 0) Data Source Selection - * 0: Primary Display (IGA1) - * 1: Secondary Display (IGA2) */ - ViaCrtcMask(hwp, 0x6C, temp << 7, 0x80); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DIP0 Display Output Source: IGA%d\n", - (temp & 0x01) + 1); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDIP0SetDisplaySource.\n")); -} - -/* - * Sets DIP0 (Digital Interface Port 0) I/O pad state. - * This function is for CLE266 chipset only. - */ -void -viaDIP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDIP0EnableIOPads.\n")); - - /* Set DIP0 I/O pad state. */ - /* 3C5.1E[7:6] - DIP0 Power Control - * 0x: Pad always off - * 10: Depend on the other control signal - * 11: Pad on/off according to the - * Power Management Status (PMS) */ - ViaSeqMask(hwp, 0x1E, ioPadState << 6, 0xC0); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DIP0 I/O Pad State: %s\n", - (ioPadState & 0x02) ? - (ioPadState & 0x01) ? "Automatic On / Off" : "Conditional" - : "Off"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDIP0EnableIOPads.\n")); -} - -/* - * Sets DIP0 (Digital Interface Port 0) clock I/O pad drive strength - * for CLE266 chipset only. - */ -void -viaDIP0SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDIP0SetClockDriveStrength.\n")); - - /* 3C5.1E[2] - DIP0 Clock Drive Strength Bit [0] */ - ViaSeqMask(hwp, 0x1E, clockDriveStrength << 2, 0x04); - - /* 3C5.2A[4] - DIP0 Clock Drive Strength Bit [1] */ - ViaSeqMask(hwp, 0x2A, clockDriveStrength << 3, 0x10); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DIP0 Clock I/O Pad Drive Strength: %u\n", - clockDriveStrength & 0x03); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDIP0SetClockDriveStrength.\n")); -} - -/* - * Sets DIP0 (Digital Interface Port 0) data I/O pads drive strength - * for CLE266 chipset only. - */ -void -viaDIP0SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDIP0SetDataDriveStrength.\n")); - - /* 3C5.1B[1] - DIP0 Data Drive Strength Bit [0] */ - ViaSeqMask(hwp, 0x1B, dataDriveStrength << 1, 0x02); - - /* 3C5.2A[5] - DIP0 Data Drive Strength Bit [1] */ - ViaSeqMask(hwp, 0x2A, dataDriveStrength << 4, 0x20); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DIP0 Data I/O Pads Drive Strength: %u\n", - dataDriveStrength); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDIP0SetDataDriveStrength.\n")); -} - -/* - * Sets IGA1 or IGA2 as the display output source for DVP0 - * (Digital Video Port) interface. - */ -void -viaDVP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP0SetDisplaySource.\n")); - - /* Set DVP0 display output source. */ - /* 3X5.96[4] - DVP0 Data Source Selection - * 0: Primary Display - * 1: Secondary Display */ - ViaCrtcMask(hwp, 0x96, temp << 4, 0x10); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP0 Display Output Source: IGA%d\n", - (temp & 0x01) + 1); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP0SetDisplaySource.\n")); -} - -/* - * Sets DVP0 (Digital Video Port 0) I/O pad state. - */ -void -viaDVP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP0EnableIOPads.\n")); - - /* Set DVP0 I/O pad state. */ - /* 3C5.1E[7:6] - DVP0 Power Control - * 0x: Pad always off - * 10: Depend on the other control signal - * 11: Pad on/off according to the - * Power Management Status (PMS) */ - ViaSeqMask(hwp, 0x1E, ioPadState << 6, 0xC0); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP0 I/O Pad State: %s\n", - (ioPadState & 0x02) ? - (ioPadState & 0x01) ? "Automatic On / Off" : "Conditional" - : "Off"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP0EnableIOPads.\n")); -} - -/* - * Sets DVP0 (Digital Video Port 0) clock I/O pad drive strength. - */ -void -viaDVP0SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP0SetClockDriveStrength.\n")); - - /* 3C5.1E[2] - DVP0 Clock Drive Strength Bit [0] */ - ViaSeqMask(hwp, 0x1E, clockDriveStrength << 2, 0x04); - - /* 3C5.2A[4] - DVP0 Clock Drive Strength Bit [1] */ - ViaSeqMask(hwp, 0x2A, clockDriveStrength << 3, 0x10); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP0 Clock I/O Pad Drive Strength: %u\n", - clockDriveStrength & 0x03); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP0SetClockDriveStrength.\n")); -} - -/* - * Sets DVP0 (Digital Video Port 0) data I/O pads drive strength. - */ -void -viaDVP0SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP0SetDataDriveStrength.\n")); - - /* 3C5.1B[1] - DVP0 Data Drive Strength Bit [0] */ - ViaSeqMask(hwp, 0x1B, dataDriveStrength << 1, 0x02); - - /* 3C5.2A[5] - DVP0 Data Drive Strength Bit [1] */ - ViaSeqMask(hwp, 0x2A, dataDriveStrength << 4, 0x20); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP0 Data I/O Pads Drive Strength: %u\n", - dataDriveStrength); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP0SetDataDriveStrength.\n")); -} - -/* - * Sets IGA1 or IGA2 as the display output source for DVP1 - * (Digital Video Port) interface. - */ -void -viaDVP1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP1SetDisplaySource.\n")); - - /* Set DVP1 display output source. */ - /* 3X5.9B[4] - DVP1 Data Source Selection - * 0: Primary Display - * 1: Secondary Display */ - ViaCrtcMask(hwp, 0x9B, temp << 4, 0x10); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP1 Display Output Source: IGA%d\n", - (temp & 0x01) + 1); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP1SetDisplaySource.\n")); -} - -/* - * Sets DVP1 (Digital Video Port 1) I/O pad state. - */ -void -viaDVP1EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP1EnableIOPads.\n")); - - /* Set DVP1 I/O pad state. */ - /* 3C5.1E[5:4] - DVP1 Power Control - * 0x: Pad always off - * 10: Depend on the other control signal - * 11: Pad on/off according to the - * Power Management Status (PMS) */ - ViaSeqMask(hwp, 0x1E, ioPadState << 4, 0x30); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP1 I/O Pad State: %s\n", - (ioPadState & 0x02) ? - (ioPadState & 0x01) ? "Automatic On / Off": "Conditional" - : "Off"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP1EnableIOPads.\n")); -} - -/* - * Sets DVP1 (Digital Video Port 1) clock I/O pad drive strength. - */ -void -viaDVP1SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP1SetClockDriveStrength.\n")); - - /* 3C5.65[3:2] - DVP1 Clock Pads Driving Select - * 00: lowest - * 01: low - * 10: high - * 11: highest */ - ViaSeqMask(hwp, 0x65, clockDriveStrength << 2, 0x0C); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP1 Clock I/O Pad Drive Strength: %u\n", - clockDriveStrength & 0x03); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP1SetClockDriveStrength.\n")); -} - -/* - * Sets DVP1 (Digital Video Port 1) data I/O pads drive strength. - */ -void -viaDVP1SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDVP1SetDataDriveStrength.\n")); - - /* 3C5.65[1:0] - DVP1 Data Pads Driving Select - * 00: lowest - * 01: low - * 10: high - * 11: highest */ - ViaSeqMask(hwp, 0x65, dataDriveStrength, 0x03); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DVP1 Data I/O Pads Drive Strength: %u\n", - dataDriveStrength & 0x03); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDVP1SetDataDriveStrength.\n")); -} - -/* - * Sets IGA1 or IGA2 as the display output source for VIA Technologies - * Chrome IGP DFP (Digital Flat Panel) Low interface. - */ -void -viaDFPLowSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDFPLowSetDisplaySource.\n")); - - /* Set DFP Low display output source. */ - /* 3X5.99[4] - DFP Low Data Source Selection - * 0: Primary Display - * 1: Secondary Display */ - ViaCrtcMask(hwp, 0x99, temp << 4, 0x10); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DFP Low Display Output Source: IGA%d\n", - (temp & 0x01) + 1); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDFPLowSetDisplaySource.\n")); -} - -/* - * Sets DFP (Digital Flat Panel) Low I/O pad state. - */ -void -viaDFPLowEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaDFPLowEnableIOPads.\n")); - - /* Set DFP Low I/O pad state. */ - /* 3C5.2A[1:0] - DFP Low Power Control - * 0x: Pad always off - * 10: Depend on the other control signal - * 11: Pad on/off according to the - * Power Management Status (PMS) */ - ViaSeqMask(hwp, 0x2A, ioPadState, 0x03); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "DFP Low I/O Pad State: %s\n", - (ioPadState & 0x02) ? - (ioPadState & 0x01) ? "Automatic On / Off": "Conditional" - : "Off"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaDFPLowEnableIOPads.\n")); -} - -/* - * Reads off the VIA Technologies IGP pin strapping for - * display detection purposes. - */ -void -viaProbePinStrapping(ScrnInfoPtr pScrn) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaProbePinStrapping.\n")); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Probing VIA Technologies IGP pin strapping . . .\n"); - - if ((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) { - - sr5a = hwp->readSeq(hwp, 0x5A); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR5A: 0x%02X\n", sr5a)); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Setting 3C5.5A[0] to 0.\n"); - ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01); - } - - sr12 = hwp->readSeq(hwp, 0x12); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR12: 0x%02X\n", sr12)); - sr13 = hwp->readSeq(hwp, 0x13); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR13: 0x%02X\n", sr13)); - - switch (pVia->Chipset) { - case VIA_CLE266: - - /* 3C5.12[4] - FPD17 pin strapping - * 0: TMDS transmitter (DVI) / capture device - * 1: Flat panel */ - if (sr12 & 0x10) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "A flat panel is connected to " - "flat panel interface.\n"); - - /* 3C5.12[3:0] - FPD16-13 pin strapping - * 0 ~ 15: Flat panel code defined - * by VIA Technologies */ - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Detected Flat Panel Type from " - "Strapping Pins: %d\n", sr12 & 0x0F); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "A TMDS transmitter (DVI) / capture device is " - "connected to DIP0.\n"); - } - - /* 3C5.12[5] - FPD18 pin strapping - * 0: TMDS transmitter (DVI) - * 1: TV encoder */ - if (sr12 & 0x20) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "A TV encoder is connected to " - "DIP0.\n"); - - /* 3C5.13[4:3] - FPD21-20 pin strapping - * 00: PAL - * 01: NTSC - * 10: PAL-N - * 11: PAL-NC */ - if ((!(sr13 & 0x08)) && (sr13 & 0x04)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "NTSC for the TV encoder.\n"); - } else { - if (!(sr13 & 0x08)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "PAL for the TV encoder.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "PAL%s for the TV encoder.\n", - (sr13 & 0x04) ? "-NC" : "-N"); - } - } - - /* 3C5.12[6] - FPD19 pin strapping - * 0: 525 lines (NTSC) - * 1: 625 lines (PAL) */ - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "%s lines for the TV encoder.\n", - (sr12 & 0x40) ? "625" : "525"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "A TMDS transmitter (DVI) is connected to " - "DIP0.\n"); - } - - break; - - case VIA_KM400: - case VIA_K8M800: - case VIA_PM800: - case VIA_P4M800PRO: - - /* 3C5.12[6] - DVP0D6 pin strapping - * 0: Disable DVP0 (Digital Video Port 0) for - * DVI or TV out use - * 1: Enable DVP0 (Digital Video Port 0) for - * DVI or TV out use */ - if (sr12 & 0x40) { - - /* 3C5.12[5] - DVP0D5 pin strapping - * 0: TMDS transmitter (DVI) - * 1: TV encoder */ - if (sr12 & 0x20) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "A TV encoder is detected on " - "DVP0 (Digital Video Port 0).\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "A TMDS transmitter (DVI) is detected on " - "DVP0 (Digital Video Port 0).\n"); - } - } - - - /* 3C5.13[3] - DVP0D8 pin strapping - * 0: AGP pins are used for AGP - * 1: AGP pins are used by FPDP - * (Flat Panel Display Port) */ - if (sr13 & 0x08) { - - /* 3C5.12[4] - DVP0D4 pin strapping - * 0: Dual 12-bit FPDP (Flat Panel Display Port) - * 1: 24-bit FPDP (Flat Panel Display Port) */ - if (sr12 & 0x10) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "24-bit FPDP (Flat Panel Display Port) " - "detected.\n"); - - /* 3C5.12[3:0] - DVP0D3-0 pin strapping - * 0 ~ 15: Flat panel code defined - * by VIA Technologies */ - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Detected Flat Panel Type from " - "Strapping Pins: %d\n", sr12 & 0x0F); - } else { - - /* 3C5.12[6] - DVP0D6 pin strapping - * 0: Disable DVP0 (Digital Video Port 0) for - * DVI or TV out use - * 1: Enable DVP0 (Digital Video Port 0) for - * DVI or TV out use - * 3C5.12[5] - DVP0D5 pin strapping - * 0: TMDS transmitter (DVI) - * 1: TV encoder */ - if ((!(sr12 & 0x40)) && (!(sr12 & 0x20))) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "A TV encoder is connected to " - "FPDP (Flat Panel Display Port).\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Dual 12-bit FPDP (Flat Panel Display Port) " - "detected.\n"); - - /* 3C5.12[3:0] - DVP0D3-0 pin strapping - * 0 ~ 15: Flat panel code defined - * by VIA Technologies */ - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Detected Flat Panel Type from " - "Strapping Pins: %d\n", sr12 & 0x0F); - } - } - } - - break; - - default: - break; - } - - if ((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) { - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Setting 3C5.5A[0] to 1.\n"); - ViaSeqMask(hwp, 0x5A, sr5a | 0x01, 0x01); - - sr12 = hwp->readSeq(hwp, 0x12); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR12: 0x%02X\n", sr12)); - sr13 = hwp->readSeq(hwp, 0x13); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR13: 0x%02X\n", sr13)); - - /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select - * (DVP1D15-14 pin strapping) - * 00: LVDS1 + LVDS2 - * 01: DVI + LVDS2 - * 10: Dual LVDS Channel (High Resolution Panel) - * 11: One DVI only (decrease the clock jitter) */ - switch (sr13 & 0xC0) { - case 0x00: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "LVDS1 + LVDS2 detected.\n"); - break; - case 0x40: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Single Link DVI + LVDS2 detected.\n"); - break; - case 0x80: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Dual Channel LVDS detected.\n"); - break; - case 0xC0: - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Single Link DVI detected.\n"); - break; - default: - break; - } - - hwp->writeSeq(hwp, 0x5A, sr5a); - - } - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaProbePinStrapping.\n")); -} - void -viaOutputDetect(ScrnInfoPtr pScrn) +viaInitDisplay(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaOutputDetect.\n")); - - pBIOSInfo->analog = NULL; + "Entered viaInitDisplay.\n")); /* Initialize the number of VGA connectors. */ - pVia->numberVGA = 0; + pVIADisplay->numberVGA = 0; /* Initialize the number of DVI connectors. */ - pVia->numberDVI = 0; + pVIADisplay->numberDVI = 0; /* Initialize the number of FP connectors. */ - pVia->numberFP = 0; + pVIADisplay->numberFP = 0; - /* Read off the VIA Technologies IGP pin strapping for - display detection purposes. */ - viaProbePinStrapping(pScrn); + viaExtTMDSProbe(pScrn); + viaTMDSProbe(pScrn); + + viaFPProbe(pScrn); + + viaAnalogProbe(pScrn); - /* VGA */ - via_analog_init(pScrn); /* TV */ via_tv_init(pScrn); /* DVI */ - via_dvi_init(pScrn); + viaExtTMDSInit(pScrn); + viaTMDSInit(pScrn); - /* LVDS */ - via_lvds_init(pScrn); + /* VGA */ + viaAnalogInit(pScrn); + + /* FP (Flat Panel) */ + viaFPInit(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaOutputDetect.\n")); + "Exiting viaInitDisplay.\n")); } #ifdef HAVE_DEBUG @@ -933,38 +325,14 @@ ViaComputeProDotClock(unsigned clock) return bestClock.packed; } -/* - * - */ CARD32 ViaModeDotClockTranslate(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIAPtr pVia = VIAPTR(pScrn); - int i; if ((pVia->Chipset == VIA_CLE266) || (pVia->Chipset == VIA_KM400)) { - CARD32 best1 = 0, best2; - - for (i = 0; ViaDotClocks[i].DotClock; i++) - if (ViaDotClocks[i].DotClock == mode->Clock) { - best1 = ViaDotClocks[i].UniChrome; - break; - } - - best2 = ViaComputeDotClock(mode->Clock); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "ViaComputeDotClock %d : %04x : %04x\n", - mode->Clock, (unsigned int)best1, - (unsigned int)best2)); - - return best2; + return ViaComputeDotClock(mode->Clock); } else { - for (i = 0; ViaDotClocks[i].DotClock; i++) - if (ViaDotClocks[i].DotClock == mode->Clock) - return ViaDotClocks[i].UniChromePro.packed; return ViaComputeProDotClock(mode->Clock); } - - return 0; } diff --git a/src/via_regs.h b/src/via_regs.h index 64a628a..467a88d 100644 --- a/src/via_regs.h +++ b/src/via_regs.h @@ -1,330 +1,345 @@ -/* - * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. - * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sub license, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the - * next paragraph) shall be included in all copies or substantial portions - * of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL - * THE AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - */ - -/************************************************************************* - * - * File: via_regs.c - * Content: The defines of Via registers - * - ************************************************************************/ - -#ifndef _VIA_REGS_H_ -#define _VIA_REGS_H_ 1 - -#include "via_driver.h" - -/*#define VIA_SERIES(chip) (chip == VIA_CLE266)*/ - - -/* Chip tags. These are used to group the adapters into - * related families. - */ - -enum VIACHIPTAGS { - VIA_UNKNOWN = 0, - VIA_CLE266, - VIA_KM400, - VIA_K8M800, - VIA_PM800, - VIA_P4M800PRO, /* VT3314 */ - VIA_CX700, /* VT3324 */ -#ifdef VIA_VT3293_SUPPORT - VIA_CN750, /* VT3293 */ -#endif - VIA_P4M890, /* VT3327 */ - VIA_K8M890, /* VT3336 */ - VIA_P4M900, /* VT3364 */ - VIA_VX800, /* VT3353 */ - VIA_VX855, /* VT3409*/ - VIA_VX900, /* VT3410*/ - VIA_LAST -}; - - -#define PCI_VIA_VENDOR_ID 0x1106 - -#define PCI_CHIP_CLE3122 0x3122 /* CLE266 */ -#define PCI_CHIP_VT3205 0x7205 /* KM400 */ -#define PCI_CHIP_VT3204 0x3108 /* K8M800 */ -#define PCI_CHIP_VT3259 0x3118 /* PM800 */ -#define PCI_CHIP_VT3314 0x3344 /* P4M800 Pro */ -#define PCI_CHIP_VT3324 0x3157 /* CX700 */ -#ifdef VIA_VT3293_SUPPORT -#define PCI_CHIP_VT3293 0x3225 /* CN750 */ -#endif -#define PCI_CHIP_VT3327 0x3343 /* P4M890 */ -#define PCI_CHIP_VT3336 0x3230 /* K8M890 */ -#define PCI_CHIP_VT3364 0x3371 /* P4M900 */ -#define PCI_CHIP_VT3353 0x1122 /* VX800 */ -#define PCI_CHIP_VT3409 0x5122 /* VX855/VX875 */ -#define PCI_CHIP_VT3410 0x7122 /* VX900 */ - -/* There is some conflicting information about the two major revisions of - * the CLE266, often labelled Ax and Cx. The dividing line seems to be - * either 0x0f or 0x10. */ -#define CLE266_REV_IS_AX(x) ((x) < 0x10) -#define CLE266_REV_IS_CX(x) ((x) >= 0x10) - -#define BIOS_BSIZE 1024 -#define BIOS_BASE 0xc0000 - - -#define VIA_MMIO_REGSIZE 0xD000 /* DisplayPort: 0xC610~0xC7D4 */ -#define VIA_MMIO_REGBASE 0x0 -#define VIA_MMIO_VGABASE 0x8000 -#define VIA_MMIO_BLTBASE 0x200000 -#define VIA_MMIO_BLTSIZE 0x200000 - -#define VIA_MMIO_INTEGRATED_TV_BASE 0xC000 -#define VIA_MMIO_INTEGRATED_TV_SIZE 256 - -/* defines for VIA 2D registers */ -#define VIA_REG_GECMD 0x000 -#define VIA_REG_GEMODE 0x004 -#define VIA_REG_GESTATUS 0x004 /* as same as VIA_REG_GEMODE */ -#define VIA_REG_SRCPOS 0x008 -#define VIA_REG_DSTPOS 0x00C -#define VIA_REG_LINE_K1K2 0x008 -#define VIA_REG_LINE_XY 0x00C -#define VIA_REG_DIMENSION 0x010 /* width and height */ -#define VIA_REG_PATADDR 0x014 -#define VIA_REG_FGCOLOR 0x018 -#define VIA_REG_DSTCOLORKEY 0x018 /* as same as VIA_REG_FG */ -#define VIA_REG_BGCOLOR 0x01C -#define VIA_REG_SRCCOLORKEY 0x01C /* as same as VIA_REG_BG */ -#define VIA_REG_CLIPTL 0x020 /* top and left of clipping */ -#define VIA_REG_CLIPBR 0x024 /* bottom and right of clipping */ -#define VIA_REG_OFFSET 0x028 -#define VIA_REG_LINE_ERROR 0x028 -#define VIA_REG_KEYCONTROL 0x02C /* color key control */ -#define VIA_REG_SRCBASE 0x030 -#define VIA_REG_DSTBASE 0x034 -#define VIA_REG_PITCH 0x038 /* pitch of src and dst */ -#define VIA_REG_MONOPAT0 0x03C -#define VIA_REG_MONOPAT1 0x040 -#define VIA_REG_ROT_TMP_ADDR 0x044 /* Rotation Temporary Base Address */ -#define VIA_REG_ROTSRC 0x048 /* Resolution X,Y of Rotation Source */ -#define VIA_REG_ROT_TMP_PITCH 0x04C /* Pitch of Rotation Temporary Memory */ -#define VIA_REG_ROTDST 0x050 /* Resolution X,Y of Rotation Destination*/ -#define VIA_REG_COLORPAT 0x100 /* from 0x100 to 0x1ff */ - -/* defines for VIA 2D registers for vt3353 (M1 engine)*/ -#define VIA_REG_GECMD_M1 0x000 -#define VIA_REG_GEMODE_M1 0x004 -#define VIA_REG_GESTATUS_M1 0x004 /* as same as VIA_REG_GEMODE + rotate 410*/ -#define VIA_REG_PITCH_M1 0x008 /* pitch of src and dst */ -#define VIA_REG_DIMENSION_M1 0x00C /* width and height */ -#define VIA_REG_DSTPOS_M1 0x010 -#define VIA_REG_LINE_XY_M1 0x010 -#define VIA_REG_DSTBASE_M1 0x014 -#define VIA_REG_SRCPOS_M1 0x018 -#define VIA_REG_LINE_K1K2_M1 0x018 -#define VIA_REG_SRCBASE_M1 0x01C -#define VIA_REG_PATADDR_M1 0x020 -#define VIA_REG_MONOPAT0_M1 0x024 -#define VIA_REG_MONOPAT1_M1 0x028 -#define VIA_REG_OFFSET_M1 0x02C -#define VIA_REG_LINE_ERROR_M1 0x02C -#define VIA_REG_CLIPTL_M1 0x040 /* top and left of clipping */ -#define VIA_REG_CLIPBR_M1 0x044 /* bottom and right of clipping */ -#define VIA_REG_KEYCONTROL_M1 0x048 /* color key control */ -#define VIA_REG_FGCOLOR_M1 0x04C -#define VIA_REG_DSTCOLORKEY_M1 0x04C /* as same as VIA_REG_FG */ -#define VIA_REG_BGCOLOR_M1 0x050 -#define VIA_REG_SRCCOLORKEY_M1 0x050 /* as same as VIA_REG_BG */ -#define VIA_REG_MONOPATFGC_M1 0x058 /* VT3353 Add Backgroung color of Pattern. */ -#define VIA_REG_MONOPATBGC_M1 0x05C /* VT3353 Add Foregroung color of Pattern. */ -#define VIA_REG_COLORPAT_M1 0x100 /* from 0x100 to 0x1ff */ - -/*410*/ -#define VIA_REG_CFC 0x030 -#define VIA_REG_SCALEFACTOR 0x034 -#define VIA_REG_SCALINGMODE 0x038 -#define VIA_REG_23DIDCLT 0x060 -#define VIA_REG_23DWAITCLT 0x06C -/* defines for VIA video registers */ -#define VIA_REG_INTERRUPT 0x200 -#define VIA_REG_CRTCSTART 0x214 - - -/* defines for VIA HW cursor registers */ -#define VIA_REG_CURSOR_MODE 0x2D0 -#define VIA_REG_CURSOR_POS 0x2D4 -#define VIA_REG_CURSOR_ORG 0x2D8 -#define VIA_REG_CURSOR_BG 0x2DC -#define VIA_REG_CURSOR_FG 0x2E0 - - -/* defines for VIA 3D registers */ -#define VIA_REG_STATUS 0x400 -#define VIA_REG_TRANSET 0x43C -#define VIA_REG_TRANSPACE 0x440 - -/* VIA_REG_STATUS(0x400): Engine Status */ -#define VIA_CMD_RGTR_BUSY 0x00000080 /* Command Regulator is busy */ -#define VIA_2D_ENG_BUSY 0x00000002 /* 2D Engine is busy */ -#define VIA_3D_ENG_BUSY 0x00000001 /* 3D Engine is busy */ -#define VIA_VR_QUEUE_EMPTY 0x00020000 /* Virtual Queue is empty */ - -/* VIA_REG_STATUS(0x400): Engine Status for H5 */ -#define VIA_CMD_RGTR_BUSY_H5 0x00000010 /* Command Regulator is busy */ -#define VIA_2D_ENG_BUSY_H5 0x00000002 /* 2D Engine is busy */ -#define VIA_3D_ENG_BUSY_H5 0x00001FE1 /* 3D Engine is busy */ -#define VIA_VR_QUEUE_BUSY_H5 0x00000004 /* Virtual Queue is busy */ - -/* VIA_REG_STATUS(0x400): Engine Status for VT3353 */ -#define VIA_CMD_RGTR_BUSY_M1 0x00000010 /* Command Regulator is busy */ -#define VIA_2D_ENG_BUSY_M1 0x00000002 /* 2D Engine is busy */ -#define VIA_3D_ENG_BUSY_M1 0x00001FE1 /* 3D Engine is busy */ -#define VIA_VR_QUEUE_BUSY_M1 0x00000004 /* Virtual Queue is busy */ - -/* VIA_REG_GECMD(0x00): 2D Engine Command */ -#define VIA_GEC_NOOP 0x00000000 -#define VIA_GEC_BLT 0x00000001 -#define VIA_GEC_LINE 0x00000005 -/*410 GECMD*/ -#define VIA_GEC_ALPHA 0x00000003 -#define VIA_GEC_BLT_ROT 0x00000009 -#define VIA_GEC_MONOTEX 0x00000002 -#define VIA_GEC_ALPHA_ROT_MONOTEX 0x0000000a - -#define VIA_GEC_ROT 0x00000008 /* Rotate Command */ - -#define VIA_GEC_SRC_XY 0x00000000 -#define VIA_GEC_SRC_LINEAR 0x00000010 -#define VIA_GEC_DST_XY 0x00000000 -#define VIA_GEC_DST_LINRAT 0x00000020 - -#define VIA_GEC_SRC_FB 0x00000000 -#define VIA_GEC_SRC_SYS 0x00000040 -#define VIA_GEC_DST_FB 0x00000000 -#define VIA_GEC_DST_SYS 0x00000080 - -#define VIA_GEC_SRC_MONO 0x00000100 /* source is mono */ -#define VIA_GEC_PAT_MONO 0x00000200 /* pattern is mono */ - -#define VIA_GEC_MSRC_OPAQUE 0x00000000 /* mono src is opaque */ -#define VIA_GEC_MSRC_TRANS 0x00000400 /* mono src is transparent */ - -#define VIA_GEC_PAT_FB 0x00000000 /* pattern is in frame buffer */ -#define VIA_GEC_PAT_REG 0x00000800 /* pattern is from reg setting */ - -#define VIA_GEC_CLIP_DISABLE 0x00000000 -#define VIA_GEC_CLIP_ENABLE 0x00001000 - -#define VIA_GEC_FIXCOLOR_PAT 0x00002000 - -#define VIA_GEC_INCX 0x00000000 -#define VIA_GEC_DECY 0x00004000 -#define VIA_GEC_INCY 0x00000000 -#define VIA_GEC_DECX 0x00008000 - -#define VIA_GEC_MPAT_OPAQUE 0x00000000 /* mono pattern is opaque */ -#define VIA_GEC_MPAT_TRANS 0x00010000 /* mono pattern is transparent */ - -#define VIA_GEC_MONO_UNPACK 0x00000000 -#define VIA_GEC_MONO_PACK 0x00020000 -#define VIA_GEC_MONO_DWORD 0x00000000 -#define VIA_GEC_MONO_WORD 0x00040000 -#define VIA_GEC_MONO_BYTE 0x00080000 - -#define VIA_GEC_LASTPIXEL_ON 0x00000000 -#define VIA_GEC_LASTPIXEL_OFF 0x00100000 -#define VIA_GEC_X_MAJOR 0x00000000 -#define VIA_GEC_Y_MAJOR 0x00200000 -#define VIA_GEC_QUICK_START 0x00800000 - - -/* VIA_REG_GEMODE(0x04): GE mode */ -#define VIA_GEM_8bpp 0x00000000 -#define VIA_GEM_16bpp 0x00000100 -#define VIA_GEM_32bpp 0x00000300 -/*410 GEM*/ -#define VIA_GEM_ALPHA 0x00100000 -#define VIA_GEM_degree90 0x00000001 -#define VIA_GEM_degree180 0x00000002 -#define VIA_GEM_degree270 0x00000303 -#define VIA_GEM_ALPHA_CNT_EN 0x00100000 -#define VIA_GEM_SETALPHA8(cnst) (cnst>>24)<<12 -/*410 SCALE*/ -#define VIA_SCALEF_VFactor8(cnst) cnst<<20 -#define VIA_SCALEF_HFactor8(cnst) cnst<<4 -#define VIA_SCALEM_En 0x80000000 -#define VIA_SCALEM_Shrink 0x40000000 -#define VIA_SCALEM_BW 0x00000000 -#define VIA_SCALEM_WB 0x10000000 -#define VIA_SCALEM_CC 0x20000000 -#define VIA_SCALEM_Half 0x30000000 -#define VIA_SCALEM_SrcDimenH12(cnst) (cnst-1)<<16 -#define VIA_SCALEM_SrcDimenW12(cnst) (cnst-1)<<0 -/*410 CFC new 2D pipline must set ??*/ -#define VIA_CFC_en 0x80000000 -#define VIA_CFC_EXT_en 0x40000000 -#define VIA_CFC_DITH_en 0x20000000 -#define VIA_CFC_DesCF16_555 0x00000000 -#define VIA_CFC_DesCF16_565 0x00000100 -#define VIA_CFC_DesCF32_888 0x00000000 -#define VIA_CFC_DesCF32_000 0x00000100 -#define VIA_CFC_SrcDep8 0x00000000 -#define VIA_CFC_SrcDep16 0x00000050 -#define VIA_CFC_SrcDep32 0x000000c0 -#define VIA_CFC_SrcCF16_555 0x00000000 -#define VIA_CFC_SrcCF16_565 0x00000001 -#define VIA_CFC_SrcCF32_888 0x00000000 -#define VIA_CFC_SrcCF32_000 0x00000001 - -#define VIA_GEM_640 0x00000000 /* 640*480 */ -#define VIA_GEM_800 0x00000400 /* 800*600 */ -#define VIA_GEM_1024 0x00000800 /* 1024*768 */ -#define VIA_GEM_1280 0x00000C00 /* 1280*1024 */ -#define VIA_GEM_1600 0x00001000 /* 1600*1200 */ -#define VIA_GEM_2048 0x00001400 /* 2048*1536 */ - -#define VIA_GEM_ROTATE_90 0x00000001 /* Rotate anticlockwise 90 degree */ -#define VIA_GEM_ROTATE_180 0x00000002 /* Rotate anticlockwise 180 degree */ -#define VIA_GEM_ROTATE_270 0x00000003 /* Rotate anticlockwise 270 degree */ - -/* VIA_REG_PITCH(0x38): Pitch Setting */ -#define VIA_PITCH_ENABLE 0x80000000 - - -#define MAXLOOP 0xffffff - - -#define VerticalRetraceWait() \ -{ \ - VGAOUT8(vgaCRIndex, 0x17); \ - if (VGAIN8(vgaCRReg) & 0x80) { \ - while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \ - while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x08) ; \ - while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \ - } \ -} - - -#define VIASETREG(addr, data) *(volatile unsigned int *)(pVia->MapBase + (addr)) = (data) -#define VIAGETREG(addr) *(volatile unsigned int *)(pVia->MapBase + (addr)) - - -#endif /* _VIA_REGS_H_ */ +/* + * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. + * Copyright 2001-2008 S3 Graphics, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sub license, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + */ + +/************************************************************************* + * + * File: via_regs.c + * Content: The defines of Via registers + * + ************************************************************************/ + +#ifndef _VIA_REGS_H_ +#define _VIA_REGS_H_ 1 + +#include "via_driver.h" + +/*#define VIA_SERIES(chip) (chip == VIA_CLE266)*/ + + +/* Chip tags. These are used to group the adapters into + * related families. + */ + +enum VIACHIPTAGS { + VIA_UNKNOWN = 0, + VIA_CLE266, + VIA_KM400, + VIA_K8M800, + VIA_PM800, + VIA_P4M800PRO, /* VT3314 */ + VIA_CX700, /* VT3324 */ +#ifdef VIA_VT3293_SUPPORT + VIA_CN750, /* VT3293 */ +#endif + VIA_P4M890, /* VT3327 */ + VIA_K8M890, /* VT3336 */ + VIA_P4M900, /* VT3364 */ + VIA_VX800, /* VT3353 */ + VIA_VX855, /* VT3409*/ + VIA_VX900, /* VT3410*/ + VIA_LAST +}; + + +#define PCI_VIA_VENDOR_ID 0x1106 + +#define PCI_CHIP_CLE3122 0x3122 /* CLE266 */ +#define PCI_CHIP_VT3205 0x7205 /* KM400 */ +#define PCI_CHIP_VT3204 0x3108 /* K8M800 */ +#define PCI_CHIP_VT3259 0x3118 /* PM800 */ +#define PCI_CHIP_VT3314 0x3344 /* P4M800 Pro */ +#define PCI_CHIP_VT3324 0x3157 /* CX700 */ +#ifdef VIA_VT3293_SUPPORT +#define PCI_CHIP_VT3293 0x3225 /* CN750 */ +#endif +#define PCI_CHIP_VT3327 0x3343 /* P4M890 */ +#define PCI_CHIP_VT3336 0x3230 /* K8M890 */ +#define PCI_CHIP_VT3364 0x3371 /* P4M900 */ +#define PCI_CHIP_VT3353 0x1122 /* VX800 */ +#define PCI_CHIP_VT3409 0x5122 /* VX855/VX875 */ +#define PCI_CHIP_VT3410 0x7122 /* VX900 */ + +#define PCI_DEVICE_ID_VIA_CLE266_HB 0x3123 +#define PCI_DEVICE_ID_VIA_KM400_HB 0x3205 +#define PCI_DEVICE_ID_VIA_P4M800_AGP 0x0296 +#define PCI_DEVICE_ID_VIA_P4M800_PRO_AGP 0x0314 +#define PCI_DEVICE_ID_VIA_PM800_AGP 0x0259 +#define PCI_DEVICE_ID_VIA_K8M800_AGP 0x0204 +#define PCI_DEVICE_ID_VIA_CX700_AGP 0x0324 +#define PCI_DEVICE_ID_VIA_P4M890_AGP 0x0327 +#define PCI_DEVICE_ID_VIA_K8M890_AGP 0x0336 +#define PCI_DEVICE_ID_VIA_P4M900_AGP 0x0364 +#define PCI_DEVICE_ID_VIA_VX800_HC 0x0353 +#define PCI_DEVICE_ID_VIA_VX855_HC 0x0409 +#define PCI_DEVICE_ID_VIA_VX900_HC 0x0410 + +/* There is some conflicting information about the two major revisions of + * the CLE266, often labelled Ax and Cx. The dividing line seems to be + * either 0x0f or 0x10. */ +#define CLE266_REV_IS_AX(x) ((x) < 0x10) +#define CLE266_REV_IS_CX(x) ((x) >= 0x10) + +#define BIOS_BSIZE 1024 +#define BIOS_BASE 0xc0000 + + +#define VIA_MMIO_REGSIZE 0xD000 /* DisplayPort: 0xC610~0xC7D4 */ +#define VIA_MMIO_REGBASE 0x0 +#define VIA_MMIO_VGABASE 0x8000 +#define VIA_MMIO_BLTBASE 0x200000 +#define VIA_MMIO_BLTSIZE 0x200000 + +#define VIA_MMIO_INTEGRATED_TV_BASE 0xC000 +#define VIA_MMIO_INTEGRATED_TV_SIZE 256 + +/* defines for VIA 2D registers */ +#define VIA_REG_GECMD 0x000 +#define VIA_REG_GEMODE 0x004 +#define VIA_REG_GESTATUS 0x004 /* as same as VIA_REG_GEMODE */ +#define VIA_REG_SRCPOS 0x008 +#define VIA_REG_DSTPOS 0x00C +#define VIA_REG_LINE_K1K2 0x008 +#define VIA_REG_LINE_XY 0x00C +#define VIA_REG_DIMENSION 0x010 /* width and height */ +#define VIA_REG_PATADDR 0x014 +#define VIA_REG_FGCOLOR 0x018 +#define VIA_REG_DSTCOLORKEY 0x018 /* as same as VIA_REG_FG */ +#define VIA_REG_BGCOLOR 0x01C +#define VIA_REG_SRCCOLORKEY 0x01C /* as same as VIA_REG_BG */ +#define VIA_REG_CLIPTL 0x020 /* top and left of clipping */ +#define VIA_REG_CLIPBR 0x024 /* bottom and right of clipping */ +#define VIA_REG_OFFSET 0x028 +#define VIA_REG_LINE_ERROR 0x028 +#define VIA_REG_KEYCONTROL 0x02C /* color key control */ +#define VIA_REG_SRCBASE 0x030 +#define VIA_REG_DSTBASE 0x034 +#define VIA_REG_PITCH 0x038 /* pitch of src and dst */ +#define VIA_REG_MONOPAT0 0x03C +#define VIA_REG_MONOPAT1 0x040 +#define VIA_REG_ROT_TMP_ADDR 0x044 /* Rotation Temporary Base Address */ +#define VIA_REG_ROTSRC 0x048 /* Resolution X,Y of Rotation Source */ +#define VIA_REG_ROT_TMP_PITCH 0x04C /* Pitch of Rotation Temporary Memory */ +#define VIA_REG_ROTDST 0x050 /* Resolution X,Y of Rotation Destination*/ +#define VIA_REG_COLORPAT 0x100 /* from 0x100 to 0x1ff */ + +/* defines for VIA 2D registers for vt3353 (M1 engine)*/ +#define VIA_REG_GECMD_M1 0x000 +#define VIA_REG_GEMODE_M1 0x004 +#define VIA_REG_GESTATUS_M1 0x004 /* as same as VIA_REG_GEMODE + rotate 410*/ +#define VIA_REG_PITCH_M1 0x008 /* pitch of src and dst */ +#define VIA_REG_DIMENSION_M1 0x00C /* width and height */ +#define VIA_REG_DSTPOS_M1 0x010 +#define VIA_REG_LINE_XY_M1 0x010 +#define VIA_REG_DSTBASE_M1 0x014 +#define VIA_REG_SRCPOS_M1 0x018 +#define VIA_REG_LINE_K1K2_M1 0x018 +#define VIA_REG_SRCBASE_M1 0x01C +#define VIA_REG_PATADDR_M1 0x020 +#define VIA_REG_MONOPAT0_M1 0x024 +#define VIA_REG_MONOPAT1_M1 0x028 +#define VIA_REG_OFFSET_M1 0x02C +#define VIA_REG_LINE_ERROR_M1 0x02C +#define VIA_REG_CLIPTL_M1 0x040 /* top and left of clipping */ +#define VIA_REG_CLIPBR_M1 0x044 /* bottom and right of clipping */ +#define VIA_REG_KEYCONTROL_M1 0x048 /* color key control */ +#define VIA_REG_FGCOLOR_M1 0x04C +#define VIA_REG_DSTCOLORKEY_M1 0x04C /* as same as VIA_REG_FG */ +#define VIA_REG_BGCOLOR_M1 0x050 +#define VIA_REG_SRCCOLORKEY_M1 0x050 /* as same as VIA_REG_BG */ +#define VIA_REG_MONOPATFGC_M1 0x058 /* VT3353 Add Backgroung color of Pattern. */ +#define VIA_REG_MONOPATBGC_M1 0x05C /* VT3353 Add Foregroung color of Pattern. */ +#define VIA_REG_COLORPAT_M1 0x100 /* from 0x100 to 0x1ff */ + +/*410*/ +#define VIA_REG_CFC 0x030 +#define VIA_REG_SCALEFACTOR 0x034 +#define VIA_REG_SCALINGMODE 0x038 +#define VIA_REG_23DIDCLT 0x060 +#define VIA_REG_23DWAITCLT 0x06C +/* defines for VIA video registers */ +#define VIA_REG_INTERRUPT 0x200 +#define VIA_REG_CRTCSTART 0x214 + + +/* defines for VIA HW cursor registers */ +#define VIA_REG_CURSOR_MODE 0x2D0 +#define VIA_REG_CURSOR_POS 0x2D4 +#define VIA_REG_CURSOR_ORG 0x2D8 +#define VIA_REG_CURSOR_BG 0x2DC +#define VIA_REG_CURSOR_FG 0x2E0 + + +/* defines for VIA 3D registers */ +#define VIA_REG_STATUS 0x400 +#define VIA_REG_TRANSET 0x43C +#define VIA_REG_TRANSPACE 0x440 + +/* VIA_REG_STATUS(0x400): Engine Status */ +#define VIA_CMD_RGTR_BUSY 0x00000080 /* Command Regulator is busy */ +#define VIA_2D_ENG_BUSY 0x00000002 /* 2D Engine is busy */ +#define VIA_3D_ENG_BUSY 0x00000001 /* 3D Engine is busy */ +#define VIA_VR_QUEUE_EMPTY 0x00020000 /* Virtual Queue is empty */ + +/* VIA_REG_STATUS(0x400): Engine Status for H5 */ +#define VIA_CMD_RGTR_BUSY_H5 0x00000010 /* Command Regulator is busy */ +#define VIA_2D_ENG_BUSY_H5 0x00000002 /* 2D Engine is busy */ +#define VIA_3D_ENG_BUSY_H5 0x00001FE1 /* 3D Engine is busy */ +#define VIA_VR_QUEUE_BUSY_H5 0x00000004 /* Virtual Queue is busy */ + +/* VIA_REG_STATUS(0x400): Engine Status for VT3353 */ +#define VIA_CMD_RGTR_BUSY_M1 0x00000010 /* Command Regulator is busy */ +#define VIA_2D_ENG_BUSY_M1 0x00000002 /* 2D Engine is busy */ +#define VIA_3D_ENG_BUSY_M1 0x00001FE1 /* 3D Engine is busy */ +#define VIA_VR_QUEUE_BUSY_M1 0x00000004 /* Virtual Queue is busy */ + +/* VIA_REG_GECMD(0x00): 2D Engine Command */ +#define VIA_GEC_NOOP 0x00000000 +#define VIA_GEC_BLT 0x00000001 +#define VIA_GEC_LINE 0x00000005 +/*410 GECMD*/ +#define VIA_GEC_ALPHA 0x00000003 +#define VIA_GEC_BLT_ROT 0x00000009 +#define VIA_GEC_MONOTEX 0x00000002 +#define VIA_GEC_ALPHA_ROT_MONOTEX 0x0000000a + +#define VIA_GEC_ROT 0x00000008 /* Rotate Command */ + +#define VIA_GEC_SRC_XY 0x00000000 +#define VIA_GEC_SRC_LINEAR 0x00000010 +#define VIA_GEC_DST_XY 0x00000000 +#define VIA_GEC_DST_LINRAT 0x00000020 + +#define VIA_GEC_SRC_FB 0x00000000 +#define VIA_GEC_SRC_SYS 0x00000040 +#define VIA_GEC_DST_FB 0x00000000 +#define VIA_GEC_DST_SYS 0x00000080 + +#define VIA_GEC_SRC_MONO 0x00000100 /* source is mono */ +#define VIA_GEC_PAT_MONO 0x00000200 /* pattern is mono */ + +#define VIA_GEC_MSRC_OPAQUE 0x00000000 /* mono src is opaque */ +#define VIA_GEC_MSRC_TRANS 0x00000400 /* mono src is transparent */ + +#define VIA_GEC_PAT_FB 0x00000000 /* pattern is in frame buffer */ +#define VIA_GEC_PAT_REG 0x00000800 /* pattern is from reg setting */ + +#define VIA_GEC_CLIP_DISABLE 0x00000000 +#define VIA_GEC_CLIP_ENABLE 0x00001000 + +#define VIA_GEC_FIXCOLOR_PAT 0x00002000 + +#define VIA_GEC_INCX 0x00000000 +#define VIA_GEC_DECY 0x00004000 +#define VIA_GEC_INCY 0x00000000 +#define VIA_GEC_DECX 0x00008000 + +#define VIA_GEC_MPAT_OPAQUE 0x00000000 /* mono pattern is opaque */ +#define VIA_GEC_MPAT_TRANS 0x00010000 /* mono pattern is transparent */ + +#define VIA_GEC_MONO_UNPACK 0x00000000 +#define VIA_GEC_MONO_PACK 0x00020000 +#define VIA_GEC_MONO_DWORD 0x00000000 +#define VIA_GEC_MONO_WORD 0x00040000 +#define VIA_GEC_MONO_BYTE 0x00080000 + +#define VIA_GEC_LASTPIXEL_ON 0x00000000 +#define VIA_GEC_LASTPIXEL_OFF 0x00100000 +#define VIA_GEC_X_MAJOR 0x00000000 +#define VIA_GEC_Y_MAJOR 0x00200000 +#define VIA_GEC_QUICK_START 0x00800000 + + +/* VIA_REG_GEMODE(0x04): GE mode */ +#define VIA_GEM_8bpp 0x00000000 +#define VIA_GEM_16bpp 0x00000100 +#define VIA_GEM_32bpp 0x00000300 +/*410 GEM*/ +#define VIA_GEM_ALPHA 0x00100000 +#define VIA_GEM_degree90 0x00000001 +#define VIA_GEM_degree180 0x00000002 +#define VIA_GEM_degree270 0x00000303 +#define VIA_GEM_ALPHA_CNT_EN 0x00100000 +#define VIA_GEM_SETALPHA8(cnst) (cnst>>24)<<12 +/*410 SCALE*/ +#define VIA_SCALEF_VFactor8(cnst) cnst<<20 +#define VIA_SCALEF_HFactor8(cnst) cnst<<4 +#define VIA_SCALEM_En 0x80000000 +#define VIA_SCALEM_Shrink 0x40000000 +#define VIA_SCALEM_BW 0x00000000 +#define VIA_SCALEM_WB 0x10000000 +#define VIA_SCALEM_CC 0x20000000 +#define VIA_SCALEM_Half 0x30000000 +#define VIA_SCALEM_SrcDimenH12(cnst) (cnst-1)<<16 +#define VIA_SCALEM_SrcDimenW12(cnst) (cnst-1)<<0 +/*410 CFC new 2D pipline must set ??*/ +#define VIA_CFC_en 0x80000000 +#define VIA_CFC_EXT_en 0x40000000 +#define VIA_CFC_DITH_en 0x20000000 +#define VIA_CFC_DesCF16_555 0x00000000 +#define VIA_CFC_DesCF16_565 0x00000100 +#define VIA_CFC_DesCF32_888 0x00000000 +#define VIA_CFC_DesCF32_000 0x00000100 +#define VIA_CFC_SrcDep8 0x00000000 +#define VIA_CFC_SrcDep16 0x00000050 +#define VIA_CFC_SrcDep32 0x000000c0 +#define VIA_CFC_SrcCF16_555 0x00000000 +#define VIA_CFC_SrcCF16_565 0x00000001 +#define VIA_CFC_SrcCF32_888 0x00000000 +#define VIA_CFC_SrcCF32_000 0x00000001 + +#define VIA_GEM_640 0x00000000 /* 640*480 */ +#define VIA_GEM_800 0x00000400 /* 800*600 */ +#define VIA_GEM_1024 0x00000800 /* 1024*768 */ +#define VIA_GEM_1280 0x00000C00 /* 1280*1024 */ +#define VIA_GEM_1600 0x00001000 /* 1600*1200 */ +#define VIA_GEM_2048 0x00001400 /* 2048*1536 */ + +#define VIA_GEM_ROTATE_90 0x00000001 /* Rotate anticlockwise 90 degree */ +#define VIA_GEM_ROTATE_180 0x00000002 /* Rotate anticlockwise 180 degree */ +#define VIA_GEM_ROTATE_270 0x00000003 /* Rotate anticlockwise 270 degree */ + +/* VIA_REG_PITCH(0x38): Pitch Setting */ +#define VIA_PITCH_ENABLE 0x80000000 + + +#define MAXLOOP 0xffffff + + +#define VerticalRetraceWait() \ +{ \ + VGAOUT8(vgaCRIndex, 0x17); \ + if (VGAIN8(vgaCRReg) & 0x80) { \ + while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \ + while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x08) ; \ + while ((VGAIN8(vgaIOBase + 0x0a) & 0x08) == 0x00) ; \ + } \ +} + + +#define VIASETREG(addr, data) *(volatile unsigned int *)(pVia->MapBase + (addr)) = (data) +#define VIAGETREG(addr) *(volatile unsigned int *)(pVia->MapBase + (addr)) +#define VIASETREGMASK(addr, data, mask) \ + VIASETREG(addr, (data & mask) | (VIAGETREG(addr) & ~mask)) + +#endif /* _VIA_REGS_H_ */ diff --git a/src/via_sii164.c b/src/via_sii164.c index 5900e06..701b812 100644 --- a/src/via_sii164.c +++ b/src/via_sii164.c @@ -30,6 +30,7 @@ #endif #include "via_driver.h" +#include "via_ums.h" #include "via_sii164.h" static void @@ -41,10 +42,10 @@ viaSiI164DumpRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev) DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaSiI164DumpRegisters.\n")); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "SiI 164: dumping registers:\n")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dumping SiI 164 registers.\n")); for (i = 0; i <= 0x0f; i++) { xf86I2CReadByte(pDev, i, &tmp); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "SiI 164: 0x%02x: 0x%02x\n", i, tmp)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "0x%02x: 0x%02x\n", i, tmp)); } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -153,13 +154,9 @@ viaSiI164RestoreRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev, static int viaSiI164CheckModeValidity(xf86OutputPtr output, DisplayModePtr pMode) { - ScrnInfoPtr pScrn = output->scrn; viaSiI164RecPtr pSiI164Rec = output->driver_private; int status = MODE_OK; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaSiI164CheckModeValidity.\n")); - if (pMode->Clock < pSiI164Rec->DotclockMin) { status = MODE_CLOCK_LOW; goto exit; @@ -170,8 +167,6 @@ viaSiI164CheckModeValidity(xf86OutputPtr output, DisplayModePtr pMode) } exit: - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaSiI164CheckModeValidity.\n")); return status; } @@ -191,12 +186,14 @@ via_sii164_dpms(xf86OutputPtr output, int mode) switch (mode) { case DPMSModeOn: - viaSiI164Power(pScrn, pSiI164Rec->SiI164I2CDev, TRUE); + viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, TRUE); + viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, TRUE); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: - viaSiI164Power(pScrn, pSiI164Rec->SiI164I2CDev, FALSE); + viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, FALSE); + viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, FALSE); break; default: break; @@ -215,7 +212,7 @@ via_sii164_save(xf86OutputPtr output) DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_sii164_save.\n")); - viaSiI164SaveRegisters(pScrn, pSiI164Rec->SiI164I2CDev, pSiI164Rec); + viaSiI164SaveRegisters(pScrn, pSiI164Rec->pSiI164I2CDev, pSiI164Rec); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_sii164_save.\n")); @@ -230,7 +227,7 @@ via_sii164_restore(xf86OutputPtr output) DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_sii164_restore.\n")); - viaSiI164RestoreRegisters(pScrn, pSiI164Rec->SiI164I2CDev, + viaSiI164RestoreRegisters(pScrn, pSiI164Rec->pSiI164I2CDev, pSiI164Rec); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -253,11 +250,33 @@ via_sii164_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, static void via_sii164_prepare(xf86OutputPtr output) { + ScrnInfoPtr pScrn = output->scrn; + viaSiI164RecPtr pSiI164Rec = output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, FALSE); + viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, FALSE); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); } static void via_sii164_commit(xf86OutputPtr output) { + ScrnInfoPtr pScrn = output->scrn; + viaSiI164RecPtr pSiI164Rec = output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + viaSiI164Power(pScrn, pSiI164Rec->pSiI164I2CDev, TRUE); + viaExtTMDSIOPadState(pScrn, pSiI164Rec->diPort, TRUE); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); } static void @@ -276,9 +295,9 @@ via_sii164_mode_set(xf86OutputPtr output, DisplayModePtr mode, viaExtTMDSSetDataDriveStrength(pScrn, 0x03); viaExtTMDSEnableIOPads(pScrn, 0x03); - viaSiI164DumpRegisters(pScrn, pSiI164Rec->SiI164I2CDev); - viaSiI164InitRegisters(pScrn, pSiI164Rec->SiI164I2CDev); - viaSiI164DumpRegisters(pScrn, pSiI164Rec->SiI164I2CDev); + viaSiI164DumpRegisters(pScrn, pSiI164Rec->pSiI164I2CDev); + viaSiI164InitRegisters(pScrn, pSiI164Rec->pSiI164I2CDev); + viaSiI164DumpRegisters(pScrn, pSiI164Rec->pSiI164I2CDev); viaExtTMDSSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); } @@ -290,25 +309,63 @@ via_sii164_mode_set(xf86OutputPtr output, DisplayModePtr mode, static xf86OutputStatus via_sii164_detect(xf86OutputPtr output) { - xf86MonPtr mon; + ScrnInfoPtr pScrn = output->scrn; xf86OutputStatus status = XF86OutputStatusDisconnected; + viaSiI164RecPtr pSiI164Rec = (viaSiI164RecPtr) output->driver_private; + Bool connectorDetected; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_sii_164_detect.\n")); + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Probing for a DVI connector . . .\n"); + + connectorDetected = viaSiI164Sense(pScrn, pSiI164Rec->pSiI164I2CDev); + if (!connectorDetected) { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "DVI connector not detected.\n"); + goto exit; + } + + status = XF86OutputStatusConnected; + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "DVI connector detected.\n"); + +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_sii_164_detect.\n")); + return status; +} + +static DisplayModePtr +via_sii164_get_modes(xf86OutputPtr output) +{ ScrnInfoPtr pScrn = output->scrn; - viaSiI164RecPtr pSiI164Rec = output->driver_private; + xf86MonPtr pMon; + DisplayModePtr pDisplay_Mode = NULL; + I2CBusPtr pI2CBus; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + viaSiI164RecPtr pSiI164Rec = (viaSiI164RecPtr) output->driver_private; - /* Check for the DVI presence via SiI 164 first before accessing - * I2C bus. */ - if (viaSiI164Sense(pScrn, pSiI164Rec->SiI164I2CDev)) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + if (pSiI164Rec->i2cBus & VIA_I2C_BUS2) { + pI2CBus = pVIADisplay->pI2CBus2; + } else if (pSiI164Rec->i2cBus & VIA_I2C_BUS3) { + pI2CBus = pVIADisplay->pI2CBus3; + } else { + pI2CBus = NULL; + } - /* Since DVI presence was established, access the I2C bus - * assigned to DVI. */ - mon = xf86OutputGetEDID(output, pSiI164Rec->SiI164I2CDev->pI2CBus); + if (pI2CBus) { + pMon = xf86OutputGetEDID(output, pI2CBus); /* Is the interface type digital? */ - if (mon && DIGITAL(mon->features.input_type)) { - status = XF86OutputStatusConnected; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Detected a monitor connected to DVI.\n"); - xf86OutputSetEDID(output, mon); + if (pMon && DIGITAL(pMon->features.input_type)) { + xf86OutputSetEDID(output, pMon); + pDisplay_Mode = xf86OutputGetEDIDModes(output); } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Could not obtain EDID from a monitor " @@ -316,7 +373,9 @@ via_sii164_detect(xf86OutputPtr output) } } - return status; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); + return pDisplay_Mode; } #ifdef RANDR_12_INTERFACE @@ -352,7 +411,7 @@ const xf86OutputFuncsRec via_sii164_funcs = { .commit = via_sii164_commit, .mode_set = via_sii164_mode_set, .detect = via_sii164_detect, - .get_modes = xf86OutputGetEDIDModes, + .get_modes = via_sii164_get_modes, #ifdef RANDR_12_INTERFACE .set_property = via_sii164_set_property, #endif @@ -363,31 +422,34 @@ const xf86OutputFuncsRec via_sii164_funcs = { }; Bool -viaSiI164Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) +viaSiI164Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) { - xf86OutputPtr output; - VIAPtr pVia = VIAPTR(pScrn); - viaSiI164RecPtr pSiI164Rec = NULL; I2CDevPtr pI2CDevice = NULL; I2CSlaveAddr i2cAddr = 0x70; - CARD8 buf; + CARD8 i2cData; CARD16 vendorID, deviceID; Bool status = FALSE; - char outputNameBuffer[32]; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaSiI164Init.\n")); + "Entered viaSiI164Probe.\n")); + + if (!pI2CBus) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Invalid I2C bus.\n")); + goto exit; + } if (!xf86I2CProbeAddress(pI2CBus, i2cAddr)) { - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "I2C device not found.\n"); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "I2C bus device not found.\n")); goto exit; } pI2CDevice = xf86CreateI2CDevRec(); if (!pI2CDevice) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to create an I2C bus device record.\n"); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to create an I2C bus device " + "record.\n")); goto exit; } @@ -396,88 +458,155 @@ viaSiI164Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) pI2CDevice->pI2CBus = pI2CBus; if (!xf86I2CDevInit(pI2CDevice)) { xf86DestroyI2CDevRec(pI2CDevice, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to initialize a device on I2C bus.\n"); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to initialize a device on " + "I2C bus.\n")); goto exit; } - xf86I2CReadByte(pI2CDevice, 0, &buf); - vendorID = buf; - xf86I2CReadByte(pI2CDevice, 1, &buf); - vendorID |= buf << 8; + xf86I2CReadByte(pI2CDevice, 0, &i2cData); + vendorID = i2cData; + xf86I2CReadByte(pI2CDevice, 1, &i2cData); + vendorID |= i2cData << 8; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vendor ID: 0x%04x\n", vendorID)); - xf86I2CReadByte(pI2CDevice, 2, &buf); - deviceID = buf; - xf86I2CReadByte(pI2CDevice, 3, &buf); - deviceID |= buf << 8; + xf86I2CReadByte(pI2CDevice, 2, &i2cData); + deviceID = i2cData; + xf86I2CReadByte(pI2CDevice, 3, &i2cData); + deviceID |= i2cData << 8; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Device ID: 0x%04x\n", deviceID)); if ((vendorID != 0x0001) || (deviceID != 0x0006)) { xf86DestroyI2CDevRec(pI2CDevice, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "SiI 164 external TMDS transmitter not detected.\n"); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "SiI 164 external TMDS transmitter not " + "detected.\n")); goto exit; } + status = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "SiI 164 external TMDS transmitter detected.\n"); + xf86DestroyI2CDevRec(pI2CDevice, TRUE); +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaSiI164Probe.\n")); + return status; +} - pSiI164Rec = xnfcalloc(1, sizeof(viaSiI164Rec)); - if (!pSiI164Rec) { - xf86DestroyI2CDevRec(pI2CDevice, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate working storage for SiI 164.\n"); +void +viaSiI164Init(ScrnInfoPtr pScrn) +{ + xf86OutputPtr output; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + viaSiI164RecPtr pVIASiI164; + I2CBusPtr pI2CBus; + I2CDevPtr pI2CDevice; + I2CSlaveAddr i2cAddr = 0x70; + CARD8 i2cData; + char outputNameBuffer[32]; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaSiI164Init.\n")); + + if ((!(pVIADisplay->extTMDSPresence)) || + (pVIADisplay->extTMDSTransmitter != VIA_TMDS_SII164)) { goto exit; } - // Remembering which I2C bus is used for SiI 164. - pSiI164Rec->SiI164I2CDev = pI2CDevice; + if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS2) { + pI2CBus = pVIADisplay->pI2CBus2; + } else if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS3) { + pI2CBus = pVIADisplay->pI2CBus3; + } else { + goto exit; + } - xf86I2CReadByte(pI2CDevice, 0x06, &buf); - pSiI164Rec->DotclockMin = buf * 1000; + if (!xf86I2CProbeAddress(pI2CBus, i2cAddr)) { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "I2C device not found.\n"); + goto exit; + } - xf86I2CReadByte(pI2CDevice, 0x07, &buf); - pSiI164Rec->DotclockMax = (buf + 65) * 1000; + pI2CDevice = xf86CreateI2CDevRec(); + if (!pI2CDevice) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to create an I2C bus device record.\n"); + goto exit; + } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported SiI 164 Dot Clock Range: " - "%d to %d MHz\n", - pSiI164Rec->DotclockMin / 1000, - pSiI164Rec->DotclockMax / 1000); + pI2CDevice->DevName = "SiI 164"; + pI2CDevice->SlaveAddr = i2cAddr; + pI2CDevice->pI2CBus = pI2CBus; + if (!xf86I2CDevInit(pI2CDevice)) { + xf86DestroyI2CDevRec(pI2CDevice, TRUE); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to initialize a device on I2C bus.\n"); + goto exit; + } + + pVIASiI164 = (viaSiI164RecPtr) xnfcalloc(1, sizeof(viaSiI164Rec)); + if (!pVIASiI164) { + xf86DestroyI2CDevRec(pI2CDevice, TRUE); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate storage for " + "SiI 164.\n")); + goto exit; + } - /* The code to dynamically designate the particular DVI (i.e., DVI-1, + /* The code to dynamically designate a particular DVI (i.e., DVI-1, * DVI-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */ - sprintf(outputNameBuffer, "DVI-%d", (pVia->numberDVI + 1)); + sprintf(outputNameBuffer, "DVI-%d", (pVIADisplay->numberDVI + 1)); output = xf86OutputCreate(pScrn, &via_sii164_funcs, outputNameBuffer); if (!output) { - free(pSiI164Rec); + free(pVIASiI164); xf86DestroyI2CDevRec(pI2CDevice, TRUE); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate X Server display output record for " - "SiI 164.\n"); + "Failed to create X Server display output " + "for SiI 164.\n"); goto exit; } - output->driver_private = pSiI164Rec; + /* Increment the number of DVI connectors. */ + pVIADisplay->numberDVI++; + + // Remembering which I2C bus is used for SiI 164. + pVIASiI164->pSiI164I2CDev = pI2CDevice; + + pVIASiI164->diPort = pVIADisplay->extTMDSDIPort; + + /* Hint about which I2C bus to access for obtaining EDID. */ + pVIASiI164->i2cBus = pVIADisplay->extTMDSI2CBus; + + pVIASiI164->transmitter = pVIADisplay->extTMDSTransmitter; + + xf86I2CReadByte(pI2CDevice, 0x06, &i2cData); + pVIASiI164->DotclockMin = i2cData * 1000; + + xf86I2CReadByte(pI2CDevice, 0x07, &i2cData); + pVIASiI164->DotclockMax = (i2cData + 65) * 1000; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported SiI 164 Dot Clock Range: " + "%d to %d MHz\n", + pVIASiI164->DotclockMin / 1000, + pVIASiI164->DotclockMax / 1000); + + output->driver_private = pVIASiI164; /* Since there are two (2) display controllers registered with the * X.Org Server and both IGA1 and IGA2 can handle DVI without any * limitations, possible_crtcs should be set to 0x3 (0b11) so that * either display controller can get assigned to handle DVI. */ - output->possible_crtcs = (1 << 1) | (1 << 0); + output->possible_crtcs = BIT(1) | BIT(0); output->possible_clones = 0; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; - viaSiI164DumpRegisters(pScrn, pI2CDevice); - - pVia->numberDVI++; - status = TRUE; exit: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaSiI164Init.\n")); - return status; } diff --git a/src/via_sii164.h b/src/via_sii164.h index 10077a3..250ac75 100644 --- a/src/via_sii164.h +++ b/src/via_sii164.h @@ -36,7 +36,11 @@ #define VIA_SII164_PDB 0x01 typedef struct _viaSiI164 { - I2CDevPtr SiI164I2CDev; + I2CDevPtr pSiI164I2CDev; + + uint32_t diPort; + uint8_t i2cBus; + uint8_t transmitter; int DotclockMin; int DotclockMax; @@ -47,8 +51,9 @@ typedef struct _viaSiI164 { } viaSiI164Rec, *viaSiI164RecPtr; -const xf86OutputFuncsRec via_sii164_funcs; +extern const xf86OutputFuncsRec via_sii164_funcs; -Bool viaSiI164Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus); +Bool viaSiI164Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus); +void viaSiI164Init(ScrnInfoPtr pScrn); #endif /* _VIA_SII164_H_ */ diff --git a/src/via_tmds.c b/src/via_tmds.c index 9543665..752dcbb 100644 --- a/src/via_tmds.c +++ b/src/via_tmds.c @@ -44,33 +44,85 @@ /* - 1. Formula: - 2^13 X 0.0698uSec [1/14.318MHz] = 8192 X 0.0698uSec =572.1uSec - Timer = Counter x 572 uSec - 2. Note: - 0.0698 uSec is too small to compute for hardware. So we multiply a - reference value(2^13) to make it big enough to compute for hardware. - 3. Note: - The meaning of the TD0~TD3 are count of the clock. - TD(sec) = (sec)/(per clock) x (count of clocks) -*/ -#define TD0 200 -#define TD1 25 -#define TD2 0 -#define TD3 25 + * Sets the polarity of horizontal synchronization and vertical + * synchronization. + */ +static void +viaTMDSSyncPolarity(ScrnInfoPtr pScrn, unsigned int flags) +{ + CARD8 syncPolarity = 0x00; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaTMDSSyncPolarity.\n")); + + if (flags & V_NHSYNC) { + syncPolarity |= BIT(0); + } + if (flags & V_NVSYNC) { + syncPolarity |= BIT(1); + } + + viaTMDSSetSyncPolarity(pScrn, syncPolarity); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "TMDS (DVI) Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "TMDS (DVI) Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+"); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaTMDSSyncPolarity.\n")); +} + +/* + * Sets TMDS (DVI) display source. + */ +static void +viaTMDSDisplaySource(ScrnInfoPtr pScrn, int index) +{ + CARD8 displaySource = index; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaTMDSDisplaySource.\n")); + + viaTMDSSetDisplaySource(pScrn, displaySource & 0x01); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "TMDS (DVI) Display Source: IGA%d\n", + (displaySource & 0x01) + 1); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaTMDSDisplaySource.\n")); +} /* * Initializes most registers related to VIA Technologies IGP * integrated TMDS transmitter. Synchronization polarity and * display output source need to be set separately. */ static void -viaTMDSInitRegisters(ScrnInfoPtr pScrn) +viaTMDSInitReg(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaTMDSInitRegisters.\n")); + "Entered viaTMDSInitReg.\n")); + + /* Turn off hardware controlled FP power on / off circuit. */ + viaFPSetPrimaryHardPower(pScrn, FALSE); + + /* Use software FP power sequence control. */ + viaFPSetPrimaryPowerSeqType(pScrn, FALSE); + + /* Turn off software controlled primary FP power rails. */ + viaFPSetPrimarySoftVDD(pScrn, FALSE); + viaFPSetPrimarySoftVEE(pScrn, FALSE); + + /* Turn off software controlled primary FP back light + * control. */ + viaFPSetPrimarySoftBackLight(pScrn, FALSE); + + /* Turn off direct control of FP back light. */ + viaFPSetPrimaryDirectBackLightCtrl(pScrn, FALSE); /* Activate DVI + LVDS2 mode. */ /* 3X5.D2[5:4] - Display Channel Select @@ -115,150 +167,36 @@ viaTMDSInitRegisters(ScrnInfoPtr pScrn) ViaSeqMask(hwp, 0x2B, 0x40, 0x40); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaTMDSInitRegisters.\n")); + "Exiting viaTMDSInitReg.\n")); } /* - * Sets the polarity of horizontal synchronization and vertical - * synchronization. + * Sets integrated TMDS (DVI) monitor power state. */ -static void -viaTMDSSetSyncPolarity(ScrnInfoPtr pScrn, DisplayModePtr mode) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 cr97; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaTMDSSetSyncPolarity.\n")); - - /* 3X5.97[6] - DVI (TMDS) VSYNC Polarity - * 0: Positive - * 1: Negative - * 3X5.97[5] - DVI (TMDS) HSYNC Polarity - * 0: Positive - * 1: Negative */ - cr97 = hwp->readCrtc(hwp, 0x97); - if (mode->Flags & V_NHSYNC) { - cr97 |= 0x20; - } else { - cr97 &= (~0x20); - } - - if (mode->Flags & V_NVSYNC) { - cr97 |= 0x40; - } else { - cr97 &= (~0x40); - } - - ViaCrtcMask(hwp, 0x97, cr97, 0x60); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaTMDSSetSyncPolarity.\n")); -} - -/* - * Sets IGA1 or IGA2 as the display output source for VIA Technologies IGP - * integrated TMDS transmitter. - */ -static void -viaTMDSSetSource(ScrnInfoPtr pScrn, CARD8 displaySource) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - CARD8 temp = displaySource; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaTMDSSetSource.\n")); - - /* Set integrated TMDS transmitter display output source. - * The integrated TMDS transmitter appears to utilize LVDS1's data - * source selection bit (3X5.99[4]). */ - /* 3X5.99[4] - LVDS Channel1 Data Source Selection - * 0: Primary Display - * 1: Secondary Display */ - ViaCrtcMask(hwp, 0x99, temp << 4, 0x10); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated TMDS Transmitter Display Output Source: IGA%d\n", - (temp & 0x01) + 1); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaTMDSSetSource.\n")); -} - -/* - * Returns TMDS receiver detection state for VIA Technologies IGP - * integrated TMDS transmitter. - */ -static Bool -viaTMDSSense(ScrnInfoPtr pScrn) -{ - vgaHWPtr hwp = VGAHWPTR(pScrn); - VIAPtr pVia = VIAPTR(pScrn); - CARD8 tmdsReceiverDetected = 0x00; - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaTMDSSense.\n")); - - /* For now, faking DVI detection.*/ - tmdsReceiverDetected = 0x01; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated TMDS transmitter %s a TMDS receiver.\n", - (tmdsReceiverDetected & 0x01) ? "detected" : "did not detect"); - - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaTMDSSense.\n")); - return tmdsReceiverDetected; -} - static void viaTMDSPower(ScrnInfoPtr pScrn, Bool powerState) { - vgaHWPtr hwp = VGAHWPTR(pScrn); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaTMDSPower.\n")); if (powerState) { - /* 3X5.91[7] - Software Direct On / Off Display Period - in the Panel Path - 0: On - 1: Off */ - ViaCrtcMask(hwp, 0x91, 0x00, 0x80); - - /* 3X5.91[0] - Hardware or Software Control Power Sequence - 1: Software Control */ - ViaCrtcMask(hwp, 0x91, 0x01, 0x01); - - usleep(TD0); - - /* 3X5.91[4] - Software VDD On - 0: Off - 1: On */ - ViaCrtcMask(hwp, 0x91, 0x10, 0x10); - - usleep(TD1); - - /* 3X5.91[3] - Software Data On - 0: Off - 1: On */ - ViaCrtcMask(hwp, 0x91, 0x08, 0x08); - - /* 3X5.D2[3] - Power Down (Active High) for DVI - * 0: TMDS power on - * 1: TMDS power down */ - ViaCrtcMask(hwp, 0xD2, 0x00, 0x08); - } else { - ViaCrtcMask(hwp, 0xD2, 0x08, 0x08); + viaFPSetPrimaryDirectDisplayPeriod(pScrn, TRUE); - ViaCrtcMask(hwp, 0x91, 0x00, 0x08); + /* Turn on software controlled primary FP data transmission. */ + viaFPSetPrimarySoftData(pScrn, TRUE); - usleep(TD1); + viaTMDSSetPower(pScrn, TRUE); + } else { + viaTMDSSetPower(pScrn, FALSE); - ViaCrtcMask(hwp, 0x91, 0x00, 0x10); + /* Turn off software controlled primary FP data transmission. */ + viaFPSetPrimarySoftData(pScrn, TRUE); + + viaFPSetPrimaryDirectDisplayPeriod(pScrn, FALSE); } xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated TMDS (DVI) Power: %s\n", + "DVI Power: %s\n", powerState ? "On" : "Off"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -270,23 +208,18 @@ viaTMDSIOPadSetting(ScrnInfoPtr pScrn, Bool ioPadOn) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; CARD8 sr12, sr13, sr5a; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaTMDSIOPadSetting.\n")); - if ((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) { - - sr5a = hwp->readSeq(hwp, 0x5A); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SR5A: 0x%02X\n", sr5a)); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Setting 3C5.5A[0] to 0.\n")); - ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01); - } + sr5a = hwp->readSeq(hwp, 0x5A); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "SR5A: 0x%02X\n", sr5a)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Setting 3C5.5A[0] to 0.\n")); + ViaSeqMask(hwp, 0x5A, sr5a & 0xFE, 0x01); sr12 = hwp->readSeq(hwp, 0x12); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -295,41 +228,73 @@ viaTMDSIOPadSetting(ScrnInfoPtr pScrn, Bool ioPadOn) DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "SR13: 0x%02X\n", sr13)); - switch (pVia->Chipset) { - case VIA_CX700: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: - /* 3C5.13[7:6] - DVP1D15 and DVP1D14 pin strappings - * 00: LVDS1 + LVDS2 - * 01: DVI + LVDS2 - * 10: Dual LVDS (LVDS1 + LVDS2 used - * simultaneously) - * 11: DVI only */ - if ((((~(sr13 & 0x80)) && (sr13 & 0x40)) - || ((sr13 & 0x80) && (sr13 & 0x40))) - || (pVia->isVIANanoBook)) { - - viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); - } + /* + * 3C5.13[7:6] - DVP1D15 and DVP1D14 pin strappings + * 00: LVDS1 + LVDS2 + * 01: DVI + LVDS2 + * 10: Dual LVDS (LVDS1 + LVDS2 used + * simultaneously) + * 11: DVI only + */ + if ((((~(sr13 & BIT(7))) && (sr13 & BIT(6))) || + ((sr13 & BIT(7)) && (sr13 & BIT(6)))) || + (pVIADisplay->isVIANanoBook)) { + viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + } + + hwp->writeSeq(hwp, 0x5A, sr5a); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Restoring 3C5.5A[0].\n")); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaTMDSIOPadSetting.\n")); +} + +void +viaExtTMDSIOPadState(ScrnInfoPtr pScrn, uint32_t diPort, Bool ioPadOn) +{ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + switch(diPort) { + case VIA_DI_PORT_DVP0: + viaDVP0SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_DVP1: + viaDVP1SetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_FPDPLOW: + viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_FPDPHIGH: + viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case (VIA_DI_PORT_FPDPLOW | + VIA_DI_PORT_FPDPHIGH): + viaFPDPLowSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + viaFPDPHighSetIOPadState(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_LVDS1: + viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case VIA_DI_PORT_LVDS2: + viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + break; + case (VIA_DI_PORT_LVDS1 | + VIA_DI_PORT_LVDS2): + viaLVDS1SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); + viaLVDS2SetIOPadSetting(pScrn, ioPadOn ? 0x03 : 0x00); break; default: break; } - if ((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) { - - hwp->writeSeq(hwp, 0x5A, sr5a); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Restoring 3C5.5A[0].\n")); - } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVI I/O Pad: %s\n", + ioPadOn ? "On": "Off"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaTMDSIOPadSetting.\n")); + "Exiting %s.\n", __func__)); } void @@ -337,7 +302,8 @@ viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaExtTMDSSetDisplaySource.\n")); @@ -397,7 +363,7 @@ viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) if ((sr12 & 0x40) && (!(sr12 & 0x20))) { viaDVP0SetDisplaySource(pScrn, displaySource); } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) { - viaDFPLowSetDisplaySource(pScrn, displaySource); + viaFPDPLowSetDisplaySource(pScrn, displaySource); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "None of the external ports were set up for " @@ -417,7 +383,7 @@ viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) if ((sr12 & 0x40) && (!(sr12 & 0x20))) { viaDVP0SetDisplaySource(pScrn, displaySource); } else if (!(sr12 & 0x10)) { - viaDFPLowSetDisplaySource(pScrn, displaySource); + viaFPDPLowSetDisplaySource(pScrn, displaySource); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "None of the external ports were set up for " @@ -469,7 +435,8 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaExtTMDSEnableIOPads.\n")); @@ -501,7 +468,7 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 1: DIP0 (Digital Interface Port 0) is used by * a TV encoder */ if (!(sr12 & 0x20)) { - viaDIP0EnableIOPads(pScrn, ioPadState); + viaDIP0SetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "DIP0 was not set up for " @@ -527,9 +494,9 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 0: Dual 12-bit FPDP (Flat Panel Display Port) * 1: 24-bit FPDP (Flat Panel Display Port) */ if ((sr12 & 0x40) && (!(sr12 & 0x20))) { - viaDVP0EnableIOPads(pScrn, ioPadState); + viaDVP0SetIOPadState(pScrn, ioPadState); } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) { - viaDFPLowEnableIOPads(pScrn, ioPadState); + viaFPDPLowSetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "None of the external ports were set up for " @@ -547,9 +514,9 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 0: DVP0 is used by a TMDS transmitter (DVI) * 1: DVP0 is used by a TV encoder */ if ((sr12 & 0x40) && (!(sr12 & 0x20))) { - viaDVP0EnableIOPads(pScrn, ioPadState); + viaDVP0SetIOPadState(pScrn, ioPadState); } else if (!(sr12 & 0x10)) { - viaDFPLowEnableIOPads(pScrn, ioPadState); + viaFPDPLowSetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "None of the external ports were set up for " @@ -566,7 +533,7 @@ viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 1: DVP1 is used as a capture port */ if (!(sr13 & 0x40)) { - viaDVP1EnableIOPads(pScrn, ioPadState); + viaDVP1SetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "DVP1 is not set up for TMDS " @@ -600,7 +567,8 @@ viaExtTMDSSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaExtTMDSSetClockDriveStrength.\n")); @@ -626,15 +594,6 @@ viaExtTMDSSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) "SR13: 0x%02X\n", sr13)); switch (pVia->Chipset) { case VIA_CLE266: - /* 3C5.12[5] - FPD18 pin strapping - * 0: DIP0 (Digital Interface Port 0) is used by - * a TMDS transmitter (DVI) - * 1: DIP0 (Digital Interface Port 0) is used by - * a TV encoder */ - if (!(sr12 & 0x20)) { - viaDIP0SetClockDriveStrength(pScrn, clockDriveStrength); - } - break; case VIA_KM400: case VIA_K8M800: @@ -700,7 +659,8 @@ viaExtTMDSSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaExtTMDSSetDataDriveStrength.\n")); @@ -726,15 +686,6 @@ viaExtTMDSSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) "SR13: 0x%02X\n", sr13)); switch (pVia->Chipset) { case VIA_CLE266: - /* 3C5.12[5] - FPD18 pin strapping - * 0: DIP0 (Digital Interface Port 0) is used by - * a TMDS transmitter (DVI) - * 1: DIP0 (Digital Interface Port 0) is used by - * a TV encoder */ - if (!(sr12 & 0x20)) { - viaDIP0SetDataDriveStrength(pScrn, dataDriveStrength); - } - break; case VIA_KM400: case VIA_K8M800: @@ -932,15 +883,14 @@ via_tmds_mode_set(xf86OutputPtr output, DisplayModePtr mode, DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_tmds_mode_set.\n")); - /* Initialize VIA IGP integrated TMDS transmitter registers. */ - viaTMDSInitRegisters(pScrn); + if (output->crtc) { + /* Initialize VIA IGP integrated TMDS transmitter registers. */ + viaTMDSInitReg(pScrn); - /* Set integrated TMDS transmitter synchronization polarity for - * both horizontal synchronization and vertical synchronization. */ - viaTMDSSetSyncPolarity(pScrn, adjusted_mode); + /* Set integrated TMDS transmitter sync polarity. */ + viaTMDSSyncPolarity(pScrn, adjusted_mode->Flags); - if (output->crtc) { - viaTMDSSetSource(pScrn, iga->index ? 0x01 : 0x00); + viaTMDSDisplaySource(pScrn, iga->index); } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -950,43 +900,32 @@ via_tmds_mode_set(xf86OutputPtr output, DisplayModePtr mode, static xf86OutputStatus via_tmds_detect(xf86OutputPtr output) { - xf86MonPtr mon; - xf86OutputStatus status = XF86OutputStatusDisconnected; ScrnInfoPtr pScrn = output->scrn; + xf86MonPtr pMon; + xf86OutputStatus status = XF86OutputStatusDisconnected; + I2CBusPtr pI2CBus; VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIATMDSPtr pVIATMDS = (VIATMDSPtr) output->driver_private; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_tmds_detect.\n")); - /* Check for DVI presence by sensing the TMDS receiver connected - * to the integrated TMDS transmitter. */ - if (viaTMDSSense(pScrn)) { - - if (!pVia->pI2CBus2) { - goto exit; - } - - /* Assume that only I2C bus 2 is used for the DVI connected to the - * integrated TMDS transmitter. */ - if (!xf86I2CProbeAddress(pVia->pI2CBus2, 0xA0)) { - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "I2C device on I2C Bus 2 does not support EDID.\n"); - goto exit; - } - - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Obtaining EDID for DVI.\n"); - - /* Since DVI presence was established, access the I2C bus, - * in order to obtain EDID from the monitor. */ - mon = xf86OutputGetEDID(output, pVia->pI2CBus2); + if (pVIATMDS->i2cBus & VIA_I2C_BUS2) { + pI2CBus = pVIADisplay->pI2CBus2; + } else if (pVIATMDS->i2cBus & VIA_I2C_BUS3) { + pI2CBus = pVIADisplay->pI2CBus3; + } else { + pI2CBus = NULL; + } - /* Is the interface type digital? */ - if (mon && DIGITAL(mon->features.input_type)) { + if (pI2CBus) { + pMon = xf86OutputGetEDID(output, pI2CBus); + if (pMon && DIGITAL(pMon->features.input_type)) { status = XF86OutputStatusConnected; + xf86OutputSetEDID(output, pMon); xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected a monitor connected to DVI.\n"); - xf86OutputSetEDID(output, mon); } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Could not obtain EDID from a monitor " @@ -994,7 +933,6 @@ via_tmds_detect(xf86OutputPtr output) } } -exit: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_tmds_detect.\n")); return status; @@ -1073,166 +1011,279 @@ static const xf86OutputFuncsRec via_tmds_funcs = { .destroy = via_tmds_destroy, }; - -Bool -viaTMDSInit(ScrnInfoPtr pScrn) +void +viaTMDSProbe(ScrnInfoPtr pScrn) { - xf86OutputPtr output; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIATMDSRecPtr pVIATMDSRec = NULL; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; CARD8 sr13, sr5a; - Bool status = FALSE; - char outputNameBuffer[32]; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaTMDSInit.\n")); + "Entered viaTMDSProbe.\n")); - sr5a = hwp->readSeq(hwp, 0x5A); - ViaSeqMask(hwp, 0x5A, sr5a | 0x01, 0x01); + /* Detect the presence of integrated TMDS transmitter. */ + switch (pVia->Chipset) { + case VIA_CX700: + case VIA_VX800: + sr5a = hwp->readSeq(hwp, 0x5A); + + /* Setting SR5A[0] to 1. + * This allows the reading out the alternative + * pin strapping information from SR12 and SR13. */ + ViaSeqMask(hwp, 0x5A, BIT(0), BIT(0)); + + sr13 = hwp->readSeq(hwp, 0x13); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "SR13: 0x%02X\n", sr13)); + + /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select + * (DVP1D15-14 pin strapping) + * 00: LVDS1 + LVDS2 + * 01: DVI + LVDS2 + * 10: Dual LVDS Channel (High Resolution Panel) + * 11: One DVI only (decrease the clock jitter) */ + /* Check for DVI presence using pin strappings. + * VIA Technologies NanoBook reference design based products + * have their pin strappings set to a wrong setting to communicate + * the presence of DVI, so it requires special handling here. */ + if (pVIADisplay->isVIANanoBook) { + pVIADisplay->intTMDSPresence = TRUE; + pVIADisplay->intTMDSDIPort = VIA_DI_PORT_TMDS; + pVIADisplay->intTMDSI2CBus = VIA_I2C_BUS2; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Integrated TMDS (DVI) transmitter detected.\n"); + } else if (((!(sr13 & BIT(7))) && (sr13 & BIT(6))) + || ((sr13 & BIT(7)) && (sr13 & BIT(6)))) { + pVIADisplay->intTMDSPresence = TRUE; + pVIADisplay->intTMDSDIPort = VIA_DI_PORT_TMDS; + pVIADisplay->intTMDSI2CBus = VIA_I2C_BUS2; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Integrated TMDS (DVI) transmitter detected via pin strapping.\n"); + } else { + pVIADisplay->intTMDSPresence = FALSE; + pVIADisplay->intTMDSDIPort = VIA_DI_PORT_NONE; + pVIADisplay->intTMDSI2CBus = VIA_I2C_NONE; + } + + hwp->writeSeq(hwp, 0x5A, sr5a); + break; + default: + pVIADisplay->intTMDSPresence = FALSE; + pVIADisplay->intTMDSDIPort = VIA_DI_PORT_NONE; + pVIADisplay->intTMDSI2CBus = VIA_I2C_NONE; + break; + } + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaTMDSProbe.\n")); +} + +/* + * Probe (pre-initialization detection) of external TMDS transmitters. + */ +void +viaExtTMDSProbe(ScrnInfoPtr pScrn) +{ + vgaHWPtr hwp = VGAHWPTR(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + CARD8 sr12, sr13; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaExtTMDSProbe.\n")); + + pVIADisplay->extTMDSPresence = FALSE; + pVIADisplay->extTMDSI2CBus = VIA_I2C_NONE; + pVIADisplay->extTMDSTransmitter = VIA_TMDS_NONE; + + if ((!(pVIADisplay->extTMDSPresence)) && + ((pVIADisplay->pI2CBus2) && + (~(pVIADisplay->mappedI2CBus & VIA_I2C_BUS2)))) { + if (viaVT1632Probe(pScrn, pVIADisplay->pI2CBus2)) { + pVIADisplay->extTMDSPresence = TRUE; + pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS2; + pVIADisplay->extTMDSTransmitter = VIA_TMDS_VT1632; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2; + } else if (viaSiI164Probe(pScrn, pVIADisplay->pI2CBus2)) { + pVIADisplay->extTMDSPresence = TRUE; + pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS2; + pVIADisplay->extTMDSTransmitter = VIA_TMDS_SII164; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS2; + } + } + + if ((!(pVIADisplay->extTMDSPresence)) && + ((pVIADisplay->pI2CBus3) && + (~(pVIADisplay->mappedI2CBus & VIA_I2C_BUS3)))) { + if (viaVT1632Probe(pScrn, pVIADisplay->pI2CBus3)) { + pVIADisplay->extTMDSPresence = TRUE; + pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS3; + pVIADisplay->extTMDSTransmitter = VIA_TMDS_VT1632; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS3; + } else if (viaSiI164Probe(pScrn, pVIADisplay->pI2CBus3)) { + pVIADisplay->extTMDSPresence = TRUE; + pVIADisplay->extTMDSI2CBus = VIA_I2C_BUS3; + pVIADisplay->extTMDSTransmitter = VIA_TMDS_SII164; + pVIADisplay->mappedI2CBus |= VIA_I2C_BUS3; + } + } + + sr12 = hwp->readSeq(hwp, 0x12); sr13 = hwp->readSeq(hwp, 0x13); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "SR12: 0x%02X\n", sr12)); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "SR13: 0x%02X\n", sr13)); - hwp->writeSeq(hwp, 0x5A, sr5a); + if (pVIADisplay->extTMDSPresence) { + switch (pVia->Chipset) { + case VIA_CLE266: + + /* 3C5.12[4] - FPD17 pin strapping + * 0: TMDS transmitter (DVI) / capture device + * 1: Flat panel */ + if (!(sr12 & BIT(4))) { + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DIP0; + + /* 3C5.12[5] - FPD18 pin strapping + * 0: TMDS transmitter (DVI) + * 1: TV encoder */ + } else if (!(sr12 & BIT(5))) { + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DIP1; + } else { + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_NONE; + } + + break; + case VIA_KM400: + case VIA_P4M800PRO: + case VIA_PM800: + case VIA_K8M800: + /* 3C5.12[6] - DVP0D6 pin strapping + * 0: Disable DVP0 (Digital Video Port 0) for + * DVI or TV out use + * 1: Enable DVP0 (Digital Video Port 0) for + * DVI or TV out use + * 3C5.12[5] - DVP0D5 pin strapping + * 0: TMDS transmitter (DVI) + * 1: TV encoder */ + if ((sr12 & BIT(6)) && (!(sr12 & BIT(5)))) { + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP0; + } else { + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP1; + } + + break; + case VIA_P4M890: + case VIA_K8M890: + case VIA_P4M900: + /* Assume DVP2 as DVP0. Hence, VIA_DI_PORT_DVP0 + * is used. */ + /* 3C5.12[6] - DVP2D6 pin strapping + * 0: Disable DVP2 (Digital Video Port 2) + * 1: Enable DVP2 (Digital Video Port 2) + * 3C5.12[5] - DVP2D5 pin strapping + * 0: TMDS transmitter (DVI) + * 1: TV encoder */ + if ((sr12 & BIT(6)) && (!(sr12 & BIT(5)))) { + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP0; + } else { + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_NONE; + } + + break; + case VIA_CX700: + case VIA_VX800: + case VIA_VX855: + case VIA_VX900: + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_DVP1; + break; + default: + pVIADisplay->extTMDSDIPort = VIA_DI_PORT_NONE; + break; + } + } - /* 3C5.13[7:6] - Integrated LVDS / DVI Mode Select - * (DVP1D15-14 pin strapping) - * 00: LVDS1 + LVDS2 - * 01: DVI + LVDS2 - * 10: Dual LVDS Channel (High Resolution Panel) - * 11: One DVI only (decrease the clock jitter) */ - /* Check for DVI presence using pin strappings. - * VIA Technologies NanoBook reference design based products - * have their pin strappings set to a wrong setting to communicate - * the presence of DVI, so it requires special handling here. */ - if ((((~(sr13 & 0x80)) && (sr13 & 0x40)) - || ((sr13 & 0x80) && (sr13 & 0x40))) - || (pVia->isVIANanoBook)) { - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated TMDS transmitter found via pin strapping.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated TMDS transmitter not found.\n"); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaExtTMDSProbe.\n")); +} + +void +viaTMDSInit(ScrnInfoPtr pScrn) +{ + xf86OutputPtr output; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIATMDSPtr pVIATMDS; + char outputNameBuffer[32]; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaTMDSInit.\n")); + + if (!pVIADisplay->intTMDSPresence) { goto exit; } - pVIATMDSRec = xnfcalloc(1, sizeof(VIATMDSRec)); - if (!pVIATMDSRec) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate working storage for integrated " - "TMDS transmitter.\n"); + pVIATMDS = (VIATMDSPtr) xnfcalloc(1, sizeof(VIATMDSRec)); + if (!pVIATMDS) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate storage for " + "integrated TMDS (DVI) transmitter.\n")); goto exit; } - /* The code to dynamically designate the particular DVI (i.e., DVI-1, + /* The code to dynamically designate a particular DVI (i.e., DVI-1, * DVI-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */ - sprintf(outputNameBuffer, "DVI-%d", (pVia->numberDVI + 1)); + sprintf(outputNameBuffer, "DVI-%d", (pVIADisplay->numberDVI + 1)); output = xf86OutputCreate(pScrn, &via_tmds_funcs, outputNameBuffer); if (!output) { - free(pVIATMDSRec); - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate X Server display output record for " - "integrated TMDS transmitter.\n"); + free(pVIATMDS); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to create X Server display output " + "for integrated TMDS (DVI) " + "transmitter.\n")); goto exit; } - output->driver_private = pVIATMDSRec; + /* Increment the number of DVI connectors. */ + pVIADisplay->numberDVI++; + + /* Leaving a hint for mode setting and DPMS to know which port + * to access. For CX700 / VX700 and VX800 chipsets' integrated TMDS + * transmitter, it is fixed to LVDS1 (TMDS uses LVDS1 pins). */ + pVIATMDS->diPort = pVIADisplay->intTMDSDIPort; + + /* Hint about which I2C bus to access for obtaining EDID. */ + pVIATMDS->i2cBus = pVIADisplay->intTMDSI2CBus; + + output->driver_private = pVIATMDS; /* Since there are two (2) display controllers registered with the * X.Org Server and both IGA1 and IGA2 can handle DVI without any * limitations, possible_crtcs should be set to 0x3 (0b11) so that * either display controller can get assigned to handle DVI. */ - output->possible_crtcs = (1 << 1) | (1 << 0); + output->possible_crtcs = BIT(1) | BIT(0); output->possible_clones = 0; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; - pVia->numberDVI++; - status = TRUE; exit: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaTMDSInit.\n")); - return status; } void -via_dvi_init(ScrnInfoPtr pScrn) +viaExtTMDSInit(ScrnInfoPtr pScrn) { - VIAPtr pVia = VIAPTR(pScrn); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered via_dvi_init.\n")); - - if (!pVia->pI2CBus2 || !pVia->pI2CBus3) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "I2C Bus 2 or I2C Bus 3 does not exist.\n"); - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting via_dvi_init.\n")); - return; - } - - /* Check to see if we are dealing with the latest VIA chipsets. */ - if ((pVia->Chipset == VIA_CX700) - || (pVia->Chipset == VIA_VX800) - || (pVia->Chipset == VIA_VX855) - || (pVia->Chipset == VIA_VX900)) { - - if (!viaTMDSInit(pScrn)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated TMDS transmitter for DVI not found.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Integrated TMDS transmitter for DVI was " - "initialized successfully.\n"); - } - } + "Entered viaExtTMDSInit.\n")); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Probing I2C Bus 2 for VT1632.\n"); - if (!viaVT1632Init(pScrn, pVia->pI2CBus2)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "I2C Bus 2 was not initialized for DVI use.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "VT1632 attached to I2C Bus 2 was initialized " - "successfully for DVI use.\n"); - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Probing I2C Bus 3 for VT1632.\n"); - if (!viaVT1632Init(pScrn, pVia->pI2CBus3)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "I2C Bus 3 was not initialized for DVI use.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "VT1632 attached to I2C Bus 3 was initialized " - "successfully for DVI use.\n"); - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Probing I2C Bus 2 for SiI 164.\n"); - if (!viaSiI164Init(pScrn, pVia->pI2CBus2)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "I2C Bus 2 was not initialized for DVI use.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SiI 164 attached to I2C Bus 2 was initialized " - "successfully for DVI use.\n"); - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Probing I2C Bus 3 for SiI 164.\n"); - if (!viaSiI164Init(pScrn, pVia->pI2CBus3)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "I2C Bus 3 was not initialized for DVI use.\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SiI 164 attached to I2C Bus 3 was initialized " - "successfully for DVI use.\n"); - } + viaVT1632Init(pScrn); + viaSiI164Init(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting via_dvi_init.\n")); + "Exiting viaExtTMDSInit.\n")); } diff --git a/src/via_tv.c b/src/via_tv.c index 2492a65..d70b810 100644 --- a/src/via_tv.c +++ b/src/via_tv.c @@ -46,7 +46,8 @@ viaTVSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaTVSetDisplaySource.\n")); @@ -106,7 +107,7 @@ viaTVSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) if ((sr12 & 0x40) && (sr12 & 0x20)) { viaDVP0SetDisplaySource(pScrn, displaySource); } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) { - viaDFPLowSetDisplaySource(pScrn, displaySource); + viaFPDPLowSetDisplaySource(pScrn, displaySource); } else if (sr13 & 0x08) { viaDVP1SetDisplaySource(pScrn, displaySource); } else { @@ -180,7 +181,8 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaTVEnableIOPads.\n")); @@ -212,7 +214,7 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 1: DIP0 (Digital Interface Port 0) is used by * a TV encoder */ if (sr12 & 0x20) { - viaDIP0EnableIOPads(pScrn, ioPadState); + viaDIP0SetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "DIP0 is not set up for " @@ -238,11 +240,11 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 0: Dual 12-bit FPDP (Flat Panel Display Port) * 1: 24-bit FPDP (Flat Panel Display Port) */ if ((sr12 & 0x40) && (sr12 & 0x20)) { - viaDVP0EnableIOPads(pScrn, ioPadState); + viaDVP0SetIOPadState(pScrn, ioPadState); } else if ((sr13 & 0x08) && (!(sr12 & 0x10))) { - viaDFPLowEnableIOPads(pScrn, ioPadState); + viaFPDPLowSetIOPadState(pScrn, ioPadState); } else if (sr13 & 0x08) { - viaDVP1EnableIOPads(pScrn, ioPadState); + viaDVP1SetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "None of the external ports were set up for " @@ -263,7 +265,7 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 0: Dual 12-bit FPDP (Flat Panel Display Port) * 1: 24-bit FPDP (Flat Panel Display Port) */ if ((sr12 & 0x40) && (sr12 & 0x20) && (!(sr12 & 0x10))) { - viaDVP0EnableIOPads(pScrn, ioPadState); + viaDVP0SetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unrecognized external TV encoder use.\n" @@ -280,7 +282,7 @@ viaTVEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState) * 1: DVP1 is used as a capture port */ if (!(sr13 & 0x40)) { - viaDVP1EnableIOPads(pScrn, ioPadState); + viaDVP1SetIOPadState(pScrn, ioPadState); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "DVP1 is not set up for external TV " @@ -314,7 +316,8 @@ viaTVSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaTVSetClockDriveStrength.\n")); @@ -340,15 +343,6 @@ viaTVSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) "SR13: 0x%02X\n", sr13)); switch (pVia->Chipset) { case VIA_CLE266: - /* 3C5.12[5] - FPD18 pin strapping - * 0: DIP0 (Digital Interface Port 0) is used by - * a TMDS transmitter (DVI) - * 1: DIP0 (Digital Interface Port 0) is used by - * a TV encoder */ - if (sr12 & 0x20) { - viaDIP0SetClockDriveStrength(pScrn, clockDriveStrength); - } - break; case VIA_KM400: case VIA_K8M800: @@ -427,7 +421,8 @@ viaTVSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - CARD8 sr12, sr13, sr5a; + CARD8 sr12, sr13; + CARD8 sr5a = 0x00; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaTVSetDataDriveStrength.\n")); @@ -453,15 +448,6 @@ viaTVSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) "SR13: 0x%02X\n", sr13)); switch (pVia->Chipset) { case VIA_CLE266: - /* 3C5.12[5] - FPD18 pin strapping - * 0: DIP0 (Digital Interface Port 0) is used by - * a TMDS transmitter (DVI) - * 1: DIP0 (Digital Interface Port 0) is used by - * a TV encoder */ - if (sr12 & 0x20) { - viaDIP0SetDataDriveStrength(pScrn, dataDriveStrength); - } - break; case VIA_KM400: case VIA_K8M800: @@ -538,28 +524,28 @@ viaTVSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) static void ViaTVSave(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; - if (pBIOSInfo->TVSave) - pBIOSInfo->TVSave(pScrn); + if (pVIADisplay->TVSave) + pVIADisplay->TVSave(pScrn); } static void ViaTVRestore(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; - if (pBIOSInfo->TVRestore) - pBIOSInfo->TVRestore(pScrn); + if (pVIADisplay->TVRestore) + pVIADisplay->TVRestore(pScrn); } static Bool ViaTVDACSense(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; - if (pBIOSInfo->TVDACSense) - return pBIOSInfo->TVDACSense(pScrn); + if (pVIADisplay->TVDACSense) + return pVIADisplay->TVDACSense(pScrn); return FALSE; } @@ -568,23 +554,23 @@ ViaTVSetMode(xf86CrtcPtr crtc, DisplayModePtr mode) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; - if (pBIOSInfo->TVModeI2C) - pBIOSInfo->TVModeI2C(pScrn, mode); + if (pVIADisplay->TVModeI2C) + pVIADisplay->TVModeI2C(pScrn, mode); - if (pBIOSInfo->TVModeCrtc) - pBIOSInfo->TVModeCrtc(crtc, mode); + if (pVIADisplay->TVModeCrtc) + pVIADisplay->TVModeCrtc(crtc, mode); /* TV reset. */ - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x00); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x80); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x80); } static void ViaTVPower(ScrnInfoPtr pScrn, Bool On) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; #ifdef HAVE_DEBUG if (On) @@ -593,18 +579,18 @@ ViaTVPower(ScrnInfoPtr pScrn, Bool On) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaTVPower: Off.\n"); #endif - if (pBIOSInfo->TVPower) - pBIOSInfo->TVPower(pScrn, On); + if (pVIADisplay->TVPower) + pVIADisplay->TVPower(pScrn, On); } #ifdef HAVE_DEBUG void ViaTVPrintRegs(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; - if (pBIOSInfo->TVPrintRegs) - pBIOSInfo->TVPrintRegs(pScrn); + if (pVIADisplay->TVPrintRegs) + pVIADisplay->TVPrintRegs(pScrn); } #endif /* HAVE_DEBUG */ @@ -736,8 +722,8 @@ via_tv_get_modes(xf86OutputPtr output) VIAPtr pVia = VIAPTR(pScrn); int i; - for (i = 0; i < pVia->pBIOSInfo->TVNumModes; i++) { - mode = xf86DuplicateMode(&pVia->pBIOSInfo->TVModes[i]); + for (i = 0; i < pVia->pVIADisplay->TVNumModes; i++) { + mode = xf86DuplicateMode(&pVia->pVIADisplay->TVModes[i]); modes = xf86ModesAdd(modes, mode); } return modes; @@ -776,43 +762,43 @@ Bool via_tv_init(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; xf86OutputPtr output = NULL; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_tv_init.\n")); - /* preset some pBIOSInfo TV related values -- move up */ - pBIOSInfo->TVEncoder = VIA_NONETV; - pBIOSInfo->TVI2CDev = NULL; - pBIOSInfo->TVSave = NULL; - pBIOSInfo->TVRestore = NULL; - pBIOSInfo->TVDACSense = NULL; - pBIOSInfo->TVModeValid = NULL; - pBIOSInfo->TVModeI2C = NULL; - pBIOSInfo->TVModeCrtc = NULL; - pBIOSInfo->TVPower = NULL; - pBIOSInfo->TVModes = NULL; - pBIOSInfo->TVPrintRegs = NULL; - pBIOSInfo->LCDPower = NULL; - pBIOSInfo->TVNumRegs = 0; + /* preset some pVIADisplay TV related values -- move up */ + pVIADisplay->TVEncoder = VIA_NONETV; + pVIADisplay->TVI2CDev = NULL; + pVIADisplay->TVSave = NULL; + pVIADisplay->TVRestore = NULL; + pVIADisplay->TVDACSense = NULL; + pVIADisplay->TVModeValid = NULL; + pVIADisplay->TVModeI2C = NULL; + pVIADisplay->TVModeCrtc = NULL; + pVIADisplay->TVPower = NULL; + pVIADisplay->TVModes = NULL; + pVIADisplay->TVPrintRegs = NULL; + pVIADisplay->LCDPower = NULL; + pVIADisplay->TVNumRegs = 0; /* * On an SK43G (KM400/Ch7011), false positive detections at a VT162x * chip were observed, so try to detect the Ch7011 first. */ - if (pVia->pI2CBus2 && xf86I2CProbeAddress(pVia->pI2CBus2, 0xEC)) - pBIOSInfo->TVI2CDev = ViaCH7xxxDetect(pScrn, pVia->pI2CBus2, 0xEC); - else if (pVia->pI2CBus2 && xf86I2CProbeAddress(pVia->pI2CBus2, 0x40)) - pBIOSInfo->TVI2CDev = ViaVT162xDetect(pScrn, pVia->pI2CBus2, 0x40); - else if (pVia->pI2CBus3 && xf86I2CProbeAddress(pVia->pI2CBus3, 0x40)) - pBIOSInfo->TVI2CDev = ViaVT162xDetect(pScrn, pVia->pI2CBus3, 0x40); - else if (pVia->pI2CBus2 && xf86I2CProbeAddress(pVia->pI2CBus2, 0xEA)) - pBIOSInfo->TVI2CDev = ViaCH7xxxDetect(pScrn, pVia->pI2CBus2, 0xEA); - else if (pVia->pI2CBus3 && xf86I2CProbeAddress(pVia->pI2CBus3, 0xEA)) - pBIOSInfo->TVI2CDev = ViaCH7xxxDetect(pScrn, pVia->pI2CBus3, 0xEA); - - if (!pBIOSInfo->TVI2CDev) { + if (pVIADisplay->pI2CBus2 && xf86I2CProbeAddress(pVIADisplay->pI2CBus2, 0xEC)) + pVIADisplay->TVI2CDev = ViaCH7xxxDetect(pScrn, pVIADisplay->pI2CBus2, 0xEC); + else if (pVIADisplay->pI2CBus2 && xf86I2CProbeAddress(pVIADisplay->pI2CBus2, 0x40)) + pVIADisplay->TVI2CDev = ViaVT162xDetect(pScrn, pVIADisplay->pI2CBus2, 0x40); + else if (pVIADisplay->pI2CBus3 && xf86I2CProbeAddress(pVIADisplay->pI2CBus3, 0x40)) + pVIADisplay->TVI2CDev = ViaVT162xDetect(pScrn, pVIADisplay->pI2CBus3, 0x40); + else if (pVIADisplay->pI2CBus2 && xf86I2CProbeAddress(pVIADisplay->pI2CBus2, 0xEA)) + pVIADisplay->TVI2CDev = ViaCH7xxxDetect(pScrn, pVIADisplay->pI2CBus2, 0xEA); + else if (pVIADisplay->pI2CBus3 && xf86I2CProbeAddress(pVIADisplay->pI2CBus3, 0xEA)) + pVIADisplay->TVI2CDev = ViaCH7xxxDetect(pScrn, pVIADisplay->pI2CBus3, 0xEA); + + if (!pVIADisplay->TVI2CDev) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Did not detect a TV encoder.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -821,7 +807,7 @@ via_tv_init(ScrnInfoPtr pScrn) return FALSE; } - switch (pBIOSInfo->TVEncoder) { + switch (pVIADisplay->TVEncoder) { case VIA_VT1621: case VIA_VT1622: case VIA_VT1623: @@ -842,28 +828,28 @@ via_tv_init(ScrnInfoPtr pScrn) break; } - if (!pBIOSInfo->TVSave || !pBIOSInfo->TVRestore - || !pBIOSInfo->TVDACSense || !pBIOSInfo->TVModeValid - || !pBIOSInfo->TVModeI2C || !pBIOSInfo->TVModeCrtc - || !pBIOSInfo->TVPower || !pBIOSInfo->TVModes - || !pBIOSInfo->TVPrintRegs) { - - xf86DestroyI2CDevRec(pBIOSInfo->TVI2CDev, TRUE); - - pBIOSInfo->TVI2CDev = NULL; - pBIOSInfo->TVOutput = TVOUTPUT_NONE; - pBIOSInfo->TVEncoder = VIA_NONETV; - pBIOSInfo->TVI2CDev = NULL; - pBIOSInfo->TVSave = NULL; - pBIOSInfo->TVRestore = NULL; - pBIOSInfo->TVDACSense = NULL; - pBIOSInfo->TVModeValid = NULL; - pBIOSInfo->TVModeI2C = NULL; - pBIOSInfo->TVModeCrtc = NULL; - pBIOSInfo->TVPower = NULL; - pBIOSInfo->TVModes = NULL; - pBIOSInfo->TVPrintRegs = NULL; - pBIOSInfo->TVNumRegs = 0; + if (!pVIADisplay->TVSave || !pVIADisplay->TVRestore + || !pVIADisplay->TVDACSense || !pVIADisplay->TVModeValid + || !pVIADisplay->TVModeI2C || !pVIADisplay->TVModeCrtc + || !pVIADisplay->TVPower || !pVIADisplay->TVModes + || !pVIADisplay->TVPrintRegs) { + + xf86DestroyI2CDevRec(pVIADisplay->TVI2CDev, TRUE); + + pVIADisplay->TVI2CDev = NULL; + pVIADisplay->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVEncoder = VIA_NONETV; + pVIADisplay->TVI2CDev = NULL; + pVIADisplay->TVSave = NULL; + pVIADisplay->TVRestore = NULL; + pVIADisplay->TVDACSense = NULL; + pVIADisplay->TVModeValid = NULL; + pVIADisplay->TVModeI2C = NULL; + pVIADisplay->TVModeCrtc = NULL; + pVIADisplay->TVPower = NULL; + pVIADisplay->TVModes = NULL; + pVIADisplay->TVPrintRegs = NULL; + pVIADisplay->TVNumRegs = 0; xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "TV encoder was not properly initialized.\n"); @@ -883,13 +869,13 @@ via_tv_init(ScrnInfoPtr pScrn) "Failed to register TV-1.\n"); } - pBIOSInfo->tv = output; + pVIADisplay->tv = output; /* Save now */ - pBIOSInfo->TVSave(pScrn); + pVIADisplay->TVSave(pScrn); #ifdef HAVE_DEBUG if (VIAPTR(pScrn)->PrintTVRegs) - pBIOSInfo->TVPrintRegs(pScrn); + pVIADisplay->TVPrintRegs(pScrn); #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, diff --git a/src/via_ums.c b/src/via_ums.c index 7933e0b..309d1c3 100644 --- a/src/via_ums.c +++ b/src/via_ums.c @@ -108,7 +108,7 @@ viaMapMMIO(ScrnInfoPtr pScrn) #endif xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Mapping MMIO at address 0x%lX with " + "Mapping MMIO at address 0x%lx with " "size %u KB.\n", pVia->MmioBase, VIA_MMIO_REGSIZE / 1024); @@ -137,7 +137,7 @@ viaMapMMIO(ScrnInfoPtr pScrn) #endif xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Mapping 2D Host BitBLT space at address 0x%lX with " + "Mapping 2D Host BitBLT space at address 0x%lx with " "size %u KB.\n", pVia->MmioBase + VIA_MMIO_BLTBASE, VIA_MMIO_BLTSIZE / 1024); @@ -166,100 +166,6 @@ viaMapMMIO(ScrnInfoPtr pScrn) } #endif - if (!(pVia->videoRambytes)) { - goto fail; - } - -#ifdef HAVE_PCIACCESS - if (pVia->Chipset == VIA_VX900) { - pVia->FrameBufferBase = pVia->PciInfo->regions[2].base_addr; - } else { - pVia->FrameBufferBase = pVia->PciInfo->regions[0].base_addr; - } -#else - if (pVia->Chipset == VIA_VX900) { - pVia->FrameBufferBase = pVia->PciInfo->memBase[2]; - } else { - pVia->FrameBufferBase = pVia->PciInfo->memBase[0]; - } -#endif - - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Mapping the frame buffer at address 0x%lX with " - "size %lu KB.\n", - pVia->FrameBufferBase, pVia->videoRambytes / 1024); - -#ifdef HAVE_PCIACCESS - err = pci_device_map_range(pVia->PciInfo, pVia->FrameBufferBase, - pVia->videoRambytes, - (PCI_DEV_MAP_FLAG_WRITABLE | - PCI_DEV_MAP_FLAG_WRITE_COMBINE), - (void **)&pVia->FBBase); - if (err) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unable to map the frame buffer.\n" - "Error: %s (%u)\n", - strerror(err), err); - goto fail; - } -#else - /* - * FIXME: This is a hack to get rid of offending wrongly sized - * MTRR regions set up by the VIA BIOS. Should be taken care of - * in the OS support layer. - */ - tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, - pVia->FrameBufferBase, pVia->videoRambytes); - xf86UnMapVidMem(pScrn->scrnIndex, (pointer) tmp, pVia->videoRambytes); - - /* - * And, as if this wasn't enough, 2.6 series kernels don't - * remove MTRR regions on the first attempt. So try again. - */ - tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, - pVia->FrameBufferBase, pVia->videoRambytes); - xf86UnMapVidMem(pScrn->scrnIndex, (pointer) tmp, pVia->videoRambytes); - /* - * End of hack. - */ - - pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, - pVia->PciTag, pVia->FrameBufferBase, - pVia->videoRambytes); - - if (!pVia->FBBase) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unable to map the frame buffer.\n"); - goto fail; - } -#endif - - pVia->FBFreeStart = 0; - pVia->FBFreeEnd = pVia->videoRambytes; - - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Frame buffer start address: %p, free start: 0x%X end: 0x%X\n", - pVia->FBBase, pVia->FBFreeStart, pVia->FBFreeEnd); - -#ifdef HAVE_PCIACCESS - if (pVia->Chipset == VIA_VX900) { - pScrn->memPhysBase = pVia->PciInfo->regions[2].base_addr; - } else { - pScrn->memPhysBase = pVia->PciInfo->regions[0].base_addr; - } -#else - if (pVia->Chipset == VIA_VX900) { - pScrn->memPhysBase = pVia->PciInfo->memBase[2]; - } else { - pScrn->memPhysBase = pVia->PciInfo->memBase[0]; - } -#endif - - pScrn->fbOffset = 0; - if (pVia->IsSecondary) { - pScrn->fbOffset = pScrn->videoRam << 10; - } - /* MMIO for MPEG engine. */ pVia->MpegMapBase = pVia->MapBase + 0xc00; @@ -286,11 +192,6 @@ viaMapMMIO(ScrnInfoPtr pScrn) fail: #ifdef HAVE_PCIACCESS - if (pVia->FBBase) { - pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->FBBase, - pVia->videoRambytes); - } - if (pVia->BltBase) { pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->BltBase, VIA_MMIO_BLTSIZE); @@ -301,11 +202,6 @@ fail: VIA_MMIO_REGSIZE); } #else - if (pVia->FBBase) { - xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase, - pVia->videoRambytes); - } - if (pVia->BltBase) { xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->BltBase, VIA_MMIO_BLTSIZE); @@ -317,7 +213,6 @@ fail: } #endif - pVia->FBBase = NULL; pVia->BltBase = NULL; pVia->MapBase = NULL; @@ -326,7 +221,7 @@ fail: return FALSE; } -void +static void viaUnmapMMIO(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); @@ -337,11 +232,6 @@ viaUnmapMMIO(ScrnInfoPtr pScrn) viaMMIODisable(pScrn); #ifdef HAVE_PCIACCESS - if (pVia->FBBase) { - pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->FBBase, - pVia->videoRambytes); - } - if (pVia->BltBase) { pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->BltBase, VIA_MMIO_BLTSIZE); @@ -352,11 +242,6 @@ viaUnmapMMIO(ScrnInfoPtr pScrn) VIA_MMIO_REGSIZE); } #else - if (pVia->FBBase) { - xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase, - pVia->videoRambytes); - } - if (pVia->BltBase) { xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->BltBase, VIA_MMIO_BLTSIZE); @@ -368,7 +253,6 @@ viaUnmapMMIO(ScrnInfoPtr pScrn) } #endif - pVia->FBBase = NULL; pVia->BltBase = NULL; pVia->MapBase = NULL; @@ -376,6 +260,139 @@ viaUnmapMMIO(ScrnInfoPtr pScrn) "Exiting viaUnmapMMIO.\n")); } +static Bool +viaMapFB(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); +#ifdef HAVE_PCIACCESS + int err; +#else + unsigned char *tmp; +#endif + Bool ret = FALSE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + if (!pVia->videoRambytes) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map the frame buffer!\n"); + goto exit; + } + +#ifdef HAVE_PCIACCESS + if (pVia->Chipset == VIA_VX900) { + pVia->FrameBufferBase = pVia->PciInfo->regions[2].base_addr; + } else { + pVia->FrameBufferBase = pVia->PciInfo->regions[0].base_addr; + } +#else + if (pVia->Chipset == VIA_VX900) { + pVia->FrameBufferBase = pVia->PciInfo->memBase[2]; + } else { + pVia->FrameBufferBase = pVia->PciInfo->memBase[0]; + } +#endif + +#ifdef HAVE_PCIACCESS + err = pci_device_map_range(pVia->PciInfo, pVia->FrameBufferBase, + pVia->videoRambytes, + PCI_DEV_MAP_FLAG_WRITABLE | + PCI_DEV_MAP_FLAG_WRITE_COMBINE, + (void **)&pVia->FBBase); + if (err) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map the frame buffer!\n" + "Error: %s (%u)\n", + strerror(err), err); + goto exit; + } +#else + /* + * FIXME: This is a hack to get rid of offending wrongly sized + * MTRR regions set up by the VIA BIOS. Should be taken care of + * in the OS support layer. + */ + tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, + pVia->FrameBufferBase, pVia->videoRambytes); + if (!tmp) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map the frame buffer!\n"); + goto exit; + } + + xf86UnMapVidMem(pScrn->scrnIndex, + (pointer) tmp, pVia->videoRambytes); + + /* + * And, as if this wasn't enough, 2.6 series kernels don't + * remove MTRR regions on the first attempt. So try again. + */ + tmp = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, + pVia->FrameBufferBase, pVia->videoRambytes); + if (!tmp) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map the frame buffer!\n"); + goto exit; + } + + xf86UnMapVidMem(pScrn->scrnIndex, + (pointer) tmp, pVia->videoRambytes); + /* + * End of hack. + */ + + pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, + pVia->PciTag, pVia->FrameBufferBase, + pVia->videoRambytes); + if (!pVia->FBBase) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to map the frame buffer!\n"); + goto exit; + } +#endif + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Mapping the frame buffer at address 0x%lx with " + "size %lu KB.\n", + pVia->FrameBufferBase, pVia->videoRambytes / 1024); + + pVia->FBFreeStart = 0; + pVia->FBFreeEnd = pVia->videoRambytes; + + ret = TRUE; +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); + return ret; +} + +static void +viaUnmapFB(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + +#ifdef HAVE_PCIACCESS + if (pVia->FBBase) { + pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->FBBase, + pVia->videoRambytes); + } +#else + if (pVia->FBBase) { + xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase, + pVia->videoRambytes); + } +#endif + + pVia->FBBase = NULL; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); +} + /* * Leftover from VIA's code. */ @@ -631,14 +648,13 @@ viaInitialize3DEngine(ScrnInfoPtr pScrn) * and initializes engines and acceleration method. */ Bool -umsAccelInit(ScreenPtr pScreen) +viaUMSAccelInit(ScrnInfoPtr pScrn) { - ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); Bool ret = FALSE; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered umsAccelInit.\n")); + "Entered %s.\n", __func__)); pVia->VQStart = 0; pVia->vq_bo = drm_bo_alloc(pScrn, VIA_VQ_SIZE, 16, TTM_PL_FLAG_VRAM); @@ -656,10 +672,6 @@ umsAccelInit(ScreenPtr pScreen) "Initializing the 3D engine.\n")); viaInitialize3DEngine(pScrn); - pVia->exa_sync_bo = drm_bo_alloc(pScrn, 32, 32, TTM_PL_FLAG_VRAM); - if (!pVia->exa_sync_bo) - goto err; - /* Sync marker space. */ pVia->exa_sync_bo = drm_bo_alloc(pScrn, 32, 32, TTM_PL_FLAG_VRAM); if (!pVia->exa_sync_bo) @@ -690,38 +702,27 @@ err: } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting umsAccelInit.\n")); + "Exiting %s.\n", __func__)); return ret; } -Bool -umsCreate(ScrnInfoPtr pScrn) +static Bool +viaInitFB(ScrnInfoPtr pScrn) { - ScreenPtr pScreen = pScrn->pScreen; VIAPtr pVia = VIAPTR(pScrn); - unsigned long offset; BoxRec AvailFBArea; - Bool ret = TRUE; - long size; + int offset, size; int maxY; + Bool ret = TRUE; -#ifdef HAVE_DRI - if (pVia->directRenderingType == DRI_1) { - pVia->driSize = (pVia->FBFreeEnd - pVia->FBFreeStart) >> 2; - if ((pVia->driSize > (pVia->maxDriSize * 1024)) && pVia->maxDriSize > 0) - pVia->driSize = pVia->maxDriSize * 1024; - - /* In the case of DRI we handle all VRAM by the DRI ioctls */ - if (pVia->useEXA) - return TRUE; - - /* XAA has to use FBManager so we have to split the space with DRI */ - maxY = pScrn->virtualY + (pVia->driSize / pVia->Bpl); - } else -#endif - maxY = pVia->FBFreeEnd / pVia->Bpl; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + maxY = pVia->FBFreeEnd / pVia->Bpl; - /* FBManager can't handle more than 32767 scan lines */ + /* + * FBManager can't handle more than 32767 scan lines. + */ if (maxY > 32767) maxY = 32767; @@ -732,145 +733,427 @@ umsCreate(ScrnInfoPtr pScrn) pVia->FBFreeStart = (AvailFBArea.y2 + 1) * pVia->Bpl; /* - * Initialization of the XFree86 framebuffer manager is done via - * Bool xf86InitFBManager(ScreenPtr pScreen, BoxPtr FullBox) - * FullBox represents the area of the framebuffer that the manager - * is allowed to manage. This is typically a box with a width - * of pScrn->displayWidth and a height of as many lines as can be fit - * within the total video memory + * Initialization of the XFree86 framebuffer manager is done via + * Bool xf86InitFBManager(ScreenPtr pScreen, BoxPtr FullBox). + * FullBox represents the area of the frame buffer that the + * manager is allowed to manage. This is typically a box with a + * width of pScrn->displayWidth and a height of as many lines as + * can be fit within the total video memory. */ - ret = xf86InitFBManager(pScreen, &AvailFBArea); - if (ret != TRUE) - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86InitFBManager init failed\n"); + ret = xf86InitFBManager(pScrn->pScreen, &AvailFBArea); + if (!ret) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "xf86InitFBManager initialization failed.\n"); + goto exit; + } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Frame Buffer From (%d,%d) To (%d,%d)\n", - AvailFBArea.x1, AvailFBArea.y1, AvailFBArea.x2, AvailFBArea.y2)); + "Frame buffer from (%d,%d) to (%d,%d).\n", + AvailFBArea.x1, AvailFBArea.y1, + AvailFBArea.x2, AvailFBArea.y2)); + + offset = (pVia->FBFreeStart + + ((pScrn->bitsPerPixel >> 3) - 1)) / + (pScrn->bitsPerPixel >> 3); + size = (pVia->FBFreeEnd / (pScrn->bitsPerPixel >> 3)) - offset; + + if (size > 0) { + ret = xf86InitFBManagerLinear(pScrn->pScreen, offset, size); + if (!ret) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "xf86InitFBManagerLinear initialization " + "failed.\n"); + goto exit; + } + } - offset = (pVia->FBFreeStart + pVia->Bpp - 1) / pVia->Bpp; - size = pVia->FBFreeEnd / pVia->Bpp - offset; - if (size > 0) - xf86InitFBManagerLinear(pScreen, offset, size); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d lines for off screen memory.\n", + AvailFBArea.y2 - pScrn->virtualY)); +exit: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Using %d lines for offscreen memory.\n", - AvailFBArea.y2 - pScrn->virtualY)); - return TRUE; + "Exiting %s.\n", __func__)); + return ret; +} + +Bool +viaUMSMapIOResources(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + Bool ret = TRUE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + pScrn->fbOffset = 0; + if (pVia->IsSecondary) { + pScrn->fbOffset = pScrn->videoRam << 10; + } + +#ifdef HAVE_PCIACCESS + if (pVia->Chipset == VIA_VX900) { + pScrn->memPhysBase = pVia->PciInfo->regions[2].base_addr; + } else { + pScrn->memPhysBase = pVia->PciInfo->regions[0].base_addr; + } +#else + if (pVia->Chipset == VIA_VX900) { + pScrn->memPhysBase = pVia->PciInfo->memBase[2]; + } else { + pScrn->memPhysBase = pVia->PciInfo->memBase[0]; + } +#endif + + /* + * Map MMIO PCI hardware resources to the memory map. + */ + if (!viaMapMMIO(pScrn)) { + ret = FALSE; + goto exit; + } + + /* + * Map FB PCI hardware resource to the memory map. + */ + if (!viaMapFB(pScrn)) { + viaUnmapMMIO(pScrn); + ret = FALSE; + goto exit; + } + +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); + return ret; +} + +void +viaUMSDestroy(ScrnInfoPtr pScrn) +{ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + viaUnmapFB(pScrn); + viaUnmapMMIO(pScrn); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); } Bool -umsPreInit(ScrnInfoPtr pScrn) +viaUMSScreenInit(ScrnInfoPtr pScrn) { - MessageType from = X_PROBED; VIAPtr pVia = VIAPTR(pScrn); - CARD8 videoRam; - vgaHWPtr hwp; + Bool ret = TRUE; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + if (pVia->directRenderingType == DRI_NONE) { + if (!pVia->useEXA) { + if (!viaInitFB(pScrn)) { + ret = FALSE; + } + } else { + if (!viaInitExa(pScrn->pScreen)) { + ret = FALSE; + } + } +#ifdef HAVE_DRI + } else if (pVia->directRenderingType == DRI_1) { + if (!VIADRIKernelInit(pScrn)) { + ret = FALSE; + goto exit; + } + + if ((!pVia->NoAccel) && (pVia->useEXA)) { + if (!viaInitExa(pScrn->pScreen)) { + ret = FALSE; + goto exit; + } + } +#endif + } + +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); + return ret; +} + +static Bool +viaProbeVRAM(ScrnInfoPtr pScrn) +{ #ifdef HAVE_PCIACCESS - struct pci_device *vgaDevice = pci_device_find_by_slot(0, 0, 0, 3); - struct pci_device *bridge = pci_device_find_by_slot(0, 0, 0, 0); + struct pci_device *hostBridge = NULL; + struct pci_device *dramController = NULL; #endif - int bMemSize = 0; + uint8_t videoRAM; + int detectedVideoRAM; + CARD16 hostBridgeVendorID, hostBridgeDeviceID; + CARD16 dramControllerVendorID; + Bool status = TRUE; - if (!xf86LoadSubModule(pScrn, "vgahw")) - return FALSE; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaProbeVRAM.\n")); - if (!vgaHWGetHWRec(pScrn)) - return FALSE; +#ifdef HAVE_PCIACCESS + hostBridge = pci_device_find_by_slot(0, 0, 0, 0); + hostBridgeVendorID = VENDOR_ID(hostBridge); +#else + hostBridgeVendorID = pciReadWord(pciTag(0, 0, 0), 0x00); +#endif -#if 0 - /* Here we can alter the number of registers saved and restored by the - * standard vgaHWSave and Restore routines. - */ - vgaHWSetRegCounts(pScrn, VGA_NUM_CRTC, VGA_NUM_SEQ, VGA_NUM_GFX, - VGA_NUM_ATTR); + if (hostBridgeVendorID != PCI_VIA_VENDOR_ID) { + status = FALSE; + goto exit; + } + +#ifdef HAVE_PCIACCESS + hostBridgeDeviceID = DEVICE_ID(hostBridge); +#else + hostBridgeDeviceID = pciReadWord(pciTag(0, 0, 0), 0x02); #endif - hwp = VGAHWPTR(pScrn); - switch (pVia->Chipset) { - case VIA_CLE266: + if ((hostBridgeDeviceID != PCI_DEVICE_ID_VIA_CLE266_HB) && + (hostBridgeDeviceID != PCI_DEVICE_ID_VIA_KM400_HB)) { #ifdef HAVE_PCIACCESS - pci_device_cfg_read_u8(bridge, &videoRam, 0xE1); + dramController = pci_device_find_by_slot(0, 0, 0, 3); + dramControllerVendorID = VENDOR_ID(dramController); #else - videoRam = pciReadByte(pciTag(0, 0, 0), 0xE1) & 0x70; + dramControllerVendorID = pciReadWord(pciTag(0, 0, 3), 0x00); + #endif - pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10; - break; - case VIA_KM400: + if (dramControllerVendorID != PCI_VIA_VENDOR_ID) { + status = FALSE; + goto exit; + } + } + switch (hostBridgeDeviceID) { + case PCI_DEVICE_ID_VIA_CLE266_HB: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "CLE266 chipset host bridge detected.\n"); #ifdef HAVE_PCIACCESS - /* P4M800 Host Bridge PCI Device ID */ - if (DEVICE_ID(bridge) == 0x0296) { - pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1); - } else { - pci_device_cfg_read_u8(bridge, &videoRam, 0xE1); - } + pci_device_cfg_read_u8(hostBridge, &videoRAM, 0xE1); #else - /* P4M800 Host Bridge PCI Device ID */ - if (pciReadWord(pciTag(0, 0, 0), 0x02) == 0x0296) { - videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70; - } else { - videoRam = pciReadByte(pciTag(0, 0, 0), 0xE1) & 0x70; - } + videoRAM = pciReadByte(pciTag(0, 0, 0), 0xE1); #endif - pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10; - break; - case VIA_PM800: - case VIA_P4M800PRO: - case VIA_K8M800: + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10; + break; + case PCI_DEVICE_ID_VIA_KM400_HB: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "KM400 chipset host bridge detected.\n"); #ifdef HAVE_PCIACCESS - pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1); + pci_device_cfg_read_u8(hostBridge, &videoRAM, 0xE1); #else - videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70; + videoRAM = pciReadByte(pciTag(0, 0, 0), 0xE1); #endif - pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10; - break; - case VIA_P4M890: - case VIA_K8M890: - case VIA_P4M900: - case VIA_CX700: - case VIA_VX800: - case VIA_VX855: - case VIA_VX900: + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10; + break; + case PCI_DEVICE_ID_VIA_P4M800_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "P4M800 chipset AGP bridge detected.\n"); #ifdef HAVE_PCIACCESS - pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1); + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); #else - videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70; + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); #endif - pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 12; - break; - default: - if (pScrn->videoRam < 16384 || pScrn->videoRam > 65536) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Using old memory-detection method.\n"); - bMemSize = hwp->readSeq(hwp, 0x39); - if (bMemSize > 16 && bMemSize <= 128) - pScrn->videoRam = (bMemSize + 1) << 9; - else if (bMemSize > 0 && bMemSize < 31) - pScrn->videoRam = bMemSize << 12; - else { - from = X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Memory size detection failed: using 16 MB.\n"); - pScrn->videoRam = 16 << 10; - } - } else { - from = X_DEFAULT; - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "No memory-detection done. Use VideoRAM option.\n"); - } + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10; + break; + case PCI_DEVICE_ID_VIA_P4M800_PRO_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "P4M800 Pro chipset AGP bridge detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10; + break; + case PCI_DEVICE_ID_VIA_PM800_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "PM800 chipset AGP bridge detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10; + break; + case PCI_DEVICE_ID_VIA_K8M800_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "K8M800 chipset AGP bridge detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 10; + break; + case PCI_DEVICE_ID_VIA_CX700_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "CX700 chipset AGP bridge detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12; + break; + case PCI_DEVICE_ID_VIA_P4M890_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "P4M890 chipset AGP bridge detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12; + break; + case PCI_DEVICE_ID_VIA_K8M890_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "K8M890 chipset AGP bridge detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12; + break; + case PCI_DEVICE_ID_VIA_P4M900_AGP: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "P4M900 chipset AGP bridge detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12; + break; + case PCI_DEVICE_ID_VIA_VX800_HC: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VX800 chipset host controller detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12; + break; + case PCI_DEVICE_ID_VIA_VX855_HC: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VX855 chipset host controller detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12; + break; + case PCI_DEVICE_ID_VIA_VX900_HC: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "VX900 chipset host controller detected.\n"); +#ifdef HAVE_PCIACCESS + pci_device_cfg_read_u8(dramController, &videoRAM, 0xA1); +#else + videoRAM = pciReadByte(pciTag(0, 0, 3), 0xA1); +#endif + detectedVideoRAM = (1 << ((videoRAM & 0x70) >> 4)) << 12; + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Could not detect available video RAM.\n"); + detectedVideoRAM = 0; + status = FALSE; + break; } - /* - * PCI BAR are limited to 256 MB. - */ - if (pScrn->videoRam > (256 << 10)) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Cannot use more than 256 MB of VRAM.\n"); - pScrn->videoRam = (256 << 10); + pScrn->videoRam = detectedVideoRAM; + if (status) { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Detected Video RAM Size: %d KB\n", pScrn->videoRam); } - if (from == X_PROBED) { - xf86DrvMsg(pScrn->scrnIndex, from, - "Probed amount of VideoRAM = %d kB\n", pScrn->videoRam); +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaProbeVRAM.\n")); + return status; +} + +Bool +viaUMSPreInit(ScrnInfoPtr pScrn) +{ + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + + /* Checking for VIA Technologies NanoBook reference design. + Examples include Everex CloudBook and Sylvania g netbook. + It is also called FIC CE260 and CE261 by its ODM (Original + Design Manufacturer) name. + This device has its strapping resistors set to a wrong + setting to handle DVI. As a result, we need to make special + accommodations to handle DVI properly. */ + if ((pVia->Chipset == VIA_CX700) && + (SUBVENDOR_ID(pVia->PciInfo) == 0x1509) && + (SUBSYS_ID(pVia->PciInfo) == 0x2D30)) { + + pVIADisplay->isVIANanoBook = TRUE; + } else { + pVIADisplay->isVIANanoBook = FALSE; + } + + /* Checking for Quanta IL1 netbook. This is necessary + * due to its flat panel connected to DVP1 (Digital + * Video Port 1) rather than its LVDS channel. */ + if ((pVia->Chipset == VIA_VX800) && + (SUBVENDOR_ID(pVia->PciInfo) == 0x152D) && + (SUBSYS_ID(pVia->PciInfo) == 0x0771)) { + + pVIADisplay->isQuantaIL1 = TRUE; + } else { + pVIADisplay->isQuantaIL1 = FALSE; + } + + /* Samsung NC20 netbook has its FP connected to LVDS2 + * rather than the more logical LVDS1, hence, a special + * flag register is needed for properly controlling its + * FP. */ + if ((pVia->Chipset == VIA_VX800) && + (SUBVENDOR_ID(pVia->PciInfo) == 0x144d) && + (SUBSYS_ID(pVia->PciInfo) == 0xc04e)) { + + pVIADisplay->isSamsungNC20 = TRUE; + } else { + pVIADisplay->isSamsungNC20 = FALSE; + } + + /* Checking for OLPC XO-1.5. */ + if ((pVia->Chipset == VIA_VX855) && + (SUBVENDOR_ID(pVia->PciInfo) == 0x152D) && + (SUBSYS_ID(pVia->PciInfo) == 0x0833)) { + + pVIADisplay->isOLPCXO15 = TRUE; + } else { + pVIADisplay->isOLPCXO15 = FALSE; + } + + if (!xf86LoadSubModule(pScrn, "vgahw")) + return FALSE; + + if (!vgaHWGetHWRec(pScrn)) + return FALSE; + +#if 0 + /* Here we can alter the number of registers saved and restored by the + * standard vgaHWSave and Restore routines. + */ + vgaHWSetRegCounts(pScrn, VGA_NUM_CRTC, VGA_NUM_SEQ, VGA_NUM_GFX, + VGA_NUM_ATTR); +#endif + + if (!viaProbeVRAM(pScrn)) { + return FALSE; } /* Split the FB for SAMM. */ @@ -906,27 +1189,180 @@ umsPreInit(ScrnInfoPtr pScrn) return TRUE; } +void +viaUMSPreInitExit(ScrnInfoPtr pScrn) +{ + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + viaUnmapMMIO(pScrn); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); +} + Bool -umsCrtcInit(ScrnInfoPtr pScrn) +viaUMSCrtcInit(ScrnInfoPtr pScrn) { drmmode_crtc_private_ptr iga1_rec = NULL, iga2_rec = NULL; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); -#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,8,0,0,0) + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + VIARegPtr Regs = &pVIADisplay->SavedReg; +#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,3,0) ClockRangePtr clockRanges; #else ClockRangesPtr clockRanges; #endif int max_pitch, max_height; - VIABIOSInfoPtr pBIOSInfo; xf86CrtcPtr iga1, iga2; + uint32_t i; + + vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); + + /* Unlock extended registers. */ + hwp->writeSeq(hwp, 0x10, 0x01); + + Regs->SR[0x14] = hwp->readSeq(hwp, 0x14); + Regs->SR[0x15] = hwp->readSeq(hwp, 0x15); + Regs->SR[0x16] = hwp->readSeq(hwp, 0x16); + Regs->SR[0x17] = hwp->readSeq(hwp, 0x17); + Regs->SR[0x18] = hwp->readSeq(hwp, 0x18); + Regs->SR[0x19] = hwp->readSeq(hwp, 0x19); + Regs->SR[0x1A] = hwp->readSeq(hwp, 0x1A); + Regs->SR[0x1B] = hwp->readSeq(hwp, 0x1B); + Regs->SR[0x1C] = hwp->readSeq(hwp, 0x1C); + Regs->SR[0x1D] = hwp->readSeq(hwp, 0x1D); + Regs->SR[0x1E] = hwp->readSeq(hwp, 0x1E); + Regs->SR[0x1F] = hwp->readSeq(hwp, 0x1F); + Regs->SR[0x20] = hwp->readSeq(hwp, 0x20); + Regs->SR[0x21] = hwp->readSeq(hwp, 0x21); + Regs->SR[0x22] = hwp->readSeq(hwp, 0x22); + Regs->SR[0x23] = hwp->readSeq(hwp, 0x23); + Regs->SR[0x24] = hwp->readSeq(hwp, 0x24); + + Regs->SR[0x27] = hwp->readSeq(hwp, 0x27); + Regs->SR[0x28] = hwp->readSeq(hwp, 0x28); + Regs->SR[0x29] = hwp->readSeq(hwp, 0x29); + Regs->SR[0x2A] = hwp->readSeq(hwp, 0x2A); + Regs->SR[0x2B] = hwp->readSeq(hwp, 0x2B); + + Regs->SR[0x2C] = hwp->readSeq(hwp, 0x2C); + + Regs->SR[0x2D] = hwp->readSeq(hwp, 0x2D); + Regs->SR[0x2E] = hwp->readSeq(hwp, 0x2E); + Regs->SR[0x2F] = hwp->readSeq(hwp, 0x2F); + Regs->SR[0x30] = hwp->readSeq(hwp, 0x30); + + Regs->SR[0x3D] = hwp->readSeq(hwp, 0x3D); + + Regs->SR[0x44] = hwp->readSeq(hwp, 0x44); + Regs->SR[0x45] = hwp->readSeq(hwp, 0x45); + Regs->SR[0x46] = hwp->readSeq(hwp, 0x46); + Regs->SR[0x47] = hwp->readSeq(hwp, 0x47); + Regs->SR[0x48] = hwp->readSeq(hwp, 0x48); + Regs->SR[0x49] = hwp->readSeq(hwp, 0x49); + Regs->SR[0x4A] = hwp->readSeq(hwp, 0x4A); + Regs->SR[0x4B] = hwp->readSeq(hwp, 0x4B); - /* 3X5.3B through 3X5.3F are scratch pad registers. */ - pVia->originalCR3B = hwp->readCrtc(hwp, 0x3B); - pVia->originalCR3C = hwp->readCrtc(hwp, 0x3C); - pVia->originalCR3D = hwp->readCrtc(hwp, 0x3D); - pVia->originalCR3E = hwp->readCrtc(hwp, 0x3E); - pVia->originalCR3F = hwp->readCrtc(hwp, 0x3F); + switch (pVia->Chipset) { + case VIA_K8M800: + case VIA_P4M800PRO: + case VIA_PM800: + case VIA_CX700: + case VIA_P4M890: + case VIA_K8M890: + case VIA_P4M900: + case VIA_VX800: + case VIA_VX855: + case VIA_VX900: + Regs->SR[0x4C] = hwp->readSeq(hwp, 0x4C); + Regs->SR[0x4D] = hwp->readSeq(hwp, 0x4D); + Regs->SR[0x4E] = hwp->readSeq(hwp, 0x4E); + Regs->SR[0x4F] = hwp->readSeq(hwp, 0x4F); + break; + default: + break; + } + + if ((pVia->Chipset == VIA_VX800) || + (pVia->Chipset == VIA_VX855) || + (pVia->Chipset == VIA_VX900)) { + Regs->SR[0x14] = hwp->readSeq(hwp, 0x14); + Regs->SR[0x68] = hwp->readSeq(hwp, 0x68); + Regs->SR[0x69] = hwp->readSeq(hwp, 0x69); + Regs->SR[0x6A] = hwp->readSeq(hwp, 0x6A); + Regs->SR[0x6B] = hwp->readSeq(hwp, 0x6B); + Regs->SR[0x6C] = hwp->readSeq(hwp, 0x6C); + Regs->SR[0x6D] = hwp->readSeq(hwp, 0x6D); + Regs->SR[0x6E] = hwp->readSeq(hwp, 0x6E); + Regs->SR[0x6F] = hwp->readSeq(hwp, 0x6F); + } + + Regs->CR[0x0C] = hwp->readCrtc(hwp, 0x0C); + Regs->CR[0x0D] = hwp->readCrtc(hwp, 0x0D); + + Regs->CR[0x30] = hwp->readCrtc(hwp, 0x30); + Regs->CR[0x31] = hwp->readCrtc(hwp, 0x31); + Regs->CR[0x32] = hwp->readCrtc(hwp, 0x32); + Regs->CR[0x33] = hwp->readCrtc(hwp, 0x33); + Regs->CR[0x34] = hwp->readCrtc(hwp, 0x34); + Regs->CR[0x35] = hwp->readCrtc(hwp, 0x35); + Regs->CR[0x36] = hwp->readCrtc(hwp, 0x36); + Regs->CR[0x37] = hwp->readCrtc(hwp, 0x37); + Regs->CR[0x38] = hwp->readCrtc(hwp, 0x38); + Regs->CR[0x39] = hwp->readCrtc(hwp, 0x39); + Regs->CR[0x3A] = hwp->readCrtc(hwp, 0x3A); + Regs->CR[0x3B] = hwp->readCrtc(hwp, 0x3B); + Regs->CR[0x3C] = hwp->readCrtc(hwp, 0x3C); + Regs->CR[0x3D] = hwp->readCrtc(hwp, 0x3D); + Regs->CR[0x3E] = hwp->readCrtc(hwp, 0x3E); + Regs->CR[0x3F] = hwp->readCrtc(hwp, 0x3F); + Regs->CR[0x40] = hwp->readCrtc(hwp, 0x40); + Regs->CR[0x43] = hwp->readCrtc(hwp, 0x43); + Regs->CR[0x45] = hwp->readCrtc(hwp, 0x45); + Regs->CR[0x46] = hwp->readCrtc(hwp, 0x46); + Regs->CR[0x47] = hwp->readCrtc(hwp, 0x47); + Regs->CR[0x48] = hwp->readCrtc(hwp, 0x48); + + for (i = 0; i < (0xA8 - 0x50 + 1); i++) { + Regs->CR[i + 0x50] = hwp->readCrtc(hwp, i + 0x50); + } + + switch (pVia->Chipset) { + case VIA_CX700: + case VIA_VX800: + case VIA_VX855: + case VIA_VX900: + for (i = 0; i < (0xEF - 0xA9 + 1); i++) { + Regs->CR[i + 0xA9] = hwp->readCrtc(hwp, i + 0xA9); + } + + break; + default: + break; + } + + if ((pVia->Chipset == VIA_VX800) || + (pVia->Chipset == VIA_VX855) || + (pVia->Chipset == VIA_VX900)) { + for (i = 0; i < (0xF5 - 0xF0 + 1); i++) { + Regs->CR[i + 0xF0] = hwp->readCrtc(hwp, i + 0xF0); + } + } + + if ((pVia->Chipset == VIA_VX855) || + (pVia->Chipset == VIA_VX900)) { + for (i = 0; i < (0xFC - 0xF6 + 1); i++) { + Regs->CR[i + 0xF6] = hwp->readCrtc(hwp, i + 0xF6); + } + } + + if (pVia->Chipset == VIA_VX900) { + for (i = 0; i < (0xFF - 0xF7 + 1); i++) { + Regs->CR[i + 0xF7] = hwp->readCrtc(hwp, i + 0xF7); + } + } /* Read memory bandwidth from registers. */ pVia->MemClk = hwp->readCrtc(hwp, 0x3D) >> 4; @@ -937,22 +1373,28 @@ umsCrtcInit(ScrnInfoPtr pScrn) "Unknown Memory clock: %d\n", pVia->MemClk); pVia->MemClk = VIA_MEM_END - 1; } - pBIOSInfo = pVia->pBIOSInfo; - pBIOSInfo->Bandwidth = ViaGetMemoryBandwidth(pScrn); - if (pBIOSInfo->TVType == TVTYPE_NONE) { + pVIADisplay->Bandwidth = ViaGetMemoryBandwidth(pScrn); + + if (pVIADisplay->TVType == TVTYPE_NONE) { /* Use jumper to determine TV type. */ if (hwp->readCrtc(hwp, 0x3B) & 0x02) { - pBIOSInfo->TVType = TVTYPE_PAL; + pVIADisplay->TVType = TVTYPE_PAL; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected TV standard: PAL.\n")); } else { - pBIOSInfo->TVType = TVTYPE_NTSC; + pVIADisplay->TVType = TVTYPE_NTSC; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected TV standard: NTSC.\n")); } } + pVIADisplay->I2CDevices = VIA_I2C_BUS1 | VIA_I2C_BUS2 | VIA_I2C_BUS3; + + if (pVIADisplay->isOLPCXO15) { + pVIADisplay->I2CDevices &= ~VIA_I2C_BUS2; + } + if (pVia->drmmode.hwcursor) { if (!xf86LoadSubModule(pScrn, "ramdac")) return FALSE; @@ -971,7 +1413,7 @@ umsCrtcInit(ScrnInfoPtr pScrn) * available, and what sort of modes they can be used for. */ -#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,8,0,0,0) +#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,99,3,0) clockRanges = xnfalloc(sizeof(ClockRange)); #else clockRanges = xnfalloc(sizeof(ClockRanges)); @@ -1047,7 +1489,7 @@ umsCrtcInit(ScrnInfoPtr pScrn) xf86CrtcSetSizeRange(pScrn, 320, 200, max_pitch, max_height); - viaOutputDetect(pScrn); + viaInitDisplay(pScrn); return TRUE; } diff --git a/src/via_ums.h b/src/via_ums.h index ec2204c..e937217 100644 --- a/src/via_ums.h +++ b/src/via_ums.h @@ -26,8 +26,8 @@ * DEALINGS IN THE SOFTWARE. */ -#ifndef _VIA_BIOS_H_ -#define _VIA_BIOS_H_ 1 +#ifndef _VIA_UMS_H_ +#define _VIA_UMS_H_ 1 #include "via_vgahw.h" @@ -107,24 +107,62 @@ #define VIA_MEM_END 0x0B #define VIA_MEM_NONE 0xFF +#define VIA_BW_MIN 74000000 /* > 640x480@60Hz@32bpp */ +#define VIA_BW_DDR200 394000000 +#define VIA_BW_DDR400 553000000 /* > 1920x1200@60Hz@32bpp */ +#define VIA_BW_DDR667 922000000 +#define VIA_BW_DDR1066 922000000 + /* Digital Output Bus Width */ #define VIA_DI_12BIT 0x00 #define VIA_DI_24BIT 0x01 /* Digital Port */ #define VIA_DI_PORT_NONE 0x0 -#define VIA_DI_PORT_DVP0 0x1 -#define VIA_DI_PORT_DVP1 0x2 -#define VIA_DI_PORT_DFPLOW 0x4 -#define VIA_DI_PORT_LVDS1 0x4 -#define VIA_DI_PORT_TMDS 0x4 -#define VIA_DI_PORT_DFPHIGH 0x8 -#define VIA_DI_PORT_LVDS2 0x8 +#define VIA_DI_PORT_DIP0 0x1 +#define VIA_DI_PORT_DIP1 0x2 +#define VIA_DI_PORT_DVP0 0x4 +#define VIA_DI_PORT_DVP1 0x8 +#define VIA_DI_PORT_FPDPLOW 0x10 +#define VIA_DI_PORT_FPDPHIGH 0x20 +#define VIA_DI_PORT_LVDS1 0x40 +#define VIA_DI_PORT_TMDS 0x40 +#define VIA_DI_PORT_LVDS2 0x80 /* External TMDS (DVI) Transmitter Type */ #define VIA_TMDS_NONE 0x0 #define VIA_TMDS_VT1632 0x1 +#define VIA_TMDS_SII164 0x2 + +/* To be used with via_analog_set_dpms_control inline function. */ +#define VIA_ANALOG_DPMS_ON 0x00 +#define VIA_ANALOG_DPMS_STANDBY 0x01 +#define VIA_ANALOG_DPMS_SUSPEND 0x02 +#define VIA_ANALOG_DPMS_OFF 0x03 + +#define VIA_DPA_CLK_30M 30000000 +#define VIA_DPA_CLK_50M 50000000 +#define VIA_DPA_CLK_70M 70000000 +#define VIA_DPA_CLK_100M 100000000 +#define VIA_DPA_CLK_150M 150000000 + + +#define BIT(x) (1 << x) + +enum { + VIA_DPA_CLK_RANGE_30M, + VIA_DPA_CLK_RANGE_30M_50M, + VIA_DPA_CLK_RANGE_50M_70M, + VIA_DPA_CLK_RANGE_70M_100M, + VIA_DPA_CLK_RANGE_100M_150M, + VIA_DPA_CLK_RANGE_150M, +}; + +typedef struct { + CARD8 SR[256]; + CARD8 CR[256]; +} VIARegRec, *VIARegPtr; typedef struct ViaPanelMode { int Width; @@ -133,35 +171,66 @@ typedef struct ViaPanelMode { Bool useDithering; } ViaPanelModeRec, *ViaPanelModePtr ; -typedef struct ViaPanelInfo { - Bool IsActive ; - /* Native physical resolution */ - int NativeHeight; - int NativeWidth; - Bool useDualEdge; - Bool useDithering; +typedef struct _VIADISPLAY { + Bool analogPresence; + CARD8 analogI2CBus; - /* Native resolution index, see via_panel.c */ - CARD8 NativeModeIndex; - /* Determine if we must use the hardware scaler - * It might be false even if the "Center" option - * was specified - */ - Bool Scale; + Bool intTMDSPresence; + CARD8 intTMDSDIPort; + CARD8 intTMDSI2CBus; - /* Panel/LCD entries */ - CARD16 ResolutionIndex; - int PanelIndex; - Bool Center; - Bool SetDVI; - /* LCD Simultaneous Expand Mode HWCursor Y Scale */ - Bool scaleY; - int resY; -} ViaPanelInfoRec, *ViaPanelInfoPtr ; + Bool extTMDSPresence; + CARD8 extTMDSDIPort; + CARD8 extTMDSI2CBus; + CARD8 extTMDSTransmitter; + + Bool intFP1Presence; + CARD8 intFP1DIPort; + CARD8 intFP1I2CBus; + + Bool intFP2Presence; + CARD8 intFP2DIPort; + CARD8 intFP2I2CBus; + + /* Keeping track of the number of analog VGA connectors. */ + unsigned int numberVGA; + + /* Keeping track of the number of DVI connectors. */ + unsigned int numberDVI; + + /* Keeping track of the number of FP (Flat Panel) connectors. */ + unsigned int numberFP; -typedef struct _VIABIOSINFO { - xf86OutputPtr analog; - xf86OutputPtr tv; + CARD8 I2CDevices; + CARD8 mappedI2CBus; + + I2CBusPtr pI2CBus1; + I2CBusPtr pI2CBus2; + I2CBusPtr pI2CBus3; + + /* VIA Technologies NanoBook reference design. + * Examples include Everex CloudBook and Sylvania g netbook. + * It is also called FIC CE260 and CE261 by its ODM (Original + * Design Manufacturer) name. */ + Bool isVIANanoBook; + + /* Quanta IL1 netbook has its FP connected to DVP1 + * rather than LVDS, hence, a special flag register + * is needed for properly controlling its FP. */ + Bool isQuantaIL1; + + /* Samsung NC20 netbook has its FP connected to LVDS2 + * rather than the more logical LVDS1, hence, a special + * flag register is needed for properly controlling its + * FP. */ + Bool isSamsungNC20; + + /* OLPC XO-1.5 */ + Bool isOLPCXO15; + + VIARegRec SavedReg; + + xf86OutputPtr tv; CARD32 Clock; /* register value for the dotclock */ Bool ClockExternal; @@ -190,12 +259,48 @@ typedef struct _VIABIOSINFO { int TVNumModes; void (*TVPrintRegs) (ScrnInfoPtr pScrn); -} VIABIOSInfoRec, *VIABIOSInfoPtr; +} VIADisplayRec, *VIADisplayPtr; + +typedef struct _VIAANALOG { + CARD8 i2cBus; +} VIAAnalogRec, *VIAAnalogPtr; + +/* + * Record for storing FP (Flat Panel) specific information. + */ +typedef struct _VIAFP { + Bool IsActive ; + /* Native physical resolution */ + int NativeHeight; + int NativeWidth; + Bool useDualEdge; + Bool useDithering; + + /* Native resolution index, see via_panel.c */ + CARD8 NativeModeIndex; + /* Determine if we must use the hardware scaler + * It might be false even if the "Center" option + * was specified + */ + Bool Scale; + + /* Panel/LCD entries */ + CARD16 ResolutionIndex; + int PanelIndex; + Bool Center; + Bool SetDVI; + /* LCD Simultaneous Expand Mode HWCursor Y Scale */ + Bool scaleY; + int resY; + uint32_t diPort; + CARD8 i2cBus; +} VIAFPRec, *VIAFPPtr; -typedef struct _VIATMDSRec { - I2CBusPtr pVIATMDSI2CBus; -} VIATMDSRec, *VIATMDSRecPtr; +typedef struct _VIATMDS { + uint32_t diPort; + CARD8 i2cBus; +} VIATMDSRec, *VIATMDSPtr; typedef struct { @@ -206,47 +311,1275 @@ typedef struct CARD8 bTuningValue; } ViaExpireNumberTable; +union pllparams { + struct { + CARD32 dtz : 2; + CARD32 dr : 3; + CARD32 dn : 7; + CARD32 dm :10; + } params; + CARD32 packed; +}; + +/* + * DPA Setting Structure. + */ +typedef struct _VIADPA { + CARD8 dvp0Adjustment; + CARD8 dvp0ClockDriveStrength; + CARD8 dvp0DataDriveStrength; + CARD8 dvp1Adjustment; + CARD8 dvp1ClockDriveStrength; + CARD8 dvp1DataDriveStrength; + CARD8 fpdpLowAdjustment; + CARD8 fpdpHighAdjustment; +} VIADPARec, *VIADPAPtr; + +typedef struct _VIADPAINFOTABLE { + CARD32 ClockRangeIndex; + VIADPAPtr pDPASetting; +} VIADPAInfoTableRec, *VIADPAInfoTablePtr; + +typedef struct _VIADPAINDEXTABLE { + int Chipset; + + VIADPAInfoTablePtr pExtTMDSDPATable; + VIADPAInfoTablePtr pFPDPATable; +} VIA_DPA_INDEX_TABLE; + + +#define NUMBER_VIA_DPA_TABLE (sizeof(viaDPAIndexTable) / sizeof(*(viaDPAIndexTable))) + +/* + * Sets IGA1 or IGA2 for palette LUT access. + * This function should be called before changing the + * contents of the palette. + */ +static inline void +viaSetPaletteLUTAccess(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + ViaSeqMask(VGAHWPTR(pScrn), 0x1A, + displaySource, BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Palette LUT Access: IGA%d\n", + (displaySource & BIT(0)) + 1)); +} + +/* + * Resets IGA1 hardware. + */ +static inline void +viaIGA1HWReset(ScrnInfoPtr pScrn, Bool resetState) +{ + /* 3X5.17[7] - IGA1 HW Reset + * 0: Reset + * 1: Normal Operation */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x17, resetState ? 0x00 : BIT(7), + BIT(7)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "IGA1 HW Reset: %s\n", + resetState ? "On" : "Off")); +} + +/* + * Sets IGA1 palette LUT resolution. (6-bit or 8-bit) + */ +static inline void +viaIGA1SetPaletteLUTResolution(ScrnInfoPtr pScrn, Bool paletteLUT) +{ + /* 3C5.15[7] - IGA1 6 / 8 Bit LUT + * 0: 6-bit + * 1: 8-bit */ + ViaSeqMask(VGAHWPTR(pScrn), 0x15, + paletteLUT ? BIT(7) : 0x00, BIT(7)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "IGA1 Palette LUT Resolution: %s bit\n", + paletteLUT ? "8" : "6")); +} + +/* + * Sets IGA2 palette LUT resolution. (6-bit or 8-bit) + */ +static inline void +viaIGA2SetPaletteLUTResolution(ScrnInfoPtr pScrn, Bool paletteLUT) +{ + /* Set the palette LUT resolution for IGA2. */ + /* 3X5.6A[5] - IGA2 6 / 8 Bit LUT + * 0: 6-bit + * 1: 8-bit */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x6A, + paletteLUT ? BIT(5) : 0x00, BIT(5)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "IGA2 Palette LUT Resolution: %s bit\n", + paletteLUT ? "8" : "6")); +} + +/* + * Sets IGA1 display output state. + */ +static inline void +viaIGA1SetDisplayOutput(ScrnInfoPtr pScrn, Bool outputState) +{ + /* 3C5.01[5] - IGA1 Screen Off + * 0: Screen on + * 1: Screen off */ + ViaSeqMask(VGAHWPTR(pScrn), 0x01, outputState ? 0x00 : BIT(5), BIT(5)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "IGA1 Display Output: %s\n", + outputState ? "On" : "Off")); +} + +/* + * Sets IGA2 display output state. + */ +static inline void +viaIGA2SetDisplayOutput(ScrnInfoPtr pScrn, Bool outputState) +{ + /* 3X5.6B[2] - IGA2 Screen Off + * 0: Screen on + * 1: Screen off */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x6B, + outputState ? 0x00 : BIT(2), BIT(2)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "IGA2 Display Output: %s\n", + outputState ? "On" : "Off")); +} + +/* + * Sets DIP0 (Digital Interface Port 0) I/O pad state. + * CLE266 chipset only. + */ +static inline void +viaDIP0SetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState) +{ + /* 3C5.1E[7:6] - DIP0 Power Control + * 0x: Pad always off + * 10: Depend on the other control signal + * 11: Pad on/off according to the + * Power Management Status (PMS) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x1E, + ioPadState << 6, BIT(7) | BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DIP0 I/O Pad State: %s\n", + ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? + "On" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? + "Conditional" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? + "Off" : + "Off")); +} + +/* + * Sets the display source of DIP0 (Digital Interface Port 0) + * interface. CLE266 chipset only. + */ +static inline void +viaDIP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3X5.6C[7] - DIP0 Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x6C, + displaySource << 7, BIT(7)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DIP0 Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + + +/* + * Sets DVP0 (Digital Video Port 0) I/O pad state. + */ +static inline void +viaDVP0SetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState) +{ + /* 3C5.1E[7:6] - DVP0 Power Control + * 0x: Pad always off + * 10: Depend on the other control signal + * 11: Pad on/off according to the + * Power Management Status (PMS) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x1E, ioPadState << 6, BIT(7) | BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP0 I/O Pad State: %s\n", + ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? "On" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? "Conditional" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? "Off" : + "Off")); +} + +/* + * Sets DVP0 (Digital Video Port 0) clock I/O pad drive strength. + */ +static inline void +viaDVP0SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) +{ + /* 3C5.1E[2] - DVP0 Clock Drive Strength Bit [0] */ + ViaSeqMask(VGAHWPTR(pScrn), 0x1E, clockDriveStrength << 2, + BIT(2)); + + /* 3C5.2A[4] - DVP0 Clock Drive Strength Bit [1] */ + ViaSeqMask(VGAHWPTR(pScrn), 0x2A, clockDriveStrength << 3, + BIT(4)); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP0 Clock I/O Pad Drive Strength: %u\n", + clockDriveStrength & (BIT(1) | BIT(0)))); +} + +/* + * Sets DVP0 (Digital Video Port 0) data I/O pads drive strength. + */ +static inline void +viaDVP0SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) +{ + /* 3C5.1B[1] - DVP0 Data Drive Strength Bit [0] */ + ViaSeqMask(VGAHWPTR(pScrn), 0x1B, dataDriveStrength << 1, BIT(1)); + + /* 3C5.2A[5] - DVP0 Data Drive Strength Bit [1] */ + ViaSeqMask(VGAHWPTR(pScrn), 0x2A, dataDriveStrength << 4, BIT(5)); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP0 Data I/O Pads Drive Strength: %u\n", + dataDriveStrength & (BIT(1) | BIT(0)))); +} + +/* + * Sets DVP0 (Digital Video Port 0) adjustment register. + */ +static inline void +viaDVP0SetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment) +{ + /* 3X5.96[3:0] - DVP0 Adjustment */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x96, + adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP0 Adjustment: %d\n", + (adjustment & (BIT(3) | BIT(2) | + BIT(1) | BIT(0))))); +} + +/* + * Sets DVP0 (Digital Video Port 0) sync polarity. + */ +static inline void +viaDVP0SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity) +{ + /* 3X5.96[6] - DVP0 VSYNC Polarity + * 0: Positive + * 1: Negative + * 3X5.96[5] - DVP0 HSYNC Polarity + * 0: Positive + * 1: Negative */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x96, + syncPolarity << 5, BIT(6) | BIT(5)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP0 Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP0 Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+")); +} + +/* + * Sets the display source of DVP0 (Digital Video Port 0) interface. + */ +static inline void +viaDVP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3X5.96[4] - DVP0 Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x96, displaySource << 4, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP0 Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Sets DVP1 (Digital Video Port 1) I/O pad state. + */ +static inline void +viaDVP1SetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState) +{ + /* 3C5.1E[5:4] - DVP1 Power Control + * 0x: Pad always off + * 10: Depend on the other control signal + * 11: Pad on/off according to the + * Power Management Status (PMS) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x1E, ioPadState << 4, BIT(5) | BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP1 I/O Pad State: %s\n", + ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? "On" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? "Conditional" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? "Off" : + "Off")); +} + +/* + * Sets DVP1 (Digital Video Port 1) clock I/O pad drive strength. + */ +static inline void +viaDVP1SetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength) +{ + /* 3C5.65[3:2] - DVP1 Clock Pads Driving Select [1:0] + * 00: lowest + * 01: low + * 10: high + * 11: highest */ + ViaSeqMask(VGAHWPTR(pScrn), 0x65, clockDriveStrength << 2, BIT(3) | BIT(2)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP1 Clock I/O Pad Drive Strength: %u\n", + clockDriveStrength & (BIT(1) | BIT(0)))); +} + +/* + * Sets DVP1 (Digital Video Port 1) data I/O pads drive strength. + */ +static inline void +viaDVP1SetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength) +{ + /* 3C5.65[1:0] - DVP1 Data Pads Driving Select [1:0} + * 00: lowest + * 01: low + * 10: high + * 11: highest */ + ViaSeqMask(VGAHWPTR(pScrn), 0x65, dataDriveStrength, BIT(1) | BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP1 Data I/O Pads Drive Strength: %u\n", + dataDriveStrength & (BIT(1) | BIT(0)))); +} + +/* + * Sets DVP1 (Digital Video Port 1) adjustment register. + */ +static inline void +viaDVP1SetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment) +{ + /* 3X5.9B[3:0] - DVP1 Adjustment */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x9B, + adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP1 Adjustment: %d\n", + (adjustment & (BIT(3) | BIT(2) | + BIT(1) | BIT(0))))); +} + +/* + * Sets DVP1 (Digital Video Port 1) sync polarity. + */ +static inline void +viaDVP1SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity) +{ + /* 3X5.9B[6] - DVP1 VSYNC Polarity + * 0: Positive + * 1: Negative + * 3X5.9B[5] - DVP1 HSYNC Polarity + * 0: Positive + * 1: Negative */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x9B, + syncPolarity << 5, BIT(6) | BIT(5)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP1 Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP1 Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+")); +} + +/* + * Sets the display source of DVP1 (Digital Video Port 1) interface. + */ +static inline void +viaDVP1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3X5.9B[4] - DVP1 Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x9B, displaySource << 4, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "DVP1 Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Sets analog (VGA) DAC power. + */ +static inline void +viaAnalogSetPower(ScrnInfoPtr pScrn, Bool outputState) +{ + /* 3X5.47[2] - DACOFF Backdoor Register + * 0: DAC on + * 1: DAC off */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x47, + outputState ? 0x00 : BIT(2), BIT(2)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) Power: %s\n", + outputState ? "On" : "Off")); +} + +/* + * Sets analog (VGA) DAC off setting. + * Only available in CX700 / VX700, VX800, VX855, and VX900 chipsets. + */ +static inline void +viaAnalogSetDACOff(ScrnInfoPtr pScrn, Bool dacOff) +{ + /* 3C5.5E[0] - CRT DACOFF Setting + * 0: Disabled + * 1: DAC is controlled by 3C5.01[5] */ + ViaSeqMask(VGAHWPTR(pScrn), 0x5E, + dacOff ? BIT(0) : 0x00, BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) DAC Off Setting: %s\n", + dacOff ? "On" : "Off")); +} + +/* + * Sets analog (VGA) DPMS State. + */ +static inline void +viaAnalogSetDPMSControl(ScrnInfoPtr pScrn, CARD8 dpmsControl) +{ + /* 3X5.36[5:4] - DPMS Control + * 00: On + * 01: Stand-by + * 10: Suspend + * 11: Off */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x36, + dpmsControl << 4, BIT(5) | BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) DPMS: %s\n", + ((dpmsControl & (BIT(1) | BIT(0))) == 0x03) ? + "Off" : + ((dpmsControl & (BIT(1) | BIT(0))) == 0x02) ? + "Suspend" : + ((dpmsControl & (BIT(1) | BIT(0))) == 0x01) ? + "Standby" : + "On")); +} + +/* + * Sets analog (VGA) sync polarity. + */ +static inline void +viaAnalogSetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity) +{ + /* 3C2[7] - Analog Vertical Sync Polarity + * 0: Positive + * 1: Negative + * 3C2[6] - Analog Horizontal Sync Polarity + * 0: Positive + * 1: Negative */ + VGAHWPTR(pScrn)->writeMiscOut(VGAHWPTR(pScrn), + ((VGAHWPTR(pScrn)->readMiscOut(VGAHWPTR(pScrn))) + & ~((BIT(1) | BIT(0)) << 6)) + | ((syncPolarity & (BIT(1) | BIT(0))) << 6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+")); +} + +/* + * Sets analog (VGA) display source. + */ +static inline void +viaAnalogSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3C5.16[6] - CRT Display Source + * 0: Primary Display Stream (IGA1) + * 1: Secondary Display Stream (IGA2) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x16, + displaySource << 6, BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Analog (VGA) Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Sets KM400 or later chipset's FP primary power sequence control + * type. + */ +static inline void +viaFPSetPrimaryPowerSeqType(ScrnInfoPtr pScrn, Bool ctrlType) +{ + /* Set FP primary power sequence control type. */ + /* 3X5.91[0] - FP Primary Power Sequence Control Type + * 0: Hardware Control + * 1: Software Control */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, ctrlType ? 0x00 : BIT(0), + BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Power Sequence Control Type: " + "%s Control\n", + ctrlType ? "Hardware" : "Software")); +} + +/* + * Sets KM400 or later chipset's FP primary software controlled + * back light. + */ +static inline void +viaFPSetPrimarySoftBackLight(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.91[1] - FP Primary Software Back Light On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, + softOn ? BIT(1) : 0x00, BIT(1)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Software Controlled Back Light: " + "%s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets KM400 or later chipset's FP primary software controlled + * VEE. + */ +static inline void +viaFPSetPrimarySoftVEE(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.91[2] - FP Primary Software VEE On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, + softOn ? BIT(2) : 0x00, BIT(2)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Software Controlled VEE: " + "%s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets KM400 or later chipset's FP primary software controlled + * data. + */ +static inline void +viaFPSetPrimarySoftData(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.91[3] - FP Primary Software Data On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, + softOn ? BIT(3) : 0x00, BIT(3)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Software Controlled Data: " + "%s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets KM400 or later chipset's FP primary software controlled + * VDD. + */ +static inline void +viaFPSetPrimarySoftVDD(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.91[4] - FP Primary Software VDD On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, + softOn ? BIT(4) : 0x00, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Software Controlled VDD: " + "%s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets KM400 or later chipset's FP primary direct back light control + * bit. + */ +static inline void +viaFPSetPrimaryDirectBackLightCtrl(ScrnInfoPtr pScrn, Bool directOn) +{ + /* Set FP primary direct back light control bit. */ + /* 3X5.91[6] - FP Primary Direct Back Light Control + * 0: On + * 1: Off */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, directOn ? 0x00 : BIT(6), + BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Direct Back Light Control: %s\n", + directOn ? "On" : "Off")); +} + +/* + * Sets KM400 or later chipset's FP primary direct display period + * control bit. + */ +static inline void +viaFPSetPrimaryDirectDisplayPeriod(ScrnInfoPtr pScrn, Bool directOn) +{ + /* Set FP primary direct display period bit. */ + /* 3X5.91[7] - FP Primary Direct Display Period Control + * 0: On + * 1: Off */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, directOn ? 0x00 : BIT(7), + BIT(7)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Direct Display Period Control: %s\n", + directOn ? "On" : "Off")); +} + +/* + * Sets KM400 or later chipset's FP primary hardware controlled + * power sequence bit. + */ +static inline void +viaFPSetPrimaryHardPower(ScrnInfoPtr pScrn, Bool powerState) +{ + /* Set FP primary hardware controlled power sequence bit. */ + /* 3X5.6A[3] - FP Primary Hardware Controlled Power Sequence + * 0: Hardware Controlled Power Off + * 1: Hardware Controlled Power On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x6A, powerState ? BIT(3) : 0x00, + BIT(3)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Primary Hardware Controlled Power " + "Sequence: %s\n", + powerState ? "On" : "Off")); +} + +/* + * Sets FP secondary power sequence control type. + */ +static inline void +viaFPSetSecondaryPowerSeqType(ScrnInfoPtr pScrn, Bool ctrlType) +{ + /* 3X5.D3[0] - FP Secondary Power Sequence Control Type + * 0: Hardware Control + * 1: Software Control */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, ctrlType ? 0x00 : BIT(0), + BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Power Sequence Control Type: " + "%s Control\n", + ctrlType ? "Hardware" : "Software")); +} + +/* + * Sets CX700 / VX700 or later chipset's FP secondary + * software controlled back light. + */ +static inline void +viaFPSetSecondarySoftBackLight(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.D3[1] - FP Secondary Software Back Light On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, + softOn ? BIT(1) : 0x00, BIT(1)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Software Controlled " + "Back Light: %s\n", softOn ? "On" : "Off")); +} + +/* + * Sets CX700 / VX700 or later chipset's FP secondary software + * controlled VEE. + */ +static inline void +viaFPSetSecondarySoftVEE(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.D3[2] - FP Secondary Software VEE On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, + softOn ? BIT(2) : 0x00, BIT(2)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Software Controlled VEE: %s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets CX700 / VX700 or later chipset's FP secondary software + * controlled data. + */ +static inline void +viaFPSetSecondarySoftData(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.D3[3] - FP Secondary Software Data On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, + softOn ? BIT(3) : 0x00, BIT(3)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Software Controlled Data: %s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets CX700 / VX700 or later chipset's FP secondary software + * controlled VDD. + */ +static inline void +viaFPSetSecondarySoftVDD(ScrnInfoPtr pScrn, Bool softOn) +{ + /* 3X5.D3[4] - FP Secondary Software VDD On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, + softOn ? BIT(4) : 0x00, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Software Controlled VDD: %s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets CX700 / VX700 or later chipset's FP secondary direct back + * light control. + */ +static inline void +viaFPSetSecondaryDirectBackLightCtrl(ScrnInfoPtr pScrn, Bool directOn) +{ + /* 3X5.D3[6] - FP Secondary Direct Back Light Control + * 0: On + * 1: Off */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, + directOn ? 0x00 : BIT(6), BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Direct Back Light " + "Control: %s\n", directOn ? "On" : "Off")); +} + +/* + * Sets CX700 / VX700 or later chipset's FP secondary direct + * display period control. + */ +static inline void +viaFPSetSecondaryDirectDisplayPeriod(ScrnInfoPtr pScrn, Bool directOn) +{ + /* 3X5.D3[7] - FP Secondary Direct Display Period Control + * 0: On + * 1: Off */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD3, + directOn ? 0x00 : BIT(7), BIT(7)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Direct Display Period " + "Control: %s\n", directOn ? "On" : "Off")); +} + +/* + * Sets FP secondary hardware controlled power sequence enable bit. + */ +static inline void +viaFPSetSecondaryHardPower(ScrnInfoPtr pScrn, Bool powerState) +{ + /* 3X5.D4[1] - Secondary Power Hardware Power Sequence Enable + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD4, + powerState ? BIT(1) : 0x00, BIT(1)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FP Secondary Hardware Controlled Power " + "Sequence: %s\n", + powerState ? "On" : "Off")); +} + +/* + * Sets FPDP (Flat Panel Display Port) Low I/O pad state. + */ +static inline void +viaFPDPLowSetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState) +{ + /* 3C5.2A[1:0] - FPDP Low Power Control + * 0x: Pad always off + * 10: Depend on the other control signal + * 11: Pad on/off according to the + * Power Management Status (PMS) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x2A, + ioPadState, BIT(1) | BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FPDP Low I/O Pad State: %s\n", + ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? + "On" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? + "Conditional" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? + "Off" : + "Off")); +} + +/* + * Sets FPDP (Flat Panel Display Port) Low adjustment register. + */ +static inline void +viaFPDPLowSetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment) +{ + /* 3X5.99[3:0] - FPDP Low Adjustment */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x99, + adjustment, BIT(3) | BIT(2) | BIT(1) | BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FPDP Low Adjustment: %d\n", + (adjustment & (BIT(3) | BIT(2) | + BIT(1) | BIT(0))))); +} + +/* + * Sets FPDP (Flat Panel Display Port) Low interface display source. + */ +static inline void +viaFPDPLowSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3X5.99[4] - FPDP Low Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x99, + displaySource << 4, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FPDP Low Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Sets FPDP (Flat Panel Display Port) High I/O pad state. + */ +static inline void +viaFPDPHighSetIOPadState(ScrnInfoPtr pScrn, CARD8 ioPadState) +{ + /* 3C5.2A[3:2] - FPDP High Power Control + * 0x: Pad always off + * 10: Depend on the other control signal + * 11: Pad on/off according to the + * Power Management Status (PMS) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x2A, + ioPadState << 2, BIT(3) | BIT(2)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FPDP High I/O Pad State: %s\n", + ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? + "On" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? + "Conditional" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? + "Off" : + "Off")); +} + +/* + * Sets FPDP (Flat Panel Display Port) High adjustment register. + */ +static inline void +viaFPDPHighSetAdjustment(ScrnInfoPtr pScrn, CARD8 adjustment) +{ + /* 3X5.97[3:0] - FPDP High Adjustment */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x97, adjustment, + BIT(3) | BIT(2) | BIT(1) | BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FPDP High Adjustment: %d\n", + (adjustment & (BIT(3) | BIT(2) | + BIT(1) | BIT(0))))); +} + +/* + * Sets FPDP (Flat Panel Display Port) High interface display source. + */ +static inline void +viaFPDPHighSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3X5.97[4] - FPDP High Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x97, + displaySource << 4, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "FPDP High Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Sets LVDS1 power state. + */ +static inline void +viaLVDS1SetPower(ScrnInfoPtr pScrn, Bool powerState) +{ + /* 3X5.D2[7] - Power Down (Active High) for Channel 1 LVDS + * 0: LVDS1 power on + * 1: LVDS1 power down */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD2, + powerState ? 0x00 : BIT(7), BIT(7)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Power State: %s\n", + powerState ? "On" : "Off")); +} + +/* + * Sets CX700 or later single chipset's LVDS1 power sequence type. + */ +static inline void +viaLVDS1SetPowerSeq(ScrnInfoPtr pScrn, Bool ctrlType) +{ + /* Set LVDS1 power sequence type. */ + /* 3X5.91[0] - LVDS1 Hardware or Software Control Power Sequence + * 0: Hardware Control + * 1: Software Control */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, ctrlType ? BIT(0) : 0x00, + BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Power Sequence: %s Control\n", + ctrlType ? "Software" : "Hardware")); +} + +/* + * Sets CX700 or later single chipset's LVDS1 software controlled Vdd. + */ +static inline void +viaLVDS1SetSoftVdd(ScrnInfoPtr pScrn, Bool softOn) +{ + /* Set LVDS1 software controlled Vdd. */ + /* 3X5.91[4] - Software VDD On + * 0: Off + * 1: On */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x91, softOn ? BIT(4) : 0, + BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Software Controlled Vdd: %s\n", + softOn ? "On" : "Off")); +} + +/* + * Sets LVDS1 I/O pad state. + */ +static inline void +viaLVDS1SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState) +{ + /* 3C5.2A[1:0] - LVDS1 I/O Pad Control + * 0x: Pad always off + * 10: Depend on the other control signal + * 11: Pad on/off according to the + * Power Management Status (PMS) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x2A, + ioPadState, BIT(1) | BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 I/O Pad State: %s\n", + ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? + "On" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? + "Conditional" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? + "Off" : + "Off")); +} + +/* + * Sets LVDS1 format. + */ +static inline void +viaLVDS1SetFormat(ScrnInfoPtr pScrn, CARD8 format) +{ + /* 3X5.D2[1] - LVDS Channel 1 Format Selection + * 0: SPWG Mode + * 1: OPENLDI Mode */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD2, + format << 1, BIT(1)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Format: %s\n", + (format & BIT(0)) ? "OPENLDI" : "SPWG")); +} + +/* + * Sets LVDS1 output format (rotation or sequential mode). + */ +static inline void +viaLVDS1SetOutputFormat(ScrnInfoPtr pScrn, CARD8 outputFormat) +{ + /* 3X5.88[6] - LVDS Channel 1 Output Format + * 0: Rotation + * 1: Sequential */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x88, + outputFormat << 6, BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Output Format: %s\n", + (outputFormat & BIT(0)) ? + "Sequential" : "Rotation")); +} + +/* + * Sets LVDS1 output color dithering (18-bit color display vs. + * 24-bit color display). + */ +static inline void +viaLVDS1SetDithering(ScrnInfoPtr pScrn, Bool dithering) +{ + /* 3X5.88[0] - LVDS Channel 1 Output Bits + * 0: 24 bits (dithering off) + * 1: 18 bits (dithering on) */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x88, + dithering ? BIT(0) : 0x00, BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Color Dithering: %s\n", + dithering ? + "On (18 bit color)" : "Off (24 bit color)")); +} + +/* + * Sets LVDS1 sync polarity. + */ +static inline void +viaLVDS1SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity) +{ + /* 3X5.99[6] - LVDS1 VSYNC Polarity + * 0: Positive + * 1: Negative + * 3X5.99[5] - LVDS1 HSYNC Polarity + * 0: Positive + * 1: Negative */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x99, + syncPolarity << 5, BIT(6) | BIT(5)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+")); +} + +/* + * Sets LVDS1 display source. + */ +static inline void +viaLVDS1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3X5.99[4] - LVDS Channel 1 Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x99, + displaySource << 4, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS1 Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Sets LVDS2 power state. + */ +static inline void +viaLVDS2SetPower(ScrnInfoPtr pScrn, Bool powerState) +{ + /* 3X5.D2[6] - Power Down (Active High) for Channel 2 LVDS + * 0: LVDS2 power on + * 1: LVDS2 power down */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD2, + powerState ? 0x00 : BIT(6), BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 Power State: %s\n", + powerState ? "On" : "Off")); +} + +/* + * Sets LVDS2 I/O pad state. + */ +static inline void +viaLVDS2SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState) +{ + /* 3C5.2A[3:2] - LVDS2 I/O Pad Control + * 0x: Pad always off + * 10: Depend on the other control signal + * 11: Pad on/off according to the + * Power Management Status (PMS) */ + ViaSeqMask(VGAHWPTR(pScrn), 0x2A, + ioPadState << 2, BIT(3) | BIT(2)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 I/O Pad State: %s\n", + ((ioPadState & (BIT(1) | BIT(0))) == 0x03) ? + "On" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x02) ? + "Conditional" : + ((ioPadState & (BIT(1) | BIT(0))) == 0x01) ? + "Off" : + "Off")); +} + +/* + * Sets LVDS2 format. + */ +static inline void +viaLVDS2SetFormat(ScrnInfoPtr pScrn, CARD8 format) +{ + /* 3X5.D2[0] - LVDS Channel 2 Format Selection + * 0: SPWG Mode + * 1: OPENLDI Mode */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD2, format, BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 Format: %s\n", + (format & BIT(0)) ? "OPENLDI" : "SPWG")); +} + +/* + * Sets LVDS2 output format (rotation or sequential mode). + */ +static inline void +viaLVDS2SetOutputFormat(ScrnInfoPtr pScrn, CARD8 outputFormat) +{ + /* 3X5.D4[7] - LVDS Channel 2 Output Format + * 0: Rotation + * 1: Sequential */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD4, outputFormat << 7, BIT(7)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 Output Format: %s\n", + (outputFormat & BIT(0)) ? "Sequential" : "Rotation")); +} + +/* + * Sets LVDS2 output color dithering (18-bit color display vs. + * 24-bit color display). + */ +static inline void +viaLVDS2SetDithering(ScrnInfoPtr pScrn, Bool dithering) +{ + /* 3X5.D4[6] - LVDS Channel 2 Output Bits + * 0: 24 bits (dithering off) + * 1: 18 bits (dithering on) */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD4, dithering ? BIT(6) : 0x00, BIT(6)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 Color Dithering: %s\n", + dithering ? "On (18 bit color)" : "Off (24 bit color)")); +} + +/* + * Sets LVDS2 sync polarity. + */ +static inline void +viaLVDS2SetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity) +{ + /* 3X5.97[6] - LVDS2 VSYNC Polarity + * 0: Positive + * 1: Negative + * 3X5.97[5] - LVDS2 HSYNC Polarity + * 0: Positive + * 1: Negative */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x97, + syncPolarity << 5, BIT(6) | BIT(5)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+")); +} + +/* + * Sets LVDS2 display source. + */ +static inline void +viaLVDS2SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* 3X5.97[4] - LVDS Channel 2 Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x97, + displaySource << 4, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "LVDS2 Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Sets CX700 / VX700 and VX800 chipsets' TMDS (DVI) power state. + */ +static inline void +viaTMDSSetPower(ScrnInfoPtr pScrn, Bool powerState) +{ + /* 3X5.D2[3] - Power Down (Active High) for DVI + * 0: TMDS power on + * 1: TMDS power down */ + ViaCrtcMask(VGAHWPTR(pScrn), 0xD2, + powerState ? 0x00 : BIT(3), BIT(3)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "TMDS (DVI) Power State: %s\n", + powerState ? "On" : "Off")); +} + +/* + * Sets CX700 / VX700 and VX800 chipsets' TMDS (DVI) sync polarity. + */ +static inline void +viaTMDSSetSyncPolarity(ScrnInfoPtr pScrn, CARD8 syncPolarity) +{ + /* Set TMDS (DVI) sync polarity. */ + /* 3X5.97[6] - DVI (TMDS) VSYNC Polarity + * 0: Positive + * 1: Negative + * 3X5.97[5] - DVI (TMDS) HSYNC Polarity + * 0: Positive + * 1: Negative */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x97, + syncPolarity << 5, BIT(6) | BIT(5)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "TMDS (DVI) Horizontal Sync Polarity: %s\n", + (syncPolarity & BIT(0)) ? "-" : "+")); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "TMDS (DVI) Vertical Sync Polarity: %s\n", + (syncPolarity & BIT(1)) ? "-" : "+")); +} + +/* + * Sets TMDS (DVI) display source. + */ +static inline void +viaTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource) +{ + /* Set integrated TMDS transmitter display output source. + * The integrated TMDS transmitter appears to utilize LVDS1's data + * source selection bit (3X5.99[4]). */ + /* 3X5.99[4] - LVDS Channel1 Data Source Selection + * 0: Primary Display + * 1: Secondary Display */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x99, + displaySource << 4, BIT(4)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "TMDS (DVI) Display Source: IGA%d\n", + (displaySource & 0x01) + 1)); +} + +/* + * Turn on / off display scaling engine. + */ +static inline void +viaSetDisplayScaling(ScrnInfoPtr pScrn, Bool scalingState) +{ + /* + * 3X5.79[0] - LCD Scaling Enable + * 0: Disable + * 1: Enable + */ + ViaCrtcMask(VGAHWPTR(pScrn), 0x79, + scalingState, BIT(0)); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Display Scaling: %s\n", + scalingState ? "On" : "Off")); +} + /* via_ums.c */ -void viaUnmapMMIO(ScrnInfoPtr pScrn); void viaDisableVQ(ScrnInfoPtr pScrn); -Bool umsAccelInit(ScreenPtr pScreen); -Bool umsCreate(ScrnInfoPtr pScrn); -Bool umsPreInit(ScrnInfoPtr pScrn); -Bool umsCrtcInit(ScrnInfoPtr pScrn); +Bool viaUMSAccelInit(ScrnInfoPtr pScrn); +Bool viaUMSMapIOResources(ScrnInfoPtr pScrn); +void viaUMSDestroy(ScrnInfoPtr pScrn); +Bool viaUMSScreenInit(ScrnInfoPtr pScrn); +Bool viaUMSPreInit(ScrnInfoPtr pScrn); +void viaUMSPreInitExit(ScrnInfoPtr pScrn); +Bool viaUMSCrtcInit(ScrnInfoPtr pScrn); + +/* via_i2c.c */ +void ViaI2CInit(ScrnInfoPtr pScrn); +Bool xf86I2CMaskByte(I2CDevPtr d, I2CByte subaddr, + I2CByte value, I2CByte mask); /* via_output.c */ -void viaDIP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource); -void viaDIP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState); -void viaDIP0SetClockDriveStrength(ScrnInfoPtr pScrn, - CARD8 clockDriveStrength); -void viaDIP0SetDataDriveStrength(ScrnInfoPtr pScrn, - CARD8 dataDriveStrength); -void viaDVP0SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource); -void viaDVP0EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState); -void viaDVP0SetClockDriveStrength(ScrnInfoPtr pScrn, - CARD8 clockDriveStrength); -void viaDVP0SetDataDriveStrength(ScrnInfoPtr pScrn, - CARD8 dataDriveStrength); -void viaDVP1SetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource); -void viaDVP1EnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState); -void viaDVP1SetClockDriveStrength(ScrnInfoPtr pScrn, - CARD8 clockDriveStrength); -void viaDVP1SetDataDriveStrength(ScrnInfoPtr pScrn, - CARD8 dataDriveStrength); -void viaDFPLowSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource); -void viaDFPLowEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState); -void viaOutputDetect(ScrnInfoPtr pScrn); +void viaInitDisplay(ScrnInfoPtr pScrn); CARD32 ViaGetMemoryBandwidth(ScrnInfoPtr pScrn); CARD32 ViaModeDotClockTranslate(ScrnInfoPtr pScrn, DisplayModePtr mode); -void viaProbePinStrapping(ScrnInfoPtr pScrn); void ViaSetPrimaryDotclock(ScrnInfoPtr pScrn, CARD32 clock); void ViaSetSecondaryDotclock(ScrnInfoPtr pScrn, CARD32 clock); void ViaSetUseExternalClock(vgaHWPtr hwp); /* via_display.c */ void viaIGA2DisplayChannel(ScrnInfoPtr pScrn, Bool channelState); -void viaDisplayInit(ScrnInfoPtr pScrn); void ViaGammaDisable(ScrnInfoPtr pScrn); void viaIGAInitCommon(ScrnInfoPtr pScrn); void viaIGA1Init(ScrnInfoPtr pScrn); @@ -260,22 +1593,30 @@ void viaIGA2SetDisplayRegister(ScrnInfoPtr pScrn, DisplayModePtr mode); void viaIGA2Save(ScrnInfoPtr pScrn); void viaIGA2Restore(ScrnInfoPtr pScrn); void ViaShadowCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); +extern const xf86CrtcFuncsRec iga1_crtc_funcs; +extern const xf86CrtcFuncsRec iga2_crtc_funcs; /* via_analog.c */ -void via_analog_init(ScrnInfoPtr pScrn); +void viaAnalogProbe(ScrnInfoPtr pScrn); +void viaAnalogInit(ScrnInfoPtr pScrn); -/* via_lvds.c */ -void viaLVDS1SetIOPadSetting(ScrnInfoPtr pScrn, CARD8 ioPadState); -void via_lvds_init(ScrnInfoPtr pScrn); +/* via_fp.c */ +void viaFPProbe(ScrnInfoPtr pScrn); +void viaFPInit(ScrnInfoPtr pScrn); /* via_tmds.c */ +void viaExtTMDSIOPadState(ScrnInfoPtr pScrn, uint32_t diPort, + Bool ioPadOn); void viaExtTMDSSetDisplaySource(ScrnInfoPtr pScrn, CARD8 displaySource); void viaExtTMDSEnableIOPads(ScrnInfoPtr pScrn, CARD8 ioPadState); void viaExtTMDSSetClockDriveStrength(ScrnInfoPtr pScrn, CARD8 clockDriveStrength); void viaExtTMDSSetDataDriveStrength(ScrnInfoPtr pScrn, CARD8 dataDriveStrength); -void via_dvi_init(ScrnInfoPtr pScrn); +void viaTMDSProbe(ScrnInfoPtr pScrn); +void viaExtTMDSProbe(ScrnInfoPtr pScrn); +void viaTMDSInit(ScrnInfoPtr pScrn); +void viaExtTMDSInit(ScrnInfoPtr pScrn); /*via_tv.c */ #ifdef HAVE_DEBUG @@ -291,4 +1632,4 @@ void ViaVT162xInit(ScrnInfoPtr pScrn); I2CDevPtr ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address); void ViaCH7xxxInit(ScrnInfoPtr pScrn); -#endif /* _VIA_BIOS_H_ */ +#endif /* _VIA_UMS_H_ */ diff --git a/src/via_vt162x.c b/src/via_vt162x.c index 3bcfe18..41f7d78 100644 --- a/src/via_vt162x.c +++ b/src/via_vt162x.c @@ -36,12 +36,12 @@ ViaSetTVClockSource(xf86CrtcPtr crtc) drmmode_crtc_private_ptr iga = crtc->driver_private; ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSetTVClockSource\n")); - switch(pBIOSInfo->TVEncoder) { + switch(pVIADisplay->TVEncoder) { case VIA_VT1625: /* External TV: */ switch(pVia->Chipset) { @@ -80,15 +80,15 @@ ViaSetTVClockSource(xf86CrtcPtr crtc) static void VT162xPrintRegs(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; CARD8 i, buf; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for %s\n", - pBIOSInfo->TVI2CDev->DevName); + pVIADisplay->TVI2CDev->DevName); - for (i = 0; i < pBIOSInfo->TVNumRegs; i++) { - xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &buf); + for (i = 0; i < pVIADisplay->TVNumRegs; i++) { + xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &buf); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, buf); } @@ -99,7 +99,7 @@ VT162xPrintRegs(ScrnInfoPtr pScrn) I2CDevPtr ViaVT162xDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; I2CDevPtr pDev = xf86CreateI2CDevRec(); CARD8 buf; @@ -126,29 +126,29 @@ ViaVT162xDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address) case 0x02: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1621 TV Encoder\n"); - pBIOSInfo->TVEncoder = VIA_VT1621; + pVIADisplay->TVEncoder = VIA_VT1621; pDev->DevName = "VT1621"; break; case 0x03: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1622 TV Encoder\n"); - pBIOSInfo->TVEncoder = VIA_VT1622; + pVIADisplay->TVEncoder = VIA_VT1622; pDev->DevName = "VT1622"; break; case 0x10: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1622A/VT1623 TV Encoder\n"); - pBIOSInfo->TVEncoder = VIA_VT1623; + pVIADisplay->TVEncoder = VIA_VT1623; pDev->DevName = "VT1623"; break; case 0x50: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1625 TV Encoder\n"); - pBIOSInfo->TVEncoder = VIA_VT1625; + pVIADisplay->TVEncoder = VIA_VT1625; pDev->DevName = "VT1625"; break; default: - pBIOSInfo->TVEncoder = VIA_NONETV; + pVIADisplay->TVEncoder = VIA_NONETV; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown TV Encoder found at %s %X.\n", pBus->BusName, Address); @@ -165,25 +165,25 @@ static void VT162xSave(ScrnInfoPtr pScrn) { int i; - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT162xSave\n")); - for (i = 0; i < pBIOSInfo->TVNumRegs; i++) - xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &(pBIOSInfo->TVRegs[i])); + for (i = 0; i < pVIADisplay->TVNumRegs; i++) + xf86I2CReadByte(pVIADisplay->TVI2CDev, i, &(pVIADisplay->TVRegs[i])); } static void VT162xRestore(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT162xRestore\n")); - for (i = 0; i < pBIOSInfo->TVNumRegs; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]); + for (i = 0; i < pVIADisplay->TVNumRegs; i++) + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, pVIADisplay->TVRegs[i]); } @@ -252,35 +252,35 @@ VT1625DACSenseI2C(I2CDevPtr pDev) static Bool VT1621DACSense(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621DACSense\n")); - sense = VT162xDACSenseI2C(pBIOSInfo->TVI2CDev); + sense = VT162xDACSenseI2C(pVIADisplay->TVI2CDev); switch (sense) { case 0x00: - pBIOSInfo->TVOutput = TVOUTPUT_SC; + pVIADisplay->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: S-Video & Composite connected.\n"); return TRUE; case 0x01: - pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: Composite connected.\n"); return TRUE; case 0x02: - pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + pVIADisplay->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: S-Video connected.\n"); return TRUE; case 0x03: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: Nothing connected.\n"); return FALSE; default: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1621: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; @@ -293,45 +293,45 @@ VT1621DACSense(ScrnInfoPtr pScrn) static Bool VT1622DACSense(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622DACSense\n")); - sense = VT162xDACSenseI2C(pBIOSInfo->TVI2CDev); + sense = VT162xDACSenseI2C(pVIADisplay->TVI2CDev); switch (sense) { case 0x00: /* DAC A,B,C,D */ - pBIOSInfo->TVOutput = TVOUTPUT_RGB; + pVIADisplay->TVOutput = TVOUTPUT_RGB; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: RGB connected.\n"); return TRUE; case 0x01: /* DAC A,B,C */ - pBIOSInfo->TVOutput = TVOUTPUT_SC; + pVIADisplay->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video & Composite connected.\n"); return TRUE; case 0x07: /* DAC A */ - pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Composite connected.\n"); return TRUE; case 0x08: /* DAC B,C,D */ - pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; + pVIADisplay->TVOutput = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: YcBcR connected.\n"); return TRUE; case 0x09: /* DAC B,C */ - pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + pVIADisplay->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video connected.\n"); return TRUE; case 0x0F: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Nothing connected.\n"); return FALSE; default: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT162x: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; @@ -344,45 +344,45 @@ VT1622DACSense(ScrnInfoPtr pScrn) static Bool VT1625DACSense(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625DACSense\n")); - sense = VT1625DACSenseI2C(pBIOSInfo->TVI2CDev); + sense = VT1625DACSenseI2C(pVIADisplay->TVI2CDev); switch (sense) { case 0x00: /* DAC A,B,C,D,E,F */ - pBIOSInfo->TVOutput = TVOUTPUT_RGB; + pVIADisplay->TVOutput = TVOUTPUT_RGB; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: RGB connected.\n"); return TRUE; case 0x07: /* DAC A,B,C */ - pBIOSInfo->TVOutput = TVOUTPUT_SC; + pVIADisplay->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: S-Video & Composite connected.\n"); return TRUE; case 0x37: /* DAC C */ - pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; + pVIADisplay->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: Composite connected.\n"); return TRUE; case 0x38: /* DAC D,E,F */ - pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; + pVIADisplay->TVOutput = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: YCbCr connected.\n"); return TRUE; case 0x0F: /* DAC A,B */ - pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; + pVIADisplay->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: S-Video connected.\n"); return TRUE; case 0x3F: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: Nothing connected.\n"); return FALSE; default: - pBIOSInfo->TVOutput = TVOUTPUT_NONE; + pVIADisplay->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1625: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; @@ -392,7 +392,7 @@ VT1625DACSense(ScrnInfoPtr pScrn) static CARD8 VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeIndex\n")); @@ -400,7 +400,7 @@ VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) for (i = 0; VT1621Table[i].Width; i++) { if ((VT1621Table[i].Width == mode->CrtcHDisplay) && (VT1621Table[i].Height == mode->CrtcVDisplay) && - (VT1621Table[i].Standard == pBIOSInfo->TVType) && + (VT1621Table[i].Standard == pVIADisplay->TVType) && !(strcmp(VT1621Table[i].name, mode->name))) return i; } @@ -412,7 +412,7 @@ VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) static ModeStatus VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeValid\n")); @@ -424,12 +424,12 @@ VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) return MODE_BAD; } - if ((pBIOSInfo->TVType == TVTYPE_NTSC) && + if ((pVIADisplay->TVType == TVTYPE_NTSC) && (mode->Private != (void *)&VT162xModePrivateNTSC)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_PAL) && + } else if ((pVIADisplay->TVType == TVTYPE_PAL) && (mode->Private != (void *)&VT162xModePrivatePAL)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); @@ -444,15 +444,15 @@ VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) static CARD8 VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; struct VT162XTableRec *Table; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeIndex\n")); - if (pBIOSInfo->TVEncoder == VIA_VT1622) + if (pVIADisplay->TVEncoder == VIA_VT1622) Table = VT1622Table; - else if (pBIOSInfo->TVEncoder == VIA_VT1625) + else if (pVIADisplay->TVEncoder == VIA_VT1625) Table = VT1625Table; else Table = VT1623Table; @@ -462,12 +462,12 @@ VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) "width=%d:%d, height=%d:%d, std=%d:%d, name=%s:%s.\n", Table[i].Width, mode->CrtcHDisplay, Table[i].Height, mode->CrtcVDisplay, - Table[i].Standard, pBIOSInfo->TVType, + Table[i].Standard, pVIADisplay->TVType, Table[i].name, mode->name); if ((Table[i].Width == mode->CrtcHDisplay) && (Table[i].Height == mode->CrtcVDisplay) && - (Table[i].Standard == pBIOSInfo->TVType) && + (Table[i].Standard == pVIADisplay->TVType) && !strcmp(Table[i].name, mode->name)) return i; } @@ -479,7 +479,7 @@ VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) static ModeStatus VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeValid\n")); @@ -491,12 +491,12 @@ VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) return MODE_BAD; } - if ((pBIOSInfo->TVType == TVTYPE_NTSC) && + if ((pVIADisplay->TVType == TVTYPE_NTSC) && (mode->Private != (void *)&VT162xModePrivateNTSC)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is a PAL mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_PAL) && + } else if ((pVIADisplay->TVType == TVTYPE_PAL) && (mode->Private != (void *)&VT162xModePrivatePAL)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); @@ -511,7 +511,7 @@ VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) static ModeStatus VT1625ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625ModeValid\n")); @@ -527,32 +527,32 @@ VT1625ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) return MODE_BAD; } - if ((pBIOSInfo->TVType == TVTYPE_NTSC) && + if ((pVIADisplay->TVType == TVTYPE_NTSC) && (mode->Private != (void *)&VT162xModePrivateNTSC)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is NTSC. This is an incompatible mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_PAL) && + } else if ((pVIADisplay->TVType == TVTYPE_PAL) && (mode->Private != (void *)&VT162xModePrivatePAL)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is an incompatible mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_480P) && + } else if ((pVIADisplay->TVType == TVTYPE_480P) && (mode->Private != (void *)&VT162xModePrivate480P)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is 480P. This is an incompatible mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_576P) && + } else if ((pVIADisplay->TVType == TVTYPE_576P) && (mode->Private != (void *)&VT162xModePrivate576P)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is 576P. This is an incompatible mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_720P) && + } else if ((pVIADisplay->TVType == TVTYPE_720P) && (mode->Private != (void *)&VT162xModePrivate720P)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is 720P. This is an incompatible mode.\n"); return MODE_BAD; - } else if ((pBIOSInfo->TVType == TVTYPE_1080I) && + } else if ((pVIADisplay->TVType == TVTYPE_1080I) && (mode->Private != (void *)&VT162xModePrivate1080I)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is 1080I. This is an incompatible mode.\n"); @@ -577,45 +577,45 @@ VT162xSetSubCarrier(I2CDevPtr pDev, CARD32 SubCarrier) static void VT1621ModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; struct VT1621TableRec Table = VT1621Table[VT1621ModeIndex(pScrn, mode)]; CARD8 i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeI2C\n")); for (i = 0; i < 0x16; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV[i]); - VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.SubCarrier); + VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.SubCarrier); /* Skip reserved (1A) and version ID (1B). */ - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1C, Table.TV[0x1C]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1C, Table.TV[0x1C]); /* Skip software reset (1D). */ for (i = 0x1E; i < 0x24; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV[i]); /* Write some zeroes? */ - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x24, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x24, 0x00); for (i = 0; i < 0x08; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A + i, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A + i, 0x00); - if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) + if (pVIADisplay->TVOutput == TVOUTPUT_COMPOSITE) for (i = 0; i < 0x10; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x52 + i, Table.TVC[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x52 + i, Table.TVC[i]); else for (i = 0; i < 0x10; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x52 + i, Table.TVS[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x52 + i, Table.TVS[i]); /* Turn on all Composite and S-Video output. */ - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00); - if (pBIOSInfo->TVDotCrawl) { + if (pVIADisplay->TVDotCrawl) { if (Table.DotCrawlSubCarrier) { - xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x11, &i); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x11, i | 0x08); + xf86I2CReadByte(pVIADisplay->TVI2CDev, 0x11, &i); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x11, i | 0x08); - VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.DotCrawlSubCarrier); + VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.DotCrawlSubCarrier); } else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This mode does not currently " "support DotCrawl suppression.\n"); @@ -628,7 +628,7 @@ VT1621ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; struct VT1621TableRec Table = VT1621Table[VT1621ModeIndex(pScrn, mode)]; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeCrtc\n")); @@ -647,7 +647,7 @@ VT1621ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) hwp->writeCrtc(hwp, 0x6B, 0x80); hwp->writeCrtc(hwp, 0x6C, Table.PrimaryCR6C); } - pBIOSInfo->ClockExternal = TRUE; + pVIADisplay->ClockExternal = TRUE; ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); ViaCrtcMask(hwp, 0x6C, 0x01, 0x01); } @@ -658,99 +658,99 @@ VT1621ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) static void VT1622ModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; struct VT162XTableRec Table; CARD8 save, i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeI2C\n")); - if (pBIOSInfo->TVEncoder == VIA_VT1622) + if (pVIADisplay->TVEncoder == VIA_VT1622) Table = VT1622Table[VT1622ModeIndex(pScrn, mode)]; - else if (pBIOSInfo->TVEncoder == VIA_VT1625) + else if (pVIADisplay->TVEncoder == VIA_VT1625) Table = VT1625Table[VT1622ModeIndex(pScrn, mode)]; else /* VT1622A/VT1623 */ Table = VT1623Table[VT1622ModeIndex(pScrn, mode)]; /* TV reset. */ - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x00); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x80); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1D, 0x80); for (i = 0; i < 0x16; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV1[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV1[i]); - VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.SubCarrier); + VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.SubCarrier); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1A, Table.TV1[0x1A]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1A, Table.TV1[0x1A]); /* Skip version ID. */ - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1C, Table.TV1[0x1C]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x1C, Table.TV1[0x1C]); /* Skip software reset. */ for (i = 0x1E; i < 0x30; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV1[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, i, Table.TV1[i]); for (i = 0; i < 0x1B; i++) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A + i, Table.TV2[i]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A + i, Table.TV2[i]); /* Turn on all Composite and S-Video output. */ - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00); - if (pBIOSInfo->TVDotCrawl) { + if (pVIADisplay->TVDotCrawl) { if (Table.DotCrawlSubCarrier) { - xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x11, &save); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x11, save | 0x08); + xf86I2CReadByte(pVIADisplay->TVI2CDev, 0x11, &save); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x11, save | 0x08); - VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.DotCrawlSubCarrier); + VT162xSetSubCarrier(pVIADisplay->TVI2CDev, Table.DotCrawlSubCarrier); } else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This mode does not currently " "support DotCrawl suppression.\n"); } - if (pBIOSInfo->TVOutput == TVOUTPUT_RGB) { - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x2A); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x65, Table.RGB[0]); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x66, Table.RGB[1]); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x67, Table.RGB[2]); + if (pVIADisplay->TVOutput == TVOUTPUT_RGB) { + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x2A); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x65, Table.RGB[0]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x66, Table.RGB[1]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x67, Table.RGB[2]); if (Table.RGB[3]) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x27, Table.RGB[3]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x27, Table.RGB[3]); if (Table.RGB[4]) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x2B, Table.RGB[4]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x2B, Table.RGB[4]); if (Table.RGB[5]) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x2C, Table.RGB[5]); - if (pBIOSInfo->TVEncoder == VIA_VT1625) { - if (pBIOSInfo->TVType < TVTYPE_480P) { - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x12); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x23, 0x7E); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A, 0x85); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4B, 0x0A); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4E, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x2C, Table.RGB[5]); + if (pVIADisplay->TVEncoder == VIA_VT1625) { + if (pVIADisplay->TVType < TVTYPE_480P) { + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x12); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x23, 0x7E); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A, 0x85); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4B, 0x0A); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4E, 0x00); } else { - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x12); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A, 0x85); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4B, 0x0A); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x12); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4A, 0x85); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4B, 0x0A); } } - } else if (pBIOSInfo->TVOutput == TVOUTPUT_YCBCR) { - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x03); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x65, Table.YCbCr[0]); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x66, Table.YCbCr[1]); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x67, Table.YCbCr[2]); - if (pBIOSInfo->TVEncoder == VIA_VT1625) { - if (pBIOSInfo->TVType < TVTYPE_480P) { - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x23, 0x7E); - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4E, 0x00); + } else if (pVIADisplay->TVOutput == TVOUTPUT_YCBCR) { + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x02, 0x03); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x65, Table.YCbCr[0]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x66, Table.YCbCr[1]); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x67, Table.YCbCr[2]); + if (pVIADisplay->TVEncoder == VIA_VT1625) { + if (pVIADisplay->TVType < TVTYPE_480P) { + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x23, 0x7E); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x4E, 0x00); } } } /* Configure flicker filter. */ - xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x03, &save); + xf86I2CReadByte(pVIADisplay->TVI2CDev, 0x03, &save); save &= 0xFC; - if (pBIOSInfo->TVDeflicker == 1) + if (pVIADisplay->TVDeflicker == 1) save |= 0x01; - else if (pBIOSInfo->TVDeflicker == 2) + else if (pVIADisplay->TVDeflicker == 2) save |= 0x02; - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x03, save); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x03, save); } /* @@ -762,14 +762,14 @@ VT1622ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); - VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; struct VT162XTableRec Table; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeCrtc\n")); - if (pBIOSInfo->TVEncoder == VIA_VT1622) + if (pVIADisplay->TVEncoder == VIA_VT1622) Table = VT1622Table[VT1622ModeIndex(pScrn, mode)]; - else if (pBIOSInfo->TVEncoder == VIA_VT1625) + else if (pVIADisplay->TVEncoder == VIA_VT1625) Table = VT1625Table[VT1622ModeIndex(pScrn, mode)]; else /* VT1622A/VT1623 */ Table = VT1623Table[VT1622ModeIndex(pScrn, mode)]; @@ -806,7 +806,7 @@ VT1622ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) hwp->writeCrtc(hwp, 0x6C, Table.PrimaryCR6C); } } - pBIOSInfo->ClockExternal = TRUE; + pVIADisplay->ClockExternal = TRUE; ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); ViaSetTVClockSource(crtc); } @@ -815,102 +815,102 @@ VT1622ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) static void VT1621Power(ScrnInfoPtr pScrn, Bool On) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621Power\n")); if (On) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00); else - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x03); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x03); } static void VT1622Power(ScrnInfoPtr pScrn, Bool On) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622Power\n")); if (On) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00); else - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x0F); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x0F); } static void VT1625Power(ScrnInfoPtr pScrn, Bool On) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625Power\n")); if (On) - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x00); else - xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x3F); + xf86I2CWriteByte(pVIADisplay->TVI2CDev, 0x0E, 0x3F); } void ViaVT162xInit(ScrnInfoPtr pScrn) { - VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; + VIADisplayPtr pVIADisplay = VIAPTR(pScrn)->pVIADisplay; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVT162xInit\n")); - switch (pBIOSInfo->TVEncoder) { + switch (pVIADisplay->TVEncoder) { case VIA_VT1621: - pBIOSInfo->TVSave = VT162xSave; - pBIOSInfo->TVRestore = VT162xRestore; - pBIOSInfo->TVDACSense = VT1621DACSense; - pBIOSInfo->TVModeValid = VT1621ModeValid; - pBIOSInfo->TVModeI2C = VT1621ModeI2C; - pBIOSInfo->TVModeCrtc = VT1621ModeCrtc; - pBIOSInfo->TVPower = VT1621Power; - pBIOSInfo->TVModes = VT1621Modes; - pBIOSInfo->TVNumModes = sizeof(VT1621Modes) / sizeof(DisplayModeRec); - pBIOSInfo->TVPrintRegs = VT162xPrintRegs; - pBIOSInfo->TVNumRegs = 0x68; + pVIADisplay->TVSave = VT162xSave; + pVIADisplay->TVRestore = VT162xRestore; + pVIADisplay->TVDACSense = VT1621DACSense; + pVIADisplay->TVModeValid = VT1621ModeValid; + pVIADisplay->TVModeI2C = VT1621ModeI2C; + pVIADisplay->TVModeCrtc = VT1621ModeCrtc; + pVIADisplay->TVPower = VT1621Power; + pVIADisplay->TVModes = VT1621Modes; + pVIADisplay->TVNumModes = sizeof(VT1621Modes) / sizeof(DisplayModeRec); + pVIADisplay->TVPrintRegs = VT162xPrintRegs; + pVIADisplay->TVNumRegs = 0x68; break; case VIA_VT1622: - pBIOSInfo->TVSave = VT162xSave; - pBIOSInfo->TVRestore = VT162xRestore; - pBIOSInfo->TVDACSense = VT1622DACSense; - pBIOSInfo->TVModeValid = VT1622ModeValid; - pBIOSInfo->TVModeI2C = VT1622ModeI2C; - pBIOSInfo->TVModeCrtc = VT1622ModeCrtc; - pBIOSInfo->TVPower = VT1622Power; - pBIOSInfo->TVModes = VT1622Modes; - pBIOSInfo->TVNumModes = sizeof(VT1622Modes) / sizeof(DisplayModeRec); - pBIOSInfo->TVPrintRegs = VT162xPrintRegs; - pBIOSInfo->TVNumRegs = 0x68; + pVIADisplay->TVSave = VT162xSave; + pVIADisplay->TVRestore = VT162xRestore; + pVIADisplay->TVDACSense = VT1622DACSense; + pVIADisplay->TVModeValid = VT1622ModeValid; + pVIADisplay->TVModeI2C = VT1622ModeI2C; + pVIADisplay->TVModeCrtc = VT1622ModeCrtc; + pVIADisplay->TVPower = VT1622Power; + pVIADisplay->TVModes = VT1622Modes; + pVIADisplay->TVNumModes = sizeof(VT1622Modes) / sizeof(DisplayModeRec); + pVIADisplay->TVPrintRegs = VT162xPrintRegs; + pVIADisplay->TVNumRegs = 0x68; break; case VIA_VT1623: - pBIOSInfo->TVSave = VT162xSave; - pBIOSInfo->TVRestore = VT162xRestore; - pBIOSInfo->TVDACSense = VT1622DACSense; - pBIOSInfo->TVModeValid = VT1622ModeValid; - pBIOSInfo->TVModeI2C = VT1622ModeI2C; - pBIOSInfo->TVModeCrtc = VT1622ModeCrtc; - pBIOSInfo->TVPower = VT1622Power; - pBIOSInfo->TVModes = VT1623Modes; - pBIOSInfo->TVNumModes = sizeof(VT1623Modes) / sizeof(DisplayModeRec); - pBIOSInfo->TVPrintRegs = VT162xPrintRegs; - pBIOSInfo->TVNumRegs = 0x6C; + pVIADisplay->TVSave = VT162xSave; + pVIADisplay->TVRestore = VT162xRestore; + pVIADisplay->TVDACSense = VT1622DACSense; + pVIADisplay->TVModeValid = VT1622ModeValid; + pVIADisplay->TVModeI2C = VT1622ModeI2C; + pVIADisplay->TVModeCrtc = VT1622ModeCrtc; + pVIADisplay->TVPower = VT1622Power; + pVIADisplay->TVModes = VT1623Modes; + pVIADisplay->TVNumModes = sizeof(VT1623Modes) / sizeof(DisplayModeRec); + pVIADisplay->TVPrintRegs = VT162xPrintRegs; + pVIADisplay->TVNumRegs = 0x6C; break; case VIA_VT1625: - pBIOSInfo->TVSave = VT162xSave; - pBIOSInfo->TVRestore = VT162xRestore; - pBIOSInfo->TVDACSense = VT1625DACSense; - pBIOSInfo->TVModeValid = VT1625ModeValid; - pBIOSInfo->TVModeI2C = VT1622ModeI2C; - pBIOSInfo->TVModeCrtc = VT1622ModeCrtc; - pBIOSInfo->TVPower = VT1625Power; - pBIOSInfo->TVModes = VT1625Modes; - pBIOSInfo->TVNumModes = sizeof(VT1625Modes) / sizeof(DisplayModeRec); - pBIOSInfo->TVPrintRegs = VT162xPrintRegs; - pBIOSInfo->TVNumRegs = 0x82; + pVIADisplay->TVSave = VT162xSave; + pVIADisplay->TVRestore = VT162xRestore; + pVIADisplay->TVDACSense = VT1625DACSense; + pVIADisplay->TVModeValid = VT1625ModeValid; + pVIADisplay->TVModeI2C = VT1622ModeI2C; + pVIADisplay->TVModeCrtc = VT1622ModeCrtc; + pVIADisplay->TVPower = VT1625Power; + pVIADisplay->TVModes = VT1625Modes; + pVIADisplay->TVNumModes = sizeof(VT1625Modes) / sizeof(DisplayModeRec); + pVIADisplay->TVPrintRegs = VT162xPrintRegs; + pVIADisplay->TVNumRegs = 0x82; break; default: break; diff --git a/src/via_vt162x.h b/src/via_vt162x.h index f5ae92e..9a1e277 100644 --- a/src/via_vt162x.h +++ b/src/via_vt162x.h @@ -68,7 +68,7 @@ static DisplayModeRec VT1621Modes[] = { }; struct VT1621TableRec { - char * name; + const char* name; CARD16 Width; CARD16 Height; int Standard; @@ -187,7 +187,7 @@ static DisplayModeRec VT1622Modes[] = { }; struct VT162XTableRec { - char * name; + const char* name; CARD16 Width; CARD16 Height; int Standard; diff --git a/src/via_vt1632.c b/src/via_vt1632.c index 1fe58aa..bc1b810 100644 --- a/src/via_vt1632.c +++ b/src/via_vt1632.c @@ -30,6 +30,7 @@ #endif #include "via_driver.h" +#include "via_ums.h" #include "via_vt1632.h" static void @@ -130,17 +131,17 @@ viaVT1632Power(ScrnInfoPtr pScrn, I2CDevPtr pDev, Bool powerState) static void viaVT1632SaveRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev, - viaVT1632RecPtr pVIAVT1632Rec) + viaVT1632RecPtr pVIAVT1632) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaVT1632SaveRegisters.\n")); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Saving VT1632 registers.\n"); - xf86I2CReadByte(pDev, 0x08, &pVIAVT1632Rec->Register08); - xf86I2CReadByte(pDev, 0x09, &pVIAVT1632Rec->Register09); - xf86I2CReadByte(pDev, 0x0A, &pVIAVT1632Rec->Register0A); - xf86I2CReadByte(pDev, 0x0C, &pVIAVT1632Rec->Register0C); + xf86I2CReadByte(pDev, 0x08, &pVIAVT1632->Register08); + xf86I2CReadByte(pDev, 0x09, &pVIAVT1632->Register09); + xf86I2CReadByte(pDev, 0x0A, &pVIAVT1632->Register0A); + xf86I2CReadByte(pDev, 0x0C, &pVIAVT1632->Register0C); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaVT1632SaveRegisters.\n")); @@ -148,17 +149,17 @@ viaVT1632SaveRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev, static void viaVT1632RestoreRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev, - viaVT1632RecPtr pVIAVT1632Rec) + viaVT1632RecPtr pVIAVT1632) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered viaVT1632RestoreRegisters.\n")); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Restoring VT1632 registers.\n")); - xf86I2CWriteByte(pDev, 0x08, pVIAVT1632Rec->Register08); - xf86I2CWriteByte(pDev, 0x09, pVIAVT1632Rec->Register09); - xf86I2CWriteByte(pDev, 0x0A, pVIAVT1632Rec->Register0A); - xf86I2CWriteByte(pDev, 0x0C, pVIAVT1632Rec->Register0C); + xf86I2CWriteByte(pDev, 0x08, pVIAVT1632->Register08); + xf86I2CWriteByte(pDev, 0x09, pVIAVT1632->Register09); + xf86I2CWriteByte(pDev, 0x0A, pVIAVT1632->Register0A); + xf86I2CWriteByte(pDev, 0x0C, pVIAVT1632->Register0C); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaVT1632RestoreRegisters.\n")); @@ -167,25 +168,19 @@ viaVT1632RestoreRegisters(ScrnInfoPtr pScrn, I2CDevPtr pDev, static int viaVT1632CheckModeValidity(xf86OutputPtr output, DisplayModePtr pMode) { - ScrnInfoPtr pScrn = output->scrn; - viaVT1632RecPtr pVIAVT1632Rec = output->driver_private; + viaVT1632RecPtr pVIAVT1632 = output->driver_private; int status = MODE_OK; - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaVT1632CheckModeValidity.\n")); - - if (pMode->Clock < pVIAVT1632Rec->DotclockMin) { + if (pMode->Clock < pVIAVT1632->DotclockMin) { status = MODE_CLOCK_LOW; goto exit; } - if (pMode->Clock > pVIAVT1632Rec->DotclockMax) { + if (pMode->Clock > pVIAVT1632->DotclockMax) { status = MODE_CLOCK_HIGH; } exit: - DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Exiting viaVT1632CheckModeValidity.\n")); return status; } @@ -198,19 +193,21 @@ static void via_vt1632_dpms(xf86OutputPtr output, int mode) { ScrnInfoPtr pScrn = output->scrn; - viaVT1632RecPtr pVIAVT1632Rec = output->driver_private; + viaVT1632RecPtr pVIAVT1632 = output->driver_private; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_dpms.\n")); switch (mode) { case DPMSModeOn: - viaVT1632Power(pScrn, pVIAVT1632Rec->VT1632I2CDev, TRUE); + viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, TRUE); + viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, TRUE); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: - viaVT1632Power(pScrn, pVIAVT1632Rec->VT1632I2CDev, FALSE); + viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, FALSE); + viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, FALSE); break; default: break; @@ -224,12 +221,12 @@ static void via_vt1632_save(xf86OutputPtr output) { ScrnInfoPtr pScrn = output->scrn; - viaVT1632RecPtr pVIAVT1632Rec = output->driver_private; + viaVT1632RecPtr pVIAVT1632 = output->driver_private; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_save.\n")); - viaVT1632SaveRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev, pVIAVT1632Rec); + viaVT1632SaveRegisters(pScrn, pVIAVT1632->VT1632I2CDev, pVIAVT1632); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_save.\n")); @@ -239,13 +236,13 @@ static void via_vt1632_restore(xf86OutputPtr output) { ScrnInfoPtr pScrn = output->scrn; - viaVT1632RecPtr pVIAVT1632Rec = output->driver_private; + viaVT1632RecPtr pVIAVT1632 = output->driver_private; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_restore.\n")); - viaVT1632RestoreRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev, - pVIAVT1632Rec); + viaVT1632RestoreRegisters(pScrn, pVIAVT1632->VT1632I2CDev, + pVIAVT1632); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_restore.\n")); @@ -267,11 +264,33 @@ via_vt1632_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, static void via_vt1632_prepare(xf86OutputPtr output) { + ScrnInfoPtr pScrn = output->scrn; + viaVT1632RecPtr pVIAVT1632 = output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, FALSE); + viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, FALSE); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); } static void via_vt1632_commit(xf86OutputPtr output) { + ScrnInfoPtr pScrn = output->scrn; + viaVT1632RecPtr pVIAVT1632 = output->driver_private; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + viaVT1632Power(pScrn, pVIAVT1632->VT1632I2CDev, TRUE); + viaExtTMDSIOPadState(pScrn, pVIAVT1632->diPort, TRUE); + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); } static void @@ -280,7 +299,7 @@ via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode, { ScrnInfoPtr pScrn = output->scrn; drmmode_crtc_private_ptr iga = output->crtc->driver_private; - viaVT1632RecPtr pVIAVT1632Rec = output->driver_private; + viaVT1632RecPtr pVIAVT1632 = output->driver_private; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_mode_set.\n")); @@ -290,9 +309,9 @@ via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode, viaExtTMDSSetDataDriveStrength(pScrn, 0x03); viaExtTMDSEnableIOPads(pScrn, 0x03); - viaVT1632DumpRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev); - viaVT1632InitRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev); - viaVT1632DumpRegisters(pScrn, pVIAVT1632Rec->VT1632I2CDev); + viaVT1632DumpRegisters(pScrn, pVIAVT1632->VT1632I2CDev); + viaVT1632InitRegisters(pScrn, pVIAVT1632->VT1632I2CDev); + viaVT1632DumpRegisters(pScrn, pVIAVT1632->VT1632I2CDev); viaExtTMDSSetDisplaySource(pScrn, iga->index ? 0x01 : 0x00); } @@ -304,25 +323,63 @@ via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode, static xf86OutputStatus via_vt1632_detect(xf86OutputPtr output) { - xf86MonPtr mon; + ScrnInfoPtr pScrn = output->scrn; xf86OutputStatus status = XF86OutputStatusDisconnected; + viaVT1632RecPtr pVIAVT1632 = (viaVT1632RecPtr) output->driver_private; + Bool connectorDetected; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered via_vt1632_detect.\n")); + + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Probing for a DVI connector . . .\n"); + + connectorDetected = viaVT1632Sense(pScrn, pVIAVT1632->VT1632I2CDev); + if (!connectorDetected) { + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "DVI connector not detected.\n"); + goto exit; + } + + status = XF86OutputStatusConnected; + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "DVI connector detected.\n"); + +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting via_vt1632_detect.\n")); + return status; +} + +static DisplayModePtr +via_vt1632_get_modes(xf86OutputPtr output) +{ ScrnInfoPtr pScrn = output->scrn; - viaVT1632RecPtr pVIAVT1632Rec = output->driver_private; + xf86MonPtr pMon; + DisplayModePtr pDisplay_Mode = NULL; + I2CBusPtr pI2CBus; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + viaVT1632RecPtr pVIAVT1632 = (viaVT1632RecPtr) output->driver_private; - /* Check for the DVI presence via VT1632 first before accessing - * I2C bus. */ - if (viaVT1632Sense(pScrn, pVIAVT1632Rec->VT1632I2CDev)) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered %s.\n", __func__)); + + if (pVIAVT1632->i2cBus & VIA_I2C_BUS2) { + pI2CBus = pVIADisplay->pI2CBus2; + } else if (pVIAVT1632->i2cBus & VIA_I2C_BUS3) { + pI2CBus = pVIADisplay->pI2CBus3; + } else { + pI2CBus = NULL; + } - /* Since DVI presence was established, access the I2C bus - * assigned to DVI. */ - mon = xf86OutputGetEDID(output, pVIAVT1632Rec->VT1632I2CDev->pI2CBus); + if (pI2CBus) { + pMon = xf86OutputGetEDID(output, pI2CBus); /* Is the interface type digital? */ - if (mon && DIGITAL(mon->features.input_type)) { - status = XF86OutputStatusConnected; - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Detected a monitor connected to DVI.\n"); - xf86OutputSetEDID(output, mon); + if (pMon && DIGITAL(pMon->features.input_type)) { + xf86OutputSetEDID(output, pMon); + pDisplay_Mode = xf86OutputGetEDIDModes(output); } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Could not obtain EDID from a monitor " @@ -330,7 +387,9 @@ via_vt1632_detect(xf86OutputPtr output) } } - return status; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting %s.\n", __func__)); + return pDisplay_Mode; } #ifdef RANDR_12_INTERFACE @@ -364,7 +423,7 @@ const xf86OutputFuncsRec via_vt1632_funcs = { .commit = via_vt1632_commit, .mode_set = via_vt1632_mode_set, .detect = via_vt1632_detect, - .get_modes = xf86OutputGetEDIDModes, + .get_modes = via_vt1632_get_modes, #ifdef RANDR_12_INTERFACE .set_property = via_vt1632_set_property, #endif @@ -375,31 +434,34 @@ const xf86OutputFuncsRec via_vt1632_funcs = { }; Bool -viaVT1632Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) +viaVT1632Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) { - xf86OutputPtr output; - VIAPtr pVia = VIAPTR(pScrn); - viaVT1632RecPtr pVIAVT1632Rec = NULL; I2CDevPtr pI2CDevice = NULL; - I2CSlaveAddr i2cAddr = 0x10; - CARD8 buf; + I2CSlaveAddr i2cAddr = VIA_VT1632_I2C_ADDR; + CARD8 i2cData; CARD16 vendorID, deviceID; Bool status = FALSE; - char outputNameBuffer[32]; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Entered viaVT1632Init.\n")); + "Entered viaVT1632Probe.\n")); + + if (!pI2CBus) { + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "Invalid I2C bus.\n")); + goto exit; + } if (!xf86I2CProbeAddress(pI2CBus, i2cAddr)) { - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "I2C device not found.\n"); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "I2C bus device not found.\n")); goto exit; } pI2CDevice = xf86CreateI2CDevRec(); if (!pI2CDevice) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to create an I2C bus device record.\n"); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to create an I2C bus device " + "record.\n")); goto exit; } @@ -407,89 +469,148 @@ viaVT1632Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus) pI2CDevice->SlaveAddr = i2cAddr; pI2CDevice->pI2CBus = pI2CBus; if (!xf86I2CDevInit(pI2CDevice)) { - xf86DestroyI2CDevRec(pI2CDevice, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to initialize a device on I2C bus.\n"); - goto exit; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to initialize a device on " + "I2C bus.\n")); + goto free_dev_rec; } - xf86I2CReadByte(pI2CDevice, 0, &buf); - vendorID = buf; - xf86I2CReadByte(pI2CDevice, 1, &buf); - vendorID |= buf << 8; + xf86I2CReadByte(pI2CDevice, 0, &i2cData); + vendorID = i2cData; + xf86I2CReadByte(pI2CDevice, 1, &i2cData); + vendorID |= i2cData << 8; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vendor ID: 0x%04x\n", vendorID)); - xf86I2CReadByte(pI2CDevice, 2, &buf); - deviceID = buf; - xf86I2CReadByte(pI2CDevice, 3, &buf); - deviceID |= buf << 8; + xf86I2CReadByte(pI2CDevice, 2, &i2cData); + deviceID = i2cData; + xf86I2CReadByte(pI2CDevice, 3, &i2cData); + deviceID |= i2cData << 8; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Device ID: 0x%04x\n", deviceID)); if ((vendorID != 0x1106) || (deviceID != 0x3192)) { - xf86DestroyI2CDevRec(pI2CDevice, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "VT1632 external TMDS transmitter not detected.\n"); - goto exit; + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, + "VT1632 external TMDS transmitter not " + "detected.\n")); + goto free_dev_rec; } + status = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1632 external TMDS transmitter detected.\n"); +free_dev_rec: + xf86DestroyI2CDevRec(pI2CDevice, TRUE); +exit: + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Exiting viaVT1632Probe.\n")); + return status; +} - pVIAVT1632Rec = xnfcalloc(1, sizeof(viaVT1632Rec)); - if (!pVIAVT1632Rec) { - xf86DestroyI2CDevRec(pI2CDevice, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate working storage for VT1632.\n"); +void +viaVT1632Init(ScrnInfoPtr pScrn) +{ + xf86OutputPtr output; + VIAPtr pVia = VIAPTR(pScrn); + VIADisplayPtr pVIADisplay = pVia->pVIADisplay; + viaVT1632RecPtr pVIAVT1632; + I2CBusPtr pI2CBus; + I2CDevPtr pI2CDevice; + I2CSlaveAddr i2cAddr = VIA_VT1632_I2C_ADDR; + CARD8 i2cData; + char outputNameBuffer[32]; + + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Entered viaVT1632Init.\n")); + + if ((!(pVIADisplay->extTMDSPresence)) || (pVIADisplay->extTMDSTransmitter != VIA_TMDS_VT1632)) { goto exit; } - // Remembering which I2C bus is used for VT1632. - pVIAVT1632Rec->VT1632I2CDev = pI2CDevice; + if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS2) { + pI2CBus = pVIADisplay->pI2CBus2; + } else if (pVIADisplay->extTMDSI2CBus & VIA_I2C_BUS3) { + pI2CBus = pVIADisplay->pI2CBus3; + } else { + goto exit; + } - xf86I2CReadByte(pI2CDevice, 0x06, &buf); - pVIAVT1632Rec->DotclockMin = buf * 1000; + pI2CDevice = xf86CreateI2CDevRec(); + if (!pI2CDevice) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to create an I2C bus device record.\n"); + goto exit; + } - xf86I2CReadByte(pI2CDevice, 0x07, &buf); - pVIAVT1632Rec->DotclockMax = (buf + 65) * 1000; + pI2CDevice->DevName = "VT1632"; + pI2CDevice->SlaveAddr = i2cAddr; + pI2CDevice->pI2CBus = pI2CBus; + if (!xf86I2CDevInit(pI2CDevice)) { + xf86DestroyI2CDevRec(pI2CDevice, TRUE); + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to initialize a device on I2C bus.\n"); + goto exit; + } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported VT1632 Dot Clock Range: " - "%d to %d MHz\n", - pVIAVT1632Rec->DotclockMin / 1000, - pVIAVT1632Rec->DotclockMax / 1000); + pVIAVT1632 = (viaVT1632RecPtr) xnfcalloc(1, sizeof(viaVT1632Rec)); + if (!pVIAVT1632) { + xf86DestroyI2CDevRec(pI2CDevice, TRUE); + DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate storage for " + "VT1632.\n")); + goto exit; + } - /* The code to dynamically designate the particular DVI (i.e., DVI-1, + /* The code to dynamically designate a particular DVI (i.e., DVI-1, * DVI-2, etc.) for xrandr was borrowed from xf86-video-r128 DDX. */ - sprintf(outputNameBuffer, "DVI-%d", (pVia->numberDVI + 1)); + sprintf(outputNameBuffer, "DVI-%d", (pVIADisplay->numberDVI + 1)); output = xf86OutputCreate(pScrn, &via_vt1632_funcs, outputNameBuffer); if (!output) { - free(pVIAVT1632Rec); + free(pVIAVT1632); xf86DestroyI2CDevRec(pI2CDevice, TRUE); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate X Server display output record for " - "VT1632.\n"); + "Failed to create X Server display output " + "for VT1632.\n"); goto exit; } - output->driver_private = pVIAVT1632Rec; + /* Increment the number of DVI connectors. */ + pVIADisplay->numberDVI++; + + // Remembering which I2C bus is used for VT1632. + pVIAVT1632->VT1632I2CDev = pI2CDevice; + + pVIAVT1632->diPort = pVIADisplay->extTMDSDIPort; + + /* Hint about which I2C bus to access for obtaining EDID. */ + pVIAVT1632->i2cBus = pVIADisplay->extTMDSI2CBus; + + pVIAVT1632->transmitter = pVIADisplay->extTMDSTransmitter; + + xf86I2CReadByte(pI2CDevice, 0x06, &i2cData); + pVIAVT1632->DotclockMin = i2cData * 1000; + + xf86I2CReadByte(pI2CDevice, 0x07, &i2cData); + pVIAVT1632->DotclockMax = (i2cData + 65) * 1000; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Supported VT1632 Dot Clock Range: " + "%d to %d MHz\n", + pVIAVT1632->DotclockMin / 1000, + pVIAVT1632->DotclockMax / 1000); + + output->driver_private = pVIAVT1632; /* Since there are two (2) display controllers registered with the * X.Org Server and both IGA1 and IGA2 can handle DVI without any * limitations, possible_crtcs should be set to 0x3 (0b11) so that * either display controller can get assigned to handle DVI. */ - output->possible_crtcs = (1 << 1) | (1 << 0); + output->possible_crtcs = BIT(1) | BIT(0); output->possible_clones = 0; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; - viaVT1632DumpRegisters(pScrn, pI2CDevice); - - pVia->numberDVI++; - status = TRUE; exit: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting viaVT1632Init.\n")); - return status; } diff --git a/src/via_vt1632.h b/src/via_vt1632.h index 41df77f..61dada1 100644 --- a/src/via_vt1632.h +++ b/src/via_vt1632.h @@ -25,6 +25,8 @@ #ifndef _VIA_VT1632_H_ #define _VIA_VT1632_H_ 1 +#define VIA_VT1632_I2C_ADDR 0x10 + #define VIA_VT1632_VEN 0x20 #define VIA_VT1632_HEN 0x10 #define VIA_VT1632_DSEL 0x08 @@ -32,20 +34,26 @@ #define VIA_VT1632_EDGE 0x02 #define VIA_VT1632_PDB 0x01 -typedef struct _viaVT1632Rec { - I2CDevPtr VT1632I2CDev; +typedef struct _VIAVT1632 { + I2CDevPtr VT1632I2CDev; + + uint32_t diPort; + CARD8 i2cBus; + CARD8 transmitter; + + int DotclockMin; + int DotclockMax; - int DotclockMin; - int DotclockMax; - CARD8 Register08; - CARD8 Register09; - CARD8 Register0A; - CARD8 Register0C; + CARD8 Register08; + CARD8 Register09; + CARD8 Register0A; + CARD8 Register0C; } viaVT1632Rec, *viaVT1632RecPtr; -const xf86OutputFuncsRec via_vt1632_funcs; +extern const xf86OutputFuncsRec via_vt1632_funcs; -Bool viaVT1632Init(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus); +Bool viaVT1632Probe(ScrnInfoPtr pScrn, I2CBusPtr pI2CBus); +void viaVT1632Init(ScrnInfoPtr pScrn); #endif /* _VIA_VT1632_H_ */ diff --git a/src/via_xv.c b/src/via_xv.c index adc9af2..8d2823a 100644 --- a/src/via_xv.c +++ b/src/via_xv.c @@ -107,10 +107,6 @@ static int viaSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer); static int viaPutImage(ScrnInfoPtr, short, short, short, short, short, short, short, short, int, unsigned char *, short, short, Bool, RegionPtr, pointer, DrawablePtr); -static void UVBlit(unsigned char *dest, - const unsigned char *uBuffer, - const unsigned char *vBuffer, - unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines); static void nv12Blit(unsigned char *nv12Chroma, const unsigned char *uBuffer, const unsigned char *vBuffer, @@ -143,13 +139,21 @@ static XF86VideoFormatRec FormatsG[NUM_FORMATS_G] = { #define NUM_ATTRIBUTES_G 6 +static char attributeXvColorkey[] = { "XV_COLORKEY" }; +static char attributeXvBrightness[] = { "XV_BRIGHTNESS" }; +static char attributeXvContrast[] = { "XV_CONTRAST" }; +static char attributeXvSaturation[] = { "XV_SATURATION" }; +static char attributeXvHue[] = { "XV_HUE" }; +static char attributeXvAutopaintColorkey[] = + { "XV_AUTOPAINT_COLORKEY" }; + static XF86AttributeRec AttributesG[NUM_ATTRIBUTES_G] = { - {XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"}, - {XvSettable | XvGettable, 0, 10000, "XV_BRIGHTNESS"}, - {XvSettable | XvGettable, 0, 20000, "XV_CONTRAST"}, - {XvSettable | XvGettable, 0, 20000, "XV_SATURATION"}, - {XvSettable | XvGettable, -180, 180, "XV_HUE"}, - {XvSettable | XvGettable, 0, 1, "XV_AUTOPAINT_COLORKEY"} + {XvSettable | XvGettable, 0, (1 << 24) - 1, attributeXvColorkey}, + {XvSettable | XvGettable, 0, 10000, attributeXvBrightness}, + {XvSettable | XvGettable, 0, 20000, attributeXvContrast}, + {XvSettable | XvGettable, 0, 20000, attributeXvSaturation}, + {XvSettable | XvGettable, -180, 180, attributeXvHue}, + {XvSettable | XvGettable, 0, 1, attributeXvAutopaintColorkey} }; #define NUM_IMAGES_G 7 @@ -239,7 +243,7 @@ static XF86ImageRec ImagesG[NUM_IMAGES_G] = { }; -static char *XvAdaptorName[XV_ADAPT_NUM] = { +static const char *XvAdaptorName[XV_ADAPT_NUM] = { "XV_SWOV" }; @@ -678,7 +682,7 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); int i, j, usedPorts, numPorts; - viaPortPrivRec *viaPortPriv; + viaPortPrivPtr pPriv; DevUnion *pdevUnion; DBG_DD(ErrorF(" via_xv.c : viaSetupAdaptors (viaSetupImageVideo): \n")); @@ -698,7 +702,7 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors) return 0; numPorts = numAdaptPort[i]; - viaPortPriv = + pPriv = (viaPortPrivPtr) xnfcalloc(numPorts, sizeof(viaPortPrivRec)); pdevUnion = (DevUnion *) xnfcalloc(numPorts, sizeof(DevUnion)); @@ -721,7 +725,7 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors) /* The adapter can handle 1 port simultaneously */ viaAdaptPtr[i]->nPorts = numPorts; viaAdaptPtr[i]->pPortPrivates = pdevUnion; - viaAdaptPtr[i]->pPortPrivates->ptr = (pointer) viaPortPriv; + viaAdaptPtr[i]->pPortPrivates->ptr = (pointer) pPriv; viaAdaptPtr[i]->nAttributes = NUM_ATTRIBUTES_G; viaAdaptPtr[i]->pAttributes = AttributesG; @@ -736,23 +740,23 @@ viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors) viaAdaptPtr[i]->ReputImage = NULL; viaAdaptPtr[i]->QueryImageAttributes = viaQueryImageAttributes; for (j = 0; j < numPorts; ++j) { - viaPortPriv[j].dmaBounceBuffer = NULL; - viaPortPriv[j].dmaBounceStride = 0; - viaPortPriv[j].dmaBounceLines = 0; - viaPortPriv[j].colorKey = 0x0821; - viaPortPriv[j].autoPaint = TRUE; - viaPortPriv[j].brightness = 5000.; - viaPortPriv[j].saturation = 10000; - viaPortPriv[j].contrast = 10000; - viaPortPriv[j].hue = 0; - viaPortPriv[j].FourCC = 0; - viaPortPriv[j].xv_portnum = j + usedPorts; - viaPortPriv[j].xvErr = xve_none; + pPriv[j].dmaBounceBuffer = NULL; + pPriv[j].dmaBounceStride = 0; + pPriv[j].dmaBounceLines = 0; + pPriv[j].colorKey = 0x0821; + pPriv[j].autoPaint = TRUE; + pPriv[j].brightness = 5000.; + pPriv[j].saturation = 10000; + pPriv[j].contrast = 10000; + pPriv[j].hue = 0; + pPriv[j].FourCC = 0; + pPriv[j].xv_portnum = j + usedPorts; + pPriv[j].xvErr = xve_none; #ifdef X_USE_REGION_NULL - REGION_NULL(pScreen, &viaPortPriv[j].clip); + REGION_NULL(pScreen, &pPriv[j].clip); #else - REGION_INIT(pScreen, &viaPortPriv[j].clip, NullBox, 1); + REGION_INIT(pScreen, &pPriv[j].clip, NullBox, 1); #endif } usedPorts += j; @@ -959,28 +963,6 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, } } -static void -planar420cp(unsigned char *dst, const unsigned char *src, int dstPitch, - int w, int h, int i420) -{ - unsigned long srcUOffset, srcVOffset; - - /* - * Blit luma component as a fake YUY2 assembler blit. - */ - if (i420) { - srcVOffset = w * h + (w >> 1) * (h >> 1); - srcUOffset = w * h; - } else { - srcUOffset = w * h + (w >> 1) * (h >> 1); - srcVOffset = w * h; - } - - (*viaFastVidCpy) (dst, src, dstPitch, w >> 1, h, 1); - UVBlit(dst + dstPitch * h, src + srcUOffset, - src + srcVOffset, w >> 1, w >> 1, dstPitch, h >> 1); -} - /* * Slow and dirty. NV12 blit. */ @@ -1017,7 +999,6 @@ viaDmaBlitImage(VIAPtr pVia, Bool bounceBuffer; drm_via_dmablit_t blit; drm_via_blitsync_t *chromaSync = &blit.sync; - drm_via_blitsync_t lumaSync; unsigned char *base; unsigned char *bounceBase; unsigned bounceStride; @@ -1097,8 +1078,6 @@ viaDmaBlitImage(VIAPtr pVia, if (err < 0) return -1; - lumaSync = blit.sync; - if (id == FOURCC_YV12 || id == FOURCC_I420) { unsigned tmp = ALIGN_TO(width >> 1, 16); @@ -1496,35 +1475,6 @@ VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y) pVia->swov.panning_y = y; } -/* - * Blit the U and V Fields. Used to Flip the U V for I420. - */ - -static void -UVBlit(unsigned char *dst, - const unsigned char *uBuffer, - const unsigned char *vBuffer, - unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines) -{ - int i, j; - - dstPitch >>= 1; - - for(j = 0; j < lines; j++) - { - for(i = 0; i < width; i++) - { - dst[i] = (uBuffer[i] << 8) | (vBuffer[i] << 16); - } - - dst += dstPitch; - uBuffer += srcPitch; - vBuffer += srcPitch; - } - -} - - /* * Blit the chroma field from one buffer to another while at the same time converting from * YV12 to NV12. diff --git a/src/via_xv_overlay.c b/src/via_xv_overlay.c index b65a688..776a79e 100644 --- a/src/via_xv_overlay.c +++ b/src/via_xv_overlay.c @@ -123,10 +123,10 @@ viaWaitHQVFlip(VIAPtr pVia) static void viaWaitHQVFlipClear(VIAPtr pVia, unsigned long dwData) { + unsigned count = 50000; CARD32 volatile *pdwState = (CARD32 volatile *)(pVia->MapBase + HQV_CONTROL); *pdwState = dwData; - unsigned count = 50000; while (--count && (*pdwState & HQV_FLIP_STATUS)) { VIASETREG(HQV_CONTROL, *pdwState | HQV_FLIP_STATUS); @@ -683,7 +683,7 @@ viaOverlayHQVCalcZoomHeight(VIAPtr pVia, HQV_V_TAP8_12221, HQV_V_TAP8_12221 }; /* CARD32 HQVmini[5] = { 0, 0x0c000000, 0x0a000000, 0x09000000, 0x08800000 }; */ - /*if (pVia->pBIOSInfo->scaleY) + /*if (pVia->pVIADisplay->scaleY) * { * dstHeight = dstHeight + 1; * } */ @@ -1126,7 +1126,7 @@ ViaYUVFillBlack(VIAPtr pVia, void *buf, int num) static long AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc) { - unsigned int i, width, height, pitch, fbsize, addr; + unsigned int i, height, pitch, fbsize, addr; BOOL isplanar; void *buf; @@ -1142,7 +1142,6 @@ AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc) isplanar = ((fourcc == FOURCC_YV12) || (fourcc == FOURCC_I420) || (fourcc == FOURCC_XVMC)); - width = pVia->swov.SWDevice.gdwSWSrcWidth; height = pVia->swov.SWDevice.gdwSWSrcHeight; pitch = pVia->swov.SWDevice.dwPitch; fbsize = pitch * height * (isplanar ? 2 : 1); @@ -1211,7 +1210,8 @@ CreateSurface(ScrnInfoPtr pScrn, CARD32 FourCC, CARD16 Width, pVia->swov.SWDevice.dwSWPhysicalAddr[0] = addr; pVia->swov.SWDevice.dwSWPhysicalAddr[1] = addr + fbsize; pVia->swov.SWDevice.lpSWOverlaySurface[0] = buf; - pVia->swov.SWDevice.lpSWOverlaySurface[1] = buf + fbsize; + pVia->swov.SWDevice.lpSWOverlaySurface[1] = + (unsigned char*)buf + fbsize; if (isplanar) { pVia->swov.SWDevice.dwSWCrPhysicalAddr[0] = @@ -1751,10 +1751,10 @@ SetVideoWindow(ScrnInfoPtr pScrn, unsigned long videoFlag, * So, we need to adjust the Y top and bottom position. * if (videoFlag & VIDEO_1_INUSE) { - if (pBIOSInfo->SetDVI && pBIOSInfo->scaleY) { - top = (pUpdate->DstTop * pBIOSInfo->Panel->NativeMode->Height + if (pVIADisplay->SetDVI && pVIADisplay->scaleY) { + top = (pUpdate->DstTop * pVIADisplay->Panel->NativeMode->Height / pScrn->currentMode->VDisplay); - bottom = (pUpdate->DstBottom * pBIOSInfo->Panel->NativeMode->Height + bottom = (pUpdate->DstBottom * pVIADisplay->Panel->NativeMode->Height / pScrn->currentMode->VDisplay); } }*/ @@ -1830,10 +1830,10 @@ Upd_Video(xf86CrtcPtr crtc, unsigned long videoFlag, pUpdate->DstTop, pUpdate->DstBottom)); dstWidth = pUpdate->DstRight - pUpdate->DstLeft; - /*if (pBIOSInfo->lvds && pBIOSInfo->lvds->status == XF86OutputStatusConnected && - pBIOSInfo->Panel->Scale) { + /*if (pVIADisplay->lvds && pVIADisplay->lvds->status == XF86OutputStatusConnected && + pVIADisplay->Panel->Scale) { * FIXME: We need to determine if the panel is using V1 or V3 * - float hfactor = (float)pBIOSInfo->Panel->NativeMode->Width + float hfactor = (float)pVIADisplay->Panel->NativeMode->Width / pScrn->currentMode->HDisplay; dstWidth *= hfactor; }*/ diff --git a/src/via_xvmc.c b/src/via_xvmc.c index 8882947..56b2602 100644 --- a/src/via_xvmc.c +++ b/src/via_xvmc.c @@ -69,7 +69,8 @@ * to be added here to be supported also by XvMC. * Currently, only colorkey seems to be supported by Xv for Putimage. */ -static char *attrXvMC[VIA_NUM_XVMC_ATTRIBUTES] = { "XV_COLORKEY", +static const char *attrXvMC[VIA_NUM_XVMC_ATTRIBUTES] = { + "XV_COLORKEY", "XV_AUTOPAINT_COLORKEY", "XV_BRIGHTNESS", "XV_CONTRAST", @@ -342,7 +343,8 @@ ViaInitXVMC(ScreenPtr pScreen) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] Kernel drm version is %d.%d.%d; " "at least version 2.4.0 is needed.\n", - pVia->drmVerMajor, pVia->drmVerMinor, pVia->drmVerPL); + pVia->drmVerMajor, pVia->drmVerMinor, + pVia->drmVerPatchLevel); xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] Please update. Disabling XvMC.\n"); return; @@ -502,7 +504,7 @@ ViaXvMCCreateContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext, contextRec->chipId = pVia->ChipId; contextRec->screen = pScrn->scrnIndex; contextRec->depth = pScrn->bitsPerPixel; - contextRec->stride = pVia->Bpp * pScrn->virtualX; + contextRec->stride = pScrn->virtualX * (pScrn->bitsPerPixel >> 3); vXvMC->nContexts++; vXvMC->contexts[ctxNo] = pContext->context_id; @@ -602,8 +604,8 @@ ViaXvMCCreateSurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, yBufSize = stride(ctx->width) * ctx->height; for (i = 0; i < numBuffers; ++i) { memset(buf, 0, yBufSize); - memset(buf + yBufSize, 0x80, yBufSize >> 1); - buf += bufSize; + memset((unsigned char*)buf + yBufSize, 0x80, yBufSize >> 1); + buf = (unsigned char*)buf + bufSize; } drm_bo_unmap(pScrn, sPriv->memory_ref); @@ -683,7 +685,6 @@ ViaXvMCDestroyContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext) VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); int i; - volatile ViaXvMCSAreaPriv *sAPriv; viaPortPrivPtr pPriv; XvPortRecPrivatePtr portPriv; ViaXvMCXVPriv *vx; @@ -691,7 +692,6 @@ ViaXvMCDestroyContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext) for (i = 0; i < VIA_XVMC_MAX_CONTEXTS; i++) { if (vXvMC->contexts[i] == pContext->context_id) { - sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); portPriv = (XvPortRecPrivatePtr) pContext->port_priv; pPriv = (viaPortPrivPtr) portPriv->DevPriv.ptr; vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; diff --git a/src/via_xvpriv.h b/src/via_xvpriv.h index b6c796b..8f0c9a0 100644 --- a/src/via_xvpriv.h +++ b/src/via_xvpriv.h @@ -84,7 +84,6 @@ typedef struct } viaPortPrivRec, *viaPortPrivPtr; -extern viaPortPrivPtr viaPortPriv[]; extern unsigned viaNumXvPorts; #endif /* _VIA_XVPRIV_H_ */ diff --git a/src/xvmc/viaXvMC.c b/src/xvmc/viaXvMC.c index edd2c6f..931591c 100644 --- a/src/xvmc/viaXvMC.c +++ b/src/xvmc/viaXvMC.c @@ -1086,7 +1086,6 @@ XvMCSyncSurface(Display * display, XvMCSurface * surface) ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (pViaSurface->needsSync) { - CARD32 timeStamp = pViaSurface->timeStamp; int syncMode = pViaSurface->syncMode; if (pViaXvMC->useAGP) { @@ -1094,9 +1093,6 @@ XvMCSyncSurface(Display * display, XvMCSurface * surface) syncMode = (pViaSurface->syncMode == LL_MODE_2D || pViaSurface->timeStamp < pViaXvMC->timeStamp) ? LL_MODE_2D : LL_MODE_DECODER_IDLE; - if (pViaSurface->syncMode != LL_MODE_2D) - timeStamp = pViaXvMC->timeStamp; - } else if (syncMode != LL_MODE_2D && pViaXvMC->rendSurf[0] != (pViaSurface->srfNo | VIA_XVMC_VALID)) { diff --git a/src/xvmc/xf86dristr.h b/src/xvmc/xf86dristr.h index 3b43438..c466564 100644 --- a/src/xvmc/xf86dristr.h +++ b/src/xvmc/xf86dristr.h @@ -59,7 +59,7 @@ typedef struct _XF86DRIQueryVersion { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIQueryVersion */ - CARD16 length B16; + CARD16 length; } xXF86DRIQueryVersionReq; #define sz_xXF86DRIQueryVersionReq 4 @@ -68,15 +68,15 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD16 majorVersion B16; /* major version of DRI protocol */ - CARD16 minorVersion B16; /* minor version of DRI protocol */ - CARD32 patchVersion B32; /* patch version of DRI protocol */ - CARD32 pad3 B32; - CARD32 pad4 B32; - CARD32 pad5 B32; - CARD32 pad6 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD16 majorVersion; /* major version of DRI protocol */ + CARD16 minorVersion; /* minor version of DRI protocol */ + CARD32 patchVersion; /* patch version of DRI protocol */ + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; + CARD32 pad6; } xXF86DRIQueryVersionReply; #define sz_xXF86DRIQueryVersionReply 32 @@ -85,8 +85,8 @@ typedef struct _XF86DRIQueryDirectRenderingCapable { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* X_DRIQueryDirectRenderingCapable */ - CARD16 length B16; - CARD32 screen B32; + CARD16 length; + CARD32 screen; } xXF86DRIQueryDirectRenderingCapableReq; #define sz_xXF86DRIQueryDirectRenderingCapableReq 8 @@ -95,17 +95,17 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; + CARD16 sequenceNumber; + CARD32 length; BOOL isCapable; BOOL pad2; BOOL pad3; BOOL pad4; - CARD32 pad5 B32; - CARD32 pad6 B32; - CARD32 pad7 B32; - CARD32 pad8 B32; - CARD32 pad9 B32; + CARD32 pad5; + CARD32 pad6; + CARD32 pad7; + CARD32 pad8; + CARD32 pad9; } xXF86DRIQueryDirectRenderingCapableReply; #define sz_xXF86DRIQueryDirectRenderingCapableReply 32 @@ -114,8 +114,8 @@ typedef struct _XF86DRIOpenConnection { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIOpenConnection */ - CARD16 length B16; - CARD32 screen B32; + CARD16 length; + CARD32 screen; } xXF86DRIOpenConnectionReq; #define sz_xXF86DRIOpenConnectionReq 8 @@ -124,14 +124,14 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 hSAREALow B32; - CARD32 hSAREAHigh B32; - CARD32 busIdStringLength B32; - CARD32 pad6 B32; - CARD32 pad7 B32; - CARD32 pad8 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 hSAREALow; + CARD32 hSAREAHigh; + CARD32 busIdStringLength; + CARD32 pad6; + CARD32 pad7; + CARD32 pad8; } xXF86DRIOpenConnectionReply; #define sz_xXF86DRIOpenConnectionReply 32 @@ -140,9 +140,9 @@ typedef struct _XF86DRIAuthConnection { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICloseConnection */ - CARD16 length B16; - CARD32 screen B32; - CARD32 magic B32; + CARD16 length; + CARD32 screen; + CARD32 magic; } xXF86DRIAuthConnectionReq; #define sz_xXF86DRIAuthConnectionReq 12 @@ -151,14 +151,14 @@ typedef struct { BYTE type; BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 authenticated B32; - CARD32 pad2 B32; - CARD32 pad3 B32; - CARD32 pad4 B32; - CARD32 pad5 B32; - CARD32 pad6 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 authenticated; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; + CARD32 pad6; } xXF86DRIAuthConnectionReply; #define zx_xXF86DRIAuthConnectionReply 32 @@ -167,8 +167,8 @@ typedef struct _XF86DRICloseConnection { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICloseConnection */ - CARD16 length B16; - CARD32 screen B32; + CARD16 length; + CARD32 screen; } xXF86DRICloseConnectionReq; #define sz_xXF86DRICloseConnectionReq 8 @@ -177,8 +177,8 @@ typedef struct _XF86DRIGetClientDriverName { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIGetClientDriverName */ - CARD16 length B16; - CARD32 screen B32; + CARD16 length; + CARD32 screen; } xXF86DRIGetClientDriverNameReq; #define sz_xXF86DRIGetClientDriverNameReq 8 @@ -187,14 +187,14 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 ddxDriverMajorVersion B32; - CARD32 ddxDriverMinorVersion B32; - CARD32 ddxDriverPatchVersion B32; - CARD32 clientDriverNameLength B32; - CARD32 pad5 B32; - CARD32 pad6 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 ddxDriverMajorVersion; + CARD32 ddxDriverMinorVersion; + CARD32 ddxDriverPatchVersion; + CARD32 clientDriverNameLength; + CARD32 pad5; + CARD32 pad6; } xXF86DRIGetClientDriverNameReply; #define sz_xXF86DRIGetClientDriverNameReply 32 @@ -203,10 +203,10 @@ typedef struct _XF86DRICreateContext { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICreateContext */ - CARD16 length B16; - CARD32 screen B32; - CARD32 visual B32; - CARD32 context B32; + CARD16 length; + CARD32 screen; + CARD32 visual; + CARD32 context; } xXF86DRICreateContextReq; #define sz_xXF86DRICreateContextReq 16 @@ -215,14 +215,14 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 hHWContext B32; - CARD32 pad2 B32; - CARD32 pad3 B32; - CARD32 pad4 B32; - CARD32 pad5 B32; - CARD32 pad6 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 hHWContext; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; + CARD32 pad6; } xXF86DRICreateContextReply; #define sz_xXF86DRICreateContextReply 32 @@ -231,9 +231,9 @@ typedef struct _XF86DRIDestroyContext { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIDestroyContext */ - CARD16 length B16; - CARD32 screen B32; - CARD32 context B32; + CARD16 length; + CARD32 screen; + CARD32 context; } xXF86DRIDestroyContextReq; #define sz_xXF86DRIDestroyContextReq 12 @@ -242,9 +242,9 @@ typedef struct _XF86DRICreateDrawable { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICreateDrawable */ - CARD16 length B16; - CARD32 screen B32; - CARD32 drawable B32; + CARD16 length; + CARD32 screen; + CARD32 drawable; } xXF86DRICreateDrawableReq; #define sz_xXF86DRICreateDrawableReq 12 @@ -253,14 +253,14 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 hHWDrawable B32; - CARD32 pad2 B32; - CARD32 pad3 B32; - CARD32 pad4 B32; - CARD32 pad5 B32; - CARD32 pad6 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 hHWDrawable; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; + CARD32 pad6; } xXF86DRICreateDrawableReply; #define sz_xXF86DRICreateDrawableReply 32 @@ -269,9 +269,9 @@ typedef struct _XF86DRIDestroyDrawable { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIDestroyDrawable */ - CARD16 length B16; - CARD32 screen B32; - CARD32 drawable B32; + CARD16 length; + CARD32 screen; + CARD32 drawable; } xXF86DRIDestroyDrawableReq; #define sz_xXF86DRIDestroyDrawableReq 12 @@ -280,9 +280,9 @@ typedef struct _XF86DRIGetDrawableInfo { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIGetDrawableInfo */ - CARD16 length B16; - CARD32 screen B32; - CARD32 drawable B32; + CARD16 length; + CARD32 screen; + CARD32 drawable; } xXF86DRIGetDrawableInfoReq; #define sz_xXF86DRIGetDrawableInfoReq 12 @@ -291,18 +291,18 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 drawableTableIndex B32; - CARD32 drawableTableStamp B32; - INT16 drawableX B16; - INT16 drawableY B16; - INT16 drawableWidth B16; - INT16 drawableHeight B16; - CARD32 numClipRects B32; - INT16 backX B16; - INT16 backY B16; - CARD32 numBackClipRects B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 drawableTableIndex; + CARD32 drawableTableStamp; + INT16 drawableX; + INT16 drawableY; + INT16 drawableWidth; + INT16 drawableHeight; + CARD32 numClipRects; + INT16 backX; + INT16 backY; + CARD32 numBackClipRects; } xXF86DRIGetDrawableInfoReply; #define sz_xXF86DRIGetDrawableInfoReply 36 @@ -311,8 +311,8 @@ typedef struct _XF86DRIGetDeviceInfo { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIGetDeviceInfo */ - CARD16 length B16; - CARD32 screen B32; + CARD16 length; + CARD32 screen; } xXF86DRIGetDeviceInfoReq; #define sz_xXF86DRIGetDeviceInfoReq 8 @@ -321,14 +321,14 @@ typedef struct { BYTE type; /* X_Reply */ BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 hFrameBufferLow B32; - CARD32 hFrameBufferHigh B32; - CARD32 framebufferOrigin B32; - CARD32 framebufferSize B32; - CARD32 framebufferStride B32; - CARD32 devPrivateSize B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 hFrameBufferLow; + CARD32 hFrameBufferHigh; + CARD32 framebufferOrigin; + CARD32 framebufferSize; + CARD32 framebufferStride; + CARD32 devPrivateSize; } xXF86DRIGetDeviceInfoReply; #define sz_xXF86DRIGetDeviceInfoReply 32 @@ -337,9 +337,9 @@ typedef struct _XF86DRIOpenFullScreen { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIOpenFullScreen */ - CARD16 length B16; - CARD32 screen B32; - CARD32 drawable B32; + CARD16 length; + CARD32 screen; + CARD32 drawable; } xXF86DRIOpenFullScreenReq; #define sz_xXF86DRIOpenFullScreenReq 12 @@ -348,14 +348,14 @@ typedef struct { BYTE type; BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 isFullScreen B32; - CARD32 pad2 B32; - CARD32 pad3 B32; - CARD32 pad4 B32; - CARD32 pad5 B32; - CARD32 pad6 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 isFullScreen; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; + CARD32 pad6; } xXF86DRIOpenFullScreenReply; #define sz_xXF86DRIOpenFullScreenReply 32 @@ -364,9 +364,9 @@ typedef struct _XF86DRICloseFullScreen { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICloseFullScreen */ - CARD16 length B16; - CARD32 screen B32; - CARD32 drawable B32; + CARD16 length; + CARD32 screen; + CARD32 drawable; } xXF86DRICloseFullScreenReq; #define sz_xXF86DRICloseFullScreenReq 12 @@ -375,14 +375,14 @@ typedef struct { BYTE type; BOOL pad1; - CARD16 sequenceNumber B16; - CARD32 length B32; - CARD32 pad2 B32; - CARD32 pad3 B32; - CARD32 pad4 B32; - CARD32 pad5 B32; - CARD32 pad6 B32; - CARD32 pad7 B32; + CARD16 sequenceNumber; + CARD32 length; + CARD32 pad2; + CARD32 pad3; + CARD32 pad4; + CARD32 pad5; + CARD32 pad6; + CARD32 pad7; } xXF86DRICloseFullScreenReply; #define sz_xXF86DRICloseFullScreenReply 32