pax_global_header00006660000000000000000000000064126702503140014512gustar00rootroot0000000000000052 comment=babf51f887554743a46a5078832fe4013f02a018 xserver-xorg-video-openchrome-0.3.3+git20160310/000077500000000000000000000000001267025031400210255ustar00rootroot00000000000000xserver-xorg-video-openchrome-0.3.3+git20160310/.gitignore000066400000000000000000000004061267025031400230150ustar00rootroot00000000000000.deps .libs Makefile Makefile.in *.la *.lo *.o openchrome.* via_regs_dump aclocal.m4 autom4te.cache config.guess config.h config.h.in config.log config.status config.sub configure compile depcomp install-sh libtool ltmain.sh missing stamp-h1 ChangeLog version.h xserver-xorg-video-openchrome-0.3.3+git20160310/COPYING000066400000000000000000000020041267025031400220540ustar00rootroot00000000000000Permission 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(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. xserver-xorg-video-openchrome-0.3.3+git20160310/ChangeLog000066400000000000000000002570401267025031400226070ustar00rootroot000000000000002011-05-10 Bartosz Kosiorek Workaround EXA crash with new libcairo2 (#298) * src/via_accel.c: (viaExaPrepareComposite): 2011-05-08 Bartosz Kosiorek Fix cursor garbage after suspend/resume for Xserver 1.10 (#405) * src/via_video.c: (viaRestoreVideo): 2011-05-04 Bartosz Kosiorek Fix XAA displaying issues * src/via_accel.c: (viaInitXAA): 2011-01-23 Bartosz Kosiorek Enable hardware cursor for VX900 * src/via_cursor.c: (viaHWCursorInit): * src/via_mode.c: (ViaModeSet): 2010-12-16 Bartosz Kosiorek Merge vx900_branch - initial VX900 support * src/via_accel.c: (viaFlushPCI), (viaDisableVQ), (viaInitialize2DEngine), (viaAccelSync), (viaPitchHelper), (viaInitXAA): * src/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * src/via_bios.h: * src/via_crtc.c: (ViaFirstCRTCSetMode), (ViaSecondCRTCSetMode): * src/via_cursor.c: (viaHWCursorInit), (viaCursorStore), (viaCursorRestore), (viaShowCursor), (viaHideCursor), (viaSetCursorPosition), (viaLoadCursorImage), (viaSetCursorColors): * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit), (VIALeaveVT), (VIASave), (VIARestore), (ViaMMIOEnable), (ViaMMIODisable), (VIAMapFB), (VIAWriteMode), (VIACloseScreen): * src/via_driver.h: * src/via_id.c: * src/via_id.h: * src/via_mode.c: (ViaDFPDetect), (ViaOutputsDetect), (ViaOutputsSelect), (ViaGetMemoryBandwidth), (ViaSetDotclock), (ViaModeSet): * src/via_mode.h: * src/via_panel.c: (ViaPanelScaleDisable), (ViaPanelPreInit), (ViaPanelGetSizeFromDDC): * src/via_video.c: (DecideOverlaySupport): * src/via_xvmc.c: (ViaInitXVMC): 2010-12-15 Bartosz Kosiorek Enable the new mode switch and panel support on K8M800 and VM800 chipsets * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit): * src/via_mode.c: (ViaModeSet): 2010-11-10 Bartosz Kosiorek Replace the deprecated functions xalloc/xrealloc/xfree/xcalloc with malloc/realloc/free/calloc. Refer to "/xserver/include/os.h" * src/via_accel.c: (viaSetupCBuffer), (viaTearDownCBuffer), (viaInitExa), (viaExitAccel), (viaFinishInitAccel): * src/via_dga.c: (VIASetupDGAMode): * src/via_dri.c: (VIAInitVisualConfigs), (VIADRIScreenInit), (VIADRICloseScreen): * src/via_driver.c: (VIAFreeRec), (VIAProbe), (VIAPreInit), (VIACloseScreen): * src/via_memcpy.c: (viaVidCopyInit): * src/via_swov.c: (Upd_Video): * src/via_vbe.c: (ViaVbeSetMode): * src/via_video.c: (viaExitVideo), (viaStopVideo), (viaDmaBlitImage): * src/via_xvmc.c: (cleanupViaXvMC), (ViaCleanupXVMC), (ViaXvMCCreateContext), (ViaXvMCCreateSurface), (ViaXvMCCreateSubpicture), (ViaXvMCDestroyContext), (ViaXvMCDestroySurface), (ViaXvMCDestroySubpicture), (viaXvMCInitXv): 2010-10-24 Bartosz Kosiorek Siragon ML-6200 laptop support * src/via_id.c: 2010-06-24 Jon Nettleton PM800 also uses the CME Engine. Setup the hqv_cme_regs for it. * src/via_swov.c: (VIAVidHWDiffInit): 2010-06-09 Bartosz Kosiorek Fix freeze on 64bit system for K8M800 chipset * src/via_dri.c: (VIADRIAgpInit): 2010-05-04 Jon Nettleton Re-enable the Virtual Queue for the VX800/VX855 chipsets. * src/via_accel.c: (viaDisableVQ), (viaInitialize2DEngine): 2010-05-04 Jon Nettleton Disable certain hardware clipping options for the VX855. These cause the 2d engine to become unstable when in 16-bit mode. * src/via_accel.c: (viaInitXAA): 2010-05-04 Jon Nettleton Add an undocumented option which allows certain I2C buses to be probed at startup. This allows workarounds for custom chipset makers that have used the VX855 I2C buses for other purposes. * src/via_bios.h: * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit): * src/via_driver.h: * src/via_i2c.c: 2010-05-04 Jon Nettleton Improve 2d performance on chipsets that don't have AGP/PCIe support yet. * src/via_accel.c: (viaSetupForScreenToScreenCopy), (viaSetupForSolidFill), (viaSetupForMono8x8PatternFill), (viaSetupForColor8x8PatternFill), (viaSetupForCPUToScreenColorExpandFill), (viaSubsequentScanlineCPUToScreenColorExpandFill), (viaSetupForImageWrite), (viaSubsequentImageWriteRect), (viaSetupForSolidLine), (viaSetupForDashedLine), (viaInitXAA): 2010-05-04 Jon Nettleton Put timeouts on our while statements. These codepaths should be interrupted by a hardware state change, but if something goes wrong they loop forevere. Let's try and behave a little by putting a timeout on these loops. * src/via_swov.c: (viaWaitHQVFlip), (viaWaitHQVFlipClear), (viaWaitHQVDone): * src/via_video.c: (Flip): 2010-05-04 Jon Nettleton Add XVideo support for the VX855 Chipset. To support this chipset I have added HWDiff->HQVCmeRegs that allows handling differing register values, and HWDiff->dwNewScaleCtl which allows selection of a new Video scaling engine needed for the VX800/VX855 chipsets. * src/via.h: * src/via_bandwidth.c: (ViaSetSecondaryFIFO): * src/via_driver.h: * src/via_swov.c: (SaveVideoRegister), (VIAVidHWDiffInit), (viaOverlayHQVCalcZoomWidth), (viaOverlayHQVCalcZoomHeight), (ViaSwovSurfaceCreate), (SetHQVFetch), (Upd_Video): * src/via_swov.h: 2010-04-21 Bartosz Kosiorek Replace RegionsEqual with REGION_EQUAL and use the xf86XVFillKeyHelperDrawable instead of xf86XVFillKeyHelper * src/via_video.c: (viaReputImage), (viaPutImage): 2010-03-07 Bartosz Kosiorek Fix segfaults with EXA and XV (Ticket #359) Tested on K8M890 and VN800 * src/via_video.c: (viaReputImage), (viaPutImage): 2010-02-10 Bartosz Kosiorek Fix bug with suspend and VT switch on VX800 and 64bit systems * src/via_driver.h: * src/via_video.c: (viaResetVideo), (viaSaveVideo), (viaRestoreVideo), (viaExitVideo): * src/via_video.h: 2010-01-24 Bartosz Kosiorek Fix starting address restore and save (initial 64-bit support) * src/via_crtc.c: (ViaFirstCRTCSetMode), (ViaFirstCRTCSetStartingAddress): * src/via_dri.c: (VIADRIAgpInit): * src/via_driver.c: (VIASave), (VIARestore): * src/via_driver.h: 2009-12-04 Bartosz Kosiorek Enable new mode switch for VM800 chipsets * src/via_driver.c: (VIASetupDefaultOptions): 2009-11-21 Bartosz Kosiorek Add option to enable unaccelerated RandR rotation ("SWRandR"). The accelerated option "HWRandR" is currently not implemented. * src/openchrome.man: * src/via_driver.c: (VIAPreInit): 2009-11-20 Bartosz Kosiorek Enabled new mode switch for PM800 chipset, to resolve many bugs with resolution detecting and changing (eg. switching to console) * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit): 2009-11-07 Bartosz Kosiorek Add more comments to ViaSetSecondaryFIFO, add panel scale support for CLE266 and KM400, fix bug with malloc. * src/via_bandwidth.c: (ViaSetSecondaryFIFO): * src/via_panel.c: (ViaPanelScale), (ViaPanelGetNativeDisplayMode): 2009-09-26 Bartosz Kosiorek Save/restore ECK Clock Synthesizer * src/via_driver.c: (VIASave), (VIARestore): * src/via_driver.h: 2009-09-21 Bartosz Kosiorek Fixed bug with panel autodetection using ViaPanelGetNativeModeFromScratchPad function * src/via_panel.c: 2009-09-21 Bartosz Kosiorek Fixed problem with backlite (Ticket #308) * src/via_lvds.c: (ViaLVDSSoftwarePowerFirstSequence), (ViaLVDSSoftwarePowerSecondSequence), (ViaLVDSHardwarePowerFirstSequence), (ViaLVDSHardwarePowerSecondSequence), (ViaLVDSPower): 2009-09-15 Bartosz Kosiorek TV-out VT1625 chip support * src/via_bios.h: * src/via_crtc.c: (ViaFirstCRTCSetMode): * src/via_display.c: (ViaDisplayEnableDVO), (ViaDisplayDisableDVO), (ViaDisplaySetStreamOnDVO): * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit): * src/via_mode.c: (ViaTVSetMode), (ViaOutputsSelect), (ViaModeSet): * src/via_vt162x.c: (ViaSetTVClockSource), (VT1622ModeI2C), (VT1622ModeCrtc): * src/via_vt162x.h: 2009-09-15 Bartosz Kosiorek Cursor support speedup * src/via_cursor.c: (viaHWCursorInit), (viaCursorStore), (viaCursorRestore), (viaShowCursor), (viaHideCursor), (viaSetCursorPosition), (viaLoadCursorImage), (viaLoadCursorARGB): 2009-09-14 Bartosz Kosiorek Removed two old variables: pBIOSInfo->panelX pBIOSInfo->panelY and replaced it by: pBIOSInfo->Panel->NativeMode->Width pBIOSInfo->Panel->NativeMode->Height * src/via_bios.h: * src/via_driver.c: (VIASetupDefaultOptions): * src/via_mode.c: (ViaPanelGetIndex), (VIASetLCDMode), (ViaModePrimaryLegacy), (ViaModeSecondaryLegacy): * src/via_swov.c: (SetVideoWindow): * src/via_video.c: (DecideOverlaySupport): 2009-09-10 Bartosz Kosiorek Fix bug with DFP Power Off (ticket #317) * src/via_mode.c: (ViaDFPPower): 2009-08-20 Bartosz Kosiorek Fix bug with wrong panel size value (http://www.openchrome.org/trac/ticket/301) This bug appeared only when UseLegacyModeSwitch was TRUE * src/via_driver.c: (VIASetupDefaultOptions): * src/via_video.c: (DecideOverlaySupport): 2009-08-17 Bartosz Kosiorek Added support of the VIA OpenBook * src/via_id.c: 2009-08-08 Bartosz Kosiorek Added support for screen rotate upside-down and remove "magic numbers" * src/via_driver.c: * src/via_driver.h: * src/via_shadow.c: 2009-07-28 Jon Nettleton Forgot to remove an old Dot Clock entry from the table. * src/via_mode.h: 2009-07-28 Jon Nettleton XO 1.5 Panel patch contributed by Xavier Bachelot. Fixup some of the Dotclock code and add working plls for the XO 1.5 * src/via_bios.h: * src/via_mode.c: (ViaSetDotclock), (ViaSetPrimaryDotclock), (ViaSetSecondaryDotclock): * src/via_mode.h: * src/via_panel.c: 2009-03-21 Xavier Bachelot * src/via_bios.h: * src/via_display.c: (ViaDisplaySetStreamOnDFP): * src/via_driver.c: (VIAPreInit), (VIASave), (VIARestore), (VIADPMS): * src/via_driver.h: * src/via_mode.c: (ViaDFPDetect), (ViaOutputsDetect), (ViaOutputsSelect), (ViaDFPPower), (ViaModeSet): CX700 integrated TMDS (Patch courtesy Tim Chen from VIA). 2009-02-19 Gabriel Mansi * src/via_driver.c: (VIAScreenInit), (VIAWriteMode): Initialize CRTC before a mode switch. Fix bug #260. 2009-01-26 Jon Nettleton * src/via_accel.c: (viaInitXAA), (viaExaCheckComposite): a couple of small compatibility fixes for XAA and EXA. 2009-01-17 Jon Nettleton * libxvmc/viaLowLevel.c: (viaDMAInitTimeStamp): * src/via_accel.c: (viaDisableVQ): * src/via_video.c: (viaVideoFillPixmap): viaLowLevel.c and via_accel.c are fixes by Bartosz Kosiorek. The via_video.c is a syntax fix by Robert Bridge. Thanks for the bug fixes. 2009-01-17 Jon Nettleton * configure.ac: * src/via_accel.c: (viaInitAccel), (viaExitAccel), (viaFinishInitAccel): * src/via_driver.c: (VIASetup), (VIASetupDefaultOptions), (VIAPreInit), (VIAWriteMode), (VIAInitialize3DEngine): * src/via_driver.h: * src/via_memory.c: (viaExaFBSave), (VIAFreeLinear), (viaOffScreenLinear), (VIAInitLinear): * src/via_priv.h: Patch submitted by Robert Bridge, originally started by Xavier Bachelot, to remove old EXA support. We are moving forward with the driver and are no longer supporting the old EXA initializations. 2009-01-14 Jon Nettleton * src/via_accel.c: (viaDisableVQ), (viaInitialize2DEngine), (viaAccelSync): According to VIA's code the P4M900 should have the same acceleration initialization registers as the K8M890. This patch fixes this and gives about a 10x increase in the video benchmark numbers. 2009-01-14 Jon Nettleton * src/via_accel.c: (viaFlushPCI): remove the check for VIA_3D_ENG_BUSY in the idle loop. This causes xorg to chew a bit more cpu with XAA enabled, and it causes the entire X server to dump if EXA is enabled. I should investigate further, but for now I will just remove it. 2009-01-14 Jon Nettleton * src/via_accel.c: (viaFlushPCI): Oops forgot to change registers for the vx800 chipset when waiting for Idle in the engines. I also added back in waiting for the 3d engine to be idle. I am not sure if this was removed for a reason. 2009-01-07 Jon Nettleton * src/via_bios.h: * src/via_crtc.c: (via_xf86crtc_resize), (ViaPreInitCRTCConfig): * src/via_driver.c: (VIAPreInit): Temporary hack to fix a bug with newer Xorg and DRI that crashes if CRTC is not setup. I am adding this because I am working on this part of the code anyways so it won't get lost in bit rot. 2009-01-06 Jon Nettleton * src/via_mode.c: (ViaModesMonitorFixup), (ViaModesAttachHelper): Make sure that the monitor settings will handle our internal Modes set for TV out and LCD Panels. 2009-01-05 Jon Nettleton * src/via_cursor.c: (viaHWCursorInit), (viaLoadCursorImage): A couple more tweaks to fix mono hardware cursor on older chipsets. 2009-01-05 Jon Nettleton * src/via_cursor.c: (viaHWCursorInit), (viaUseHWCursorARGB), (viaUseHWCursor): * src/via_driver.c: (VIAScreenInit): Missed a couple of changes for the chipset specific cursors. Moved chipset detection to HWInit. Removed some extraneous debugging. 2009-01-04 Gabriel Mansi * src/via.h: * src/via_accel.c: (viaInitialize2DEngine): * src/via_crtc.c: (ViaFirstCRTCSetMode), (ViaSecondCRTCSetMode): * src/via_driver.c: (ViaMMIOEnable), (ViaMMIODisable), (VIAWriteMode): * src/via_swov.c: (SetFIFO_V3), (Upd_Video): * src/via_video.c: (DecideOverlaySupport): Initial XVideo support for VX800. 2009-01-04 Jon Nettleton * src/via_cursor.c: (viaHWCursorInit), (viaCursorSetFB), (viaUseHWCursorARGB), (viaUseHWCursor), (viaLoadCursorImage), (viaSetCursorColors), (viaLoadCursorARGB): * src/via_driver.h: Okay I tried to cheat. We need to have some chipset specific intelligence. I have added this back into the initial test to check for HWCursor support. 2009-01-04 Jon Nettleton * src/via_accel.c: (viaInitXAA), (viaInitAccel): * src/via_crtc.c: (ViaSecondCRTCSetStartingAddress): * src/via_cursor.c: (viaHWCursorInit), (viaCursorSetFB), (viaCursorStore), (viaCursorRestore), (viaShowCursor), (viaHideCursor), (viaSetCursorPosition), (viaUseHWCursorARGB), (viaUseHWCursor), (viaLoadCursorImage), (viaSetCursorColors), (viaLoadCursorARGB): * src/via_dga.c: (VIADGASetMode): * src/via_driver.c: (VIAFreeRec), (VIASetupDefaultOptions), (VIAPreInit), (VIAEnterVT), (VIALeaveVT), (VIAScreenInit), (VIACloseScreen): * src/via_driver.h: * src/via_regs.h: This is a take at reworking HWCursor. It works off the ttm_branch and the work done in the randr_branch. It only needs marginal testing as HWCursor was already very broken. 2009-01-04 Jon Nettleton * src/via_driver.c: (VIAMapMMIO), (VIAMapFB): Moved pVia->FrameBufferBase setting to within VIAMapFB where it was before being called without being set. 2009-01-04 Jon Nettleton * src/via_driver.c: (VIAPreInit): Patch submitted by Robert Bridge to clean up compiler warnings. Should close trac ticket #243. Thanks RobbieAB. 2008-12-29 Jon Nettleton * src/via_accel.c: (viaInitXAA): * src/via_driver.c: (VIAMapMMIO), (VIAMapFB): Finally tracked down the XAA libpciaccess bug. Also Realized I had not enabled write-combining on the main framebuffer. This should give a small speed boost. 2008-12-26 Jon Nettleton * src/via_mode.h: Added support for all Modes in ViaPanelNativeModes to ViaPanelModes. Modes used are from Via's released driver in ViaSupportModes. 2008-11-04 Jon Nettleton * src/via_crtc.c: (ViaFirstCRTCSetMode), (ViaSecondCRTCSetMode): Found needed register writes that are needed so VX800 doesn't crash when CRT is not enabled. I also removed NEEDS FIXING comments from them as they are obviously needed. 2008-11-03 Jon Nettleton * src/via_accel.c: (viaSubsequentMono8x8PatternFillRect), (viaSetupForSolidLine), (viaSubsequentSolidHorVertLine), (viaSetupForDashedLine), (viaAccelMarkSync): A few more acceleration tweaks for the VX800. This should fix all the XAA rendering issues. This should also allow 800x480 Panels to work without custom modelines. 2008-11-02 Jon Nettleton * src/via_accel.c: (viaFlushPCI), (viaDisableVQ), (viaInitialize2DEngine), (viaAccelSync), (viaPitchHelper), (viaAccelClippingHelper), (viaAccelSolidHelper), (viaAccelTransparentHelper), (viaAccelCopyHelper), (viaSetupForScreenToScreenCopy), (viaSubsequentScreenToScreenCopy), (viaSetupForSolidFill), (viaSubsequentSolidFillRect), (viaSetupForMono8x8PatternFill), (viaSubsequentMono8x8PatternFillRect), (viaSetupForColor8x8PatternFill), (viaSubsequentColor8x8PatternFillRect), (viaSetupForCPUToScreenColorExpandFill), (viaSubsequentScanlineCPUToScreenColorExpandFill), (viaSetupForImageWrite), (viaSubsequentImageWriteRect), (viaSetupForSolidLine), (viaSubsequentSolidTwoPointLine), (viaSubsequentSolidHorVertLine), (viaSetupForDashedLine), (viaInitXAA), (viaAccelMarkSync), (viaExaPrepareSolid), (viaExaSolid), (viaExaPrepareCopy), (viaExaCopy): * src/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * src/via_cursor.c: (viaCursorARGBInit), (viaCursorARGBShow), (viaCursorARGBHide), (viaCursorARGBSetPosition), (viaCursorRecInit): * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit), (VIALeaveVT), (VIACloseScreen): * src/via_driver.h: * src/via_id.c: * src/via_id.h: * src/via_mode.c: (ViaOutputsSelect), (VIAGetPanelSize), (ViaPanelGetIndex): * src/via_mode.h: * src/via_panel.c: (ViaPanelPreInit): * src/via_regs.h: * src/via_swov.c: (VIAVidHWDiffInit), (viaCalculateVideoColor), (viaSetColorSpace), (ViaInitVideoStatusFlag), (ViaSetVidCtl), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16): * src/via_video.c: (viaInitVideo): Initial support for the VX800 chipset. This is based off the Basic chipset support work of Xavier Bachelot and the inital Acceleration work done by Harald Welte. I verified the changes based off the most recent VIA codebaase and fixed a couple of rendering issues. Still needs more work on EXA ( font rendering glitches ) and XVideo. 2008-05-26 Gabriel Mansi * src/Makefile.am: * src/via_accel.c: (viaInitAccel): * src/via_bios.h: * src/via_crtc.c: (ViaCRTCSetGraphicsRegisters), (ViaCRTCSetAttributeRegisters), (ViaCRTCInit), (ViaFirstCRTCSetMode), (ViaFirstCRTCSetStartingAddress), (ViaSecondCRTCSetStartingAddress), (ViaSecondCRTCHorizontalQWCount), (ViaSecondCRTCHorizontalOffset), (ViaSecondCRTCSetMode), (ViaFirstCRTCModeValid), (ViaSecondCRTCModeValid), (ViaShadowCRTCSetMode): * src/via_cursor.c: (viaCursorARGBInit), (viaCursorSetFB), (viaCursorHWInit), (viaCursorHWShow), (viaCursorHWHide), (viaCursorShow), (viaCursorHide), (viaCursorLoadImage), (viaCursorHWSetPosition), (viaCursorSetPosition), (viaCursorSetColors), (viaCursorStore), (viaCursorRestore), (viaCursorARGBShow), (viaCursorARGBHide), (viaCursorARGBSetPosition), (viaCursorARGBUse), (viaCursorARGBLoad), (viaCursorRecInit), (viaCursorRecDestroy), (viaCursorHWUse): * src/via_dga.c: (VIADGASetMode): * src/via_display.c: (ViaSecondDisplayChannelEnable), (ViaSecondDisplayChannelDisable), (ViaDisplayInit), (ViaDisplayEnableSimultaneous), (ViaDisplayDisableSimultaneous), (ViaDisplayEnableCRT), (ViaDisplayDisableCRT), (ViaDisplaySetStreamOnCRT): * src/via_driver.c: (VIAGetRec), (VIAFreeRec), (VIASetupDefaultOptions), (VIAPreInit), (VIAEnterVT), (VIALeaveVT), (ViaGammaDisable), (VIASave), (VIARestore), (ViaMMIOEnable), (ViaMMIODisable), (VIAMapMMIO), (VIAUnmapMem), (VIALoadPalette), (VIAScreenInit), (VIAWriteMode), (VIACloseScreen), (VIAAdjustFrame), (VIADPMS): * src/via_driver.h: * src/via_lvds.c: (ViaLVDSPowerFirstSequence), (ViaLVDSPowerSecondSequence), (ViaLVDSDFPPower), (ViaLVDSPowerChannel), (ViaLVDSPower): * src/via_mode.c: (ViaPrintMode), (ViaOutputsSelect), (VIAGetPanelSize), (ViaPanelGetIndex), (ViaModesAttach), (ViaValidMode), (VIASetLCDMode), (ViaModePrimaryLegacy), (ViaModeSecondaryLegacy), (ViaLCDPower), (ViaModeFirstCRTC), (ViaModeSecondCRTC), (ViaModeSet): * src/via_panel.c: (ViaPanelLookUpModeIndex), (ViaPanelGetNativeModeFromOption), (ViaPanelGetNativeModeFromScratchPad), (ViaPanelScaleDisable), (ViaPanelScale), (ViaPanelGetNativeDisplayMode), (ViaPanelPreInit), (ViaPanelCenterMode), (ViaPanelGetSizeFromEDID), (ViaPanelGetSizeFromDDCv1), (ViaPanelGetSizeFromDDCv2): * src/via_regs.h: * src/via_swov.c: (Upd_Video): * src/via_timing.c: (froundf), (timingGenerateMode), (viaTimingCvt), (viaTimingGtf): * src/via_timing.h: * src/via_vbe.c: (ViaVbeGetActiveDevices), (ViaVbeSetMode), (ViaVbeDoDPMS): * src/via_video.c: (DecideOverlaySupport), (viaSaveVideo), (viaRestoreVideo): Merge panel code from randr branch (rev. 427 to 553) Add native mode setting for P4M890, P4M900, K8M890 and CX700 Add LVDS power functions for P4M900 and CX700 Add ARGB hardware cursor support 2008-03-11 Xavier Bachelot * configure.ac: * src/via.h: * src/via_dri.c: (VIADRIIrqInit), (VIADRIScreenInit): * src/via_driver.c: (via_pci_device), (via_host_bridge), (viaPciDeviceVga), (if), (switch): * src/via_driver.h: * src/via_id.c: (ViaCheckCardId): Merge changes from pciaccess branch. 2008-02-19 Benno Schulenberg * src/via_driver.c: (VIAPreInit): Dealing with the NoAccel option before the Rotate option, since the latter overrides the first. 2008-01-28 Benno Schulenberg * src/Makefile.am: Recreating svnversion.h only when a source file has changed. 2008-01-18 Benno Schulenberg * src/via_dri.c: (VIAInitVisualConfigs): Condensing an unneeded code duplication. 2008-01-11 Benno Schulenberg * src/openchrome.man: * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit): Removing the redundant HWCursor option. 2008-01-10 Benno Schulenberg * src/openchrome.man: Tweaking the text, clarifying the effect of an option, giving the default value. 2008-01-08 Benno Schulenberg * src/via_accel.c: (viaBitExpandHelper), (viaPixelARGB8888): Moving a little more computation into the helper function. 2007-10-29 Benno Schulenberg * src/via_driver.c: (VIAPreInit): Redoing the second change of June 10: Printing VideoRAM again only when it's actually been probed; plus further tiny code cleanups: comments, line wraps, whitespace. 2007-10-29 Benno Schulenberg * src/via_driver.c: (VIAPreInit): Redoing the first change of June 10: Putting the chipset and revision print statements together at the beginning; moving the reading of the VideoRAM option to after X has parsed the config file; plus a few small layout tweaks. 2007-10-05 Gabriel Mansi * src/via_swov.c: (Upd_Video): Enable colorkey on secondary. 2007-10-03 Gabriel Mansi * src/via_driver.c: (VIAPreInit): Fix memory detection for P4M900 and CX700. 2007-09-12 Gabriel Mansi * src/via_bios.h: * src/via_driver.c: (VIAWriteMode), (VIAAdjustFrame), (VIASwitchMode): * src/via_mode.c: (ViaModeSecondaryVGAFetchCount), (ViaModeSecondaryVGAOffset), (ViaModeSecondaryVGA): * src/via_swov.c: (Upd_Video): * src/via_vbe.c: (ViaVbeSetPanelMode), (ViaVbeSetMode): Fix offset when using vbe modes on secondary. 2007-09-11 Xavier Bachelot * libxvmc/viaLowLevel.c: (initXvMCLowLevel): * libxvmc/viaLowLevel.h: * libxvmc/viaLowLevelPro.c: (initXvMCLowLevel): * src/via.h: * src/via_accel.c: (viaInitExa): * src/via_bandwidth.c: (ViaSetPrimaryFIFO): * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit), (VIASave), (VIARestore), (VIALoadPalette): * src/via_driver.h: * src/via_id.c: * src/via_mode.c: (ViaOutputsDetect): * src/via_priv.h: * src/via_swov.c: (Upd_Video): * src/via_vbe.c: (ViaVbeInitInt10), (ViaVbeGetRefreshRateIndex), (ViaVbeGetActiveDevices), (ViaVbeSetActiveDevices), (ViaVbeSetPanelExpansion), (ViaVbeSetRefresh), (ViaVbeSetMode), (ViaVbeSaveRestore), (ViaVbeModePreInit): * src/via_xvmc.c: (ViaInitXVMC), (ViaXvMCCreateContext): Sync with experimental_branch. 2007-09-07 Gabriel Mansi * unichrome/via_id.c: Added Gigabyte GA-VM900M ID, reported by Alexandre Penasso Teixeira. 2007-09-07 Gabiel Mansi * libxvmc/viaLowLevel.c: (initXvMCLowLevel): * libxvmc/viaLowLevel.h: * libxvmc/viaLowLevelPro.c: (initXvMCLowLevel): * unichrome/via.h: * unichrome/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit), (VIASave), (VIARestore), (VIALoadPalette): * unichrome/via_driver.h: * unichrome/via_mode.c: (ViaOutputsDetect): * unichrome/via_swov.c: (Upd_Video): * unichrome/via_vbe.c: (ViaVbeInitInt10), (ViaVbeGetRefreshRateIndex), (ViaVbeGetActiveDevices), (ViaVbeSetActiveDevices), (ViaVbeSetPanelExpansion), (ViaVbeSetRefresh), (ViaVbeSetMode), (ViaVbeSaveRestore), (ViaVbeModePreInit): * unichrome/via_xvmc.c: (ViaInitXVMC), (ViaXvMCCreateContext): Merged vn896_branch from revision 361 to 391. 2007-09-07 Gabriel Mansi * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_mode.c: (ViaOutputsDetect): * unichrome/via_vbe.c: (ViaVbeSetActiveDevices): Disabled TV detection for P4M900. 2007-09-07 Gabriel Mansi * unichrome/via_driver.h: * unichrome/via_vbe.c: (ViaVbeInitInt10), (ViaVbeGetRefreshRateIndex), (ViaVbeGetActiveDevices), (ViaVbeSetActiveDevices), (ViaVbeSetPanelExpansion), (ViaVbeSetRefresh), (ViaVbeSetMode), (ViaVbeModePreInit): VBE code cleanup. 2007-09-02 Gabriel Mansi * unichrome/via_driver.c: (VIASetupDefaultOptions), (VIASave), (VIARestore): * unichrome/via_vbe.c: (ViaVbeSetMode): Disabled XvDMA for P4M900. Modified VBE functions calling order. 2007-08-18 Gabriel Mansi * unichrome/via_driver.c: (VIASetupDefaultOptions): * unichrome/via_priv.h: * unichrome/via_swov.c: (Upd_Video): Xvideo code cleanup; added maximum resolution with interpolation for all chipsets. 2007-08-03 Xavier Bachelot * src/via_bios.h: * src/via_mode.h: * src/via_video.c: (DecideOverlaySupport): Add basic support for DDR667. 2007-07-31 Jon Nettleton * src/via_xvmc.c: (ViaInitXVMC): Fixed the xvmc name we register. Was still looking for the old via xvmc library names. 2007-07-04 Xavier Bachelot * configure.ac: * src/via_driver.c: (VIAPreInit): * src/via_driver.h: Bump driver version to 0.2.900. Do not log detected chipset 2 times. Remove duplicate changelog entry. 2007-06-20 Gabriel Mansi * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO) FIFO settings for CX700. 2007-06-14 Jon Nettleton * configure.ac: * libxvmc/viaLowLevel.h: * src/via.h: * src/via_accel.c: (viaFlushPCI), (viaInitPCIe), (viaEnableAgpVQ), (viaEnablePCIeVQ), (viaDisableVQ), (viaInitialize2DEngine), (viaAccelSync), (viaInitXAA), (viaInitExa), (viaInitAccel): * src/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * src/via_dri.c: (VIADRIRingBufferInit): * src/via_driver.c: (VIASetupDefaultOptions), (VIAPreInit), (VIALeaveVT), (VIASave), (VIAScreenInit), (VIACloseScreen): * src/via_driver.h: * src/via_id.c: (ViaDoubleCheckCLE266Revision), (ViaCheckCardId): * src/via_id.h: * src/via_mode.c: (ViaGetMemoryBandwidth), (ViaModePrimary): * src/via_mode.h: * src/via_regs.h: * src/via_swov.c: (viaWaitHQVFlip), (viaWaitHQVDone), (VIAVidHWDiffInit), (viaCalculateVideoColor), (viaSetColorSpace), (ViaInitVideoStatusFlag), (ViaSetVidCtl), (AddHQVSurface), (SetFIFO_V3), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16), (SetColorKey), (SetChromaKey), (SetHQVFetch), (Upd_Video), (VIAVidUpdateOverlay), (ViaOverlayHide): * src/via_swov.h: * src/via_vbe.c: (ViaVbeSetMode): * src/via_video.c: (DecideOverlaySupport), (viaInitVideo), (Flip), (viaDmaBlitImage), (viaPutImage): * src/via_video.h: * src/via_xvmc.c: (ViaInitXVMC): Pulled in Changes from the experimental_branch including - Partial support for VIA_K8M890, VIA_P4M900, VIA_CX700, VIA_P4M890 - Added the VideoEngine option to help clean up code - Ability to enable debugging with the configure script 2007-06-12 Gabriel Mansi * unichrome/via.h: * unichrome/via_dri.c: (VIADRIRingBufferInit): * unichrome/via_driver.c: * unichrome/via_id.c: * unichrome/via_id.h: * unichrome/via_swov.c: (viaCalculateVideoColor), (viaSetColorSpace), (ViaInitVideoStatusFlag), (ViaSetVidCtl), (SetFIFO_V3), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16), (Upd_Video): * unichrome/via_vbe.c: (ViaVbeSetMode): * unichrome/via_video.c: (DecideOverlaySupport): Renamed VT3157 to VT3324. Added check for null data block in vbe. Remove version check for older version of Xorg. 2007-06-12 Gabriel Mansi * unichrome/via.h: Added missing includes. 2007-06-10 Benno Schulenberg * unichrome/via_driver.c: (VIAPreInit): Print VideoRAM again only when it's actually been probed. Further tiny code cleanups: comments, line wraps, whitespace. 2007-06-10 Benno Schulenberg * unichrome/via.man: * unichrome/via_driver.c: (VIAPreInit): Move reading of the VideoRAM option to after X has parsed the config file. Also put the chipset and revision print statements together and at the beginning. Plus several small layout tweaks. 2007-06-07 Jon Nettleton * Makefile.am: * configure.ac: * libxvmc/Makefile.am: * man/Makefile.am: * src/Makefile.am: * src/via_driver.c: * src/via_driver.h: Renaming driver to openchrome_drv.so and XvMC library to libchromeXvMC.so. 2007-06-06 Jon Nettleton * unichrome/via_driver.c: Removed the chipset option definitions that aren't in trunk yet. 2007-06-06 Jon Nettleton * unichrome/via_driver.c: * unichrome/via_driver.h: * unichrome/via.man: Added per-chipset option defaults. This should allow the driver to work out of the box with almost all hardware and xorg.conf configurations. 2007-05-23 Jon Nettleton * unichrome/via.h: Remove version check for older version of Xorg. This is really not necessary anymore, and was causing some breakage with xorg-server's new version numbering. 2007-05-18 Xavier Bachelot * libxvmc/Makefile.am: * libxvmc/viaXvMC.c: (XvMCCreateContext): Backport 2 fixes from Xorg tree. http://gitweb.freedesktop.org/?p=xorg/driver/xf86-video-via.git;a=commit;h=362e03a38682bfcf366242c53444fa36b6052794 http://gitweb.freedesktop.org/?p=xorg/driver/xf86-video-via.git;a=commit;h=3cd7dac2b5a1c4bfb66bd1b67904d72dc08cbd0e 2007-05-15 Gabriel Mansi * unichrome/via.h: * unichrome/via_driver.c: (VIASetupDefaultOptions): * unichrome/via_driver.h: * unichrome/via_swov.c: (viaWaitHQVFlip), (SetColorKey), (SetChromaKey), (Upd_Video): * unichrome/via_video.c: (Flip), (viaDmaBlitImage), (viaPutImage): Xv code cleanup. 2007-05-10 Jon Nettleton * unichrome/via_driver.c: * unichrome/via_driver.h: * unichrome/via.man: Added per chipset option defaults. This should allow the driver to install and work out of the box with almost all hardware and xorg.conf configurations. 2007-05-07 Gabriel Mansi * libxvmc/viaLowLevel.h: * unichrome/via_accel.c: (viaFlushPCI), (viaDisableVQ), (viaAccelSync): * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * unichrome/via_dri.c: (VIADRIRingBufferInit): * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_id.c: * unichrome/via_swov.c: (viaWaitHQVFlip), (VIAVidHWDiffInit), (viaSetColorSpace), (ViaInitVideoStatusFlag), (ViaSetVidCtl), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16), (SetColorKey), (SetChromaKey), (Upd_Video): * unichrome/via_video.c: (DecideOverlaySupport), (Flip), (viaDmaBlitImage), (viaPutImage): Fix Xv for P4M890. 2007-04-30 Gabriel Mansi * unichrome/via_swov.c: (Upd_Video): * unichrome/via_xvmc.c: (ViaInitXVMC): Disable interpolation when the source width is greater than 800, otherwise the picture wraps around the screen (bug #109). Fix a typo in ViaInitXVMC (bug #111). 2007-04-14 Benno Schulenberg * unichrome/via_id.c: (ViaDoubleCheckCLE266Revision), (ViaCheckCardId): VN -> VM, message tweaks, and trailing white space fixes. 2007-03-28 Gabriel Mansi * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO): * unichrome/via_swov.c: (viaWaitHQVFlip), (VIAVidHWDiffInit), (viaSetColorSpace), (ViaInitVideoStatusFlag), (ViaSetVidCtl), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16), (SetColorKey), (SetChromaKey), (Upd_Video): * unichrome/via_video.c: (Flip), (viaDmaBlitImage), (viaPutImage): Fix Xv for CX700. 2007-03-20 Xavier Bachelot * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * unichrome/via_dri.c: (VIADRIRingBufferInit): * unichrome/via_driver.c: * unichrome/via_id.c: * unichrome/via_id.h: * unichrome/via_mode.c: (ViaGetMemoryBandwidth), (ViaModePrimary): * unichrome/via_mode.h: * unichrome/via_swov.c: (VIAVidHWDiffInit), (viaCalculateVideoColor), (viaSetColorSpace), (ViaInitVideoStatusFlag), (SetFIFO_V3), (SetFIFO_V3_64or32or32): * unichrome/via_video.c: (viaInitVideo): * unichrome/via_xvmc.c: (ViaInitXVMC): Initial support for P4M890. 2007-03-09 Gabriel Mansi * unichrome/via_accel.c: (viaFlushPCI), (viaAccelSync), (viaInitXAA): * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * unichrome/via_driver.c: (VIAPreInit), (VIALeaveVT), (VIACloseScreen): * unichrome/via_id.c: * unichrome/via_id.h: * unichrome/via_mode.c: (ViaGetMemoryBandwidth), (ViaModePrimary): * unichrome/via_mode.h: * unichrome/via_swov.c: (viaWaitHQVFlip), (VIAVidHWDiffInit), (viaCalculateVideoColor), (viaSetColorSpace), (ViaInitVideoStatusFlag), (ViaSetVidCtl), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16), (SetColorKey), (SetChromaKey), (Upd_Video): * unichrome/via_video.c: (DecideOverlaySupport), (viaInitVideo), (Flip), (viaDmaBlitImage), (viaPutImage): * unichrome/via_xvmc.c: (ViaInitXVMC): Initial support for P4M900. 2007-03-08 Xavier Bachelot * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * unichrome/via_dri.c: (VIADRIRingBufferInit): * unichrome/via_driver.c: * unichrome/via_id.c: * unichrome/via_id.h: * unichrome/via_mode.c: (ViaGetMemoryBandwidth), (ViaModePrimary): * unichrome/via_mode.h: * unichrome/via_swov.c: (VIAVidHWDiffInit), (viaCalculateVideoColor), (viaSetColorSpace), (ViaInitVideoStatusFlag), (SetFIFO_V3), (SetFIFO_V3_64or32or32): * unichrome/via_video.c: (DecideOverlaySupport), (viaInitVideo): * unichrome/via_xvmc.c: (ViaInitXVMC): Initial support for CX700. 2007-03-04 Benno Schulenberg * unichrome/via.man: Textual tweaks and options ordered alphabetically. 2007-02-16 Benno Schulenberg * unichrome/via_accel.c: (viaSetClippingRectangle), (viaAccelSolidHelper), (viaAccelCopyHelper), (viaSubsequentMono8x8PatternFillRect), (viaSubsequentColor8x8PatternFillRect), (viaSubsequentSolidTwoPointLine), (viaSubsequentSolidHorVertLine): Limit x value to sixteen bits. Fixes a rendering glitch reported by Marg Huijgen ; solution found by Thomas. 2007-02-10 Thomas Hellström * unichrome/via_accel.c: (viaFlushDRIEnabled), (viaSubsequentSolidTwoPointLine): Fix line-clipping bug reported by Manuel Bilderbeek . 2007-02-06 Benno Schulenberg * unichrome/via_driver.c: Try CR39 when CR34 says zero during memory detection on the CLE266. Idea from Luc Verhaegen, patch by Mark Huijgen . 2007-01-20 Benno Schulenberg * ChangeLog Switch encoding of ChangeLog file to Unicode. Whitespace and format adjustments. 2007-01-20 Benno Schulenberg * unichrome/via_driver.c: (VIALoadRgbLut), (VIALoadPalette), (VIAScreenInit): Add ability to change gamma setting. Original patch by Gonzalo A. de la Vega , adapted from Luc Verhaegen's implementation. 2006-12-28 Thomas Hellström * unichrome/via_accel.c: (viaExaTexUploadToScreen): Work around an obscure hardware limitation when texturing from AGP. 2006-12-28 Thomas Hellström * unichrome/via_dri.c: (VIASetAgpMode): Fix AGP mode setting. 2006-12-28 Thomas Hellström Use non-power-of-two textures for EXA whenever possible. 2006-12-18 Jon Nettleton * unichrome/via_xvmc.c: Thomas needs a good drm test which means we need XvMC. I have re-enabled it for testing. 2006-12-15 Jon Nettleton * unichrome/via.h: * unichrome/via_swov.c: This is my cleanup commit of the excellent patch that Gabriel Mansi provided, which finishes the XVideo work on the VT3336 chipset. Nice work Gabriel. 2006-12-13 Jon Nettleton * unichrome/via_video.c: Don't use HQV Offset for HQV_CONTROL. 2006-12-11 Jon Nettleton * unichrome/via_video.c: * unichrome/via_swov.c: Looks like the VT3336 has the same offset as the VT3259 for the hardware overlay. 2006-12-10 Jon Nettleton * unichrome/via_memcpy.c: * unichrome/via_swov.c: Removed the previous changes; I am not ready to rewrite the assembly code for x86_64. The ColorSpace registers were being set up incorrectly for VT3336. 2006-12-09 Jon Nettleton * unichrome/via_memcpy.c: The ifdef's in memcpy.c only support i386 arch; should also support i86_64. 2006-12-09 Jon Nettleton * unichrome/via_xvmc.c: K8M890 does not support XvMC like the other chipsets; disable it for now. 2006-12-09 Jon Nettleton * unichrome/via_video.h: * unichrome/via_swov.h: * unichrome/via_swov.c: Made K8M890 XV FIFO settings match K8M800. Enabled XV_DEBUG. 2006-12-07 Jon Nettleton * unichrome/via_mode.h: Updated the BandwidthTable for K8M890 chipset. 2006-12-07 Thomas Hellström * unichrome/via_driver.c: (VIAEnterVT): Initialize the AGP ring buffer before command submission. 2006-12-07 Thomas Hellström * unichrome/via_driver.c: (VIAEnterVT): Blank and clear screen when entering VT. 2006-12-07 Thomas Hellström * unichrome/via_driver.c: (VIAEnterVT): Blank and clear screen when entering VT. 2006-12-07 Thomas Hellström * unichrome/via_accel.c: (viaAccelDMADownload), (viaExaDownloadFromScreen), (viaInitExa): Indent via_accel.c. 2006-12-07 Thomas Hellström * unichrome/via_accel.c: (viaAccelDMADownload): Fix download from screen which was reusing kernel argument data that was altered by the kernel. 2006-12-07 Thomas Hellström * unichrome/via_accel.c: (viaAccelDMADownload), (viaExaDownloadFromScreen): Reimplement download from screen to something more easily debuggable. 2006-12-06 Jon Nettleton * unichrome/via_driver.c: Fixed some of the boolean option changes that are inverses such as DisableIRQ. 2006-12-06 Thomas Hellström * unichrome/via_memory.c: (viaExaFBSave), (viaOffScreenLinear): Cause a "FatalError" if EXA is used with an un-patched Xserver, and an illegal save locked memory action is requested. 2006-12-06 Thomas Hellström * unichrome/via_driver.c: (VIAInitialize3DEngine): Proper register names in VIAInitialize3DEngine. 2006-12-06 Thomas Hellström * unichrome/via_driver.c: (VIALeaveVT), (VIAWriteMode), (VIACloseScreen): * unichrome/via_vbe.c: (ViaVbeSetMode): Now that we initialize the 3D engine every time we write mode, make sure this is done before setting up VQ and AGP so that those settings persist. The GPU will be unstable otherwise. Also fix some code comments. 2006-12-06 Thomas Hellström * unichrome/via_driver.c: (VIALeaveVT): Force 3D context upload after a VT switch. 2006-12-06 Thomas Hellström * unichrome/via_dri.c: (viaDRIFBMemcpy), (viaDRIOffscreenSave): Fix up previous commit for > 16MB sizes. 2006-12-06 Thomas Hellström * unichrome/via_dri.c: (viaDRIOffscreenSave), (viaDRIOffscreenRestore): * unichrome/via_driver.c: (VIAEnterVT), (VIALeaveVT): * unichrome/via_driver.h: Back up DRI offscreen memory before leaving VT and restore it when entering VT. It may be overwritten in between. Use PCI DMA blit for this if available. 2006-12-05 Thomas Hellström * unichrome/via_driver.c: (VIAWriteMode), (VIAInitialize3DEngine): * unichrome/via_vbe.c: (ViaVbeSetMode): With EXA + 3D we need to reinitialize the 3D engine after a mode switch (possibly the soft reset + 2D engine initialization). Otherwise the GPU will hang. 2006-12-05 Thomas Hellström * unichrome/via_driver.c: (VIAPreInit): Fix the dma2d option setting. 2006-12-05 Thomas Hellström * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO): Use a more aggressive fifo setting for CLE266 Cx. Boosts performance. Please report problems with this. 2006-12-05 Jon Nettleton * unichrome/via_video.c: * unichrome/via_swov.c: Added missing hardware overlay support for VT3336. 2006-12-04 Jon Nettleton * unichrome/via_driver.c: Added patch to fix the K8M890 hang on VT switch; submitted by Gabriel Mansi . 2006-12-01 Thomas Hellström * unichrome/via.man: * unichrome/via_bios.h: * unichrome/via_dri.c: (VIADRIScreenInit): * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_driver.h: Remove unused options. First pass cleaning up option handling. Make most boolean options work as expected; (that is, accepting both a "true" and a "false" argument). 2006-11-30 Jon Nettleton * unichrome/via_mode.c: * unichrome/via_accel.c: Added patch to fix some of the K8M890 logic; submitted by Gabriel Mansi . 2006-11-28 Jon Nettleton * unichrome/via_bandwidth.c: * unichrome/via_accel.c: Patched via_bandwidth.c for dumb mistake I made. Thanks, Gabriel Mansi, for the second set of eyes. Move HWCursor memory allocation even further in the driver initialization. 2006-11-25 Jon Nettleton * unichrome/via_id.c: * unichrome/via_accel.c: Added additional IDs for the K8M890 cards. Changed memory allocation order for the HW cursor and 2D engine. 2006-10-29 Thomas Hellström * libxvmc/viaLowLevel.c: * libxvmc/viaLowLevelPro.c: * unichrome/via_regs.h: Via managed to mix up the 2D / 3D engine busy status bits. Funny we never noticed this before. 2006-10-24 Thomas Hellström * unichrome/via_xvmc.c: (ViaXvMCCreateContext): Remove VT3314 (CN700, VM800 etc.) mpeg2 AGP DMA support. 2006-10-11 Xavier Bachelot reviewed by: Ivor * unichrome/via_bios.h: * unichrome/via_id.c: * unichrome/via_mode.h: * unichrome/via_video.c: (DecideOverlaySupport): DDR533 memory support and small cleanup. Fujitsu/Siemens Amilo L7320 pci id (reported by DeNayGo). 2006-10-03 Thomas Hellström * unichrome/via_video.c: (viaPutImage): Removed some stray debug messages. 2006-10-02 Benno Schulenberg * unichrome/via_driver.c: (VIASave), (VIARestore): Moved a line to after declarations for picky gcc-2.96, tweaked comments and debugging lines. 2006-09-27 Thomas Hellström * unichrome/via_memory.c: Don't include drm headers in non-dri build. 2006-09-25 Benno Schulenberg * unichrome/Makefile.am: Mention the overall revision number in the log, not just the driver code revision. 2006-09-24 Thomas Hellström * libxvmc/viaLowLevel.c: (initXvMCLowLevel): * libxvmc/viaLowLevelPro.c: (initXvMCLowLevel): * libxvmc/viaXvMC.c: (XvMCSetAttribute): Fix a mutex unlocking issue (Luc Verhaegen). Have the lowlevel drivers check for the correct chipid. 2006-09-24 Michal Ludvig * man/Makefile.am: Fix man-page symlink for out-of-tree build (trac ticket #50). 2006-09-22 Jon Nettleton * unichrome/via_drmclient.h: Include stdint.h instead of re-typedefining CARD32. 2006-09-22 Jon Nettleton * src/via_id.h * src/via_video.c * src/via_mode.c * src/via_mode.h * src/via_driver.c * src/via_swov.c * src/via_bandwidth.c * src/via_accel.c * src/via_vbe.c * src/via_xvmc.c * src/via_id.c Initial code for support of VT3336 cards. 2006-09-17 Benno Schulenberg * unichrome/via_driver.c: (VIASave): Put in a few extra debugging lines. 2006-09-05 Benno Schulenberg * unichrome/via_swov.c: Comment and whitespace tweaks. 2006-09-05 Benno Schulenberg * unichrome/via_id.c: Add an ID (trac ticket #67), note identical numbers, remove a duplicate, remove obsolete unknown, remove trailing tab. 2006-08-27 Benno Schulenberg * unichrome/via_id.c: Textual tweaks. 2006-08-27 Benno Schulenberg * unichrome/via_dri.c: (VIADRIAgpInit): Rearrange declarations to fix compilation problem with gcc-2.96, reported by Nikolai V. Ivanyushin . 2006-08-22 Benno Schulenberg * unichrome/via_accel.c: Whitespace adjustment; getting back close to Xorg. Comment tweaks and #endif clarifications. 2006-08-19 Benno Schulenberg * unichrome/via_swov.c: (viaWaitVideoCommandFire), (SetVideoWindow): Comment tweaks. 2006-08-18 Benno Schulenberg * unichrome/via_driver.h: Move definition of AGP_SIZE out of #ifdef VIA_HAVE_EXA block, to make the driver compile again for Xorg-6.8.2. 2006-08-10 Thomas Hellström * unichrome/via_mode.c: (ViaModeDotClockTranslate): * unichrome/via_video.c: (viaPaintColorkey): Re-enable Ivor's Dotclock computation. Enable accelerated redirected colorkey painting for Xv. 2006-07-28 Thomas Hellström * unichrome/via_driver.c: (VIAPreInit): ...And get default AGP size correct as well. 2006-07-28 Thomas Hellström * unichrome/via_accel.c: (viaIsAGP): * unichrome/via_dri.c: (VIADRIAgpInit): Fix false AGP detection and make sure we have the correct AGP size. 2006-07-27 Thomas Hellström * unichrome/via.man: * unichrome/via_accel.c: (viaExaUploadToScratch), (viaExaCheckComposite), (viaIsAGP), (viaInitExa), (viaInitAccel): * unichrome/via_ch7xxx.c: (ViaCH7xxxInit): * unichrome/via_dri.c: (VIADRIAgpInit): * unichrome/via_driver.c: (VIAPreInit), (VIAEnterVT), (VIALeaveVT), (VIAScreenInit), (VIACloseScreen): * unichrome/via_driver.h: Changes donated by "PConRails, LLC" and "Tungsten Graphics, Inc.": EXA and memory management optimizations, Manpage update. New options: ExaScratchSize MaxDRIMem AGPMem VBESaveRestore 2006-07-27 Thomas Hellström * unichrome/via.h: * unichrome/via_accel.c: * unichrome/via_dri.h: * unichrome/via_driver.h: * unichrome/via_mode.c: (ViaModeDotClockTranslate): * unichrome/via_swov.c: (ViaOverlayHide): * unichrome/via_video.c: (DecideOverlaySupport), (viaVideoFillPixmap), (viaPaintColorkey), (viaReputImage), (viaPutImage): Changes donated by "PConRails, LLC" and "Tungsten Graphics, Inc.": Video optimizations: Paint colorkey correctly under composite manager. Make sure the driver compiles with Xorg git. Don't reset the primary display FIFO after XV. It's never touched by the Xv code, and slows things down in VBE mode. 2006-07-11 Thomas Hellström * libxvmc/viaXvMC.c: * unichrome/via_dri.c: Change DRM major compatibility from 3.x.x to 2.x.x. 2006-07-10 Thomas Hellström * libxvmc/driDrawable.c: * libxvmc/viaLowLevel.c: * libxvmc/viaLowLevelPro.c: (finish_header_agp), (computeHQVScaleAndFilter): * libxvmc/viaXvMC.c: (yOffs), (vOffs), (uOffs), (defaultQMatrices), (releaseDecoder), (grabDecoder), (setupAttribDesc), (releaseAttribDesc), (releaseContextResources), (XvMCCreateContext), (XvMCDestroyContext), (XvMCCreateSurface), (XvMCDestroySurface), (XvMCPutSlice2), (XvMCPutSlice), (updateXVOverlay), (XvMCPutSurface), (debugControl), (XvMCBeginSurface), (XvMCSyncSurface), (XvMCLoadQMatrix), (XvMCRenderSurface), (XvMCCreateBlocks), (XvMCDestroyBlocks), (XvMCCreateMacroBlocks), (XvMCDestroyMacroBlocks), (XvMCCreateSubpicture), (XvMCSetSubpicturePalette), (findOverlap), (XvMCClearSubpicture), (XvMCCompositeSubpicture), (XvMCBlendSubpicture), (XvMCBlendSubpicture2), (XvMCSyncSubpicture), (XvMCFlushSubpicture), (XvMCDestroySubpicture), (XvMCGetSubpictureStatus), (XvMCFlushSurface), (XvMCGetSurfaceStatus), (XvMCQueryAttributes), (XvMCSetAttribute), (XvMCGetAttribute), (XvMCHideSurface): * libxvmc/xf86dri.c: Remove the "config.h" includes from libxvmc, as they break it. I wonder how the openChrome libXvMC has been working? Indent viaXvMC.c. 2006-07-10 Thomas Hellström * libxvmc/viaXvMC.c: (XvMCCreateContext): * unichrome/via_dri.c: (VIADRIRingBufferInit), (VIADRIScreenInit): * unichrome/via_xvmc.c: (ViaInitXVMC): Update DRM version checking. 2006-07-10 Thomas Hellström * unichrome/via_swov.c: (viaWaitVideoCommandFire): Increase video command fire timeout. 2006-07-10 Thomas Hellström * unichrome/via_memory.c: (viaOffScreenLinear): Fix dri close screen segfault caused by previous commit. 2006-06-15 Thomas Hellström * unichrome/via_dri.c: (VIADRIFBInit): * unichrome/via_driver.h: * unichrome/via_memory.c: (viaOffScreenLinear), (VIAAllocLinear): Fix severe dri memory allocation bug. (Reported by Trevor Kramer) 2006-05-11 Ivor Hewitt * configure.ac: * unichrome/via.h: * unichrome/via_accel.c: * unichrome/via_cursor.c: * unichrome/via_dri.c: * unichrome/via_driver.h: * unichrome/via_memcpy.c: * unichrome/via_memory.c: * unichrome/via_mode.c: * unichrome/via_shadow.c: * unichrome/via_swov.c: * unichrome/via_vbe.c: * unichrome/via_vgahw.c: * unichrome/via_video.c: * unichrome/via_xvmc.c: - Xorg xv ABI compatibility patch. (Marcin Kurek) 2006-04-14 Ivor Hewitt * libxvmc/Imakefile: - Unbreak makefile. 2006-03-19 Thomas Hellström * libxvmc/Makefile.am: * unichrome/Makefile.am: - Backport Makefile changes form xorg. 2006-03-17 Thomas Hellström * unichrome/via_driver.c: - Update the built-against macro to recognize Xorg if present. (Reported by Eric Anholt) 2006-03-17 Thomas Hellström * configure.ac: - Update compatibility check for XvMC. 2006-03-17 Thomas Hellström * unichrome/via_accel.c: (viaInitExa): * unichrome/via_driver.c: (VIAPreInit): - Support EXA 2.0. 2006-03-13 Thomas Hellström * unichrome/via_accel.c: (viaSetupForSolidLine), (viaSubsequentSolidTwoPointLine), (viaSetupForDashedLine): * unichrome/via_driver.h: - Possible fix for XAA bug rendering solid lines as dashed. (Reported by Lewin Edwards) 2006-03-08 Thomas Hellström * libxvmc/Imakefile: * unichrome/via_swov.c: * unichrome/via_swov.h: * unichrome/via_video.c: (viaInitVideo), (viaExitVideo), * unichrome/via_video.h: * unichrome/via_xvmc.c: (initViaXvMC), (cleanupViaXvMC), (stride), * unichrome/via_xvmc.h: * unichrome/via_xvpriv.h: - Run indent on above files after syncing them with Xorg. 2006-02-23 Xavier Bachelot * configure.ac: - Fix man pages suffix. - Bump driver version number to be equal to xorg. 2006-02-21 Ivor Hewitt * unichrome/via_bios.h: * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_mode.h: * unichrome/via_priv.h: * unichrome/via_swov.c: (viaOverlayGetV1V3Format), (viaOverlayGetSrcStartAddress), (viaOverlayGetFetch), (CreateSurface), (ViaSwovSurfaceCreate), (ViaSwovSurfaceDestroy), (VIAVidUpdateOverlay), (ViaOverlayHide): * unichrome/via_video.c: (viaInitVideo), (Flip), (viaDmaBlitImage), (viaPutImage), (viaQueryImageAttributes): - Lets have RV32 too. - Add 12x8 panel. 2006-02-10 Ivor Hewitt * unichrome/via.h: * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * unichrome/via_dri.c: (VIADRIRingBufferInit): * unichrome/via_mode.c: (ViaModePrimary): * unichrome/via_swov.c: (VIAVidHWDiffInit), (viaOverlayGetSrcStartAddress), (viaOverlayGetFetch), (viaCalculateVideoColor), (viaSetColorSpace), (ViaInitVideoStatusFlag), (ViaSetVidCtl), (SetFIFO_V3), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16), (SetColorKey), (SetChromaKey), (SetHQVFetch), (Upd_Video): * unichrome/via_video.c: (DecideOverlaySupport), (viaInitVideo), (viaDmaBlitImage): * unichrome/via_xvmc.c: (ViaInitXVMC), (ViaXvMCCreateContext): - Get some code exercised for VM800, let's see where it crumbles. 2006-01-29 Thomas Hellström * unichrome/via_vbe.c: (ViaVbeSetMode): - Fix VBE refresh setting. 2006-01-29 Thomas Hellström * unichrome/via_accel.c: (viaInitExa): * unichrome/via_driver.c: (VIAPreInit): - Merge EXA branch revisions 152:155 2006-01-29 Thomas Hellström * unichrome/via_swov.c: * unichrome/via_video.c: (viaXvError), (viaReputImage), (viaSetupAdaptors), (viaDmaBlitImage), (viaPutImage): * unichrome/via_xvpriv.h: - Removed time.h and sys/time.h includes from via_swov.c (Reported by George E Sollish). - More verbose Xv error reporting. 2006-01-27 Thomas Hellström * unichrome/via.man: * unichrome/via_3d.c: * unichrome/via_accel.c: (viaAccelPlaneMaskHelper), (viaInitExa), (viaInitAccel), (viaExitAccel), (viaFinishInitAccel): * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_driver.h: - Merge EXA branch revisions 138:152 2006-01-27 Thomas Hellström * unichrome/via_mode.c: (ViaModePrimary): - Import Luc's fix for sometimes-blanking CRTs on CLE266. (Luc Verhaegen) 2006-01-27 Thomas Hellström * unichrome/via_swov.c: (viaWaitVideoCommandFire): - The previous commit causes problems with older X versions. Avoid using gettimeofday(). Reported by Paul Bender. 2006-01-26 Thomas Hellström * unichrome/via_swov.c: (viaTimeDiff), (viaWaitVideoCommandFire): - Make the Xv viaWaitVideoCommandFire loop time out. Better than server hang? 2006-01-26 Thomas Hellström * unichrome/via.man: * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_driver.h: * unichrome/via_video.c: (viaInitVideo): - Added a "NoXVDMA" option to disable PCI DMA for Xv image transfers. May turn out useful to vlc users. - Updated man page. 2006-01-26 Thomas Hellström * unichrome/via_driver.c: - Added vgaHWGetIndex to vgaHW symbol list. (Reported by Ole Sandum) 2006-01-26 Thomas Hellström * unichrome/via_swov.c: (ViaOverlayHide): - Fix HQV offset bug. 2006-01-26 Thomas Hellström * libxvmc/driDrawable.c: (drawStamp), (getDRIDrawableInfoLocked), (driDestroyHashContents): * libxvmc/driDrawable.h: * libxvmc/viaLowLevel.c: (hwlLock), (hwlUnlock), (timeDiff), (viaDMATimeStampLowLevel), (viaDMAWaitTimeStamp), (viaDMAInitTimeStamp), (viaDMACleanupTimeStamp), (viaMpegGetStatus), (viaMpegIsBusy), (syncDMA), (syncVideo), (syncAccel), (syncMpeg), (pciFlush), (agpFlush), (flushXvMCLowLevel), (flushPCIXvMCLowLevel), (pciCommand), (viaMpegSetSurfaceStride), (viaVideoSetSWFLipLocked), (viaVideoSWFlipLocked), (viaMpegSetFB), (viaMpegBeginPicture), (viaMpegReset), (viaMpegWriteSlice), (viaVideoSubPictureOffLocked), (viaVideoSubPictureLocked), (viaBlit), (syncXvMCLowLevel), (initXvMCLowLevel), (closeXvMCLowLevel): * libxvmc/viaLowLevel.h: * libxvmc/viaLowLevelPro.c: (initHQVShadow), (setHQVHWDeinterlacing), (setHQVDeblocking), (setHQVStartAddress), (setHQVColorSpaceConversion), (setHQVFetchLine), (setHQVScale), (setHQVSingleDestination), (setHQVDeinterlacing), (setHQVTripleBuffer), (finish_header_agp), (hwlLock), (hwlUnlock), (timeDiff), (viaDMATimeStampLowLevel), (viaDMAWaitTimeStamp), (viaDMAInitTimeStamp), (viaDMACleanupTimeStamp), (viaMpegGetStatus), (viaMpegIsBusy), (syncDMA), (syncVideo), (syncAccel), (syncMpeg), (pciFlush), (agpFlush), (uploadHQVDeinterlace), (uploadHQVShadow), (flushXvMCLowLevel), (flushPCIXvMCLowLevel), (viaMpegSetSurfaceStride), (viaVideoSetSWFLipLocked), (viaVideoSWFlipLocked), (viaMpegSetFB), (viaMpegBeginPicture), (viaMpegReset), (viaMpegWriteSlice), (viaVideoSubPictureOffLocked), (viaVideoSubPictureLocked), (viaBlit), (syncXvMCLowLevel), (updateLowLevelBuf), (cleanupLowLevelBuf), (releaseXvMCLowLevel), (initXvMCLowLevel), (setLowLevelLocking), (closeXvMCLowLevel), (computeDownScaling), (computeHQVScaleAndFilter), (setupBackBuffer): * libxvmc/viaXvMCPriv.h: * libxvmc/vldXvMC.h: * libxvmc/xf86dri.c: (uniDRIDestroyContext), (uniDRICreateDrawable), (uniDRIDestroyDrawable), (uniDRIGetDrawableInfo): * libxvmc/xf86dri.h: * libxvmc/xf86dristr.h: - Run indent on libXvMC. Sync XvMC with Xorg 7.0. 2006-01-26 Thomas Hellström * unichrome/via_dri.c: (VIADRIKernelInit), (VIADRIMapInit): * unichrome/via_driver.h: - Add a framebuffer map for DRI. Don't just assume that the framebuffer map handle is the physical address. 2006-01-12 Thomas Hellström * unichrome/via_accel.c: (viaExaDownloadFromScreen), (viaExaTexUploadToScreen), (viaExaUploadToScreen), (viaExaCheckComposite): * unichrome/via_driver.h: - Exa branch revision 132:138 merge. 2006-01-12 Thomas Hellström * unichrome/via_swov.c: (CreateSurface): * unichrome/via_video.c: (viaInitVideo), (Flip), (viaDmaBlitImage): - Fix planar Xv Flipping and surface allocation size. (Reported by Tim, MagicITX) - Fix Xv dmablit strides and bump drm version for dmablit to 2.9.0, since there is a direction bug in earlier versions. 2006-01-09 Thomas Hellström * libxvmc/viaXvMC.c: (releaseContextResources): * unichrome/via_swov.c: (CreateSurface), (ViaSwovSurfaceDestroy): - Mark already destroyed XvMC contexts as bad, in case clients try to destroy them twice. - Don't try to destroy YV12 buffers when exiting XvMC video. 2006-01-08 Thomas Hellström * unichrome/via_accel.c: (viaPixelARGB8888): - Merge exa_branch 130:132. Rendering errors. - Changelog typo. 2006-01-08 Thomas Hellström * unichrome/via_3d.c: (viaSet3DFlags), (viaSet3DCompositeOperator): * unichrome/via_accel.c: (viaIsAGP): - Merge exa_branch 127:130. Rendering errors. 2006-01-08 Thomas Hellström * unichrome/Makefile.am: - Modular build fix. (Boris Dusek) 2006-01-07 Thomas Hellström * unichrome/Imakefile: * unichrome/via_accel.c: (viaDumpDMA), (viaFlushPCI), (viaFlushDRIEnabled), (viaSetupCBuffer), (viaAccelClippingHelper), (viaAccelSolidHelper), (viaAccelPlaneMaskHelper), (viaAccelTransparentHelper), (viaAccelCopyHelper), (viaSetupForScreenToScreenCopy), (viaSubsequentScreenToScreenCopy), (viaSetupForSolidFill), (viaSubsequentSolidFillRect), (viaSetupForMono8x8PatternFill), (viaSubsequentMono8x8PatternFillRect), (viaSetupForColor8x8PatternFill), (viaSubsequentColor8x8PatternFillRect), (viaSetupForCPUToScreenColorExpandFill), (viaSubsequentScanlineCPUToScreenColorExpandFill), (viaSetupForImageWrite), (viaSubsequentImageWriteRect), (viaSetupForSolidLine), (viaSubsequentSolidTwoPointLine), (viaSubsequentSolidHorVertLine), (viaSetupForDashedLine), (viaAccelMarkSync), (viaExaPrepareSolid), (viaExaSolid), (viaExaPrepareCopy), (viaExaCopy), (viaExaCompositePictDesc), (viaExaPrintComposite), (viaBitExpandHelper), (viaPixelARGB8888), (viaExpandablePixel), (viaCheckUpload), (viaOrder), (viaExaDownloadFromScreen), (viaExaTexUploadToScreen), (viaExaUploadToScreen), (viaExaUploadToScratch), (viaExaCheckComposite), (viaIsAGP), (viaIsOffscreen), (viaExaPrepareComposite), (viaExaComposite), (viaInitExa), (viaInitAccel), (viaExitAccel), (viaFinishInitAccel), (viaAccelBlitRect), (viaAccelFillRect), (viaAccelSyncMarker): * unichrome/via_dga.c: * unichrome/via_dmabuffer.h: * unichrome/via_dri.c: (VIADRIFBInit): * unichrome/via_driver.c: (VIALeaveVT), (VIAScreenInit), (VIAWriteMode), (VIACloseScreen): * unichrome/via_driver.h: - Merge in exa_branch from revision 104 to 127. Exa Composite acceleration. See the branch Changelog for a detailed description of changes. 2006-01-06 Thomas Hellström * unichrome/via_accel.c: (viaExaDownloadFromScreen), (viaExaUploadToScreen): * unichrome/via_video.c: (viaDmaBlitImage): - Update Xv blit to new blit-combining feature of DRM. (Idea from Luc Verhaegen/Unichrome). - Prepare for ugly via_drm.h dmablit IOCTL arg change and via_drm.h versioning. 2005-12-29 Thomas Hellström * unichrome/via_video.c: (viaDmaBlitImage): - Fix Xv YUY2/RVXX dmaBlit stride. 2005-12-26 Thomas Hellström * libxvmc/Makefile.am: - Modular built two identical XvMC libs. The pro lib was not a pro lib. Fix this. (Tim Dodge) 2005-12-15 Thomas Hellström * unichrome/via_accel.c: (viaInitAccel): - Make sure the accel marker system is properly initialized. 2005-12-08 Thomas Hellström * unichrome/via_driver.c: (VIAScreenInit): * unichrome/via_memory.c: (VIAAllocLinear): - Protect the accelerated initial sceen clearing with a DRI lock. - Submit the correct context for drm memory allocation. 2005-12-08 Thomas Hellström * unichrome/via_ch7xxx.c: (CH7xxxModeI2C): * unichrome/via_dri.c: (VIADRIAgpInit): * unichrome/via_driver.c: (VIAScreenInit): * unichrome/via_id.c: - Moved the memset from previous commit to after dri is initialized, so that AGP command submission will work. - Silenced some warnings. 2005-12-08 Thomas Hellström * unichrome/via_driver.c: (VIAScreenInit): * unichrome/via_mode.c: (ViaModePrimary): * unichrome/via_vbe.c: (ViaVbeSetMode): - Moved memset to blank screen from ModeSetting to ScreenInit, in an attempt to avoid long standing hangs on K8M800. Also use the 2D engine for this if acceleration is enabled. 2005-12-07 Thomas Hellström * Makefile.in: - Removed Makefile.in since it is generated by the build process. 2005-12-06 Jon Nettleton * Makefile.am: * Makefile.in: - Added Makefile.am and Makefile.in to allow running make in the root directory. 2005-12-06 Thomas Hellström * acinclude.m4: * autogen.sh: * configure.ac: * libxvmc/Makefile.am: * libxvmc/driDrawable.c: * libxvmc/viaLowLevel.c: * libxvmc/viaLowLevelPro.c: * libxvmc/viaXvMC.c: * libxvmc/viaXvMCPriv.h: * libxvmc/xf86dri.c: * man/Makefile.am: * unichrome/Makefile.am: * unichrome/via_accel.c: * unichrome/via_bandwidth.c: * unichrome/via_ch7xxx.c: * unichrome/via_cursor.c: * unichrome/via_dga.c: * unichrome/via_dri.c: * unichrome/via_driver.c: * unichrome/via_i2c.c: * unichrome/via_id.c: * unichrome/via_memcpy.c: * unichrome/via_memory.c: * unichrome/via_mode.c: * unichrome/via_shadow.c: * unichrome/via_vbe.c: * unichrome/via_vgahw.c: * unichrome/via_vt162x.c: * unichrome/via_xvmc.c: - Adjust for modular build. 2005-12-04 Thomas Hellström * unichrome/via_vt162x.c: (VT1622ModeCrtc): - Fix trac item #13. This will probably also make TV-out work on some K8M/N800 laptops, and will probaly fix TV-out after a resume. 2005-12-02 Thomas Hellström * libxvmc/Imakefile: * libxvmc/xf86dri.c: - 64 bit fixes on libviaXvMC* 2005-12-02 Thomas Hellström * unichrome/via_accel.c: (viaAccelPlaneMaskHelper), (viaAccelTransparentHelper), (viaSetupForScreenToScreenCopy), (viaSetupForSolidFill), (viaSetupForMono8x8PatternFill), (viaSetupForColor8x8PatternFill), (viaSetupForCPUToScreenColorExpandFill), (viaSetupForImageWrite), (viaSetupForSolidLine), (viaSubsequentSolidTwoPointLine), (viaSetupForDashedLine), (viaAccelMarkSync), (viaExaPrepareSolid), (viaExaPrepareCopy), (viaInitAccel), (viaDGABlitRect), (viaDGAFillRect): * unichrome/via_driver.c: * unichrome/via_driver.h: - Merge exa_branch revisions 91:104: Add support for EXA planemasks. Tell loader about some missing EXA functions (Reported by Adam Jackson). Fix broken XAA dashed lines. 2005-12-01 Thomas Hellström * libxvmc/Imakefile: * unichrome/Imakefile: * unichrome/via_driver.c: - Remove drmCommandWriteRead from drm loader symbols again. Ivor had already added it :) - Fix a typo in unichrome/Imakefile that broke build on x86_64. - Add $(PICFLAGS) to libxvmc Makefile to make it build on x86_64. 2005-12-01 Thomas Hellström * unichrome/via_driver.c: * unichrome/via_memory.c: (VIAFreeLinear): - Add drmCommandWriteRead to drm loader symbols. - Make the drm freemem call drmCommandWrite. 2005-11-29 Thomas Hellström * unichrome/via_accel.c: (viaInitAccel): * unichrome/via_memory.c: (VIAAllocLinear): - Merge exa_branch revisions 86:91 2005-11-29 Thomas Hellström * unichrome/Imakefile: - Yet another drm.h include fixup. For 6.8 and earlier? 2005-11-28 Ivor Hewitt * unichrome/via_id.c: - Just another id. (Tobias Blom) 2005-11-28 Thomas Hellström * unichrome/Imakefile: - Include the correct drm.h file. This is important for 64 bit builds. 2005-11-26 Thomas Hellström * unichrome/via_accel.c: (viaFlushDRIEnabled), (viaSetupCBuffer): - Merged EXA branch changes between revisions 84 and 86. 2005-11-23 Thomas Hellström * unichrome/via_accel.c: (viaFlushPCI), (viaFlushDRIEnabled), (viaSetupCBuffer), (viaTearDownCBuffer), (viaEnableVQ), (viaDisableVQ), (viaAccelSetMode), (viaInitialize2DEngine), (viaAccelSync), (viaSetClippingRectangle), (viaAccelClippingHelper), (viaAccelSolidHelper), (viaAccelTransparentHelper), (viaAccelCopyHelper), (viaSetupForScreenToScreenCopy), (viaSubsequentScreenToScreenCopy), (viaSetupForSolidFill), (viaSubsequentSolidFillRect), (viaSetupForMono8x8PatternFill), (viaSubsequentMono8x8PatternFillRect), (viaSetupForColor8x8PatternFill), (viaSubsequentColor8x8PatternFillRect), (viaSetupForCPUToScreenColorExpandFill), (viaSubsequentScanlineCPUToScreenColorExpandFill), (viaSetupForImageWrite), (viaSubsequentImageWriteRect), (viaSetupForSolidLine), (viaSubsequentSolidTwoPointLine), (viaSubsequentSolidHorVertLine), (viaSetupForDashedLine), (viaSubsequentDashedTwoPointLine), (viaInitXAA), (viaAccelMarkSync), (viaAccelWaitMarker), (viaExaPrepareSolid), (viaExaSolid), (viaExaPrepareCopy), (viaExaCopy), (viaExaDownloadFromScreen), (viaExaUploadToScreen), (viaInitExa), (viaInitAccel), (viaExitAccel), (viaDGABlitRect), (viaDGAFillRect): - Merged EXA branch changes between revisions 74 and 84. Mainly indentations and minor bugfixes. 2005-11-15 Thomas Hellström * unichrome/via_swov.c: (ViaSwovSurfaceCreate), (ViaSwovSurfaceDestroy): * unichrome/via_video.c: (viaSetupAdaptors): * unichrome/via_xvpriv.h: - Fix Xv surface destruction and re-allocation. (Reported by Cedric Berger). 2005-11-15 Thomas Hellström * unichrome/Imakefile: * unichrome/via_accel.c: (viaTearDownCBuffer), (viaAccelSolidHelper), (viaAccelCopyHelper), (viaExaDownloadFromScreen), (viaExaUploadToScreen): * unichrome/via_driver.c: (VIAScreenInit): - Merged changes in exa_branch revisions 67 to 74. For a detailed ChangeLog, see that branch. 2005-11-09 Thomas Hellström * unichrome/Imakefile: * unichrome/via_accel.c: (viaFlushPCI), (viaFlushDRIEnabled), (viaSetupCBuffer), (viaTearDownCBuffer), (viaInitAgp), (viaEnableVQ), (viaDisableVQ), (viaAccelSetMode), (viaInitialize2DEngine), (viaAccelSync), (viaSetClippingRectangle), (viaDisableClipping), (viaAccelClippingHelper), (viaAccelSolidHelper), (viaAccelTransparentHelper), (viaAccelCopyHelper), (viaSetupForScreenToScreenCopy), (viaSubsequentScreenToScreenCopy), (viaSetupForSolidFill), (viaSubsequentSolidFillRect), (viaSetupForMono8x8PatternFill), (viaSubsequentMono8x8PatternFillRect), (viaSetupForColor8x8PatternFill), (viaSubsequentColor8x8PatternFillRect), (viaSetupForCPUToScreenColorExpandFill), (viaSubsequentScanlineCPUToScreenColorExpandFill), (viaSetupForImageWrite), (viaSubsequentImageWriteRect), (viaSetupForSolidLine), (viaSubsequentSolidTwoPointLine), (viaSubsequentSolidHorVertLine), (viaSetupForDashedLine), (viaSubsequentDashedTwoPointLine), (viaInitXAA), (viaAccelMarkSync), (viaAccelWaitMarker), (viaExaPrepareSolid), (viaExaSolid), (viaExaDoneSolidCopy), (viaExaPrepareCopy), (viaExaCopy), (viaExaDownloadFromScreen), (viaExaUploadToScreen), (viaInitExa), (viaInitAccel), (viaExitAccel), (viaDGABlitRect), (viaDGAFillRect), (viaDGAWaitMarker): * unichrome/via_cursor.c: (VIALoadCursorImage): * unichrome/via_dga.c: * unichrome/via_dri.c: (VIADRIFBInit), (VIADRIScreenInit), (VIADRICloseScreen), (VIADRIFinishScreenInit): * unichrome/via_driver.c: (VIASetup), (VIAPreInit), (VIALeaveVT), (VIAScreenInit), (VIAWriteMode), (VIACloseScreen), (VIASwitchMode): * unichrome/via_driver.h: * unichrome/via_memcpy.c: (viaVidCopyInit): * unichrome/via_memory.c: (VIAFreeLinear), (offScreenLinear), (VIAAllocLinear), (VIAInitLinear): * unichrome/via_priv.h: * unichrome/via_vbe.c: (ViaVbeSetMode): - Merge exa_branch from revision 52 to 67. For a detailed Changelog, check that branch. 2005-11-09 Ivor Hewitt * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_mode.c: (ViaModeDotClockTranslate): - Fix pro-mode and remove pro warning. (Paul Bender) 2005-11-08 Ivor Hewitt * unichrome/via_driver.c: (VIASwitchMode): - Don't kickVblank with no DRI enabled. (Joris van Rantwijk) 2005-11-02 Ivor Hewitt * unichrome/via_mode.c: (ViaGetMemoryBandwidth): * unichrome/via_mode.h: - Give VM800 some bandwidth. 2005-11-01 Thomas Hellström * libxvmc/viaLowLevel.c: (viaDMAInitTimeStamp): * libxvmc/viaLowLevelPro.c: (viaDMAInitTimeStamp), (updateLowLevelBuf): * unichrome/via_drmclient.h: - Fix compilation errors caused by the drm / dri update. (reported by Tarun Kripalani) 2005-10-31 Thomas Hellström * unichrome/via_accel.c: (VIAInitAccel): * unichrome/via_cursor.c: (VIAHWCursorInit): - Second attempt at fixing the hw cursor issue. There were actually two errors involved. 2005-10-31 Thomas Hellström * unichrome/via_xvpriv.h: - Fix stray include left over by previous commit. 2005-10-31 Ivor Hewitt * unichrome/via_id.c: - Mitac 8889 device id. (Daniel Schindler) 2005-10-30 Thomas Hellström * unichrome/via_accel.c: (VIAInitAccel): - Revert the hardware cursor fix since it for some strange reason makes hw cursors white. Need to figure out why. 2005-10-30 Thomas Hellström * unichrome/via_video.c: (viaInitVideo), (viaSetupAdaptors), (nv12cp), (viaDmaBlitImage), (viaPutImage), (nv12Blit): * unichrome/via_xvpriv.h: - Enable DMA Xv image transfers also for PM8X0 / CN400. YV12 to NV12 conversion is still software but now takes place in system memory instead of during transfer to framebuffer memory. CPU usage is much improved on PM8X0. Less so on CN400. Hardware YV12 to NV12 conversion using the blitter was implemented and tested but was very slow, probably due to the fact that blitting only took place one column at a time. Since sync on the 2D engine currently requires a busy-wait, the approach was not only slow, but also CPU-consuming. 2005-10-27 Thomas Hellström * unichrome/via_video.c: (viaExitVideo), (viaSaveVideo), (viaRestoreVideo), (VIAVidAdjustFrame): - Fix server crash when compiled without -DXvExtension. 2005-10-27 Thomas Hellström * unichrome/via_dri.c: (VIADRIRingBufferInit), (VIADRIScreenInit), (VIADRIFinishScreenInit), (VIADRIMapInit): * unichrome/via_dri.h: * unichrome/via_driver.h: * unichrome/via_drm.h: * unichrome/via_memory.c: (VIAFreeLinear), (VIAAllocLinear): * unichrome/via_video.c: (viaInitVideo): * unichrome/via_xvmc.c: (ViaInitXVMC): - Sync dri handling with Xorg. This should hopefully make it run with Mesa 6.4 again. (Luc Verhaegen, Eric Anholt, me) 2005-10-27 Thomas Hellström * unichrome/via_video.c: (viaPutImage): - Make via_video.c compile without -DXF86DRI. Was broken with the dmablit commit. (Reported by Luc Verhaegen) 2005-10-27 Thomas Hellström * unichrome/via_accel.c: (VIAInitAccel): - Fix HW cursor memory allocation. 2005-10-18 Ivor Hewitt * unichrome/via_bandwidth.c: (ViaSetPrimaryFIFO), (ViaSetSecondaryFIFO): * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_id.c: * unichrome/via_id.h: * unichrome/via_swov.c: (VIAVidHWDiffInit): - Remaining device id's lying about. - Remove PM800 conditionals. 2005-10-18 Ivor Hewitt * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_id.c: * unichrome/via_id.h: * unichrome/via_mode.h: - Device id additions. AsRock P4VM800 reported by Mariano Benedettini 2005-09-25 Thomas Hellström * unichrome/via.h: * unichrome/via_dri.c: (VIADRIRingBufferInit), (VIADRIFinishScreenInit): * unichrome/via_dri.h: * unichrome/via_driver.h: * unichrome/via_drm.h: * unichrome/via_priv.h: * unichrome/via_swov.c: (viaWaitHQVFlip), (viaWaitHQVFlipClear), (viaWaitHQVDone), (viaOverlayGetV1V3Format), (viaOverlayGetSrcStartAddress), (viaOverlayGetFetch), (viaSetColorSpace), (ViaSetVidCtl), (AddHQVSurface), (ViaSwovSurfaceCreate), (ViaSwovSurfaceDestroy), (SetFIFO_V3_64or32or32), (SetFIFO_V3_64or32or16), (SetColorKey), (SetChromaKey), (SetHQVFetch), (Upd_Video), (VIAVidUpdateOverlay), (ViaOverlayHide): * unichrome/via_video.c: (DecideOverlaySupport), (viaResetVideo), (viaSaveVideo), (viaExitVideo), (viaInitVideo), (viaReputImage), (viaSetupAdaptors), (viaStopVideo), (Flip), (nv12cp), (viaDmaBlitImage), (viaPutImage), (viaQueryImageAttributes): * unichrome/via_xvmc.c: (ViaInitXVMC): * unichrome/via_xvpriv.h: Big Xv update. - Bring Xv in sync with Xorg, which includes RV15 and RV16 support. - Add support for PCI DMA Xv image transfer. This requires DRM >= 2.7.0, and does not yet work on Unichrome Pro group A, since YV12->NV12 hardware conversion is not yet implemented. 2005-08-13 Thomas Hellström * unichrome/via_swov.c: (ViaSwovSurfaceDestroy): - Destroy video surfaces on video exit / stop. 2005-08-13 Thomas Hellström * unichrome/via_driver.c: (VIAAdjustFrame) - Fix Xv panning also for VBEModes. 2005-08-12 Thomas Hellström * unichrome/via_driver.c: (VIAEnterVT): - Fix segfault on EnterVT when DRI is not enabled. (Joris van Rantwijk) 2005-08-12 Thomas Hellström * unichrome/via_priv.h: * unichrome/via_swov.c: (VIAVidUpdateOverlay): * unichrome/via_video.c: (RegionsEqual), (viaReputImage), (viaSetupAdaptors), (VIAVidAdjustFrame): - Fix Xv panning. Speed up overlay updates on window moves. 2005-08-12 Thomas Hellström * unichrome/via_video.c: (viaExitVideo): - Fix stopvideo for all ports and adaptors. 2005-08-10 Ivor Hewitt * unichrome/Imakefile: * unichrome/via_bios.h: * unichrome/via_ch7xxx.c: (CH7xxxPrintRegs), (ViaCH7xxxDetect), (CH7xxxSave), (CH7xxxRestore), (CH7xxxDACSenseI2C), (CH7xxxDACSense), (CH7011ModeIndex), (CH7019ModeIndex), (CH7xxxModeValid), (CH7xxxModeI2C), (CH7xxxModeCrtc), (CH7xxxTVPower), (CH7019LCDPower), (ViaCH7xxxInit): * unichrome/via_ch7xxx.h: * unichrome/via_driver.c: (VIAPreInit): * unichrome/via_id.c: * unichrome/via_mode.c: (ViaTVDetect), (ViaTVInit): * unichrome/via_vt162x.c: (ViaVT162xDetect), (VT1625DACSenseI2C), (VT1625DACSense), (VT1621ModeIndex), (VT1622ModeIndex), (VT1625ModeValid), (VT1622ModeI2C), (VT1622ModeCrtc), (VT1625Power), (ViaVT162xInit): * unichrome/via_vt162x.h: - Initial steps to incorporating CH7xxx and VT1625 support; merging patches from David George, Philip Prindeville, Terry Lewis. 2005-07-30 Ivor Hewitt * libxvmc/Imakefile: * unichrome/via_mode.c: (ViaGetMemoryBandwidth), (ViaModePrimaryVGA), (ViaModePrimary): * unichrome/via_swov.c: - Merge fixes from xorg for typos in mode setting and sync set 2005-07-18 Ivor Hewitt * unichrome/via_id.c: - Additional card-id. Reported by Philip Prindeville. 2005-07-04 Thomas Hellström * unichrome/via_driver.c: (VIAPreInit), (VIAScreenInit): * unichrome/via_id.c: - Avoid calling DPMS to blank screen during init with VBEModes. - Add another card ID. 2005-06-29 Ivor Hewitt * unichrome/via_id.c: - Additional card-ids. Patch from Xavier Bachelot 2005-06-26 Thomas Hellström * libxvmc/viaLowLevelPro.c: (finish_header_agp), (syncDMA), (syncVideo), (pciFlush), (agpFlush), (uploadHQVDeinterlace), (uploadHQVShadow), (flushXvMCLowLevel), (flushPCIXvMCLowLevel), (viaMpegSetSurfaceStride), (viaVideoSetSWFLipLocked), (viaVideoSWFlipLocked), (viaMpegSetFB), (viaMpegBeginPicture), (viaMpegReset), (viaMpegWriteSlice), (viaVideoSubPictureOffLocked), (viaVideoSubPictureLocked), (viaBlit), (syncXvMCLowLevel), (releaseXvMCLowLevel), (initXvMCLowLevel), (closeXvMCLowLevel): - Clean up the VIDEO_DMA ifdef mess before xorg inclusion. - Make VIDEO_DMA wait for DMA quiescent before flipping, pending proper HQV locking. - Disable VIDEO_DMA to improve latency pending proper HQV locking. 2005-06-17 Thomas Hellström * unichrome/via_mode.c: (ViaSetPrimaryDotclock), (ViaSetSecondaryDotclock), (ViaComputeProDotClock), (ViaModeDotClockTranslate): - Free dotclock on Unichrome Pro. Pls report problems with unstable clocks. - Minor 64-bit fixes. 2005-06-16 Thomas Hellström * unichrome/via_xvmc.c: (ViaXvMCCreateContext), (ViaXvMCCreateSurface), (ViaXvMCCreateSubpicture): * unichrome/via_xvmc.h: - XvMC 64 bit fixes. XvMC now runs on K8M800 64-bit Linux. 2005-06-12 Thomas Hellström * unichrome/via_bios.h: * unichrome/via_i2c.c: * unichrome/via_mode.c: (ViaTVRestore): * unichrome/via_vt162x.c: (VT162xPrintRegs), (ViaVT162xDetect), (VT162xSave), (VT162xRestore), (ViaVT162xInit): - Fix up the vt1623 encoder: Correct device ID, number of registers and most of all reading from the i2cbus it is sitting on. 2005-06-11 Thomas Hellström * unichrome/via_dri.c: (VIADRIScreenInit): - Update via_dri.c to compile with new libdri. 2005-06-01 Thomas Hellström * unichrome/via_mode.c: (ViaModePrimary): * unichrome/via_vt162x.h: - Fix TV-out on Unichrome Pro. To make it work CRT+TV needs to be enabled in BIOS. Still it will hang the machine or possibly only the display chip on X server exit. - Import the 720x576Noscale mode for vt1622A/vt1623 from the Unichrome driver (Terry Barnaby) 2005-05-25 Thomas Hellström * libxvmc/viaLowLevelPro.c: (setHQVDeinterlacing): * libxvmc/viaXvMC.c: * unichrome/via_driver.c: * unichrome/via_mode.c: (ViaModePrimary): * unichrome/via_mode.h: * unichrome/via_vt162x.c: (ViaVT162xDetect): - Updated incorrect field order in libViaXvMCPro. - Fixed warnings about unresolved int10 symbols in the Unichrome driver. - Updated Unichrome Pro dotclocks - also for TV. - Made the driver recognize the vt1623 TV encoder on the EPIA SP13000. - Removed unnecessary define in viaXvMC.c. 2005-05-16 Thomas Hellström * libxvmc/driDrawable.c: (getDRIDrawableInfoLocked): * libxvmc/viaXvMC.c: (releaseContextResources), (XvMCCreateContext): * libxvmc/xf86dri.c: (uniDRIDestroyContext), (uniDRICreateDrawable), (uniDRIDestroyDrawable), (uniDRIGetDrawableInfo): * libxvmc/xf86dri.h: - Changed DRI client function names since they clash with via_dri.so, causing strange problems in, for example, xine. 2005-05-16 Thomas Hellström * unichrome/via_dri.c: (VIASetAgpMode), (VIADRIAgpInit): - Added better AGP mode control to the DDX. 2005-05-11 Thomas Hellström * prepare-ChangeLogSVN.pl: - Added the above file for generation of ChangeLog Entries. 2005-05-11 Thomas Hellström * libxvmc/driDrawable.c: * libxvmc/viaLowLevel.c: (hwlLock), (hwlUnlock), (setAGPSyncLowLevel), (viaDMATimeStampLowLevel), (flushXvMCLowLevel), (flushPCIXvMCLowLevel), (viaMpegSetSurfaceStride), (viaVideoSetSWFLipLocked), (viaVideoSWFlipLocked), (viaMpegSetFB), (viaMpegBeginPicture), (viaMpegReset), (viaMpegWriteSlice), (viaVideoSubPictureOffLocked), (viaVideoSubPictureLocked), (viaBlit), (syncXvMCLowLevel), (initXvMCLowLevel), (setLowLevelLocking), (closeXvMCLowLevel): * libxvmc/viaLowLevel.h: * libxvmc/viaLowLevelPro.c: (initHQVShadow), (setHQVHWDeinterlacing), (setHQVDeblocking), (setHQVStartAddress), (setHQVColorSpaceConversion), (setHQVFetchLine), (setHQVScale), (setHQVSingleDestination), (setHQVDeinterlacing), (setHQVTripleBuffer), (hwlLock), (hwlUnlock), (setAGPSyncLowLevel), (viaDMATimeStampLowLevel), (viaDMAInitTimeStamp), (uploadHQVDeinterlace), (uploadHQVShadow), (flushXvMCLowLevel), (flushPCIXvMCLowLevel), (viaMpegSetSurfaceStride), (viaVideoSetSWFLipLocked), (viaVideoSWFlipLocked), (viaMpegSetFB), (viaMpegBeginPicture), (viaMpegReset), (viaMpegWriteSlice), (viaVideoSubPictureOffLocked), (viaVideoSubPictureLocked), (viaBlit), (syncXvMCLowLevel), (updateLowLevelBuf), (cleanupLowLevelBuf), (initXvMCLowLevel), (setLowLevelLocking), (closeXvMCLowLevel), (computeDownScaling), (computeHQVScaleAndFilter), (setupBackBuffer): * libxvmc/viaXvMC.c: (grabDecoder), (releaseContextResources), (XvMCCreateContext), (XvMCCreateSurface), (XvMCPutSlice2), (XvMCPutSlice), (XvMCPutSurface), (XvMCBeginSurface), (XvMCSyncSurface), (XvMCLoadQMatrix), (XvMCCreateSubpicture), (XvMCSetSubpicturePalette), (XvMCClearSubpicture), (XvMCCompositeSubpicture), (XvMCBlendSubpicture2), (XvMCSyncSubpicture), (XvMCDestroySubpicture), (XvMCFlushSurface), (XvMCGetSurfaceStatus), (XvMCQueryAttributes), (XvMCSetAttribute), (XvMCGetAttribute), (XvMCHideSurface): * libxvmc/viaXvMCPriv.h: * unichrome/via_swov.c: (ViaSwovSurfaceCreate): * unichrome/via_video.c: (viaSetupAdaptors): * unichrome/via_xvpriv.h: - Added ChangeLog to the repository. - Made the DDX update the overlay if a change in surface format occured while it's dimensions are still the same. - Made the XvMCLowLevel struct opaque (void *) and not defined in the header file. This allows for different definitions for different hardware - Added a HQV shadow which holds the HQV context for the Unichrome Pro. The purpose is twofold: 1. If someone else touched the HQV since we last used it, we can upload the whole context. 2. We do not need to read from the HQV, which is bad because we have to halt the DMA engine to do that. - Added and activated mpeg deblocking for Unichrome Pro. - Added a number of HQV utility functions for the upcoming video engine free output. These are not activated yet. (Unichrome Pro.) - Added HW deinterlacing functions. Deactivated, since I cannot see any visible difference. (Unichrome Pro.) xserver-xorg-video-openchrome-0.3.3+git20160310/Makefile.am000066400000000000000000000023531267025031400230640ustar00rootroot00000000000000# Copyright 2005 Adam Jackson. # # 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 # on 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 # ADAM JACKSON 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. AUTOMAKE_OPTIONS = foreign SUBDIRS = src man tools EXTRA_DIST = COPYING NEWS README ChangeLog: $(CHANGELOG_CMD) dist-hook: ChangeLog xserver-xorg-video-openchrome-0.3.3+git20160310/NEWS000066400000000000000000000245451267025031400215360ustar00rootroot00000000000000openchrome 0.3.3 (23/05/2013) ----------------------------- This is a bugfix release. - Fix integer overflow in libchromeXvMC (CVE-2013-1994). - Various bug fixes and improvements. openchrome 0.3.2 (27/03/2013) ----------------------------- This is a bugfix release. - EXA fixes. Compositing is now enabled again. - TV out fixes and enhancements. - Fix memory detection on P4M800. - Fix for lockup when probing some I2C bus on P4M900. - VGA out probing with Vblank. - Fix building with autoconf 1.13.1. - Fix for X server 1.14. - Various bug fixes and improvements. openchrome 0.3.1 (04/09/2012) ----------------------------- This is a bugfix release. It mainly fixes a crash at startup with X server 1.13. openchrome 0.3.0 (20/07/2012) ----------------------------- The 0.3.0 release is a major step forward for the openchrome X.org driver. It brings most of the features that are needed with todays X server. The code has seen a major overhaul, with a lot of new features and a lot of cleanup. It has been tested on most of the available VIA IGPs and we believe there are no regression at this point. However, the testing was done on a limited range of hardware, so your mileage may vary. Please let us know if you have any trouble using it. * New Features : - TTM/GEM support. - KMS support. - Better RandR support. - XAA removal. - DGA removal. - Support for X server 1.13 API. - Code cleanup and bug fixes. * Known bugs and limitations : - Dual screen is not fully working. - EXA compositing is disabled. - KMS-enabled DRM module is not in upstream kernel yet. Starting with the 0.3.0 release, please submit bugs and patches to freedesktop.org bug tracker. https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/openchrome The old ticket tracker is kept as a reference only. It is still available at : http://www.openchrome.org/trac/report/1?asc=1&sort=ticket openchrome 0.2.906 (15/05/2012) ------------------------------- * New features : - VX900 Xv support. - EXA is now the default although compositing is buggy and thus disabled. * Bugfixes and enhancements : - Fix I420 Xv surface on CME engine. - Fix EXA to not require XAA module in X server. openchrome 0.2.905 (10/02/2012) ------------------------------- * New features : - VX900 support (Xv not supported yet). - VX855 XVideo support. * Bugfixes and enhancements : - More debug information to video decoding. - Add secondary FIFO support for K8M890 and P4M890. - Check the primary FIFO for VX855. - Add panel scale support for CLE266 and KM400. - Fix bug with malloc. - Enabled new mode switch for PM800 chipset. - Add option to enable unaccelerated RandR rotation ("SWRandR"). - Enable new mode switch for VM800 chipsets. - More debug traces to via_video.c. - Fix manual and add more comments. - Fix start address. - Optimization of the hardware accelerated cursor and XAA (K8M890 chipset). - Code clean up. - Fix bug with suspend and VT switch on VX800 chipset and 64bit systems. - Synchronize via_drm.h with drm-2.4.17. - Fix segfaults with EXA and XV. - Fix build on old kernels. - Replace RegionsEqual with REGION_EQUAL and use the xf86XVFillKeyHelperDrawable instead of xf86XVFillKeyHelper. - Fix DFP parameter description for the ActiveDevice option. - Manpage update and some minor changes. - Set colorkey for 2nd_monitor. - Add timeouts to HQV while loops. - Improve 2d performance on chipsets without AGP/PCIe. - Add option I2CDevices. - Disable Hardware Clipping for the VX855. - Re-Enable the VQ for VX800/VX855. - Disable AGP and DMA by default for VX800 and VX855. - Fixed freeze on 64bit system for K8M800 chipset. - Increase bandwidth to handle 1920x1200 resolution with DDR266. - Fix XV crash on PM800 post VX855 rework. - Fix several typo in code comments. - Update VX855 FIFO. - Fix bug with TV out flickering. - Replace the deprecated functions with new ones. Refer to "/xserver/include/os.h". - Replace remaining xalloc to malloc. - Change maximum line pitch and virtual height according to chipset. - Update 1024x600 modeline. - Add workaround for memory autodetection. - Enable new mode switch and panel support on K8M800 and VM800. - Fix type in VIASave. - Use DRICreatePCIBusID when available to create Bus ID string. - Restore video interrupt flag. - Fix OpenGL application crash on VX900 chipset. - Fix VIA VB8001 Mini-ITX Board (P4M900) support. - Add workaround for bad memory detection on some P4M800. - Fix resolution detection for OLPC 1.5. - Fix Xvideo crash on X.Org server 1.10. - Fix XAA displaying issues. - Fix cursor garbare after suspend/hibernate/resume on VX855/VX900. - Workaround EXA crash with new libcairo2. - Handle X server 1.12 (videoabi 12). - Add support for I420 Xv surface. - Limit video RAM size to 256 MB, PCI BAR can't handle more. - Add Harald Welte's registers dump tool. * New boards : - ASRock PV530, ECS P4M800PRO-M2 (V2.0) , FIC CE2A1, FIC PTM800Pro LF, Guillemot-Hercules ECafe EC900B, Hewlett Packard DX2020, Hewlett Packard t5550 Thin Client, Lenovo ThinkCenter E51 8714, MSI K8M890M2-V, MSI PM8M-V, MSI PM9M-V, OLPC XO 1.5, Semp Informática Notebook IS 1462, Sharp Mebius PC-CS30H, Siragon ML-6200, Twinhead K15V openchrome 0.2.904 (09/10/2009) ------------------------------- * New features : - Basic VX855 support. - VX800 support. - CX700, VX800 integrated TMDS support. - ARGB cursor support. - Panel modesetting code rework. * Bug fixes and enhancements : - Add checking of the initialization of the XFree86 framebuffer manager. - Save/restore ECK Clock Synthesizer. - Fix bug with panel autodetection. - Fixed problem with backlite (Ticket #308). - Better VT1625 chipset support. - Cursor support speedup. - Fix bug with wrong panel size (Ticket #301). - Remove build warnings and removed unused variables. - Unified variable names with RandR. - RandR initial support. - Updated manpage. - Add rotate upside-down and remove "Magic numbers". - Disable TMDS by default for now, output detection is not working properly. - Fix hardlock on resolution change. - Remove loader symbol lists. - XO-1.5 panel patch and dot clock fixup. - Switch on LVDS pads only for active channel. - Modify PLL generation and add VX855 support. - Fix cursor on secondary. - Fix a segfault on shutdown in ViaCleanupXVMC when there's no Xv. - Fix null pointer dereference in viaExaCheckComposite. - Clean up duplicate defines in via_regs.h. - Remove VT8454B LCD flag. - Make sure Chrome9 chipsets use software rasterizer for 3D. - Cosmetic fix for ViaMMIODisable. - Fix DFP pad mask. - Fix possible use of uninitialized variable (ticket#292). - Fix use of uninitialized variable. - Fix 2D engine init. - ViaPanelGetIndex: 1 bugfix and 1 cosmetic fix. - Set P4M890 primary FIFO. - Initialize CRTC before a mode switch. Fix bug #260. - Small bug fixes for XAA and EXA. - Minor bug fixes and tweaks. - Remove support for old EXA. - Fix 2d initialization for P4M900. - Temporary workaround for freedesktop bug 21563. - Adjust monitor values to handle preset LCD panel and TV modes. - Fix placement of pVia->FrameBufferBase to MapFB. - Clean up compile warnings. - Fix crash worked around by XaaNoImageWriteRect. - Restore panel backlight after VT switch (Ticket #29). - XvMC Unichrome Pro allocation fixes. - Add more needed modes to ViaPanelModes. - XvMC symbol visibility. - Properly link XvMC. - Hide overlay when video is invisible (ticket #266). - Allow FullHD with DDR400. - Add missing 640x480 PAL mode for VT1625. - Remove support for pre-xorg 7.1rc1 Xv ABI. * New boards : - Axper XP-M8VM800, Gigabyte M704 / RoverPC A700GQ, IBM AnyPlace Kiosk 3xx, ECS P4M890T-M v2.0, Foxconn P4M800P7MB-RS2H, Haier A60-440256080BD, Lenovo S12, Mitac 8624 (w/ P4M890), MSI K8M Neo-V (broken pci id), MSI P4M900M3-L, Packard Bell Lima (ASUS MBP5VDZ-NVM), Samsung NC20, Twinhead H12V, Twinhead M6, VIA Epia M700. VIA Openbook, Sharp PC-AE30J. openchrome 0.2.903 (19/08/2008) ------------------------------- * Enhancements and bug fixes: - Simplify memory bandwidth setting. - Fix compilation without EXA. - Fix interpolation for CN400. - Fix Xv on LCD for K8M890 and CX700. - Disable XvDMA for P4M890 and K8M890, it is broken... - Replace xf86strstr by the unwrapped version. - Fix chipset revision detection in libpciaccess code path. - Print driver version in the libpciaccess code path. * New boards: - Biostar P4M890-M7 TE, ECS CLE266, FIC CE261, Foxconn P4M9007MB-8RS2H, Hewlett Packard 2133 Mini-Note, KamLAB KINO-LUKE-533-R20, Mercury P4VM800M7, MSI K9MM-V, MSI VR321, PCChips (unknown model), Samsung Q1B. openchrome 0.2.902 (08/04/2008) ------------------------------- * Enhancements and bug fixes: - libpciaccess support. - Fix Xv on LCD for VM800/CN700/P4M800pro. - Fix P4M900 fifo setting. - Various code clean up. * New boards: - ASRock P4VM900-SATA2, Asustek M2V-MX SE, Asustek P5VD2-VM SE, Biostar P4M800 Pro-M7, Clevo M54xSR, Clevo M660SR, Medion Notebook MD96483, Mitac 8515, Mitac 8624, MSI Fuzzy CX700/CX700D, Packard Bell EasyNote XS (aka Everex Cloudbook CE1200V), VIA Epia SN. * Notes: - The "HWCursor" option has been removed. Hardware-accelerated cursor is on by default, so this option was useless. Use the "SWCursor" option if you want to disable HW cursor. - AGPDMA has been disabled for K8M800 and VM800/CN700/P4M800pro in this release because it causes screen repaint and lockup issues. The problem has been tracked down to a bug in kernel drm. All kernel >= 2.6.22 are affected. This bug will be fixed in the upcoming 2.6.25-rc7. It is also fixed in current drm git tree. If you're using one of the affected kernels, you'll have to either keep AGPDMA disabled or build the modules from the fixed drm git tree. This option brings extra performance for some operations. To use it, add 'Option "EnableAGPDMA"' in the Device section of the xorg configuration. openchrome 0.2.901 (02/01/2008) ------------------------------- * Enhancements : - New pci ids : FIC CE260, Hasee F700C, MSI P4M900M / P4M900M2-F/L, PCChips V21G, Biostar P4M900M-M7 SE. - Identify the driver as Openchrome, with CHROME as a shorthand. - Report chipset too in case of an unknown card id. - Improve P4M890 memory detection. - Add VT1625 720x480Under, 720x480Fit and 720x480Over NTSC modes. - Add VT1625 720x576 PAL mode. * Fixes : - Panel on CX700 needs VBE. - K8M890 can use DDR667. - Never enable IRQ on KM400, KM400A owner will still need to enable manually. - Various code cleanups. openchrome 0.2.900 (20/10/2007) ------------------------------- - First openchrome official release. xserver-xorg-video-openchrome-0.3.3+git20160310/README000066400000000000000000000036341267025031400217130ustar00rootroot00000000000000xf86-video-openchrome --------------------- (http://www.openchrome.org) SUPPORTED CHIPSETS : -------------------- - CLE266 (VT3122) - KM400/P4M800 (VT3205) - K8M800 (VT3204) - PM800/PM880/CN400 (VT3259) - VM800/CN700/P4M800Pro (VT3314) - CX700 (VT3324) - P4M890 (VT3327) - K8M890 (VT3336) - P4M900/VN896 (VT3364) - VX800 (VT3353) - VX855 (VT3409) - VX900 (VT3410) SUPPORTED FEATURES : -------------------- - Free modesetting for Unichrome, Unichrome Pro and Chrome9 chipsets. - VBE modesetting for everything not natively supported. - TV-out support. - EXA acceleration. - Hardware MPEG2 acceleration. KNOWN BUGS/LIMITATIONS : ------------------------ * Laptop panel - Laptop displays for anything other than CLE266 and KM400/P4M800 are only supported thru VBE calls. - Virtual terminal is broken on some laptop displays. Use a vesa framebuffer to work around that (append vga=791 to your kernel command line, for example). * XvMC - The hardware MPEG4 acceleration that is present on some chipsets is not implemented. - No XvMC support for CX700 and newer (new, unsupported engine). - No XvMC support for K8M890, P4M890 and P4M900/VN896 (need to get dri working for them first). * TV output - TV modes are hardcoded and must be choosen inside a list depending on the TV encoder. - Outputs are dependent on each other and will use the least common denominator. If you're using both VGA/LCD output and TV output, the VGA/LCD output will be limited by the TV encoder (720x576@50Hz for example). In other words, there is no dual screen support. * Misc. - Add-on TMDS encoders are not supported, except thru VBE. - CX700, VX800 and VX855 integrated TMDS is supported. * Chrome9 - Chrome9 chipsets' family (P4M900, K8M890, VX800, VX855, VX900) currently doesn't support neither AGP DMA nor 3D acceleration. Please note that 3D acceleration is provided by Mesa (http://mesa3d.org) and is not directly related to openchrome. xserver-xorg-video-openchrome-0.3.3+git20160310/acinclude.m4000066400000000000000000000072661267025031400232310ustar00rootroot00000000000000dnl Copyright 2005 Red Hat, Inc dnl dnl Permission to use, copy, modify, distribute, and sell this software and its dnl documentation for any purpose is hereby granted without fee, provided that dnl the above copyright notice appear in all copies and that both that dnl copyright notice and this permission notice appear in supporting dnl documentation. dnl dnl The above copyright notice and this permission notice shall be included dnl in all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. dnl IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR dnl OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, dnl ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR dnl OTHER DEALINGS IN THE SOFTWARE. dnl dnl Except as contained in this notice, the name of the copyright holders shall dnl not be used in advertising or otherwise to promote the sale, use or dnl other dealings in this Software without prior written authorization dnl from the copyright holders. dnl # XORG_DRIVER_CHECK_EXT() # -------------------------- # Checks for the $1 define in xorg-server.h (from the sdk). If it # is defined, then add $1 to $REQUIRED_MODULES. AC_DEFUN([XORG_DRIVER_CHECK_EXT],[ SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include "xorg-server.h" #if !defined $1 #error $1 not defined #endif ]])], [_EXT_CHECK=yes], [_EXT_CHECK=no]) CFLAGS="$SAVE_CFLAGS" AC_MSG_CHECKING([if $1 is defined]) AC_MSG_RESULT([$_EXT_CHECK]) if test "$_EXT_CHECK" != no; then REQUIRED_MODULES="$REQUIRED_MODULES $2" fi ]) dnl Copyright 2005 Red Hat, Inc dnl dnl Permission to use, copy, modify, distribute, and sell this software and its dnl documentation for any purpose is hereby granted without fee, provided that dnl the above copyright notice appear in all copies and that both that dnl copyright notice and this permission notice appear in supporting dnl documentation. dnl dnl The above copyright notice and this permission notice shall be included dnl in all copies or substantial portions of the Software. dnl dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. dnl IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR dnl OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, dnl ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR dnl OTHER DEALINGS IN THE SOFTWARE. dnl dnl Except as contained in this notice, the name of the copyright holders shall dnl not be used in advertising or otherwise to promote the sale, use or dnl other dealings in this Software without prior written authorization dnl from the copyright holders. dnl # XORG_RELEASE_VERSION # -------------------- # Adds --with/without-release-string and changes the PACKAGE and # PACKAGE_TARNAME to use "$PACKAGE{_TARNAME}-$RELEASE_VERSION". If # no option is given, PACKAGE and PACKAGE_TARNAME are unchanged. AC_DEFUN([XORG_RELEASE_VERSION],[ AC_ARG_WITH(release-version, AC_HELP_STRING([--with-release-version=STRING], [Use release version string in package name]), [RELEASE_VERSION="$withval"], [RELEASE_VERSION=""]) if test "x$RELEASE_VERSION" != "x"; then PACKAGE="$PACKAGE-$RELEASE_VERSION" PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION" AC_MSG_NOTICE([Building with package name set to $PACKAGE]) fi ]) xserver-xorg-video-openchrome-0.3.3+git20160310/autogen.sh000077500000000000000000000003031267025031400230220ustar00rootroot00000000000000#! /bin/sh srcdir=`dirname $0` test -z "$srcdir" && srcdir=. ORIGDIR=`pwd` cd $srcdir autoreconf -v --install || exit 1 cd $ORIGDIR || exit $? $srcdir/configure --enable-maintainer-mode "$@" xserver-xorg-video-openchrome-0.3.3+git20160310/configure.ac000066400000000000000000000140401267025031400233120ustar00rootroot00000000000000# Copyright 2005 Adam Jackson. # # 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 # on 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 # ADAM JACKSON 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. # # Process this file with autoconf to produce a configure script # Initialize Autoconf AC_PREREQ(2.57) AC_INIT([xf86-video-openchrome], [0.3.3], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg&component=Driver/openchrome], [xf86-video-openchrome]) AC_DEFINE_UNQUOTED([VIA_MAJOR_VERSION], [$(echo $PACKAGE_VERSION | sed -e 's/^\([[0-9]]*\)\.[[0-9]]*\.[[0-9]]*/\1/')], [Major version]) AC_DEFINE_UNQUOTED([VIA_MINOR_VERSION], [$(echo $PACKAGE_VERSION | sed -e 's/^[[0-9]]*\.\([[0-9]]*\)\.[[0-9]]*/\1/')], [Minor version]) AC_DEFINE_UNQUOTED([VIA_PATCHLEVEL], [$(echo $PACKAGE_VERSION | sed -e 's/^[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)/\1/')], [Patch version]) AC_CONFIG_SRCDIR([Makefile.am]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_AUX_DIR(.) AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_MAINTAINER_MODE # Initialize libtool AC_DISABLE_STATIC AC_PROG_LIBTOOL AC_SYS_LARGEFILE AH_TOP([#include "xorg-server.h"]) AC_ARG_WITH(xorg-module-dir, AC_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], [Enable debugging support [[default=no]]]), [DEBUG="$enableval"], [DEBUG=no]) AC_ARG_ENABLE(xv-debug, AC_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], [Enable build of registers dumper tool [[default=no]]]), [TOOLS="$enableval"], [TOOLS=no]) # Checks for extensions XORG_DRIVER_CHECK_EXT(RANDR, randrproto) XORG_DRIVER_CHECK_EXT(RENDER, renderproto) XORG_DRIVER_CHECK_EXT(XV, videoproto) XORG_DRIVER_CHECK_EXT(XF86DRI, xextproto x11) XORG_DRIVER_CHECK_EXT(DPMSExtension, xextproto) # Checks for pkg-config packages PKG_CHECK_MODULES(XORG, [xorg-server xproto fontsproto glproto $REQUIRED_MODULES]) PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1], HAVE_XEXTPROTO_71="yes"; AC_DEFINE(HAVE_XEXTPROTO_71, 1, [xextproto 7.1 available]), HAVE_XEXTPROTO_71="no") 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" AC_CHECK_HEADER(xf86Modes.h,[XMODES=yes],[XMODES=no],[#include "xorg-server.h"]) PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.11.0], HAVE_PCIACCESS="yes"; AC_DEFINE(HAVE_PCIACCESS, 1, [libpciacces available]), HAVE_PCIACCESS="no") AC_SUBST([PCIACCESS_CFLAGS]) AC_SUBST([PCIACCESS_LIBS]) PKG_CHECK_MODULES(DRI, [libdrm >= 2.4.4 xf86driproto], DRI="yes"; AC_DEFINE(HAVE_DRI, 1, [DRI is available]), DRI="no") AC_MSG_CHECKING([whether to build KMS support]) AC_MSG_RESULT([$DRI]) AM_CONDITIONAL(DRI, test x$DRI = xyes) if test "$DRI" = yes; then AC_DEFINE(XF86DRI,1,[Enable DRI driver support]) AC_CHECK_HEADER([damage.h], [have_damage_h="yes"], [have_damage_h="no"],[-]) if test "$have_damage_h" = yes; then AC_DEFINE(DAMAGE,1,[Use Damage extension]) fi PKG_CHECK_MODULES(LIBUDEV, [libudev], [LIBUDEV=yes], [LIBUDEV=no]) if test "x$LIBUDEV" = xyes; then AC_DEFINE(HAVE_LIBUDEV, 1,[libudev support]) fi case "$host_cpu" in i*86) XVMC=yes ;; amd64*|x86_64*) XVMC=yes ;; *) XVMC=no ;; esac else XVMC="no" fi if test "x$XVMC" = xyes; then AC_CHECK_HEADERS(pthread.h sys/ioctl.h sys/time.h time.h,,[XVMC="no"; break],) PKG_CHECK_MODULES(XVMC, [x11 xext xvmc]) fi AC_MSG_CHECKING([whether to build XvMC driver support]) AC_MSG_RESULT([$XVMC]) AM_CONDITIONAL(XVMC, test x$XVMC = xyes) AM_CONDITIONAL(DEBUG, test x$DEBUG = xyes) if test "$DEBUG" = yes; then AC_DEFINE(HAVE_DEBUG,1,[Enable debug support]) fi AM_CONDITIONAL(XV_DEBUG, test x$XV_DEBUG = xyes) if test "$XV_DEBUG" = yes; then AC_DEFINE(XV_DEBUG,1,[Enable XVideo debug support]) fi AM_CONDITIONAL(TOOLS, test x$TOOLS = xyes) if test "$TOOLS" = yes; then AC_DEFINE(TOOLS,1,[Enable build of registers dumper tool]) fi 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 ]) xserver-xorg-video-openchrome-0.3.3+git20160310/man/000077500000000000000000000000001267025031400216005ustar00rootroot00000000000000xserver-xorg-video-openchrome-0.3.3+git20160310/man/Makefile.am000066400000000000000000000043361267025031400236420ustar00rootroot00000000000000# $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. # drivermandir = $(mandir)/man$(DRIVER_MAN_SUFFIX) driverman_MANFILES = @DRIVER_NAME@.man driverman_DATA = $(driverman_MANFILES:man=@DRIVER_MAN_SUFFIX@) EXTRA_DIST = @DRIVER_NAME@.man CLEANFILES = $(driverman_DATA) SED = sed # Strings to replace in man pages XORGRELSTRING = @PACKAGE_STRING@ XORGMANNAME = X Version 11 MAN_SUBSTS = \ -e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ -e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ -e 's|__xservername__|Xorg|g' \ -e 's|__xconfigfile__|xorg.conf|g' \ -e 's|__projectroot__|$(prefix)|g' \ -e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \ -e 's|__drivermansuffix__|$(DRIVER_MAN_SUFFIX)|g' \ -e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \ -e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \ -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g' SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man .man.$(DRIVER_MAN_SUFFIX): sed $(MAN_SUBSTS) < $< > $@ @DRIVER_NAME@.man: ln -s -f $(top_srcdir)/src/@DRIVER_NAME@.man . xserver-xorg-video-openchrome-0.3.3+git20160310/prepare-ChangeLogSVN.pl000077500000000000000000000435451267025031400252520ustar00rootroot00000000000000#!/usr/bin/perl -w # -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 2 -*- # Perl script to create a ChangeLog entry with names of files # and functions from a svn diff. # # Darin Adler , started 20 April 2000 # Java support added by Maciej Stachowiak # Adapted for subversion by Thomas Hellstrom # last updated 11 May 2005 # # (Someone put a license in here, like maybe GPL.) # # TODO: # For new files, just say "New file" instead of listing # function names. # List functions that have been removed too. # Decide what a good logical order is for the changed files # other than a normal text "sort" (top level first?) # (group directories?) (.h before .c?) # Leave a diff file behind if asked, but in unified format. # Handle C++ and yacc source files too (other languages?). # Help merge when there are ChangeLog conflicts or if there's # already a partly written ChangeLog entry. # Add command line option to put the ChangeLog into a separate # file or just spew it out stdout. # Figure out how to allow -z options from .cvsrc to work without # letting other bad options work. Currently the -f disables # everything from the .cvsrc. # Add CVS version numbers for each file too (can't do that until # the changes are checked in, though). # Work around diff stupidity where deleting a function that starts # with a comment makes diff think that the following function # has been changed (if the following function starts with a comment # with the same first line, such as /**) # Work around diff stupidity where deleting an entire function and # the blank lines before it makes diff think you've changed the # previous function. use diagnostics; use strict; use English; use Text::Wrap; # For each file, build a list of modified lines. # Use line numbers from the "after" side of each diff. print STDERR " Running svn diff to find changes.\n"; my %changed_line_ranges; my $file; open DIFF, "svn diff --diff-cmd diff -x -N |" or die "The svn diff failed: $OS_ERROR.\n"; while () { $file = $1 if /^Index: (\S+)$/; if (defined $file and $file ne "ChangeLog" and (/^\d+(,\d+)?[acd](\d+)(,(\d+))?/ or /^Binary files/) ) { push @{$changed_line_ranges{$file}}, [ $2, $4 || $2 ]; } } close DIFF; if (!%changed_line_ranges) { print STDERR " No changes found.\n"; exit; } # For each ".c" file, convert line range to function list. print STDERR " Extracting affected function names from C source files.\n"; my %function_lists; foreach my $file (keys %changed_line_ranges) { # An empty function list still indicates that something changed. $function_lists{$file} = ""; # Only look for function names in .c files. next unless $file =~ /\.(c|java)/; # Find all the functions in the file. open SOURCE, $file or next; my @function_ranges = get_function_line_ranges(\*SOURCE, $file); close SOURCE; # Find all the modified functions. my @functions; my %saw_function; my @change_ranges = (@{$changed_line_ranges{$file}}, []); my @change_range = (0, 0); FUNCTION: foreach my $function_range_ref (@function_ranges) { my @function_range = @$function_range_ref; # Advance to successive change ranges. for (;; @change_range = @{shift @change_ranges}) { last FUNCTION unless @change_range; # If past this function, move on to the next one. next FUNCTION if $change_range[0] > $function_range[1]; # If an overlap with this function range, record the function name. if ($change_range[1] >= $function_range[0] and $change_range[0] <= $function_range[1]) { if (!$saw_function{$function_range[2]}) { $saw_function{$function_range[2]} = 1; push @functions, $function_range[2]; } next FUNCTION; } } } # Format the list of functions now. $function_lists{$file} = " (" . join("), (", @functions) . "):" if @functions; } # Get some pieces of the ChangeLog we are about to write. my $date = sprintf "%d-%02d-%02d", 1900 + (localtime $BASETIME)[5], # year 1 + (localtime $BASETIME)[4], # month (localtime $BASETIME)[3]; # day within month my $name = $ENV{CHANGE_LOG_NAME} || $ENV{REAL_NAME} || (getpwuid $REAL_USER_ID)[6] || "set REAL_NAME environment variable"; my $email_address = $ENV{CHANGE_LOG_EMAIL_ADDRESS} || $ENV{EMAIL_ADDRESS} || "set EMAIL_ADDRESS environment variable"; # Find the change logs. my %has_log; my %files; foreach my $file (sort keys %function_lists) { my $prefix = $file; my $has_log = 0; while ($prefix) { $prefix =~ s-/[^/]+/?$-/- or $prefix = ""; $has_log = $has_log{$prefix}; if (!defined $has_log) { $has_log = -f "${prefix}ChangeLog"; $has_log{$prefix} = $has_log; } last if $has_log; } if (!$has_log) { print STDERR "No ChangeLog found for $file.\n"; } else { push @{$files{$prefix}}, $file; } } # Get the latest ChangeLog files from svn. my $logs = ""; foreach my $prefix (sort keys %files) { $logs .= " ${prefix}ChangeLog"; } if ($logs) { print STDERR " Updating ChangeLog files from svn repository.\n"; open ERRORS, "svn update$logs |" or die "The svn update of ChangeLog files failed: $OS_ERROR.\n"; print STDERR " $ARG" while ; close ERRORS; } # Write out a new ChangeLog file. foreach my $prefix (sort keys %files) { print STDERR " Editing the ${prefix}ChangeLog file.\n"; open OLD_CHANGE_LOG, "${prefix}ChangeLog" or die "Could not open ${prefix}ChangeLog file: $OS_ERROR.\n"; # It's less efficient to read the whole thing into memory than it would be # to read it while we prepend to it later, but I like doing this part first. my @old_change_log = ; close OLD_CHANGE_LOG; open CHANGE_LOG, "> ${prefix}ChangeLog" or die "Could not write ${prefix}ChangeLog\n."; print CHANGE_LOG "$date $name <$email_address>\n\n"; print CHANGE_LOG "\treviewed by: \n\n"; foreach my $file (sort @{$files{$prefix}}) { my $file_stem = substr $file, length $prefix; my $lines = wrap("\t", "\t", "XX$file_stem:$function_lists{$file}"); $lines =~ s/^\tXX/\t* /; print CHANGE_LOG "$lines\n"; } print CHANGE_LOG "\n", @old_change_log; close CHANGE_LOG; print STDERR " Done editing ${prefix}ChangeLog.\n"; } # Done. exit; sub get_function_line_ranges { my ($file_handle, $file_name) = @_; if ($file_name =~ /\.c$/) { return get_function_line_ranges_for_c ($file_handle, $file_name); } elsif ($file_name =~ /\.java$/) { return get_function_line_ranges_for_java ($file_handle, $file_name); } return (); } # Read a file and get all the line ranges of the things that look like C functions. # A function name is the last word before an open parenthesis before the outer # level open brace. A function starts at the first character after the last close # brace or semicolon before the function name and ends at the close brace. # Comment handling is simple-minded but will work for all but pathological cases. # # Result is a list of triples: [ start_line, end_line, function_name ]. sub get_function_line_ranges_for_c { my ($file_handle, $file_name) = @_; my @ranges; my $in_comment = 0; my $in_macro = 0; my $in_parentheses = 0; my $in_braces = 0; my $word = ""; my $potential_start = 0; my $potential_name = ""; my $start = 0; my $name = ""; while (<$file_handle>) { # Handle continued multi-line comment. if ($in_comment) { next unless s-.*\*/--; $in_comment = 0; } # Handle continued macro. if ($in_macro) { $in_macro = 0 unless /\\$/; next; } # Handle start of macro (or any preprocessor directive). if (/^\s*\#/) { $in_macro = 1 if /^([^\\]|\\.)*\\$/; next; } # Handle comments and quoted text. while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy { my $match = $1; if ($match eq "/*") { if (!s-/\*.*?\*/--) { s-/\*.*--; $in_comment = 1; } } elsif ($match eq "//") { s-//.*--; } else # ' or " { if (!s-$match([^\\]|\\.)*?$match--) { warn "mismatched quotes at line $INPUT_LINE_NUMBER in $file_name\n"; s-$match.*--; } } } # Find function names. while (m-(\w+|[(){};])-g) { # Open parenthesis. if ($1 eq "(") { $potential_name = $word unless $in_parentheses; $in_parentheses++; next; } # Close parenthesis. if ($1 eq ")") { $in_parentheses--; next; } # Open brace. if ($1 eq "{") { # Promote potiential name to real function name at the # start of the outer level set of braces (function body?). if (!$in_braces and $potential_start) { $start = $potential_start; $name = $potential_name; } $in_braces++; next; } # Close brace. if ($1 eq "}") { $in_braces--; # End of an outer level set of braces. # This could be a function body. if (!$in_braces and $name) { push @ranges, [ $start, $INPUT_LINE_NUMBER, $name ]; $name = ""; } $potential_start = 0; $potential_name = ""; next; } # Semicolon. if ($1 eq ";") { $potential_start = 0; $potential_name = ""; next; } # Word. $word = $1; if (!$in_parentheses) { $potential_start = 0; $potential_name = ""; } if (!$potential_start) { $potential_start = $INPUT_LINE_NUMBER; $potential_name = ""; } } } warn "mismatched braces in $file_name\n" if $in_braces; warn "mismatched parentheses in $file_name\n" if $in_parentheses; return @ranges; } # Read a file and get all the line ranges of the things that look like Java # classes, interfaces and methods. # # A class or interface name is the word that immediately follows # `class' or `interface' when followed by an open curly brace and not # a semicolon. It can appear at the top level, or inside another class # or interface block, but not inside a function block # # A class or interface starts at the first character after the first close # brace or after the function name and ends at the close brace. # # A function name is the last word before an open parenthesis before # an open brace rather than a semicolon. It can appear at top level or # inside a class or interface block, but not inside a function block. # # A function starts at the first character after the first close # brace or after the function name and ends at the close brace. # # Comment handling is simple-minded but will work for all but pathological cases. # # Result is a list of triples: [ start_line, end_line, function_name ]. sub get_function_line_ranges_for_java { my ($file_handle, $file_name) = @_; my @current_scopes; my @ranges; my $in_comment = 0; my $in_macro = 0; my $in_parentheses = 0; my $in_braces = 0; my $in_non_block_braces = 0; my $class_or_interface_just_seen = 0; my $word = ""; my $potential_start = 0; my $potential_name = ""; my $potential_name_is_class_or_interface = 0; my $start = 0; my $name = ""; my $current_name_is_class_or_interface = 0; while (<$file_handle>) { # Handle continued multi-line comment. if ($in_comment) { next unless s-.*\*/--; $in_comment = 0; } # Handle continued macro. if ($in_macro) { $in_macro = 0 unless /\\$/; next; } # Handle start of macro (or any preprocessor directive). if (/^\s*\#/) { $in_macro = 1 if /^([^\\]|\\.)*\\$/; next; } # Handle comments and quoted text. while (m-(/\*|//|\'|\")-) # \' and \" keep emacs perl mode happy { my $match = $1; if ($match eq "/*") { if (!s-/\*.*?\*/--) { s-/\*.*--; $in_comment = 1; } } elsif ($match eq "//") { s-//.*--; } else # ' or " { if (!s-$match([^\\]|\\.)*?$match--) { warn "mismatched quotes at line $INPUT_LINE_NUMBER in $file_name\n"; s-$match.*--; } } } # Find function names. while (m-(\w+|[(){};])-g) { # Open parenthesis. if ($1 eq "(") { if (!$in_parentheses) { $potential_name = $word; $potential_name_is_class_or_interface = 0; } $in_parentheses++; next; } # Close parenthesis. if ($1 eq ")") { $in_parentheses--; next; } # Open brace. if ($1 eq "{") { # Promote potiential name to real function name at the # start of the outer level set of braces (function/class/interface body?). if (!$in_non_block_braces and (!$in_braces or $current_name_is_class_or_interface) and $potential_start) { if ($name) { push @ranges, [ $start, ($INPUT_LINE_NUMBER - 1), join ('.', @current_scopes) ]; } $current_name_is_class_or_interface = $potential_name_is_class_or_interface; $start = $potential_start; $name = $potential_name; push (@current_scopes, $name); } else { $in_non_block_braces++; } $potential_name = ""; $potential_start = 0; $in_braces++; next; } # Close brace. if ($1 eq "}") { $in_braces--; # End of an outer level set of braces. # This could be a function body. if (!$in_non_block_braces) { if ($name) { push @ranges, [ $start, $INPUT_LINE_NUMBER, join ('.', @current_scopes) ]; pop (@current_scopes); if (@current_scopes) { $current_name_is_class_or_interface = 1; $start = $INPUT_LINE_NUMBER + 1; $name = $current_scopes[$#current_scopes-1]; } else { $current_name_is_class_or_interface = 0; $start = 0; $name = ""; } } } else { $in_non_block_braces-- if $in_non_block_braces; } $potential_start = 0; $potential_name = ""; next; } # Semicolon. if ($1 eq ";") { $potential_start = 0; $potential_name = ""; next; } if ($1 eq "class" or $1 eq "interface") { $class_or_interface_just_seen = 1; next; } # Word. $word = $1; if (!$in_parentheses) { if ($class_or_interface_just_seen) { $potential_name = $word; $potential_start = $INPUT_LINE_NUMBER; $class_or_interface_just_seen = 0; $potential_name_is_class_or_interface = 1; next; } } if (!$potential_start) { $potential_start = $INPUT_LINE_NUMBER; $potential_name = ""; } $class_or_interface_just_seen = 0; } } warn "mismatched braces in $file_name\n" if $in_braces; warn "mismatched parentheses in $file_name\n" if $in_parentheses; return @ranges; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/000077500000000000000000000000001267025031400216145ustar00rootroot00000000000000xserver-xorg-video-openchrome-0.3.3+git20160310/src/Makefile.am000066400000000000000000000077611267025031400236630ustar00rootroot00000000000000# Copyright 2005 Adam Jackson. # # 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 # on 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 # ADAM JACKSON 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. # this is obnoxious: # -module lets us name the module exactly how we want # -avoid-version prevents gratuitous .0.0.0 version numbers on the end # _ladir passes a dummy rpath to libtool so the thing will actually link # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. SUBDIRS = xvmc BUILT_SOURCES = version.h EXTRA_DIST = version.h CONFIG_CLEAN_FILES= version.h AM_CFLAGS = @XORG_CFLAGS@ @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 openchrome_drv_la_SOURCES = \ compat-api.h \ via_eng_regs.h \ via_3d.c \ via_3d.h \ via_3d_reg.h \ via_rop.h \ via_exa.c \ via_exa_h2.c \ via_exa_h6.c \ via_bandwidth.c \ via_ums.h \ via_ch7xxx.c \ via_ch7xxx.h \ via_display.c \ via_dmabuffer.h \ via_driver.c \ via_driver.h \ via_i2c.c \ via_id.c \ via_lvds.c \ via_memcpy.c \ via_memmgr.h \ via_memmgr.c \ via_outputs.c \ via_mode.h \ via_priv.h \ via_regs.h \ via_xv_overlay.c \ via_xv_overlay.h \ via_ums.c \ via_vbe.c \ via_vgahw.c \ via_vgahw.h \ via_xv.c \ via_xv.h \ via_vt162x.c \ via_vt162x.h \ via_vt1632.c \ via_vt1632.h \ via_xvpriv.h if DRI openchrome_drv_la_SOURCES += \ via_dri.c \ via_dri.h \ via_drm.h \ via_drmclient.h \ via_kms.h \ via_kms.c \ via_xvmc.c \ via_xvmc.h \ drm_fourcc.h else EXTRA_DIST += \ via_dri.c \ via_dri.h \ via_drm.h \ via_drmclient.h \ via_kms.h \ via_kms.c \ via_xvmc.c \ via_xvmc.h \ drm_fourcc.h endif via_driver.lo: version.h version.h: $(openchrome_drv_la_SOURCES) @if [ -d ../.git ]; then \ echo '#define BUILDCOMMENT "(development build, branch' \ "`git branch -v | sed 's/no branch/no_branch/' | \ awk '/^\*/ { print $$2 }'`" \ 'at revision' \ "`git log -1 --pretty=format:%h | head -1`"')"' \ > $@.tmp; \ else \ if [ -d .svn ]; then \ echo '#define BUILDCOMMENT "(development build, at revision '\ "`svnversion -nc .. | sed -e s/^[^:]*://`"')"' > $@.tmp; \ else \ date +'#define BUILDCOMMENT "(development build, compiled on %c)"' \ > $@.tmp; \ fi; \ fi @chmod 666 $@.tmp @mv $@.tmp $@ @echo "created $@" dist-hook: @[ -e version.h ] && rm version.h; \ echo '#define BUILDCOMMENT "(openchrome '$(VERSION)' release)"' \ > version.h xserver-xorg-video-openchrome-0.3.3+git20160310/src/compat-api.h000066400000000000000000000065711267025031400240300ustar00rootroot00000000000000/* * Copyright 2012 Red Hat, Inc. * * 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. * * Author: Dave Airlie */ /* this file provides API compat between server post 1.13 and pre it, it should be reused inside as many drivers as possible */ #ifndef COMPAT_API_H #define COMPAT_API_H #ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR #define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum] #define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p #endif #ifndef XF86_HAS_SCRN_CONV #define xf86ScreenToScrn(s) xf86Screens[(s)->myNum] #define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex] #endif #ifndef XF86_SCRN_INTERFACE #define SCRN_ARG_TYPE int #define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = xf86Screens[(arg1)] #define SCREEN_ARG_TYPE int #define SCREEN_PTR(arg1) ScreenPtr pScreen = screenInfo.screens[(arg1)] #define SCREEN_INIT_ARGS_DECL int index, ScreenPtr pScreen, int argc, char **argv #define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer pTimeout, pointer pReadmask #define BLOCKHANDLER_ARGS arg, blockData, pTimeout, pReadmask #define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr pScreen #define CLOSE_SCREEN_ARGS scrnIndex, pScreen #define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags #define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags #define FREE_SCREEN_ARGS_DECL int arg, int flags #define FREE_SCREEN_ARGS(x) (x)->scrnIndex, 0 #define VT_FUNC_ARGS_DECL int arg, int flags #define VT_FUNC_ARGS(flags) pScrn->scrnIndex, (flags) #define XF86_SCRN_ARG(x) ((x)->scrnIndex) #else #define SCRN_ARG_TYPE ScrnInfoPtr #define SCRN_INFO_PTR(arg1) ScrnInfoPtr pScrn = (arg1) #define SCREEN_ARG_TYPE ScreenPtr #define SCREEN_PTR(arg1) ScreenPtr pScreen = (arg1) #define SCREEN_INIT_ARGS_DECL ScreenPtr pScreen, int argc, char **argv #define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer pTimeout, pointer pReadmask #define BLOCKHANDLER_ARGS arg, pTimeout, pReadmask #define CLOSE_SCREEN_ARGS_DECL ScreenPtr pScreen #define CLOSE_SCREEN_ARGS pScreen #define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y #define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode #define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg #define FREE_SCREEN_ARGS(x) (x) #define VT_FUNC_ARGS_DECL ScrnInfoPtr arg #define VT_FUNC_ARGS(flags) pScrn #define XF86_SCRN_ARG(x) (x) #endif #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/drm_fourcc.h000066400000000000000000000172121267025031400241130ustar00rootroot00000000000000/* * Copyright 2011 Intel Corporation * * 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 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS 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 DRM_FOURCC_H #define DRM_FOURCC_H #include #define fourcc_code(a,b,c,d) ((uint32_t)(a) | ((uint32_t)(b) << 8) | \ ((uint32_t)(c) << 16) | ((uint32_t)(d) << 24)) #define DRM_FORMAT_BIG_ENDIAN (1<<31) /* format is big endian instead of little endian */ /* color index */ #define DRM_FORMAT_C8 fourcc_code('C', '8', ' ', ' ') /* [7:0] C */ /* 8 bpp RGB */ #define DRM_FORMAT_RGB332 fourcc_code('R', 'G', 'B', '8') /* [7:0] R:G:B 3:3:2 */ #define DRM_FORMAT_BGR233 fourcc_code('B', 'G', 'R', '8') /* [7:0] B:G:R 2:3:3 */ /* 16 bpp RGB */ #define DRM_FORMAT_XRGB4444 fourcc_code('X', 'R', '1', '2') /* [15:0] x:R:G:B 4:4:4:4 little endian */ #define DRM_FORMAT_XBGR4444 fourcc_code('X', 'B', '1', '2') /* [15:0] x:B:G:R 4:4:4:4 little endian */ #define DRM_FORMAT_RGBX4444 fourcc_code('R', 'X', '1', '2') /* [15:0] R:G:B:x 4:4:4:4 little endian */ #define DRM_FORMAT_BGRX4444 fourcc_code('B', 'X', '1', '2') /* [15:0] B:G:R:x 4:4:4:4 little endian */ #define DRM_FORMAT_ARGB4444 fourcc_code('A', 'R', '1', '2') /* [15:0] A:R:G:B 4:4:4:4 little endian */ #define DRM_FORMAT_ABGR4444 fourcc_code('A', 'B', '1', '2') /* [15:0] A:B:G:R 4:4:4:4 little endian */ #define DRM_FORMAT_RGBA4444 fourcc_code('R', 'A', '1', '2') /* [15:0] R:G:B:A 4:4:4:4 little endian */ #define DRM_FORMAT_BGRA4444 fourcc_code('B', 'A', '1', '2') /* [15:0] B:G:R:A 4:4:4:4 little endian */ #define DRM_FORMAT_XRGB1555 fourcc_code('X', 'R', '1', '5') /* [15:0] x:R:G:B 1:5:5:5 little endian */ #define DRM_FORMAT_XBGR1555 fourcc_code('X', 'B', '1', '5') /* [15:0] x:B:G:R 1:5:5:5 little endian */ #define DRM_FORMAT_RGBX5551 fourcc_code('R', 'X', '1', '5') /* [15:0] R:G:B:x 5:5:5:1 little endian */ #define DRM_FORMAT_BGRX5551 fourcc_code('B', 'X', '1', '5') /* [15:0] B:G:R:x 5:5:5:1 little endian */ #define DRM_FORMAT_ARGB1555 fourcc_code('A', 'R', '1', '5') /* [15:0] A:R:G:B 1:5:5:5 little endian */ #define DRM_FORMAT_ABGR1555 fourcc_code('A', 'B', '1', '5') /* [15:0] A:B:G:R 1:5:5:5 little endian */ #define DRM_FORMAT_RGBA5551 fourcc_code('R', 'A', '1', '5') /* [15:0] R:G:B:A 5:5:5:1 little endian */ #define DRM_FORMAT_BGRA5551 fourcc_code('B', 'A', '1', '5') /* [15:0] B:G:R:A 5:5:5:1 little endian */ #define DRM_FORMAT_RGB565 fourcc_code('R', 'G', '1', '6') /* [15:0] R:G:B 5:6:5 little endian */ #define DRM_FORMAT_BGR565 fourcc_code('B', 'G', '1', '6') /* [15:0] B:G:R 5:6:5 little endian */ /* 24 bpp RGB */ #define DRM_FORMAT_RGB888 fourcc_code('R', 'G', '2', '4') /* [23:0] R:G:B little endian */ #define DRM_FORMAT_BGR888 fourcc_code('B', 'G', '2', '4') /* [23:0] B:G:R little endian */ /* 32 bpp RGB */ #define DRM_FORMAT_XRGB8888 fourcc_code('X', 'R', '2', '4') /* [31:0] x:R:G:B 8:8:8:8 little endian */ #define DRM_FORMAT_XBGR8888 fourcc_code('X', 'B', '2', '4') /* [31:0] x:B:G:R 8:8:8:8 little endian */ #define DRM_FORMAT_RGBX8888 fourcc_code('R', 'X', '2', '4') /* [31:0] R:G:B:x 8:8:8:8 little endian */ #define DRM_FORMAT_BGRX8888 fourcc_code('B', 'X', '2', '4') /* [31:0] B:G:R:x 8:8:8:8 little endian */ #define DRM_FORMAT_ARGB8888 fourcc_code('A', 'R', '2', '4') /* [31:0] A:R:G:B 8:8:8:8 little endian */ #define DRM_FORMAT_ABGR8888 fourcc_code('A', 'B', '2', '4') /* [31:0] A:B:G:R 8:8:8:8 little endian */ #define DRM_FORMAT_RGBA8888 fourcc_code('R', 'A', '2', '4') /* [31:0] R:G:B:A 8:8:8:8 little endian */ #define DRM_FORMAT_BGRA8888 fourcc_code('B', 'A', '2', '4') /* [31:0] B:G:R:A 8:8:8:8 little endian */ #define DRM_FORMAT_XRGB2101010 fourcc_code('X', 'R', '3', '0') /* [31:0] x:R:G:B 2:10:10:10 little endian */ #define DRM_FORMAT_XBGR2101010 fourcc_code('X', 'B', '3', '0') /* [31:0] x:B:G:R 2:10:10:10 little endian */ #define DRM_FORMAT_RGBX1010102 fourcc_code('R', 'X', '3', '0') /* [31:0] R:G:B:x 10:10:10:2 little endian */ #define DRM_FORMAT_BGRX1010102 fourcc_code('B', 'X', '3', '0') /* [31:0] B:G:R:x 10:10:10:2 little endian */ #define DRM_FORMAT_ARGB2101010 fourcc_code('A', 'R', '3', '0') /* [31:0] A:R:G:B 2:10:10:10 little endian */ #define DRM_FORMAT_ABGR2101010 fourcc_code('A', 'B', '3', '0') /* [31:0] A:B:G:R 2:10:10:10 little endian */ #define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */ #define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */ /* packed YCbCr */ #define DRM_FORMAT_YUYV fourcc_code('Y', 'U', 'Y', 'V') /* [31:0] Cr0:Y1:Cb0:Y0 8:8:8:8 little endian */ #define DRM_FORMAT_YVYU fourcc_code('Y', 'V', 'Y', 'U') /* [31:0] Cb0:Y1:Cr0:Y0 8:8:8:8 little endian */ #define DRM_FORMAT_UYVY fourcc_code('U', 'Y', 'V', 'Y') /* [31:0] Y1:Cr0:Y0:Cb0 8:8:8:8 little endian */ #define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */ #define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */ /* * 2 plane YCbCr * index 0 = Y plane, [7:0] Y * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian * or * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian */ #define DRM_FORMAT_NV12 fourcc_code('N', 'V', '1', '2') /* 2x2 subsampled Cr:Cb plane */ #define DRM_FORMAT_NV21 fourcc_code('N', 'V', '2', '1') /* 2x2 subsampled Cb:Cr plane */ #define DRM_FORMAT_NV16 fourcc_code('N', 'V', '1', '6') /* 2x1 subsampled Cr:Cb plane */ #define DRM_FORMAT_NV61 fourcc_code('N', 'V', '6', '1') /* 2x1 subsampled Cb:Cr plane */ /* * 3 plane YCbCr * index 0: Y plane, [7:0] Y * index 1: Cb plane, [7:0] Cb * index 2: Cr plane, [7:0] Cr * or * index 1: Cr plane, [7:0] Cr * index 2: Cb plane, [7:0] Cb */ #define DRM_FORMAT_YUV410 fourcc_code('Y', 'U', 'V', '9') /* 4x4 subsampled Cb (1) and Cr (2) planes */ #define DRM_FORMAT_YVU410 fourcc_code('Y', 'V', 'U', '9') /* 4x4 subsampled Cr (1) and Cb (2) planes */ #define DRM_FORMAT_YUV411 fourcc_code('Y', 'U', '1', '1') /* 4x1 subsampled Cb (1) and Cr (2) planes */ #define DRM_FORMAT_YVU411 fourcc_code('Y', 'V', '1', '1') /* 4x1 subsampled Cr (1) and Cb (2) planes */ #define DRM_FORMAT_YUV420 fourcc_code('Y', 'U', '1', '2') /* 2x2 subsampled Cb (1) and Cr (2) planes */ #define DRM_FORMAT_YVU420 fourcc_code('Y', 'V', '1', '2') /* 2x2 subsampled Cr (1) and Cb (2) planes */ #define DRM_FORMAT_YUV422 fourcc_code('Y', 'U', '1', '6') /* 2x1 subsampled Cb (1) and Cr (2) planes */ #define DRM_FORMAT_YVU422 fourcc_code('Y', 'V', '1', '6') /* 2x1 subsampled Cr (1) and Cb (2) planes */ #define DRM_FORMAT_YUV444 fourcc_code('Y', 'U', '2', '4') /* non-subsampled Cb (1) and Cr (2) planes */ #define DRM_FORMAT_YVU444 fourcc_code('Y', 'V', '2', '4') /* non-subsampled Cr (1) and Cb (2) planes */ #endif /* DRM_FOURCC_H */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/openchrome.man000066400000000000000000000267471267025031400244700ustar00rootroot00000000000000.\" Shorthand for double quote that works everywhere, .\" also within other double quotes: .ds q \N'34' .TH OPENCHROME __drivermansuffix__ __vendorversion__ .SH NAME openchrome \- video driver for VIA Unichromes .SH SYNOPSIS .nf .B "Section \*qDevice\*q" .BI " Identifier \*q" devname \*q .B " Driver \*qopenchrome\*q" \ \ ... .B EndSection .fi .SH DESCRIPTION .B openchrome is an __xservername__ driver for VIA chipsets that have an integrated Unichrome graphics engine. .PP The .B openchrome driver supports the following chipsets: CLE266, KM400/KN400/KM400A/P4M800, CN400/PM800/PN800/PM880, K8M800, CN700/VM800/P4M800Pro, CX700, P4M890, K8M890, P4M900/VN896/CN896, VX800, VX855 and VX900. The driver includes 2D acceleration and Xv video overlay extensions. Flat panel, TV, and VGA outputs are supported, depending on the hardware configuration. .PP 3D direct rendering is available using experimental drivers from Mesa (www.mesa3d.org). There is also an XvMC client library for hardware acceleration of MPEG1/MPEG2 decoding (not available on the KM/N400) that uses the Direct Rendering Infrastructure (DRI). The XvMC client library implements a non-standard "VLD" extension to the XvMC standard. The current Direct Rendering Manager (DRM) kernel module is available at dri.sourceforge.net. .PP The driver supports free modes for Unichrome Pros (K8M800/K8N800, PM800/PN800, and CN400). For plain Unichromes (CLE266, KM400/KN400), it currently supports only a limited number of dotclocks, so if you are using X modelines you must make sure that the dotclock is one of those supported. Supported dotclocks on plain Unichromes are currently (in MHz): 25.2, 25.312, 26.591, 31.5, 31.704, 32.663, 33.750, 35.5, 36.0, 39.822, 40.0, 41.164, 46.981, 49.5, 50.0, 56.3, 57.284, 64.995, 65.0, 65.028, 74.480, 75.0, 78.8, 81.613, 94.5, 108.0, 108.28, 122.0, 122.726, 135.0, 148.5, 155.8, 157.5, 161.793, 162.0, 175.5, 189.0, 202.5, 204.8, 218.3, 229.5. On top of this, bandwidth restrictions apply for both Unichromes and Unichrome Pros. .PP .SH CONFIGURATION DETAILS Please refer to __xconfigfile__(__filemansuffix__) for general configuration details. This section only covers configuration details specific to this driver. .PP The following driver .B options are supported: .TP .BI "Option \*qAccelMethod\*q \*q" string \*q The driver supports "XAA" and "EXA" acceleration methods. The default method is XAA, since EXA is still experimental. Contrary to XAA, EXA implements acceleration for screen uploads and downloads (if DRI is enabled) and for the Render/Composite extension. .TP .BI "Option \*qActiveDevice\*q \*q" string \*q Specifies the active device combination. Any string containing "CRT", "LCD", "DFP", "TV" should be possible. "CRT" represents anything that is connected to the VGA port, "LCD" is for laptop panels (not TFT screens attached to the VGA port), "DFP" is for screens connected to the DVI port, "TV" is self-explanatory. The default is to use what is detected. The driver is currently unable to use LCD and TV simultaneously, and will favour the LCD. The DVI port is not properly probed and needs to be enabled with this option. .TP .BI "Option \*qAGPMem\*q \*q" integer \*q Sets the amount of AGP memory that is allocated at X server startup. The allocated memory will be "integer" kB. This AGP memory is used for the AGP command buffer (if the option "EnableAGPDMA" is set to "true"), for DRI textures, and for the EXA scratch area. The driver will allocate at least one system page of AGP memory, or \-\- if the AGP command buffer is used \-\- at least 2 MB plus one system page. If there is no room for the EXA scratch area in AGP space, it will be allocated from VRAM. If there is no room for DRI textures, they will be allocated from the DRI part of VRAM (see the option "MaxDRIMem"). The default amount of AGP is 32768 kB. Note that the AGP aperture set in the BIOS must be able to accommodate the amount of AGP memory specified here. Otherwise no AGP memory will be available. It is safe to set a very large AGP aperture in the BIOS. .TP .BI "Option \*qCenter\*q \*q" boolean \*q Enables image centering on DVI displays. The default is disabled. .TP .BI "Option \*qDisableIRQ\*q \*q" boolean \*q Disables the vertical blank IRQ. This is a workaround for some mainboards that have problems with IRQs coming from the Unichrome engine. With IRQs disabled, DRI clients have no way to synchronize their drawing to Vblank. (IRQ is disabled by default on the KM400 and K8M800 chipsets.) .TP .BI "Option \*qDisableVQ\*q \*q" boolean \*q Disables the use of the virtual command queue. The queue is enabled by default. .TP .BI "Option \*qEnableAGPDMA\*q \*q" boolean \*q Enables the AGP DMA functionality in DRM. This requires that DRI is enabled and will force 2D and 3D acceleration to use AGP DMA. The XvMC DRI client will also make use of this on the CLE266 to consume much less CPU. (This option is enabled by default, except on the K8M890 and P4M900.) .TP .BI "Option \*qExaNoComposite\*q \*q" boolean \*q If EXA is enabled (using the option "AccelMethod"), this option enables acceleration of compositing. Since EXA, and in particular its composite acceleration, is still experimental, this is a way to disable a misbehaving composite acceleration. .TP .BI "Option \*qExaScratchSize\*q \*q" integer \*q Sets the size of the EXA scratch area to "integer" kB. This area is used by EXA as a last place to look for available space for pixmaps. Too little space will slow compositing down. This option should be set to the size of the largest pixmap used. If you have a screen width of over 1024 pixels and use 24 bpp, set this to 8192. Otherwise you can leave this at the default 4096. The space will be allocated from AGP memory if available, otherwise from VRAM. .TP .BI "Option \*qLCDDualEdge\*q \*q" boolean \*q Enables the use of dual-edge mode to set the LCD. The default is disabled. .TP .BI "Option \*qMaxDRIMem\*q \*q" integer \*q Sets the maximum amount of VRAM memory allocated for DRI clients to "integer" kB. Normally DRI clients get half the available VRAM size, but in some cases it may make sense to limit this amount. For example, if you are using a composite manager and you want to give as much memory as possible to the EXA pixmap storage area. .TP .BI "Option \*qMigrationHeuristic\*q \*q" string \*q Sets the heuristic for EXA pixmap migration. This is an EXA core option, and starting from __xservername__ server version 1.3.0 this defaults to "always". The openchrome driver performs best with "greedy", so you should really add this option to your configuration file. The third possibility is "smart". .TP .BI "Option \*qNoAccel\*q \*q" boolean \*q Disables the use of hardware acceleration. Acceleration is enabled by default. .TP .BI "Option \*qNoAGPFor2D\*q \*q" boolean \*q Disables the use of AGP DMA for 2D acceleration, even when AGP DMA is enabled. The default is enabled. .TP .BI "Option \*qNoXVDMA\*q \*q" boolean \*q If DRI is enabled, Xv normally uses PCI DMA to transfer video images from system to frame-buffer memory. This is somewhat slower than direct copies due to the limitations of the PCI bus, but on the other hand it decreases CPU usage significantly, particularly on computers with fast processors. Some video players are buggy and will display rendering artifacts when PCI DMA is used. If you experience this, or don't want your PCI bus to be stressed with Xv images, set this option to "true". This option has no effect when DRI is not enabled. .TP .BI "Option \*qPanelSize\*q \*q" string \*q Specifies the size (width x height) of the LCD panel attached to the system. The sizes 640x480, 800x600, 1024x768, 1280x1024, and 1400x1050 are supported. .TP .BI "Option \*qRotationType\*q \*q" string \*q Enabled rotation by using RandR. The driver only support unaccelerated RandR rotations "SWRandR". Hardware rotations "HWRandR" is currently unimplemented. .TP .BI "Option \*qRotate\*q \*q" string \*q Rotates the display either clockwise ("CW"), counterclockwise ("CCW") and upside-down ("UD"). Rotation is only supported unaccelerated. Adding option "Rotate", enables RandR rotation feature. The RandR allows clients to dynamically change X screens. .TP .BI "Option \*qShadowFB\*q \*q" boolean \*q Enables the use of a shadow frame buffer. This is required when rotating the display, but otherwise defaults to disabled. .TP .BI "Option \*qSWCursor\*q \*q" boolean \*q Enables the use of a software cursor. The default is disabled: the hardware cursor is used. .TP .BI "Option \*qTVDeflicker\*q \*q" integer \*q Specifies the deflicker setting for TV output. Valid values are "0", "1", and "2". Here 0 means no deflicker, 1 means 1:1:1 deflicker, and 2 means 1:2:1 deflicker. .TP .BI "Option \*qTVDotCrawl\*q \*q" boolean \*q Enables dot-crawl suppression. The default is disabled. .TP .BI "Option \*qTVOutput\*q \*q" string \*q Specifies which TV output to use. The driver supports "S-Video", "Composite", "SC", "RGB", and "YCbCr" outputs. Note that on some EPIA boards the composite-video port is shared with audio-out and is selected via a jumper. .TP .BI "Option \*qTVPort\*q \*q" string \*q Specifies TV port. The driver currently supports "DVP0", "DVP1", "DFPHigh" and "DFPLow" ports. .TP .BI "Option \*qTVType\*q \*q" string \*q Specifies TV output format. The driver currently supports "NTSC" and "PAL" timings only. .TP .BI "Option \*qVBEModes\*q \*q" boolean \*q Enables the use of VBE BIOS calls for setting the display mode. This mimics the behaviour of the vesa driver but still provides acceleration and other features. This option may be used if your hardware works with the vesa driver but not with the openchrome driver. It may not work on 64-bit systems. Using "VBEModes" may speed up driver acceleration significantly due to a more aggressive hardware setting, particularly on systems with low memory bandwidth. Your refresh rate may be limited to 60 Hz on some systems. .TP .BI "Option \*qVBESaveRestore\*q \*q" boolean \*q Enables the use of VBE BIOS calls for saving and restoring the display state when the X server is launched. This can be extremely slow on some hardware, and the system may appear to have locked for 10 seconds or so. The default is to use the driver builtin function. This option only works if option "VBEModes" is enabled. .TP .BI "Option \*qVideoRAM\*q \*q" integer \*q Overrides the VideoRAM autodetection. This should never be needed. .PP .SH "TV ENCODERS" Unichromes tend to be paired with several different TV encoders. .TP .BI "VIA Technologies VT1621" Still untested, as no combination with a Unichrome is known or available. Supports the following normal modes: "640x480" and "800x600". Use "640x480Over" and "800x600Over" for vertical overscan. These modes are made available by the driver; modelines provided in __xconfigfile__ will be ignored. .TP .BI "VIA Technologies VT1622, VT1622A, VT1623" Supports the following modes: "640x480", "800x600", "1024x768", "848x480", "720x480" (NTSC only) and "720x576" (PAL only). Use "640x480Over", "800x600Over", "1024x768Over", "848x480Over", "720x480Over" (NTSC) and "720x576Over" (PAL) for vertical overscan. The modes "720x480Noscale" (NTSC) and "720x576Noscale" (PAL) (available on VT1622 only) provide cleaner TV output (unscaled with only minimal overscan). These modes are made available by the driver; modelines provided in __xconfigfile__ will be ignored. .SH "SEE ALSO" __xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__), EXA(__filemansuffix__), Xv(__filemansuffix__) .SH AUTHORS Authors include: ... xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_3d.c000066400000000000000000000457171267025031400231430ustar00rootroot00000000000000/* * Copyright 2006 Thomas Hellström. 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. */ #include "via_3d.h" #include "via_3d_reg.h" #include typedef struct { Bool supported; CARD32 col0; CARD32 col1; CARD32 al0; CARD32 al1; } ViaCompositeOperator; typedef struct { CARD32 pictFormat; Bool dstSupported; Bool texSupported; CARD32 dstFormat; CARD32 texFormat; } Via3DFormat; static ViaCompositeOperator viaOperatorModes[256]; static Via3DFormat via3DFormats[256]; #define VIA_NUM_3D_OPCODES 19 #define VIA_NUM_3D_FORMATS 15 #define VIA_FMT_HASH(arg) (((((arg) >> 1) + (arg)) >> 8) & 0xFF) static const CARD32 viaOpCodes[VIA_NUM_3D_OPCODES][5] = { {PictOpClear, 0x05, 0x45, 0x40, 0x80}, {PictOpSrc, 0x15, 0x45, 0x50, 0x80}, {PictOpDst, 0x05, 0x55, 0x40, 0x90}, {PictOpOver, 0x15, 0x52, 0x50, 0x91}, {PictOpOverReverse, 0x13, 0x45, 0x52, 0x90}, {PictOpIn, 0x03, 0x45, 0x42, 0x80}, {PictOpInReverse, 0x05, 0x42, 0x40, 0x81}, {PictOpOut, 0x13, 0x45, 0x52, 0x80}, {PictOpOutReverse, 0x05, 0x52, 0x40, 0x91}, {PictOpAtop, 0x03, 0x52, 0x42, 0x91}, {PictOpAtopReverse, 0x13, 0x42, 0x52, 0x81}, {PictOpXor, 0x15, 0x52, 0x52, 0x91}, {PictOpAdd, 0x15, 0x55, 0x50, 0x90}, {PictOpDisjointClear, 0x05, 0x45, 0x40, 0x80}, {PictOpDisjointSrc, 0x15, 0x45, 0x50, 0x80}, {PictOpDisjointDst, 0x05, 0x55, 0x40, 0x90}, {PictOpConjointClear, 0x05, 0x45, 0x40, 0x80}, {PictOpConjointSrc, 0x15, 0x45, 0x50, 0x80}, {PictOpConjointDst, 0x05, 0x55, 0x40, 0x90} }; static const CARD32 viaFormats[VIA_NUM_3D_FORMATS][5] = { {PICT_x1r5g5b5, HC_HDBFM_RGB555, HC_HTXnFM_RGB555, 1, 1}, {PICT_r5g6b5, HC_HDBFM_RGB565, HC_HTXnFM_RGB565, 1, 1}, {PICT_a4r4g4b4, HC_HDBFM_ARGB4444, HC_HTXnFM_ARGB4444, 1, 1}, {PICT_a1r5g5b5, HC_HDBFM_ARGB1555, HC_HTXnFM_ARGB1555, 1, 1}, {PICT_x1b5g5r5, HC_HDBFM_BGR555, HC_HTXnFM_BGR555, 1, 1}, {PICT_b5g6r5, HC_HDBFM_BGR565, HC_HTXnFM_BGR565, 1, 1}, {PICT_a4b4g4r4, HC_HDBFM_ABGR4444, HC_HTXnFM_ABGR4444, 1, 1}, {PICT_a1b5g5r5, HC_HDBFM_ABGR1555, HC_HTXnFM_ABGR1555, 1, 1}, {PICT_x8r8g8b8, HC_HDBFM_ARGB0888, HC_HTXnFM_ARGB0888, 1, 1}, {PICT_a8r8g8b8, HC_HDBFM_ARGB8888, HC_HTXnFM_ARGB8888, 1, 1}, {PICT_x8b8g8r8, HC_HDBFM_ABGR0888, HC_HTXnFM_ABGR0888, 1, 1}, {PICT_a8b8g8r8, HC_HDBFM_ABGR8888, HC_HTXnFM_ABGR8888, 1, 1}, {PICT_a8, 0x00, HC_HTXnFM_A8, 0, 1}, {PICT_a4, 0x00, HC_HTXnFM_A4, 0, 1}, {PICT_a1, 0x00, HC_HTXnFM_A1, 0, 1} }; static CARD32 via3DDstFormat(int format) { return via3DFormats[VIA_FMT_HASH(format)].dstFormat; } static CARD32 via3DTexFormat(int format) { return via3DFormats[VIA_FMT_HASH(format)].texFormat; } static Bool via3DDstSupported(int format) { Via3DFormat *fm = via3DFormats + VIA_FMT_HASH(format); if (fm->pictFormat != format) return FALSE; return fm->dstSupported; } static Bool via3DTexSupported(int format) { Via3DFormat *fm = via3DFormats + VIA_FMT_HASH(format); if (fm->pictFormat != format) return FALSE; return fm->texSupported; } static void viaSet3DDestination(Via3DState * v3d, CARD32 offset, CARD32 pitch, int format) { v3d->drawingDirty = TRUE; /* Affects planemask format. */ v3d->destDirty = TRUE; v3d->destOffset = offset; v3d->destPitch = pitch; v3d->destFormat = via3DDstFormat(format); v3d->destDepth = (v3d->destFormat < HC_HDBFM_ARGB0888) ? 16 : 32; } static void viaSet3DDrawing(Via3DState * v3d, int rop, CARD32 planeMask, CARD32 solidColor, CARD32 solidAlpha) { v3d->drawingDirty = TRUE; v3d->rop = rop; v3d->planeMask = planeMask; v3d->solidColor = solidColor; v3d->solidAlpha = solidAlpha; } static void viaSet3DFlags(Via3DState * v3d, int numTextures, Bool writeAlpha, Bool writeColor, Bool blend) { v3d->enableDirty = TRUE; v3d->blendDirty = TRUE; v3d->numTextures = numTextures; v3d->writeAlpha = writeAlpha; v3d->writeColor = writeColor; v3d->blend = blend; } static Bool viaOrder(CARD32 val, CARD32 * shift) { *shift = 0; while (val > (1 << *shift)) (*shift)++; return (val == (1 << *shift)); } static Bool viaSet3DTexture(Via3DState * v3d, int tex, CARD32 offset, CARD32 pitch, Bool npot, CARD32 width, CARD32 height, int format, ViaTextureModes sMode, ViaTextureModes tMode, ViaTexBlendingModes blendingMode, Bool agpTexture) { ViaTextureUnit *vTex = v3d->tex + tex; vTex->textureLevel0Offset = offset; vTex->npot = npot; if (!viaOrder(pitch, &vTex->textureLevel0Exp) && !vTex->npot) return FALSE; vTex->textureLevel0Pitch = pitch; if (!viaOrder(width, &vTex->textureLevel0WExp)) return FALSE; if (!viaOrder(height, &vTex->textureLevel0HExp)) return FALSE; if (pitch <= 4) { ErrorF("Warning: texture pitch <= 4 !\n"); } vTex->textureFormat = via3DTexFormat(format); switch (blendingMode) { case via_src: vTex->texCsat = (0x01 << 23) | (0x10 << 14) | (0x03 << 7) | 0x00; vTex->texAsat = ((0x0B << 14) | ((PICT_FORMAT_A(format) ? 0x04 : 0x02) << 7) | 0x03); vTex->texRCa = 0x00000000; vTex->texRAa = 0x00000000; vTex->texBColDirty = TRUE; break; case via_src_onepix_mask: vTex->texCsat = (0x01 << 23) | (0x09 << 14) | (0x03 << 7) | 0x00; vTex->texAsat = ((0x03 << 14) | ((PICT_FORMAT_A(format) ? 0x04 : 0x02) << 7) | 0x03); break; case via_src_onepix_comp_mask: vTex->texCsat = (0x01 << 23) | (0x09 << 14) | (0x03 << 7) | 0x00; vTex->texAsat = ((0x03 << 14) | ((PICT_FORMAT_A(format) ? 0x04 : 0x02) << 7) | 0x03); break; case via_mask: vTex->texCsat = (0x01 << 23) | (0x07 << 14) | (0x04 << 7) | 0x00; vTex->texAsat = (0x01 << 23) | (0x04 << 14) | (0x02 << 7) | 0x03; break; case via_comp_mask: vTex->texCsat = (0x01 << 23) | (0x03 << 14) | (0x04 << 7) | 0x00; vTex->texAsat = (0x01 << 23) | (0x04 << 14) | (0x02 << 7) | 0x03; break; default: return FALSE; } vTex->textureDirty = TRUE; vTex->textureModesS = sMode - via_single; vTex->textureModesT = tMode - via_single; vTex->agpTexture = agpTexture; return TRUE; } static void viaSet3DTexBlendCol(Via3DState * v3d, int tex, Bool component, CARD32 color) { CARD32 alpha; ViaTextureUnit *vTex = v3d->tex + tex; vTex->texRAa = (color >> 8) & 0x00FF0000; if (component) { vTex->texRCa = (color & 0x00FFFFFF); } else { alpha = color >> 24; vTex->texRCa = alpha | (alpha << 8) | (alpha << 16) | (alpha << 24); } vTex->texBColDirty = TRUE; } /* * Check if the compositing operator is supported and * return the corresponding register setting. */ static void viaSet3DCompositeOperator(Via3DState * v3d, CARD8 op) { ViaCompositeOperator *vOp = viaOperatorModes + op; if (v3d) v3d->blendDirty = TRUE; else return; if (vOp->supported) { v3d->blendCol0 = vOp->col0 << 4; v3d->blendCol1 = vOp->col1 << 2; v3d->blendAl0 = vOp->al0 << 4; v3d->blendAl1 = vOp->al1 << 2; } } static Bool via3DOpSupported(CARD8 op) { return viaOperatorModes[op].supported; } static void via3DEmitQuad(Via3DState * v3d, ViaCommandBuffer * cb, int dstX, int dstY, int src0X, int src0Y, int src1X, int src1Y, int w, int h) { CARD32 acmd; float dx1, dx2, dy1, dy2, sx1[2], sx2[2], sy1[2], sy2[2], wf; double scalex, scaley; int i, numTex; ViaTextureUnit *vTex; numTex = v3d->numTextures; dx1 = dstX; dx2 = dstX + w; dy1 = dstY; dy2 = dstY + h; if (numTex) { sx1[0] = src0X; sx1[1] = src1X; sy1[0] = src0Y; sy1[1] = src1Y; for (i = 0; i < numTex; ++i) { vTex = v3d->tex + i; scalex = 1. / (double)((1 << vTex->textureLevel0WExp)); scaley = 1. / (double)((1 << vTex->textureLevel0HExp)); sx2[i] = sx1[i] + w; sy2[i] = sy1[i] + h; sx1[i] *= scalex; sy1[i] *= scaley; sx2[i] *= scalex; sy2[i] *= scaley; } } wf = 0.05; /* * Vertex buffer. Emit two 3-point triangles. The W or Z coordinate * is needed for AGP DMA, and the W coordinate is for some obscure * reason needed for texture mapping to be done correctly. So emit * a w value after the x and y coordinates. */ BEGIN_H2(HC_ParaType_CmdVdata, 22 + numTex * 6); acmd = ((1 << 14) | (1 << 13) | (1 << 11)); if (numTex) acmd |= ((1 << 7) | (1 << 8)); OUT_RING_SubA(0xEC, acmd); acmd = 2 << 16; OUT_RING_SubA(0xEE, acmd); OUT_RING(*((CARD32 *) (&dx1))); OUT_RING(*((CARD32 *) (&dy1))); OUT_RING(*((CARD32 *) (&wf))); for (i = 0; i < numTex; ++i) { OUT_RING(*((CARD32 *) (sx1 + i))); OUT_RING(*((CARD32 *) (sy1 + i))); } OUT_RING(*((CARD32 *) (&dx2))); OUT_RING(*((CARD32 *) (&dy1))); OUT_RING(*((CARD32 *) (&wf))); for (i = 0; i < numTex; ++i) { OUT_RING(*((CARD32 *) (sx2 + i))); OUT_RING(*((CARD32 *) (sy1 + i))); } OUT_RING(*((CARD32 *) (&dx1))); OUT_RING(*((CARD32 *) (&dy2))); OUT_RING(*((CARD32 *) (&wf))); for (i = 0; i < numTex; ++i) { OUT_RING(*((CARD32 *) (sx1 + i))); OUT_RING(*((CARD32 *) (sy2 + i))); } OUT_RING(*((CARD32 *) (&dx1))); OUT_RING(*((CARD32 *) (&dy2))); OUT_RING(*((CARD32 *) (&wf))); for (i = 0; i < numTex; ++i) { OUT_RING(*((CARD32 *) (sx1 + i))); OUT_RING(*((CARD32 *) (sy2 + i))); } OUT_RING(*((CARD32 *) (&dx2))); OUT_RING(*((CARD32 *) (&dy1))); OUT_RING(*((CARD32 *) (&wf))); for (i = 0; i < numTex; ++i) { OUT_RING(*((CARD32 *) (sx2 + i))); OUT_RING(*((CARD32 *) (sy1 + i))); } OUT_RING(*((CARD32 *) (&dx2))); OUT_RING(*((CARD32 *) (&dy2))); OUT_RING(*((CARD32 *) (&wf))); for (i = 0; i < numTex; ++i) { OUT_RING(*((CARD32 *) (sx2 + i))); OUT_RING(*((CARD32 *) (sy2 + i))); } OUT_RING_SubA(0xEE, acmd | HC_HPLEND_MASK | HC_HPMValidN_MASK | HC_HE3Fire_MASK); OUT_RING_SubA(0xEE, acmd | HC_HPLEND_MASK | HC_HPMValidN_MASK | HC_HE3Fire_MASK); ADVANCE_RING; } static void via3DEmitState(Via3DState * v3d, ViaCommandBuffer * cb, Bool forceUpload) { int i; Bool saveHas3dState; ViaTextureUnit *vTex; /* * Destination buffer location, format and pitch. */ if (forceUpload || v3d->destDirty) { v3d->destDirty = FALSE; BEGIN_H2(HC_ParaType_NotTex, 3); OUT_RING_SubA(HC_SubA_HDBBasL, v3d->destOffset & 0x00FFFFFF); OUT_RING_SubA(HC_SubA_HDBBasH, v3d->destOffset >> 24); OUT_RING_SubA(HC_SubA_HDBFM, v3d->destFormat | (v3d->destPitch & HC_HDBPit_MASK) | HC_HDBLoc_Local); } if (forceUpload || v3d->blendDirty) { v3d->blendDirty = FALSE; BEGIN_H2(HC_ParaType_NotTex, 6); OUT_RING_SubA(HC_SubA_HABLRFCa, 0x00); OUT_RING_SubA(HC_SubA_HABLRFCb, 0x00); OUT_RING_SubA(HC_SubA_HABLCsat, v3d->blendCol0); OUT_RING_SubA(HC_SubA_HABLCop, v3d->blendCol1); OUT_RING_SubA(HC_SubA_HABLAsat, v3d->blendAl0); OUT_RING_SubA(HC_SubA_HABLAop, v3d->blendAl1); } if (forceUpload || v3d->drawingDirty) { CARD32 planeMaskLo, planeMaskHi; v3d->drawingDirty = FALSE; BEGIN_H2(HC_ParaType_NotTex, 4); /* * Raster operation and Planemask. */ if ( /* v3d->destDepth == 16 Bad Docs? */ FALSE) { planeMaskLo = (v3d->planeMask & 0x000000FF) << 16; planeMaskHi = (v3d->planeMask & 0x0000FF00) >> 8; } else { planeMaskLo = v3d->planeMask & 0x00FFFFFF; planeMaskHi = v3d->planeMask >> 24; } OUT_RING_SubA(HC_SubA_HROP, ((v3d->rop & 0x0F) << 8) | planeMaskHi); OUT_RING_SubA(HC_SubA_HFBBMSKL, planeMaskLo); /* * Solid shading color and alpha. Pixel center at * floating coordinates (X.5,Y.5). */ OUT_RING_SubA(HC_SubA_HSolidCL, (v3d->solidColor & 0x00FFFFFF) | (0 << 23)); OUT_RING_SubA(HC_SubA_HPixGC, (((v3d->solidColor & 0xFF000000) >> 16) | (0 << 23) | (v3d->solidAlpha & 0xFF))); } if (forceUpload || v3d->enableDirty) { v3d->enableDirty = FALSE; BEGIN_H2(HC_ParaType_NotTex, 1); OUT_RING_SubA(HC_SubA_HEnable, ((v3d->writeColor) ? HC_HenCW_MASK : 0) | ((v3d->blend) ? HC_HenABL_MASK : 0) | ((v3d->numTextures) ? HC_HenTXMP_MASK : 0) | ((v3d->writeAlpha) ? HC_HenAW_MASK : 0)); if (v3d->numTextures) { BEGIN_H2((HC_ParaType_Tex | (HC_SubType_TexGeneral << 8)), 2); OUT_RING_SubA(HC_SubA_HTXSMD, (0 << 7) | (0 << 6) | (((v3d->numTextures - 1) & 0x1) << 3) | (0 << 1) | 1); OUT_RING_SubA(HC_SubA_HTXSMD, (0 << 7) | (0 << 6) | (((v3d->numTextures - 1) & 0x1) << 3) | (0 << 1) | 0); } } for (i = 0; i < v3d->numTextures; ++i) { vTex = v3d->tex + i; if (forceUpload || vTex->textureDirty) { vTex->textureDirty = FALSE; BEGIN_H2((HC_ParaType_Tex | (((i == 0) ? HC_SubType_Tex0 : HC_SubType_Tex1) << 8)), 13); OUT_RING_SubA(HC_SubA_HTXnFM, (vTex->textureFormat | (vTex-> agpTexture ? HC_HTXnLoc_AGP : HC_HTXnLoc_Local))); OUT_RING_SubA(HC_SubA_HTXnL0BasL, vTex->textureLevel0Offset & 0x00FFFFFF); OUT_RING_SubA(HC_SubA_HTXnL012BasH, vTex->textureLevel0Offset >> 24); if (vTex->npot) { OUT_RING_SubA(HC_SubA_HTXnL0Pit, (vTex->textureLevel0Pitch & HC_HTXnLnPit_MASK) | HC_HTXnEnPit_MASK); } else { OUT_RING_SubA(HC_SubA_HTXnL0Pit, vTex->textureLevel0Exp << HC_HTXnLnPitE_SHIFT); } OUT_RING_SubA(HC_SubA_HTXnL0_5WE, vTex->textureLevel0WExp); OUT_RING_SubA(HC_SubA_HTXnL0_5HE, vTex->textureLevel0HExp); OUT_RING_SubA(HC_SubA_HTXnL0OS, 0x00); OUT_RING_SubA(HC_SubA_HTXnTB, 0x00); OUT_RING_SubA(HC_SubA_HTXnMPMD, ((((unsigned)vTex->textureModesT) << 19) | (((unsigned)vTex->textureModesS) << 16))); OUT_RING_SubA(HC_SubA_HTXnTBLCsat, vTex->texCsat); OUT_RING_SubA(HC_SubA_HTXnTBLCop, (0x00 << 22) | (0x00 << 19) | (0x00 << 14) | (0x02 << 11) | (0x00 << 7) | (0x03 << 3) | 0x02); OUT_RING_SubA(HC_SubA_HTXnTBLAsat, vTex->texAsat); OUT_RING_SubA(HC_SubA_HTXnTBLRFog, 0x00); } } for (i = 0; i < v3d->numTextures; ++i) { vTex = v3d->tex + i; if (forceUpload || vTex->texBColDirty) { saveHas3dState = cb->has3dState; vTex->texBColDirty = FALSE; BEGIN_H2((HC_ParaType_Tex | (((i == 0) ? HC_SubType_Tex0 : HC_SubType_Tex1) << 8)), 2); OUT_RING_SubA(HC_SubA_HTXnTBLRAa, vTex->texRAa); OUT_RING_SubA(HC_SubA_HTXnTBLRCa, vTex->texRCa); cb->has3dState = saveHas3dState; } } } /* * Cliprect. Considered not important for the DRM 3D State, so restore the * has3dState flag afterwards. */ static void via3DEmitClipRect(Via3DState * v3d, ViaCommandBuffer * cb, int x, int y, int w, int h) { Bool saveHas3dState; saveHas3dState = cb->has3dState; BEGIN_H2(HC_ParaType_NotTex, 4); OUT_RING_SubA(HC_SubA_HClipTB, (y << 12) | (y + h)); OUT_RING_SubA(HC_SubA_HClipLR, (x << 12) | (x + w)); cb->has3dState = saveHas3dState; } void viaInit3DState(Via3DState * v3d) { ViaCompositeOperator *op; int i; CARD32 tmp, hash; Via3DFormat *format; v3d->setDestination = viaSet3DDestination; v3d->setDrawing = viaSet3DDrawing; v3d->setFlags = viaSet3DFlags; v3d->setTexture = viaSet3DTexture; v3d->setTexBlendCol = viaSet3DTexBlendCol; v3d->opSupported = via3DOpSupported; v3d->setCompositeOperator = viaSet3DCompositeOperator; v3d->emitQuad = via3DEmitQuad; v3d->emitState = via3DEmitState; v3d->emitClipRect = via3DEmitClipRect; v3d->dstSupported = via3DDstSupported; v3d->texSupported = via3DTexSupported; for (i = 0; i < 256; ++i) { viaOperatorModes[i].supported = FALSE; } for (i = 0; i < VIA_NUM_3D_OPCODES; ++i) { op = viaOperatorModes + viaOpCodes[i][0]; op->supported = TRUE; op->col0 = viaOpCodes[i][1]; op->col1 = viaOpCodes[i][2]; op->al0 = viaOpCodes[i][3]; op->al1 = viaOpCodes[i][4]; } for (i = 0; i < 256; ++i) { via3DFormats[i].pictFormat = 0x00; } for (i = 0; i < VIA_NUM_3D_FORMATS; ++i) { tmp = viaFormats[i][0]; hash = VIA_FMT_HASH(tmp); format = via3DFormats + hash; if (format->pictFormat) { ErrorF("BUG: Bad hash function\n"); } format->pictFormat = tmp; format->dstSupported = (viaFormats[i][3] != 0x00); format->texSupported = (viaFormats[i][4] != 0x00); format->dstFormat = viaFormats[i][1]; format->texFormat = viaFormats[i][2]; } } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_3d.h000066400000000000000000000073151267025031400231400ustar00rootroot00000000000000/* * Copyright 2006 Thomas Hellstrom. 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_3D_H #define VIA_3D_H #include "xorg-server.h" #include "xf86.h" #include "via_dmabuffer.h" #define VIA_NUM_TEXUNITS 2 typedef enum { via_single, via_clamp, via_repeat, via_mirror, via_warp } ViaTextureModes; typedef enum { via_src, via_src_onepix_mask, via_src_onepix_comp_mask, via_mask, via_comp_mask } ViaTexBlendingModes; typedef struct _ViaTextureUnit { CARD32 textureLevel0Offset; CARD32 textureLevel0Pitch; CARD32 textureLevel0Exp; CARD32 textureLevel0WExp; CARD32 textureLevel0HExp; CARD32 textureFormat; CARD32 textureModesT; CARD32 textureModesS; CARD32 texCsat; CARD32 texRCa; CARD32 texAsat; CARD32 texRAa; Bool agpTexture; Bool textureDirty; Bool texBColDirty; Bool npot; } ViaTextureUnit; typedef struct _Via3DState { Bool destDirty; Bool blendDirty; Bool enableDirty; Bool drawingDirty; CARD32 rop; CARD32 planeMask; CARD32 solidColor; CARD32 solidAlpha; CARD32 destOffset; CARD32 destPitch; CARD32 destFormat; int destDepth; int numTextures; Bool blend; CARD32 blendCol0; CARD32 blendCol1; CARD32 blendAl0; CARD32 blendAl1; Bool writeAlpha; Bool writeColor; Bool useDestAlpha; ViaTextureUnit tex[VIA_NUM_TEXUNITS]; void (*setDestination) (struct _Via3DState * v3d, CARD32 offset, CARD32 pitch, int format); void (*setDrawing) (struct _Via3DState * v3d, int rop, CARD32 planeMask, CARD32 solidColor, CARD32 solidAlpha); void (*setFlags) (struct _Via3DState * v3d, int numTextures, Bool writeAlpha, Bool writeColor, Bool blend); Bool(*setTexture) (struct _Via3DState * v3d, int tex, CARD32 offset, CARD32 pitch, Bool nPot, CARD32 width, CARD32 height, int format, ViaTextureModes sMode, ViaTextureModes tMode, ViaTexBlendingModes blendingMode, Bool agpTexture); void (*setTexBlendCol) (struct _Via3DState * v3d, int tex, Bool component, CARD32 color); void (*setCompositeOperator) (struct _Via3DState * v3d, CARD8 op); Bool(*opSupported) (CARD8 op); void (*emitQuad) (struct _Via3DState * v3d, ViaCommandBuffer * cb, int dstX, int dstY, int src0X, int src0Y, int src1X, int src1Y, int w, int h); void (*emitState) (struct _Via3DState * v3d, ViaCommandBuffer * cb, Bool forceUpload); void (*emitClipRect) (struct _Via3DState * v3d, ViaCommandBuffer * cb, int x, int y, int w, int h); Bool(*dstSupported) (int format); Bool(*texSupported) (int format); } Via3DState; void viaInit3DState(Via3DState * v3d); #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_3d_reg.h000066400000000000000000002047251267025031400240010ustar00rootroot00000000000000/* * 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 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS 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_3D_REG_H #define VIA_3D_REG_H #define HC_REG_BASE 0x0400 #define HC_REG_TRANS_SPACE 0x0040 #define HC_ParaN_MASK 0xffffffff #define HC_Para_MASK 0x00ffffff #define HC_SubA_MASK 0xff000000 #define HC_SubA_SHIFT 24 /* Transmission Setting */ #define HC_REG_TRANS_SET 0x003c #define HC_ParaSubType_MASK 0xff000000 #define HC_ParaType_MASK 0x00ff0000 #define HC_ParaOS_MASK 0x0000ff00 #define HC_ParaAdr_MASK 0x000000ff #define HC_ParaSubType_SHIFT 24 #define HC_ParaType_SHIFT 16 #define HC_ParaOS_SHIFT 8 #define HC_ParaAdr_SHIFT 0 #define HC_ParaType_CmdVdata 0x0000 #define HC_ParaType_NotTex 0x0001 #define HC_ParaType_Tex 0x0002 #define HC_ParaType_Palette 0x0003 #define HC_ParaType_PreCR 0x0010 #define HC_ParaType_Auto 0x00fe /* Transmission Space */ #define HC_REG_Hpara0 0x0040 #define HC_REG_HpataAF 0x02fc /* Read */ #define HC_REG_HREngSt 0x0000 #define HC_REG_HRFIFOempty 0x0004 #define HC_REG_HRFIFOfull 0x0008 #define HC_REG_HRErr 0x000c #define HC_REG_FIFOstatus 0x0010 /* HC_REG_HREngSt 0x0000 */ #define HC_HDASZC_MASK 0x00010000 #define HC_HSGEMI_MASK 0x0000f000 #define HC_HLGEMISt_MASK 0x00000f00 #define HC_HCRSt_MASK 0x00000080 #define HC_HSE0St_MASK 0x00000040 #define HC_HSE1St_MASK 0x00000020 #define HC_HPESt_MASK 0x00000010 #define HC_HXESt_MASK 0x00000008 #define HC_HBESt_MASK 0x00000004 #define HC_HE2St_MASK 0x00000002 #define HC_HE3St_MASK 0x00000001 /* HC_REG_HRFIFOempty 0x0004 */ #define HC_HRZDempty_MASK 0x00000010 #define HC_HRTXAempty_MASK 0x00000008 #define HC_HRTXDempty_MASK 0x00000004 #define HC_HWZDempty_MASK 0x00000002 #define HC_HWCDempty_MASK 0x00000001 /* HC_REG_HRFIFOfull 0x0008 */ #define HC_HRZDfull_MASK 0x00000010 #define HC_HRTXAfull_MASK 0x00000008 #define HC_HRTXDfull_MASK 0x00000004 #define HC_HWZDfull_MASK 0x00000002 #define HC_HWCDfull_MASK 0x00000001 /* HC_REG_HRErr 0x000c */ #define HC_HAGPCMErr_MASK 0x80000000 #define HC_HAGPCMErrC_MASK 0x70000000 /* HC_REG_FIFOstatus 0x0010 */ #define HC_HRFIFOATall_MASK 0x80000000 #define HC_HRFIFOATbusy_MASK 0x40000000 #define HC_HRATFGMDo_MASK 0x00000100 #define HC_HRATFGMDi_MASK 0x00000080 #define HC_HRATFRZD_MASK 0x00000040 #define HC_HRATFRTXA_MASK 0x00000020 #define HC_HRATFRTXD_MASK 0x00000010 #define HC_HRATFWZD_MASK 0x00000008 #define HC_HRATFWCD_MASK 0x00000004 #define HC_HRATTXTAG_MASK 0x00000002 #define HC_HRATTXCH_MASK 0x00000001 /* AGP Command Setting */ #define HC_SubA_HAGPBstL 0x0060 #define HC_SubA_HAGPBendL 0x0061 #define HC_SubA_HAGPCMNT 0x0062 #define HC_SubA_HAGPBpL 0x0063 #define HC_SubA_HAGPBpH 0x0064 /* HC_SubA_HAGPCMNT 0x0062 */ #define HC_HAGPCMNT_MASK 0x00800000 #define HC_HCmdErrClr_MASK 0x00400000 #define HC_HAGPBendH_MASK 0x0000ff00 #define HC_HAGPBstH_MASK 0x000000ff #define HC_HAGPBendH_SHIFT 8 #define HC_HAGPBstH_SHIFT 0 /* HC_SubA_HAGPBpL 0x0063 */ #define HC_HAGPBpL_MASK 0x00fffffc #define HC_HAGPBpID_MASK 0x00000003 #define HC_HAGPBpID_PAUSE 0x00000000 #define HC_HAGPBpID_JUMP 0x00000001 #define HC_HAGPBpID_STOP 0x00000002 /* HC_SubA_HAGPBpH 0x0064 */ #define HC_HAGPBpH_MASK 0x00ffffff /* Miscellaneous Settings */ #define HC_SubA_HClipTB 0x0070 #define HC_SubA_HClipLR 0x0071 #define HC_SubA_HFPClipTL 0x0072 #define HC_SubA_HFPClipBL 0x0073 #define HC_SubA_HFPClipLL 0x0074 #define HC_SubA_HFPClipRL 0x0075 #define HC_SubA_HFPClipTBH 0x0076 #define HC_SubA_HFPClipLRH 0x0077 #define HC_SubA_HLP 0x0078 #define HC_SubA_HLPRF 0x0079 #define HC_SubA_HSolidCL 0x007a #define HC_SubA_HPixGC 0x007b #define HC_SubA_HSPXYOS 0x007c #define HC_SubA_HVertexCNT 0x007d #define HC_HClipT_MASK 0x00fff000 #define HC_HClipT_SHIFT 12 #define HC_HClipB_MASK 0x00000fff #define HC_HClipB_SHIFT 0 #define HC_HClipL_MASK 0x00fff000 #define HC_HClipL_SHIFT 12 #define HC_HClipR_MASK 0x00000fff #define HC_HClipR_SHIFT 0 #define HC_HFPClipBH_MASK 0x0000ff00 #define HC_HFPClipBH_SHIFT 8 #define HC_HFPClipTH_MASK 0x000000ff #define HC_HFPClipTH_SHIFT 0 #define HC_HFPClipRH_MASK 0x0000ff00 #define HC_HFPClipRH_SHIFT 8 #define HC_HFPClipLH_MASK 0x000000ff #define HC_HFPClipLH_SHIFT 0 #define HC_HSolidCH_MASK 0x000000ff #define HC_HPixGC_MASK 0x00800000 #define HC_HSPXOS_MASK 0x00fff000 #define HC_HSPXOS_SHIFT 12 #define HC_HSPYOS_MASK 0x00000fff /* Command * Command A */ #define HC_HCmdHeader_MASK 0xfe000000 /*0xffe00000 */ #define HC_HE3Fire_MASK 0x00100000 #define HC_HPMType_MASK 0x000f0000 #define HC_HEFlag_MASK 0x0000e000 #define HC_HShading_MASK 0x00001c00 #define HC_HPMValidN_MASK 0x00000200 #define HC_HPLEND_MASK 0x00000100 #define HC_HVCycle_MASK 0x000000ff #define HC_HVCycle_Style_MASK 0x000000c0 #define HC_HVCycle_ChgA_MASK 0x00000030 #define HC_HVCycle_ChgB_MASK 0x0000000c #define HC_HVCycle_ChgC_MASK 0x00000003 #define HC_HPMType_Point 0x00000000 #define HC_HPMType_Line 0x00010000 #define HC_HPMType_Tri 0x00020000 #define HC_HPMType_TriWF 0x00040000 #define HC_HEFlag_NoAA 0x00000000 #define HC_HEFlag_ab 0x00008000 #define HC_HEFlag_bc 0x00004000 #define HC_HEFlag_ca 0x00002000 #define HC_HShading_Solid 0x00000000 #define HC_HShading_FlatA 0x00000400 #define HC_HShading_FlatB 0x00000800 #define HC_HShading_FlatC 0x00000c00 #define HC_HShading_Gouraud 0x00001000 #define HC_HVCycle_Full 0x00000000 #define HC_HVCycle_AFP 0x00000040 #define HC_HVCycle_One 0x000000c0 #define HC_HVCycle_NewA 0x00000000 #define HC_HVCycle_AA 0x00000010 #define HC_HVCycle_AB 0x00000020 #define HC_HVCycle_AC 0x00000030 #define HC_HVCycle_NewB 0x00000000 #define HC_HVCycle_BA 0x00000004 #define HC_HVCycle_BB 0x00000008 #define HC_HVCycle_BC 0x0000000c #define HC_HVCycle_NewC 0x00000000 #define HC_HVCycle_CA 0x00000001 #define HC_HVCycle_CB 0x00000002 #define HC_HVCycle_CC 0x00000003 /* Command B */ #define HC_HLPrst_MASK 0x00010000 #define HC_HLLastP_MASK 0x00008000 #define HC_HVPMSK_MASK 0x00007f80 #define HC_HBFace_MASK 0x00000040 #define HC_H2nd1VT_MASK 0x0000003f #define HC_HVPMSK_X 0x00004000 #define HC_HVPMSK_Y 0x00002000 #define HC_HVPMSK_Z 0x00001000 #define HC_HVPMSK_W 0x00000800 #define HC_HVPMSK_Cd 0x00000400 #define HC_HVPMSK_Cs 0x00000200 #define HC_HVPMSK_S 0x00000100 #define HC_HVPMSK_T 0x00000080 /* Enable Setting */ #define HC_SubA_HEnable 0x0000 #define HC_HenTXEnvMap_MASK 0x00200000 #define HC_HenVertexCNT_MASK 0x00100000 #define HC_HenCPUDAZ_MASK 0x00080000 #define HC_HenDASZWC_MASK 0x00040000 #define HC_HenFBCull_MASK 0x00020000 #define HC_HenCW_MASK 0x00010000 #define HC_HenAA_MASK 0x00008000 #define HC_HenST_MASK 0x00004000 #define HC_HenZT_MASK 0x00002000 #define HC_HenZW_MASK 0x00001000 #define HC_HenAT_MASK 0x00000800 #define HC_HenAW_MASK 0x00000400 #define HC_HenSP_MASK 0x00000200 #define HC_HenLP_MASK 0x00000100 #define HC_HenTXCH_MASK 0x00000080 #define HC_HenTXMP_MASK 0x00000040 #define HC_HenTXPP_MASK 0x00000020 #define HC_HenTXTR_MASK 0x00000010 #define HC_HenCS_MASK 0x00000008 #define HC_HenFOG_MASK 0x00000004 #define HC_HenABL_MASK 0x00000002 #define HC_HenDT_MASK 0x00000001 /* Z Setting */ #define HC_SubA_HZWBBasL 0x0010 #define HC_SubA_HZWBBasH 0x0011 #define HC_SubA_HZWBType 0x0012 #define HC_SubA_HZBiasL 0x0013 #define HC_SubA_HZWBend 0x0014 #define HC_SubA_HZWTMD 0x0015 #define HC_SubA_HZWCDL 0x0016 #define HC_SubA_HZWCTAGnum 0x0017 #define HC_SubA_HZCYNum 0x0018 #define HC_SubA_HZWCFire 0x0019 /* HC_SubA_HZWBType */ #define HC_HZWBType_MASK 0x00800000 #define HC_HZBiasedWB_MASK 0x00400000 #define HC_HZONEasFF_MASK 0x00200000 #define HC_HZOONEasFF_MASK 0x00100000 #define HC_HZWBFM_MASK 0x00030000 #define HC_HZWBLoc_MASK 0x0000c000 #define HC_HZWBPit_MASK 0x00003fff #define HC_HZWBFM_16 0x00000000 #define HC_HZWBFM_32 0x00020000 #define HC_HZWBFM_24 0x00030000 #define HC_HZWBLoc_Local 0x00000000 #define HC_HZWBLoc_SyS 0x00004000 /* HC_SubA_HZWBend */ #define HC_HZWBend_MASK 0x00ffe000 #define HC_HZBiasH_MASK 0x000000ff #define HC_HZWBend_SHIFT 10 /* HC_SubA_HZWTMD */ #define HC_HZWTMD_MASK 0x00070000 #define HC_HEBEBias_MASK 0x00007f00 #define HC_HZNF_MASK 0x000000ff #define HC_HZWTMD_NeverPass 0x00000000 #define HC_HZWTMD_LT 0x00010000 #define HC_HZWTMD_EQ 0x00020000 #define HC_HZWTMD_LE 0x00030000 #define HC_HZWTMD_GT 0x00040000 #define HC_HZWTMD_NE 0x00050000 #define HC_HZWTMD_GE 0x00060000 #define HC_HZWTMD_AllPass 0x00070000 #define HC_HEBEBias_SHIFT 8 /* HC_SubA_HZWCDL 0x0016 */ #define HC_HZWCDL_MASK 0x00ffffff /* HC_SubA_HZWCTAGnum 0x0017 */ #define HC_HZWCTAGnum_MASK 0x00ff0000 #define HC_HZWCTAGnum_SHIFT 16 #define HC_HZWCDH_MASK 0x000000ff #define HC_HZWCDH_SHIFT 0 /* HC_SubA_HZCYNum 0x0018 */ #define HC_HZCYNum_MASK 0x00030000 #define HC_HZCYNum_SHIFT 16 #define HC_HZWCQWnum_MASK 0x00003fff #define HC_HZWCQWnum_SHIFT 0 /* HC_SubA_HZWCFire 0x0019 */ #define HC_ZWCFire_MASK 0x00010000 #define HC_HZWCQWnumLast_MASK 0x00003fff #define HC_HZWCQWnumLast_SHIFT 0 /* Stencil Setting */ #define HC_SubA_HSTREF 0x0023 #define HC_SubA_HSTMD 0x0024 /* HC_SubA_HSBFM */ #define HC_HSBFM_MASK 0x00030000 #define HC_HSBLoc_MASK 0x0000c000 #define HC_HSBPit_MASK 0x00003fff /* HC_SubA_HSTREF */ #define HC_HSTREF_MASK 0x00ff0000 #define HC_HSTOPMSK_MASK 0x0000ff00 #define HC_HSTBMSK_MASK 0x000000ff #define HC_HSTREF_SHIFT 16 #define HC_HSTOPMSK_SHIFT 8 /* HC_SubA_HSTMD */ #define HC_HSTMD_MASK 0x00070000 #define HC_HSTOPSF_MASK 0x000001c0 #define HC_HSTOPSPZF_MASK 0x00000038 #define HC_HSTOPSPZP_MASK 0x00000007 #define HC_HSTMD_NeverPass 0x00000000 #define HC_HSTMD_LT 0x00010000 #define HC_HSTMD_EQ 0x00020000 #define HC_HSTMD_LE 0x00030000 #define HC_HSTMD_GT 0x00040000 #define HC_HSTMD_NE 0x00050000 #define HC_HSTMD_GE 0x00060000 #define HC_HSTMD_AllPass 0x00070000 #define HC_HSTOPSF_KEEP 0x00000000 #define HC_HSTOPSF_ZERO 0x00000040 #define HC_HSTOPSF_REPLACE 0x00000080 #define HC_HSTOPSF_INCRSAT 0x000000c0 #define HC_HSTOPSF_DECRSAT 0x00000100 #define HC_HSTOPSF_INVERT 0x00000140 #define HC_HSTOPSF_INCR 0x00000180 #define HC_HSTOPSF_DECR 0x000001c0 #define HC_HSTOPSPZF_KEEP 0x00000000 #define HC_HSTOPSPZF_ZERO 0x00000008 #define HC_HSTOPSPZF_REPLACE 0x00000010 #define HC_HSTOPSPZF_INCRSAT 0x00000018 #define HC_HSTOPSPZF_DECRSAT 0x00000020 #define HC_HSTOPSPZF_INVERT 0x00000028 #define HC_HSTOPSPZF_INCR 0x00000030 #define HC_HSTOPSPZF_DECR 0x00000038 #define HC_HSTOPSPZP_KEEP 0x00000000 #define HC_HSTOPSPZP_ZERO 0x00000001 #define HC_HSTOPSPZP_REPLACE 0x00000002 #define HC_HSTOPSPZP_INCRSAT 0x00000003 #define HC_HSTOPSPZP_DECRSAT 0x00000004 #define HC_HSTOPSPZP_INVERT 0x00000005 #define HC_HSTOPSPZP_INCR 0x00000006 #define HC_HSTOPSPZP_DECR 0x00000007 /* Alpha Setting */ #define HC_SubA_HABBasL 0x0030 #define HC_SubA_HABBasH 0x0031 #define HC_SubA_HABFM 0x0032 #define HC_SubA_HATMD 0x0033 #define HC_SubA_HABLCsat 0x0034 #define HC_SubA_HABLCop 0x0035 #define HC_SubA_HABLAsat 0x0036 #define HC_SubA_HABLAop 0x0037 #define HC_SubA_HABLRCa 0x0038 #define HC_SubA_HABLRFCa 0x0039 #define HC_SubA_HABLRCbias 0x003a #define HC_SubA_HABLRCb 0x003b #define HC_SubA_HABLRFCb 0x003c #define HC_SubA_HABLRAa 0x003d #define HC_SubA_HABLRAb 0x003e /* HC_SubA_HABFM */ #define HC_HABFM_MASK 0x00030000 #define HC_HABLoc_MASK 0x0000c000 #define HC_HABPit_MASK 0x000007ff /* HC_SubA_HATMD */ #define HC_HATMD_MASK 0x00000700 #define HC_HATREF_MASK 0x000000ff #define HC_HATMD_NeverPass 0x00000000 #define HC_HATMD_LT 0x00000100 #define HC_HATMD_EQ 0x00000200 #define HC_HATMD_LE 0x00000300 #define HC_HATMD_GT 0x00000400 #define HC_HATMD_NE 0x00000500 #define HC_HATMD_GE 0x00000600 #define HC_HATMD_AllPass 0x00000700 /* HC_SubA_HABLCsat */ #define HC_HABLCsat_MASK 0x00010000 #define HC_HABLCa_MASK 0x0000fc00 #define HC_HABLCa_C_MASK 0x0000c000 #define HC_HABLCa_OPC_MASK 0x00003c00 #define HC_HABLFCa_MASK 0x000003f0 #define HC_HABLFCa_C_MASK 0x00000300 #define HC_HABLFCa_OPC_MASK 0x000000f0 #define HC_HABLCbias_MASK 0x0000000f #define HC_HABLCbias_C_MASK 0x00000008 #define HC_HABLCbias_OPC_MASK 0x00000007 /*-- Define the input color. */ #define HC_XC_Csrc 0x00000000 #define HC_XC_Cdst 0x00000001 #define HC_XC_Asrc 0x00000002 #define HC_XC_Adst 0x00000003 #define HC_XC_Fog 0x00000004 #define HC_XC_HABLRC 0x00000005 #define HC_XC_minSrcDst 0x00000006 #define HC_XC_maxSrcDst 0x00000007 #define HC_XC_mimAsrcInvAdst 0x00000008 #define HC_XC_OPC 0x00000000 #define HC_XC_InvOPC 0x00000010 #define HC_XC_OPCp5 0x00000020 /*-- Define the input Alpha */ #define HC_XA_OPA 0x00000000 #define HC_XA_InvOPA 0x00000010 #define HC_XA_OPAp5 0x00000020 #define HC_XA_0 0x00000000 #define HC_XA_Asrc 0x00000001 #define HC_XA_Adst 0x00000002 #define HC_XA_Fog 0x00000003 #define HC_XA_minAsrcFog 0x00000004 #define HC_XA_minAsrcAdst 0x00000005 #define HC_XA_maxAsrcFog 0x00000006 #define HC_XA_maxAsrcAdst 0x00000007 #define HC_XA_HABLRA 0x00000008 #define HC_XA_minAsrcInvAdst 0x00000008 #define HC_XA_HABLFRA 0x00000009 /*-- */ #define HC_HABLCa_OPC (HC_XC_OPC << 10) #define HC_HABLCa_InvOPC (HC_XC_InvOPC << 10) #define HC_HABLCa_OPCp5 (HC_XC_OPCp5 << 10) #define HC_HABLCa_Csrc (HC_XC_Csrc << 10) #define HC_HABLCa_Cdst (HC_XC_Cdst << 10) #define HC_HABLCa_Asrc (HC_XC_Asrc << 10) #define HC_HABLCa_Adst (HC_XC_Adst << 10) #define HC_HABLCa_Fog (HC_XC_Fog << 10) #define HC_HABLCa_HABLRCa (HC_XC_HABLRC << 10) #define HC_HABLCa_minSrcDst (HC_XC_minSrcDst << 10) #define HC_HABLCa_maxSrcDst (HC_XC_maxSrcDst << 10) #define HC_HABLFCa_OPC (HC_XC_OPC << 4) #define HC_HABLFCa_InvOPC (HC_XC_InvOPC << 4) #define HC_HABLFCa_OPCp5 (HC_XC_OPCp5 << 4) #define HC_HABLFCa_Csrc (HC_XC_Csrc << 4) #define HC_HABLFCa_Cdst (HC_XC_Cdst << 4) #define HC_HABLFCa_Asrc (HC_XC_Asrc << 4) #define HC_HABLFCa_Adst (HC_XC_Adst << 4) #define HC_HABLFCa_Fog (HC_XC_Fog << 4) #define HC_HABLFCa_HABLRCa (HC_XC_HABLRC << 4) #define HC_HABLFCa_minSrcDst (HC_XC_minSrcDst << 4) #define HC_HABLFCa_maxSrcDst (HC_XC_maxSrcDst << 4) #define HC_HABLFCa_mimAsrcInvAdst (HC_XC_mimAsrcInvAdst << 4) #define HC_HABLCbias_HABLRCbias 0x00000000 #define HC_HABLCbias_Asrc 0x00000001 #define HC_HABLCbias_Adst 0x00000002 #define HC_HABLCbias_Fog 0x00000003 #define HC_HABLCbias_Cin 0x00000004 /* HC_SubA_HABLCop 0x0035 */ #define HC_HABLdot_MASK 0x00010000 #define HC_HABLCop_MASK 0x00004000 #define HC_HABLCb_MASK 0x00003f00 #define HC_HABLCb_C_MASK 0x00003000 #define HC_HABLCb_OPC_MASK 0x00000f00 #define HC_HABLFCb_MASK 0x000000fc #define HC_HABLFCb_C_MASK 0x000000c0 #define HC_HABLFCb_OPC_MASK 0x0000003c #define HC_HABLCshift_MASK 0x00000003 #define HC_HABLCb_OPC (HC_XC_OPC << 8) #define HC_HABLCb_InvOPC (HC_XC_InvOPC << 8) #define HC_HABLCb_OPCp5 (HC_XC_OPCp5 << 8) #define HC_HABLCb_Csrc (HC_XC_Csrc << 8) #define HC_HABLCb_Cdst (HC_XC_Cdst << 8) #define HC_HABLCb_Asrc (HC_XC_Asrc << 8) #define HC_HABLCb_Adst (HC_XC_Adst << 8) #define HC_HABLCb_Fog (HC_XC_Fog << 8) #define HC_HABLCb_HABLRCa (HC_XC_HABLRC << 8) #define HC_HABLCb_minSrcDst (HC_XC_minSrcDst << 8) #define HC_HABLCb_maxSrcDst (HC_XC_maxSrcDst << 8) #define HC_HABLFCb_OPC (HC_XC_OPC << 2) #define HC_HABLFCb_InvOPC (HC_XC_InvOPC << 2) #define HC_HABLFCb_OPCp5 (HC_XC_OPCp5 << 2) #define HC_HABLFCb_Csrc (HC_XC_Csrc << 2) #define HC_HABLFCb_Cdst (HC_XC_Cdst << 2) #define HC_HABLFCb_Asrc (HC_XC_Asrc << 2) #define HC_HABLFCb_Adst (HC_XC_Adst << 2) #define HC_HABLFCb_Fog (HC_XC_Fog << 2) #define HC_HABLFCb_HABLRCb (HC_XC_HABLRC << 2) #define HC_HABLFCb_minSrcDst (HC_XC_minSrcDst << 2) #define HC_HABLFCb_maxSrcDst (HC_XC_maxSrcDst << 2) #define HC_HABLFCb_mimAsrcInvAdst (HC_XC_mimAsrcInvAdst << 2) /* HC_SubA_HABLAsat 0x0036 */ #define HC_HABLAsat_MASK 0x00010000 #define HC_HABLAa_MASK 0x0000fc00 #define HC_HABLAa_A_MASK 0x0000c000 #define HC_HABLAa_OPA_MASK 0x00003c00 #define HC_HABLFAa_MASK 0x000003f0 #define HC_HABLFAa_A_MASK 0x00000300 #define HC_HABLFAa_OPA_MASK 0x000000f0 #define HC_HABLAbias_MASK 0x0000000f #define HC_HABLAbias_A_MASK 0x00000008 #define HC_HABLAbias_OPA_MASK 0x00000007 #define HC_HABLAa_OPA (HC_XA_OPA << 10) #define HC_HABLAa_InvOPA (HC_XA_InvOPA << 10) #define HC_HABLAa_OPAp5 (HC_XA_OPAp5 << 10) #define HC_HABLAa_0 (HC_XA_0 << 10) #define HC_HABLAa_Asrc (HC_XA_Asrc << 10) #define HC_HABLAa_Adst (HC_XA_Adst << 10) #define HC_HABLAa_Fog (HC_XA_Fog << 10) #define HC_HABLAa_minAsrcFog (HC_XA_minAsrcFog << 10) #define HC_HABLAa_minAsrcAdst (HC_XA_minAsrcAdst << 10) #define HC_HABLAa_maxAsrcFog (HC_XA_maxAsrcFog << 10) #define HC_HABLAa_maxAsrcAdst (HC_XA_maxAsrcAdst << 10) #define HC_HABLAa_HABLRA (HC_XA_HABLRA << 10) #define HC_HABLFAa_OPA (HC_XA_OPA << 4) #define HC_HABLFAa_InvOPA (HC_XA_InvOPA << 4) #define HC_HABLFAa_OPAp5 (HC_XA_OPAp5 << 4) #define HC_HABLFAa_0 (HC_XA_0 << 4) #define HC_HABLFAa_Asrc (HC_XA_Asrc << 4) #define HC_HABLFAa_Adst (HC_XA_Adst << 4) #define HC_HABLFAa_Fog (HC_XA_Fog << 4) #define HC_HABLFAa_minAsrcFog (HC_XA_minAsrcFog << 4) #define HC_HABLFAa_minAsrcAdst (HC_XA_minAsrcAdst << 4) #define HC_HABLFAa_maxAsrcFog (HC_XA_maxAsrcFog << 4) #define HC_HABLFAa_maxAsrcAdst (HC_XA_maxAsrcAdst << 4) #define HC_HABLFAa_minAsrcInvAdst (HC_XA_minAsrcInvAdst << 4) #define HC_HABLFAa_HABLFRA (HC_XA_HABLFRA << 4) #define HC_HABLAbias_HABLRAbias 0x00000000 #define HC_HABLAbias_Asrc 0x00000001 #define HC_HABLAbias_Adst 0x00000002 #define HC_HABLAbias_Fog 0x00000003 #define HC_HABLAbias_Aaa 0x00000004 /* HC_SubA_HABLAop 0x0037 */ #define HC_HABLAop_MASK 0x00004000 #define HC_HABLAb_MASK 0x00003f00 #define HC_HABLAb_OPA_MASK 0x00000f00 #define HC_HABLFAb_MASK 0x000000fc #define HC_HABLFAb_OPA_MASK 0x0000003c #define HC_HABLAshift_MASK 0x00000003 #define HC_HABLAb_OPA (HC_XA_OPA << 8) #define HC_HABLAb_InvOPA (HC_XA_InvOPA << 8) #define HC_HABLAb_OPAp5 (HC_XA_OPAp5 << 8) #define HC_HABLAb_0 (HC_XA_0 << 8) #define HC_HABLAb_Asrc (HC_XA_Asrc << 8) #define HC_HABLAb_Adst (HC_XA_Adst << 8) #define HC_HABLAb_Fog (HC_XA_Fog << 8) #define HC_HABLAb_minAsrcFog (HC_XA_minAsrcFog << 8) #define HC_HABLAb_minAsrcAdst (HC_XA_minAsrcAdst << 8) #define HC_HABLAb_maxAsrcFog (HC_XA_maxAsrcFog << 8) #define HC_HABLAb_maxAsrcAdst (HC_XA_maxAsrcAdst << 8) #define HC_HABLAb_HABLRA (HC_XA_HABLRA << 8) #define HC_HABLFAb_OPA (HC_XA_OPA << 2) #define HC_HABLFAb_InvOPA (HC_XA_InvOPA << 2) #define HC_HABLFAb_OPAp5 (HC_XA_OPAp5 << 2) #define HC_HABLFAb_0 (HC_XA_0 << 2) #define HC_HABLFAb_Asrc (HC_XA_Asrc << 2) #define HC_HABLFAb_Adst (HC_XA_Adst << 2) #define HC_HABLFAb_Fog (HC_XA_Fog << 2) #define HC_HABLFAb_minAsrcFog (HC_XA_minAsrcFog << 2) #define HC_HABLFAb_minAsrcAdst (HC_XA_minAsrcAdst << 2) #define HC_HABLFAb_maxAsrcFog (HC_XA_maxAsrcFog << 2) #define HC_HABLFAb_maxAsrcAdst (HC_XA_maxAsrcAdst << 2) #define HC_HABLFAb_minAsrcInvAdst (HC_XA_minAsrcInvAdst << 2) #define HC_HABLFAb_HABLFRA (HC_XA_HABLFRA << 2) /* HC_SubA_HABLRAa 0x003d */ #define HC_HABLRAa_MASK 0x00ff0000 #define HC_HABLRFAa_MASK 0x0000ff00 #define HC_HABLRAbias_MASK 0x000000ff #define HC_HABLRAa_SHIFT 16 #define HC_HABLRFAa_SHIFT 8 /* HC_SubA_HABLRAb 0x003e */ #define HC_HABLRAb_MASK 0x0000ff00 #define HC_HABLRFAb_MASK 0x000000ff #define HC_HABLRAb_SHIFT 8 /* Destination Setting */ #define HC_SubA_HDBBasL 0x0040 #define HC_SubA_HDBBasH 0x0041 #define HC_SubA_HDBFM 0x0042 #define HC_SubA_HFBBMSKL 0x0043 #define HC_SubA_HROP 0x0044 /* HC_SubA_HDBFM 0x0042 */ #define HC_HDBFM_MASK 0x001f0000 #define HC_HDBLoc_MASK 0x0000c000 #define HC_HDBPit_MASK 0x00003fff #define HC_HDBFM_RGB555 0x00000000 #define HC_HDBFM_RGB565 0x00010000 #define HC_HDBFM_ARGB4444 0x00020000 #define HC_HDBFM_ARGB1555 0x00030000 #define HC_HDBFM_BGR555 0x00040000 #define HC_HDBFM_BGR565 0x00050000 #define HC_HDBFM_ABGR4444 0x00060000 #define HC_HDBFM_ABGR1555 0x00070000 #define HC_HDBFM_ARGB0888 0x00080000 #define HC_HDBFM_ARGB8888 0x00090000 #define HC_HDBFM_ABGR0888 0x000a0000 #define HC_HDBFM_ABGR8888 0x000b0000 #define HC_HDBLoc_Local 0x00000000 #define HC_HDBLoc_Sys 0x00004000 /* HC_SubA_HROP 0x0044 */ #define HC_HROP_MASK 0x00000f00 #define HC_HFBBMSKH_MASK 0x000000ff #define HC_HROP_BLACK 0x00000000 #define HC_HROP_DPon 0x00000100 #define HC_HROP_DPna 0x00000200 #define HC_HROP_Pn 0x00000300 #define HC_HROP_PDna 0x00000400 #define HC_HROP_Dn 0x00000500 #define HC_HROP_DPx 0x00000600 #define HC_HROP_DPan 0x00000700 #define HC_HROP_DPa 0x00000800 #define HC_HROP_DPxn 0x00000900 #define HC_HROP_D 0x00000a00 #define HC_HROP_DPno 0x00000b00 #define HC_HROP_P 0x00000c00 #define HC_HROP_PDno 0x00000d00 #define HC_HROP_DPo 0x00000e00 #define HC_HROP_WHITE 0x00000f00 /* Fog Setting */ #define HC_SubA_HFogLF 0x0050 #define HC_SubA_HFogCL 0x0051 #define HC_SubA_HFogCH 0x0052 #define HC_SubA_HFogStL 0x0053 #define HC_SubA_HFogStH 0x0054 #define HC_SubA_HFogOOdMF 0x0055 #define HC_SubA_HFogOOdEF 0x0056 #define HC_SubA_HFogEndL 0x0057 #define HC_SubA_HFogDenst 0x0058 /* HC_SubA_FogLF 0x0050 */ #define HC_FogLF_MASK 0x00000010 #define HC_FogEq_MASK 0x00000008 #define HC_FogMD_MASK 0x00000007 #define HC_FogMD_LocalFog 0x00000000 #define HC_FogMD_LinearFog 0x00000002 #define HC_FogMD_ExponentialFog 0x00000004 #define HC_FogMD_Exponential2Fog 0x00000005 /* #define HC_FogMD_FogTable 0x00000003 */ /* HC_SubA_HFogDenst 0x0058 */ #define HC_FogDenst_MASK 0x001fff00 #define HC_FogEndL_MASK 0x000000ff /* Texture subtype definitions */ #define HC_SubType_Tex0 0x00000000 #define HC_SubType_Tex1 0x00000001 #define HC_SubType_TexGeneral 0x000000fe /* Attribute of texture n */ #define HC_SubA_HTXnL0BasL 0x0000 #define HC_SubA_HTXnL1BasL 0x0001 #define HC_SubA_HTXnL2BasL 0x0002 #define HC_SubA_HTXnL3BasL 0x0003 #define HC_SubA_HTXnL4BasL 0x0004 #define HC_SubA_HTXnL5BasL 0x0005 #define HC_SubA_HTXnL6BasL 0x0006 #define HC_SubA_HTXnL7BasL 0x0007 #define HC_SubA_HTXnL8BasL 0x0008 #define HC_SubA_HTXnL9BasL 0x0009 #define HC_SubA_HTXnLaBasL 0x000a #define HC_SubA_HTXnLbBasL 0x000b #define HC_SubA_HTXnLcBasL 0x000c #define HC_SubA_HTXnLdBasL 0x000d #define HC_SubA_HTXnLeBasL 0x000e #define HC_SubA_HTXnLfBasL 0x000f #define HC_SubA_HTXnL10BasL 0x0010 #define HC_SubA_HTXnL11BasL 0x0011 #define HC_SubA_HTXnL012BasH 0x0020 #define HC_SubA_HTXnL345BasH 0x0021 #define HC_SubA_HTXnL678BasH 0x0022 #define HC_SubA_HTXnL9abBasH 0x0023 #define HC_SubA_HTXnLcdeBasH 0x0024 #define HC_SubA_HTXnLf1011BasH 0x0025 #define HC_SubA_HTXnL0Pit 0x002b #define HC_SubA_HTXnL1Pit 0x002c #define HC_SubA_HTXnL2Pit 0x002d #define HC_SubA_HTXnL3Pit 0x002e #define HC_SubA_HTXnL4Pit 0x002f #define HC_SubA_HTXnL5Pit 0x0030 #define HC_SubA_HTXnL6Pit 0x0031 #define HC_SubA_HTXnL7Pit 0x0032 #define HC_SubA_HTXnL8Pit 0x0033 #define HC_SubA_HTXnL9Pit 0x0034 #define HC_SubA_HTXnLaPit 0x0035 #define HC_SubA_HTXnLbPit 0x0036 #define HC_SubA_HTXnLcPit 0x0037 #define HC_SubA_HTXnLdPit 0x0038 #define HC_SubA_HTXnLePit 0x0039 #define HC_SubA_HTXnLfPit 0x003a #define HC_SubA_HTXnL10Pit 0x003b #define HC_SubA_HTXnL11Pit 0x003c #define HC_SubA_HTXnL0_5WE 0x004b #define HC_SubA_HTXnL6_bWE 0x004c #define HC_SubA_HTXnLc_11WE 0x004d #define HC_SubA_HTXnL0_5HE 0x0051 #define HC_SubA_HTXnL6_bHE 0x0052 #define HC_SubA_HTXnLc_11HE 0x0053 #define HC_SubA_HTXnL0OS 0x0077 #define HC_SubA_HTXnTB 0x0078 #define HC_SubA_HTXnMPMD 0x0079 #define HC_SubA_HTXnCLODu 0x007a #define HC_SubA_HTXnFM 0x007b #define HC_SubA_HTXnTRCH 0x007c #define HC_SubA_HTXnTRCL 0x007d #define HC_SubA_HTXnTBC 0x007e #define HC_SubA_HTXnTRAH 0x007f #define HC_SubA_HTXnTBLCsat 0x0080 #define HC_SubA_HTXnTBLCop 0x0081 #define HC_SubA_HTXnTBLMPfog 0x0082 #define HC_SubA_HTXnTBLAsat 0x0083 #define HC_SubA_HTXnTBLRCa 0x0085 #define HC_SubA_HTXnTBLRCb 0x0086 #define HC_SubA_HTXnTBLRCc 0x0087 #define HC_SubA_HTXnTBLRCbias 0x0088 #define HC_SubA_HTXnTBLRAa 0x0089 #define HC_SubA_HTXnTBLRFog 0x008a #define HC_SubA_HTXnBumpM00 0x0090 #define HC_SubA_HTXnBumpM01 0x0091 #define HC_SubA_HTXnBumpM10 0x0092 #define HC_SubA_HTXnBumpM11 0x0093 #define HC_SubA_HTXnLScale 0x0094 #define HC_SubA_HTXSMD 0x0000 /* HC_SubA_HTXnL012BasH 0x0020 */ #define HC_HTXnL0BasH_MASK 0x000000ff #define HC_HTXnL1BasH_MASK 0x0000ff00 #define HC_HTXnL2BasH_MASK 0x00ff0000 #define HC_HTXnL1BasH_SHIFT 8 #define HC_HTXnL2BasH_SHIFT 16 /* HC_SubA_HTXnL345BasH 0x0021 */ #define HC_HTXnL3BasH_MASK 0x000000ff #define HC_HTXnL4BasH_MASK 0x0000ff00 #define HC_HTXnL5BasH_MASK 0x00ff0000 #define HC_HTXnL4BasH_SHIFT 8 #define HC_HTXnL5BasH_SHIFT 16 /* HC_SubA_HTXnL678BasH 0x0022 */ #define HC_HTXnL6BasH_MASK 0x000000ff #define HC_HTXnL7BasH_MASK 0x0000ff00 #define HC_HTXnL8BasH_MASK 0x00ff0000 #define HC_HTXnL7BasH_SHIFT 8 #define HC_HTXnL8BasH_SHIFT 16 /* HC_SubA_HTXnL9abBasH 0x0023 */ #define HC_HTXnL9BasH_MASK 0x000000ff #define HC_HTXnLaBasH_MASK 0x0000ff00 #define HC_HTXnLbBasH_MASK 0x00ff0000 #define HC_HTXnLaBasH_SHIFT 8 #define HC_HTXnLbBasH_SHIFT 16 /* HC_SubA_HTXnLcdeBasH 0x0024 */ #define HC_HTXnLcBasH_MASK 0x000000ff #define HC_HTXnLdBasH_MASK 0x0000ff00 #define HC_HTXnLeBasH_MASK 0x00ff0000 #define HC_HTXnLdBasH_SHIFT 8 #define HC_HTXnLeBasH_SHIFT 16 /* HC_SubA_HTXnLcdeBasH 0x0025 */ #define HC_HTXnLfBasH_MASK 0x000000ff #define HC_HTXnL10BasH_MASK 0x0000ff00 #define HC_HTXnL11BasH_MASK 0x00ff0000 #define HC_HTXnL10BasH_SHIFT 8 #define HC_HTXnL11BasH_SHIFT 16 /* HC_SubA_HTXnL0Pit 0x002b */ #define HC_HTXnLnPit_MASK 0x00003fff #define HC_HTXnEnPit_MASK 0x00080000 #define HC_HTXnLnPitE_MASK 0x00f00000 #define HC_HTXnLnPitE_SHIFT 20 /* HC_SubA_HTXnL0_5WE 0x004b */ #define HC_HTXnL0WE_MASK 0x0000000f #define HC_HTXnL1WE_MASK 0x000000f0 #define HC_HTXnL2WE_MASK 0x00000f00 #define HC_HTXnL3WE_MASK 0x0000f000 #define HC_HTXnL4WE_MASK 0x000f0000 #define HC_HTXnL5WE_MASK 0x00f00000 #define HC_HTXnL1WE_SHIFT 4 #define HC_HTXnL2WE_SHIFT 8 #define HC_HTXnL3WE_SHIFT 12 #define HC_HTXnL4WE_SHIFT 16 #define HC_HTXnL5WE_SHIFT 20 /* HC_SubA_HTXnL6_bWE 0x004c */ #define HC_HTXnL6WE_MASK 0x0000000f #define HC_HTXnL7WE_MASK 0x000000f0 #define HC_HTXnL8WE_MASK 0x00000f00 #define HC_HTXnL9WE_MASK 0x0000f000 #define HC_HTXnLaWE_MASK 0x000f0000 #define HC_HTXnLbWE_MASK 0x00f00000 #define HC_HTXnL7WE_SHIFT 4 #define HC_HTXnL8WE_SHIFT 8 #define HC_HTXnL9WE_SHIFT 12 #define HC_HTXnLaWE_SHIFT 16 #define HC_HTXnLbWE_SHIFT 20 /* HC_SubA_HTXnLc_11WE 0x004d */ #define HC_HTXnLcWE_MASK 0x0000000f #define HC_HTXnLdWE_MASK 0x000000f0 #define HC_HTXnLeWE_MASK 0x00000f00 #define HC_HTXnLfWE_MASK 0x0000f000 #define HC_HTXnL10WE_MASK 0x000f0000 #define HC_HTXnL11WE_MASK 0x00f00000 #define HC_HTXnLdWE_SHIFT 4 #define HC_HTXnLeWE_SHIFT 8 #define HC_HTXnLfWE_SHIFT 12 #define HC_HTXnL10WE_SHIFT 16 #define HC_HTXnL11WE_SHIFT 20 /* HC_SubA_HTXnL0_5HE 0x0051 */ #define HC_HTXnL0HE_MASK 0x0000000f #define HC_HTXnL1HE_MASK 0x000000f0 #define HC_HTXnL2HE_MASK 0x00000f00 #define HC_HTXnL3HE_MASK 0x0000f000 #define HC_HTXnL4HE_MASK 0x000f0000 #define HC_HTXnL5HE_MASK 0x00f00000 #define HC_HTXnL1HE_SHIFT 4 #define HC_HTXnL2HE_SHIFT 8 #define HC_HTXnL3HE_SHIFT 12 #define HC_HTXnL4HE_SHIFT 16 #define HC_HTXnL5HE_SHIFT 20 /* HC_SubA_HTXnL6_bHE 0x0052 */ #define HC_HTXnL6HE_MASK 0x0000000f #define HC_HTXnL7HE_MASK 0x000000f0 #define HC_HTXnL8HE_MASK 0x00000f00 #define HC_HTXnL9HE_MASK 0x0000f000 #define HC_HTXnLaHE_MASK 0x000f0000 #define HC_HTXnLbHE_MASK 0x00f00000 #define HC_HTXnL7HE_SHIFT 4 #define HC_HTXnL8HE_SHIFT 8 #define HC_HTXnL9HE_SHIFT 12 #define HC_HTXnLaHE_SHIFT 16 #define HC_HTXnLbHE_SHIFT 20 /* HC_SubA_HTXnLc_11HE 0x0053 */ #define HC_HTXnLcHE_MASK 0x0000000f #define HC_HTXnLdHE_MASK 0x000000f0 #define HC_HTXnLeHE_MASK 0x00000f00 #define HC_HTXnLfHE_MASK 0x0000f000 #define HC_HTXnL10HE_MASK 0x000f0000 #define HC_HTXnL11HE_MASK 0x00f00000 #define HC_HTXnLdHE_SHIFT 4 #define HC_HTXnLeHE_SHIFT 8 #define HC_HTXnLfHE_SHIFT 12 #define HC_HTXnL10HE_SHIFT 16 #define HC_HTXnL11HE_SHIFT 20 /* HC_SubA_HTXnL0OS 0x0077 */ #define HC_HTXnL0OS_MASK 0x003ff000 #define HC_HTXnLVmax_MASK 0x00000fc0 #define HC_HTXnLVmin_MASK 0x0000003f #define HC_HTXnL0OS_SHIFT 12 #define HC_HTXnLVmax_SHIFT 6 /* HC_SubA_HTXnTB 0x0078 */ #define HC_HTXnTB_MASK 0x00f00000 #define HC_HTXnFLSe_MASK 0x0000e000 #define HC_HTXnFLSs_MASK 0x00001c00 #define HC_HTXnFLTe_MASK 0x00000380 #define HC_HTXnFLTs_MASK 0x00000070 #define HC_HTXnFLDs_MASK 0x0000000f #define HC_HTXnTB_NoTB 0x00000000 #define HC_HTXnTB_TBC_S 0x00100000 #define HC_HTXnTB_TBC_T 0x00200000 #define HC_HTXnTB_TB_S 0x00400000 #define HC_HTXnTB_TB_T 0x00800000 #define HC_HTXnFLSe_Nearest 0x00000000 #define HC_HTXnFLSe_Linear 0x00002000 #define HC_HTXnFLSe_NonLinear 0x00004000 #define HC_HTXnFLSe_Sharp 0x00008000 #define HC_HTXnFLSe_Flat_Gaussian_Cubic 0x0000c000 #define HC_HTXnFLSs_Nearest 0x00000000 #define HC_HTXnFLSs_Linear 0x00000400 #define HC_HTXnFLSs_NonLinear 0x00000800 #define HC_HTXnFLSs_Flat_Gaussian_Cubic 0x00001800 #define HC_HTXnFLTe_Nearest 0x00000000 #define HC_HTXnFLTe_Linear 0x00000080 #define HC_HTXnFLTe_NonLinear 0x00000100 #define HC_HTXnFLTe_Sharp 0x00000180 #define HC_HTXnFLTe_Flat_Gaussian_Cubic 0x00000300 #define HC_HTXnFLTs_Nearest 0x00000000 #define HC_HTXnFLTs_Linear 0x00000010 #define HC_HTXnFLTs_NonLinear 0x00000020 #define HC_HTXnFLTs_Flat_Gaussian_Cubic 0x00000060 #define HC_HTXnFLDs_Tex0 0x00000000 #define HC_HTXnFLDs_Nearest 0x00000001 #define HC_HTXnFLDs_Linear 0x00000002 #define HC_HTXnFLDs_NonLinear 0x00000003 #define HC_HTXnFLDs_Dither 0x00000004 #define HC_HTXnFLDs_ConstLOD 0x00000005 #define HC_HTXnFLDs_Ani 0x00000006 #define HC_HTXnFLDs_AniDither 0x00000007 /* HC_SubA_HTXnMPMD 0x0079 */ #define HC_HTXnMPMD_SMASK 0x00070000 #define HC_HTXnMPMD_TMASK 0x00380000 #define HC_HTXnLODDTf_MASK 0x00000007 #define HC_HTXnXY2ST_MASK 0x00000008 #define HC_HTXnMPMD_Tsingle 0x00000000 #define HC_HTXnMPMD_Tclamp 0x00080000 #define HC_HTXnMPMD_Trepeat 0x00100000 #define HC_HTXnMPMD_Tmirror 0x00180000 #define HC_HTXnMPMD_Twrap 0x00200000 #define HC_HTXnMPMD_Ssingle 0x00000000 #define HC_HTXnMPMD_Sclamp 0x00010000 #define HC_HTXnMPMD_Srepeat 0x00020000 #define HC_HTXnMPMD_Smirror 0x00030000 #define HC_HTXnMPMD_Swrap 0x00040000 /* HC_SubA_HTXnCLODu 0x007a */ #define HC_HTXnCLODu_MASK 0x000ffc00 #define HC_HTXnCLODd_MASK 0x000003ff #define HC_HTXnCLODu_SHIFT 10 /* HC_SubA_HTXnFM 0x007b */ #define HC_HTXnFM_MASK 0x00ff0000 #define HC_HTXnLoc_MASK 0x00000003 #define HC_HTXnFM_INDEX 0x00000000 #define HC_HTXnFM_Intensity 0x00080000 #define HC_HTXnFM_Lum 0x00100000 #define HC_HTXnFM_Alpha 0x00180000 #define HC_HTXnFM_DX 0x00280000 #define HC_HTXnFM_ARGB16 0x00880000 #define HC_HTXnFM_ARGB32 0x00980000 #define HC_HTXnFM_ABGR16 0x00a80000 #define HC_HTXnFM_ABGR32 0x00b80000 #define HC_HTXnFM_RGBA16 0x00c80000 #define HC_HTXnFM_RGBA32 0x00d80000 #define HC_HTXnFM_BGRA16 0x00e80000 #define HC_HTXnFM_BGRA32 0x00f80000 #define HC_HTXnFM_BUMPMAP 0x00380000 #define HC_HTXnFM_Index1 (HC_HTXnFM_INDEX | 0x00000000) #define HC_HTXnFM_Index2 (HC_HTXnFM_INDEX | 0x00010000) #define HC_HTXnFM_Index4 (HC_HTXnFM_INDEX | 0x00020000) #define HC_HTXnFM_Index8 (HC_HTXnFM_INDEX | 0x00030000) #define HC_HTXnFM_T1 (HC_HTXnFM_Intensity | 0x00000000) #define HC_HTXnFM_T2 (HC_HTXnFM_Intensity | 0x00010000) #define HC_HTXnFM_T4 (HC_HTXnFM_Intensity | 0x00020000) #define HC_HTXnFM_T8 (HC_HTXnFM_Intensity | 0x00030000) #define HC_HTXnFM_L1 (HC_HTXnFM_Lum | 0x00000000) #define HC_HTXnFM_L2 (HC_HTXnFM_Lum | 0x00010000) #define HC_HTXnFM_L4 (HC_HTXnFM_Lum | 0x00020000) #define HC_HTXnFM_L8 (HC_HTXnFM_Lum | 0x00030000) #define HC_HTXnFM_AL44 (HC_HTXnFM_Lum | 0x00040000) #define HC_HTXnFM_AL88 (HC_HTXnFM_Lum | 0x00050000) #define HC_HTXnFM_A1 (HC_HTXnFM_Alpha | 0x00000000) #define HC_HTXnFM_A2 (HC_HTXnFM_Alpha | 0x00010000) #define HC_HTXnFM_A4 (HC_HTXnFM_Alpha | 0x00020000) #define HC_HTXnFM_A8 (HC_HTXnFM_Alpha | 0x00030000) #define HC_HTXnFM_DX1 (HC_HTXnFM_DX | 0x00010000) #define HC_HTXnFM_DX23 (HC_HTXnFM_DX | 0x00020000) #define HC_HTXnFM_DX45 (HC_HTXnFM_DX | 0x00030000) #define HC_HTXnFM_RGB555 (HC_HTXnFM_ARGB16 | 0x00000000) #define HC_HTXnFM_RGB565 (HC_HTXnFM_ARGB16 | 0x00010000) #define HC_HTXnFM_ARGB1555 (HC_HTXnFM_ARGB16 | 0x00020000) #define HC_HTXnFM_ARGB4444 (HC_HTXnFM_ARGB16 | 0x00030000) #define HC_HTXnFM_ARGB0888 (HC_HTXnFM_ARGB32 | 0x00000000) #define HC_HTXnFM_ARGB8888 (HC_HTXnFM_ARGB32 | 0x00010000) #define HC_HTXnFM_BGR555 (HC_HTXnFM_ABGR16 | 0x00000000) #define HC_HTXnFM_BGR565 (HC_HTXnFM_ABGR16 | 0x00010000) #define HC_HTXnFM_ABGR1555 (HC_HTXnFM_ABGR16 | 0x00020000) #define HC_HTXnFM_ABGR4444 (HC_HTXnFM_ABGR16 | 0x00030000) #define HC_HTXnFM_ABGR0888 (HC_HTXnFM_ABGR32 | 0x00000000) #define HC_HTXnFM_ABGR8888 (HC_HTXnFM_ABGR32 | 0x00010000) #define HC_HTXnFM_RGBA5550 (HC_HTXnFM_RGBA16 | 0x00000000) #define HC_HTXnFM_RGBA5551 (HC_HTXnFM_RGBA16 | 0x00020000) #define HC_HTXnFM_RGBA4444 (HC_HTXnFM_RGBA16 | 0x00030000) #define HC_HTXnFM_RGBA8880 (HC_HTXnFM_RGBA32 | 0x00000000) #define HC_HTXnFM_RGBA8888 (HC_HTXnFM_RGBA32 | 0x00010000) #define HC_HTXnFM_BGRA5550 (HC_HTXnFM_BGRA16 | 0x00000000) #define HC_HTXnFM_BGRA5551 (HC_HTXnFM_BGRA16 | 0x00020000) #define HC_HTXnFM_BGRA4444 (HC_HTXnFM_BGRA16 | 0x00030000) #define HC_HTXnFM_BGRA8880 (HC_HTXnFM_BGRA32 | 0x00000000) #define HC_HTXnFM_BGRA8888 (HC_HTXnFM_BGRA32 | 0x00010000) #define HC_HTXnFM_VU88 (HC_HTXnFM_BUMPMAP | 0x00000000) #define HC_HTXnFM_LVU655 (HC_HTXnFM_BUMPMAP | 0x00010000) #define HC_HTXnFM_LVU888 (HC_HTXnFM_BUMPMAP | 0x00020000) #define HC_HTXnLoc_Local 0x00000000 #define HC_HTXnLoc_Sys 0x00000002 #define HC_HTXnLoc_AGP 0x00000003 /* HC_SubA_HTXnTRAH 0x007f */ #define HC_HTXnTRAH_MASK 0x00ff0000 #define HC_HTXnTRAL_MASK 0x0000ff00 #define HC_HTXnTBA_MASK 0x000000ff #define HC_HTXnTRAH_SHIFT 16 #define HC_HTXnTRAL_SHIFT 8 /* HC_SubA_HTXnTBLCsat 0x0080 *-- Define the input texture. */ #define HC_XTC_TOPC 0x00000000 #define HC_XTC_InvTOPC 0x00000010 #define HC_XTC_TOPCp5 0x00000020 #define HC_XTC_Cbias 0x00000000 #define HC_XTC_InvCbias 0x00000010 #define HC_XTC_0 0x00000000 #define HC_XTC_Dif 0x00000001 #define HC_XTC_Spec 0x00000002 #define HC_XTC_Tex 0x00000003 #define HC_XTC_Cur 0x00000004 #define HC_XTC_Adif 0x00000005 #define HC_XTC_Fog 0x00000006 #define HC_XTC_Atex 0x00000007 #define HC_XTC_Acur 0x00000008 #define HC_XTC_HTXnTBLRC 0x00000009 #define HC_XTC_Ctexnext 0x0000000a /*-- */ #define HC_HTXnTBLCsat_MASK 0x00800000 #define HC_HTXnTBLCa_MASK 0x000fc000 #define HC_HTXnTBLCb_MASK 0x00001f80 #define HC_HTXnTBLCc_MASK 0x0000003f #define HC_HTXnTBLCa_TOPC (HC_XTC_TOPC << 14) #define HC_HTXnTBLCa_InvTOPC (HC_XTC_InvTOPC << 14) #define HC_HTXnTBLCa_TOPCp5 (HC_XTC_TOPCp5 << 14) #define HC_HTXnTBLCa_0 (HC_XTC_0 << 14) #define HC_HTXnTBLCa_Dif (HC_XTC_Dif << 14) #define HC_HTXnTBLCa_Spec (HC_XTC_Spec << 14) #define HC_HTXnTBLCa_Tex (HC_XTC_Tex << 14) #define HC_HTXnTBLCa_Cur (HC_XTC_Cur << 14) #define HC_HTXnTBLCa_Adif (HC_XTC_Adif << 14) #define HC_HTXnTBLCa_Fog (HC_XTC_Fog << 14) #define HC_HTXnTBLCa_Atex (HC_XTC_Atex << 14) #define HC_HTXnTBLCa_Acur (HC_XTC_Acur << 14) #define HC_HTXnTBLCa_HTXnTBLRC (HC_XTC_HTXnTBLRC << 14) #define HC_HTXnTBLCa_Ctexnext (HC_XTC_Ctexnext << 14) #define HC_HTXnTBLCb_TOPC (HC_XTC_TOPC << 7) #define HC_HTXnTBLCb_InvTOPC (HC_XTC_InvTOPC << 7) #define HC_HTXnTBLCb_TOPCp5 (HC_XTC_TOPCp5 << 7) #define HC_HTXnTBLCb_0 (HC_XTC_0 << 7) #define HC_HTXnTBLCb_Dif (HC_XTC_Dif << 7) #define HC_HTXnTBLCb_Spec (HC_XTC_Spec << 7) #define HC_HTXnTBLCb_Tex (HC_XTC_Tex << 7) #define HC_HTXnTBLCb_Cur (HC_XTC_Cur << 7) #define HC_HTXnTBLCb_Adif (HC_XTC_Adif << 7) #define HC_HTXnTBLCb_Fog (HC_XTC_Fog << 7) #define HC_HTXnTBLCb_Atex (HC_XTC_Atex << 7) #define HC_HTXnTBLCb_Acur (HC_XTC_Acur << 7) #define HC_HTXnTBLCb_HTXnTBLRC (HC_XTC_HTXnTBLRC << 7) #define HC_HTXnTBLCb_Ctexnext (HC_XTC_Ctexnext << 7) #define HC_HTXnTBLCc_TOPC (HC_XTC_TOPC << 0) #define HC_HTXnTBLCc_InvTOPC (HC_XTC_InvTOPC << 0) #define HC_HTXnTBLCc_TOPCp5 (HC_XTC_TOPCp5 << 0) #define HC_HTXnTBLCc_0 (HC_XTC_0 << 0) #define HC_HTXnTBLCc_Dif (HC_XTC_Dif << 0) #define HC_HTXnTBLCc_Spec (HC_XTC_Spec << 0) #define HC_HTXnTBLCc_Tex (HC_XTC_Tex << 0) #define HC_HTXnTBLCc_Cur (HC_XTC_Cur << 0) #define HC_HTXnTBLCc_Adif (HC_XTC_Adif << 0) #define HC_HTXnTBLCc_Fog (HC_XTC_Fog << 0) #define HC_HTXnTBLCc_Atex (HC_XTC_Atex << 0) #define HC_HTXnTBLCc_Acur (HC_XTC_Acur << 0) #define HC_HTXnTBLCc_HTXnTBLRC (HC_XTC_HTXnTBLRC << 0) #define HC_HTXnTBLCc_Ctexnext (HC_XTC_Ctexnext << 0) /* HC_SubA_HTXnTBLCop 0x0081 */ #define HC_HTXnTBLdot_MASK 0x00c00000 #define HC_HTXnTBLCop_MASK 0x00380000 #define HC_HTXnTBLCbias_MASK 0x0007c000 #define HC_HTXnTBLCshift_MASK 0x00001800 #define HC_HTXnTBLAop_MASK 0x00000380 #define HC_HTXnTBLAbias_MASK 0x00000078 #define HC_HTXnTBLAshift_MASK 0x00000003 #define HC_HTXnTBLCop_Add 0x00000000 #define HC_HTXnTBLCop_Sub 0x00080000 #define HC_HTXnTBLCop_Min 0x00100000 #define HC_HTXnTBLCop_Max 0x00180000 #define HC_HTXnTBLCop_Mask 0x00200000 #define HC_HTXnTBLCbias_Cbias (HC_XTC_Cbias << 14) #define HC_HTXnTBLCbias_InvCbias (HC_XTC_InvCbias << 14) #define HC_HTXnTBLCbias_0 (HC_XTC_0 << 14) #define HC_HTXnTBLCbias_Dif (HC_XTC_Dif << 14) #define HC_HTXnTBLCbias_Spec (HC_XTC_Spec << 14) #define HC_HTXnTBLCbias_Tex (HC_XTC_Tex << 14) #define HC_HTXnTBLCbias_Cur (HC_XTC_Cur << 14) #define HC_HTXnTBLCbias_Adif (HC_XTC_Adif << 14) #define HC_HTXnTBLCbias_Fog (HC_XTC_Fog << 14) #define HC_HTXnTBLCbias_Atex (HC_XTC_Atex << 14) #define HC_HTXnTBLCbias_Acur (HC_XTC_Acur << 14) #define HC_HTXnTBLCbias_HTXnTBLRC (HC_XTC_HTXnTBLRC << 14) #define HC_HTXnTBLCshift_1 0x00000000 #define HC_HTXnTBLCshift_2 0x00000800 #define HC_HTXnTBLCshift_No 0x00001000 #define HC_HTXnTBLCshift_DotP 0x00001800 /*=* John Sheng [2003.7.18] texture combine *=*/ #define HC_HTXnTBLDOT3 0x00080000 #define HC_HTXnTBLDOT4 0x000C0000 #define HC_HTXnTBLAop_Add 0x00000000 #define HC_HTXnTBLAop_Sub 0x00000080 #define HC_HTXnTBLAop_Min 0x00000100 #define HC_HTXnTBLAop_Max 0x00000180 #define HC_HTXnTBLAop_Mask 0x00000200 #define HC_HTXnTBLAbias_Inv 0x00000040 #define HC_HTXnTBLAbias_Adif 0x00000000 #define HC_HTXnTBLAbias_Fog 0x00000008 #define HC_HTXnTBLAbias_Acur 0x00000010 #define HC_HTXnTBLAbias_HTXnTBLRAbias 0x00000018 #define HC_HTXnTBLAbias_Atex 0x00000020 #define HC_HTXnTBLAshift_1 0x00000000 #define HC_HTXnTBLAshift_2 0x00000001 #define HC_HTXnTBLAshift_No 0x00000002 /* #define HC_HTXnTBLAshift_DotP 0x00000003 */ /* HC_SubA_HTXnTBLMPFog 0x0082 */ #define HC_HTXnTBLMPfog_MASK 0x00e00000 #define HC_HTXnTBLMPfog_0 0x00000000 #define HC_HTXnTBLMPfog_Adif 0x00200000 #define HC_HTXnTBLMPfog_Fog 0x00400000 #define HC_HTXnTBLMPfog_Atex 0x00600000 #define HC_HTXnTBLMPfog_Acur 0x00800000 #define HC_HTXnTBLMPfog_GHTXnTBLRFog 0x00a00000 /* HC_SubA_HTXnTBLAsat 0x0083 *-- Define the texture alpha input. */ #define HC_XTA_TOPA 0x00000000 #define HC_XTA_InvTOPA 0x00000008 #define HC_XTA_TOPAp5 0x00000010 #define HC_XTA_Adif 0x00000000 #define HC_XTA_Fog 0x00000001 #define HC_XTA_Acur 0x00000002 #define HC_XTA_HTXnTBLRA 0x00000003 #define HC_XTA_Atex 0x00000004 #define HC_XTA_Atexnext 0x00000005 /*-- */ #define HC_HTXnTBLAsat_MASK 0x00800000 #define HC_HTXnTBLAMB_MASK 0x00700000 #define HC_HTXnTBLAa_MASK 0x0007c000 #define HC_HTXnTBLAb_MASK 0x00000f80 #define HC_HTXnTBLAc_MASK 0x0000001f #define HC_HTXnTBLAMB_SHIFT 20 #define HC_HTXnTBLAa_TOPA (HC_XTA_TOPA << 14) #define HC_HTXnTBLAa_InvTOPA (HC_XTA_InvTOPA << 14) #define HC_HTXnTBLAa_TOPAp5 (HC_XTA_TOPAp5 << 14) #define HC_HTXnTBLAa_Adif (HC_XTA_Adif << 14) #define HC_HTXnTBLAa_Fog (HC_XTA_Fog << 14) #define HC_HTXnTBLAa_Acur (HC_XTA_Acur << 14) #define HC_HTXnTBLAa_HTXnTBLRA (HC_XTA_HTXnTBLRA << 14) #define HC_HTXnTBLAa_Atex (HC_XTA_Atex << 14) #define HC_HTXnTBLAa_Atexnext (HC_XTA_Atexnext << 14) #define HC_HTXnTBLAb_TOPA (HC_XTA_TOPA << 7) #define HC_HTXnTBLAb_InvTOPA (HC_XTA_InvTOPA << 7) #define HC_HTXnTBLAb_TOPAp5 (HC_XTA_TOPAp5 << 7) #define HC_HTXnTBLAb_Adif (HC_XTA_Adif << 7) #define HC_HTXnTBLAb_Fog (HC_XTA_Fog << 7) #define HC_HTXnTBLAb_Acur (HC_XTA_Acur << 7) #define HC_HTXnTBLAb_HTXnTBLRA (HC_XTA_HTXnTBLRA << 7) #define HC_HTXnTBLAb_Atex (HC_XTA_Atex << 7) #define HC_HTXnTBLAb_Atexnext (HC_XTA_Atexnext << 7) #define HC_HTXnTBLAc_TOPA (HC_XTA_TOPA << 0) #define HC_HTXnTBLAc_InvTOPA (HC_XTA_InvTOPA << 0) #define HC_HTXnTBLAc_TOPAp5 (HC_XTA_TOPAp5 << 0) #define HC_HTXnTBLAc_Adif (HC_XTA_Adif << 0) #define HC_HTXnTBLAc_Fog (HC_XTA_Fog << 0) #define HC_HTXnTBLAc_Acur (HC_XTA_Acur << 0) #define HC_HTXnTBLAc_HTXnTBLRA (HC_XTA_HTXnTBLRA << 0) #define HC_HTXnTBLAc_Atex (HC_XTA_Atex << 0) #define HC_HTXnTBLAc_Atexnext (HC_XTA_Atexnext << 0) /* HC_SubA_HTXnTBLRAa 0x0089 */ #define HC_HTXnTBLRAa_MASK 0x00ff0000 #define HC_HTXnTBLRAb_MASK 0x0000ff00 #define HC_HTXnTBLRAc_MASK 0x000000ff #define HC_HTXnTBLRAa_SHIFT 16 #define HC_HTXnTBLRAb_SHIFT 8 #define HC_HTXnTBLRAc_SHIFT 0 /* HC_SubA_HTXnTBLRFog 0x008a */ #define HC_HTXnTBLRFog_MASK 0x0000ff00 #define HC_HTXnTBLRAbias_MASK 0x000000ff #define HC_HTXnTBLRFog_SHIFT 8 #define HC_HTXnTBLRAbias_SHIFT 0 /* HC_SubA_HTXnLScale 0x0094 */ #define HC_HTXnLScale_MASK 0x0007fc00 #define HC_HTXnLOff_MASK 0x000001ff #define HC_HTXnLScale_SHIFT 10 /* HC_SubA_HTXSMD 0x0000 */ #define HC_HTXSMD_MASK 0x00000080 #define HC_HTXTMD_MASK 0x00000040 #define HC_HTXNum_MASK 0x00000038 #define HC_HTXTRMD_MASK 0x00000006 #define HC_HTXCHCLR_MASK 0x00000001 #define HC_HTXNum_SHIFT 3 /* Texture Palette n */ #define HC_SubType_TexPalette0 0x00000000 #define HC_SubType_TexPalette1 0x00000001 #define HC_SubType_FogTable 0x00000010 #define HC_SubType_Stipple 0x00000014 /* HC_SubA_TexPalette0 0x0000 */ #define HC_HTPnA_MASK 0xff000000 #define HC_HTPnR_MASK 0x00ff0000 #define HC_HTPnG_MASK 0x0000ff00 #define HC_HTPnB_MASK 0x000000ff /* HC_SubA_FogTable 0x0010 */ #define HC_HFPn3_MASK 0xff000000 #define HC_HFPn2_MASK 0x00ff0000 #define HC_HFPn1_MASK 0x0000ff00 #define HC_HFPn_MASK 0x000000ff #define HC_HFPn3_SHIFT 24 #define HC_HFPn2_SHIFT 16 #define HC_HFPn1_SHIFT 8 /* Auto Testing & Security */ #define HC_SubA_HenFIFOAT 0x0000 #define HC_SubA_HFBDrawFirst 0x0004 #define HC_SubA_HFBBasL 0x0005 #define HC_SubA_HFBDst 0x0006 /* HC_SubA_HenFIFOAT 0x0000 */ #define HC_HenFIFOAT_MASK 0x00000020 #define HC_HenGEMILock_MASK 0x00000010 #define HC_HenFBASwap_MASK 0x00000008 #define HC_HenOT_MASK 0x00000004 #define HC_HenCMDQ_MASK 0x00000002 #define HC_HenTXCTSU_MASK 0x00000001 /* HC_SubA_HFBDrawFirst 0x0004 */ #define HC_HFBDrawFirst_MASK 0x00000800 #define HC_HFBQueue_MASK 0x00000400 #define HC_HFBLock_MASK 0x00000200 #define HC_HEOF_MASK 0x00000100 #define HC_HFBBasH_MASK 0x000000ff /* GEMI Setting */ #define HC_SubA_HTArbRCM 0x0008 #define HC_SubA_HTArbRZ 0x000a #define HC_SubA_HTArbWZ 0x000b #define HC_SubA_HTArbRTX 0x000c #define HC_SubA_HTArbRCW 0x000d #define HC_SubA_HTArbE2 0x000e #define HC_SubA_HArbRQCM 0x0010 #define HC_SubA_HArbWQCM 0x0011 #define HC_SubA_HGEMITout 0x0020 #define HC_SubA_HFthRTXD 0x0040 #define HC_SubA_HFthRTXA 0x0044 #define HC_SubA_HCMDQstL 0x0050 #define HC_SubA_HCMDQendL 0x0051 #define HC_SubA_HCMDQLen 0x0052 /* HC_SubA_HTArbRCM 0x0008 */ #define HC_HTArbRCM_MASK 0x0000ffff /* HC_SubA_HTArbRZ 0x000a */ #define HC_HTArbRZ_MASK 0x0000ffff /* HC_SubA_HTArbWZ 0x000b */ #define HC_HTArbWZ_MASK 0x0000ffff /* HC_SubA_HTArbRTX 0x000c */ #define HC_HTArbRTX_MASK 0x0000ffff /* HC_SubA_HTArbRCW 0x000d */ #define HC_HTArbRCW_MASK 0x0000ffff /* HC_SubA_HTArbE2 0x000e */ #define HC_HTArbE2_MASK 0x0000ffff /* HC_SubA_HArbRQCM 0x0010 */ #define HC_HTArbRQCM_MASK 0x0000ffff /* HC_SubA_HArbWQCM 0x0011 */ #define HC_HArbWQCM_MASK 0x0000ffff /* HC_SubA_HGEMITout 0x0020 */ #define HC_HGEMITout_MASK 0x000f0000 #define HC_HNPArbZC_MASK 0x0000ffff #define HC_HGEMITout_SHIFT 16 /* HC_SubA_HFthRTXD 0x0040 */ #define HC_HFthRTXD_MASK 0x00ff0000 #define HC_HFthRZD_MASK 0x0000ff00 #define HC_HFthWZD_MASK 0x000000ff #define HC_HFthRTXD_SHIFT 16 #define HC_HFthRZD_SHIFT 8 /* HC_SubA_HFthRTXA 0x0044 */ #define HC_HFthRTXA_MASK 0x000000ff /****************************************************************************** ** Define the Halcyon Internal register access constants. For simulator only. ******************************************************************************/ #define HC_SIMA_HAGPBstL 0x0000 #define HC_SIMA_HAGPBendL 0x0001 #define HC_SIMA_HAGPCMNT 0x0002 #define HC_SIMA_HAGPBpL 0x0003 #define HC_SIMA_HAGPBpH 0x0004 #define HC_SIMA_HClipTB 0x0005 #define HC_SIMA_HClipLR 0x0006 #define HC_SIMA_HFPClipTL 0x0007 #define HC_SIMA_HFPClipBL 0x0008 #define HC_SIMA_HFPClipLL 0x0009 #define HC_SIMA_HFPClipRL 0x000a #define HC_SIMA_HFPClipTBH 0x000b #define HC_SIMA_HFPClipLRH 0x000c #define HC_SIMA_HLP 0x000d #define HC_SIMA_HLPRF 0x000e #define HC_SIMA_HSolidCL 0x000f #define HC_SIMA_HPixGC 0x0010 #define HC_SIMA_HSPXYOS 0x0011 #define HC_SIMA_HCmdA 0x0012 #define HC_SIMA_HCmdB 0x0013 #define HC_SIMA_HEnable 0x0014 #define HC_SIMA_HZWBBasL 0x0015 #define HC_SIMA_HZWBBasH 0x0016 #define HC_SIMA_HZWBType 0x0017 #define HC_SIMA_HZBiasL 0x0018 #define HC_SIMA_HZWBend 0x0019 #define HC_SIMA_HZWTMD 0x001a #define HC_SIMA_HZWCDL 0x001b #define HC_SIMA_HZWCTAGnum 0x001c #define HC_SIMA_HZCYNum 0x001d #define HC_SIMA_HZWCFire 0x001e /* #define HC_SIMA_HSBBasL 0x001d */ /* #define HC_SIMA_HSBBasH 0x001e */ /* #define HC_SIMA_HSBFM 0x001f */ #define HC_SIMA_HSTREF 0x0020 #define HC_SIMA_HSTMD 0x0021 #define HC_SIMA_HABBasL 0x0022 #define HC_SIMA_HABBasH 0x0023 #define HC_SIMA_HABFM 0x0024 #define HC_SIMA_HATMD 0x0025 #define HC_SIMA_HABLCsat 0x0026 #define HC_SIMA_HABLCop 0x0027 #define HC_SIMA_HABLAsat 0x0028 #define HC_SIMA_HABLAop 0x0029 #define HC_SIMA_HABLRCa 0x002a #define HC_SIMA_HABLRFCa 0x002b #define HC_SIMA_HABLRCbias 0x002c #define HC_SIMA_HABLRCb 0x002d #define HC_SIMA_HABLRFCb 0x002e #define HC_SIMA_HABLRAa 0x002f #define HC_SIMA_HABLRAb 0x0030 #define HC_SIMA_HDBBasL 0x0031 #define HC_SIMA_HDBBasH 0x0032 #define HC_SIMA_HDBFM 0x0033 #define HC_SIMA_HFBBMSKL 0x0034 #define HC_SIMA_HROP 0x0035 #define HC_SIMA_HFogLF 0x0036 #define HC_SIMA_HFogCL 0x0037 #define HC_SIMA_HFogCH 0x0038 #define HC_SIMA_HFogStL 0x0039 #define HC_SIMA_HFogStH 0x003a #define HC_SIMA_HFogOOdMF 0x003b #define HC_SIMA_HFogOOdEF 0x003c #define HC_SIMA_HFogEndL 0x003d #define HC_SIMA_HFogDenst 0x003e /*---- start of texture 0 setting ---- */ #define HC_SIMA_HTX0L0BasL 0x0040 #define HC_SIMA_HTX0L1BasL 0x0041 #define HC_SIMA_HTX0L2BasL 0x0042 #define HC_SIMA_HTX0L3BasL 0x0043 #define HC_SIMA_HTX0L4BasL 0x0044 #define HC_SIMA_HTX0L5BasL 0x0045 #define HC_SIMA_HTX0L6BasL 0x0046 #define HC_SIMA_HTX0L7BasL 0x0047 #define HC_SIMA_HTX0L8BasL 0x0048 #define HC_SIMA_HTX0L9BasL 0x0049 #define HC_SIMA_HTX0LaBasL 0x004a #define HC_SIMA_HTX0LbBasL 0x004b #define HC_SIMA_HTX0LcBasL 0x004c #define HC_SIMA_HTX0LdBasL 0x004d #define HC_SIMA_HTX0LeBasL 0x004e #define HC_SIMA_HTX0LfBasL 0x004f #define HC_SIMA_HTX0L10BasL 0x0050 #define HC_SIMA_HTX0L11BasL 0x0051 #define HC_SIMA_HTX0L012BasH 0x0052 #define HC_SIMA_HTX0L345BasH 0x0053 #define HC_SIMA_HTX0L678BasH 0x0054 #define HC_SIMA_HTX0L9abBasH 0x0055 #define HC_SIMA_HTX0LcdeBasH 0x0056 #define HC_SIMA_HTX0Lf1011BasH 0x0057 #define HC_SIMA_HTX0L0Pit 0x0058 #define HC_SIMA_HTX0L1Pit 0x0059 #define HC_SIMA_HTX0L2Pit 0x005a #define HC_SIMA_HTX0L3Pit 0x005b #define HC_SIMA_HTX0L4Pit 0x005c #define HC_SIMA_HTX0L5Pit 0x005d #define HC_SIMA_HTX0L6Pit 0x005e #define HC_SIMA_HTX0L7Pit 0x005f #define HC_SIMA_HTX0L8Pit 0x0060 #define HC_SIMA_HTX0L9Pit 0x0061 #define HC_SIMA_HTX0LaPit 0x0062 #define HC_SIMA_HTX0LbPit 0x0063 #define HC_SIMA_HTX0LcPit 0x0064 #define HC_SIMA_HTX0LdPit 0x0065 #define HC_SIMA_HTX0LePit 0x0066 #define HC_SIMA_HTX0LfPit 0x0067 #define HC_SIMA_HTX0L10Pit 0x0068 #define HC_SIMA_HTX0L11Pit 0x0069 #define HC_SIMA_HTX0L0_5WE 0x006a #define HC_SIMA_HTX0L6_bWE 0x006b #define HC_SIMA_HTX0Lc_11WE 0x006c #define HC_SIMA_HTX0L0_5HE 0x006d #define HC_SIMA_HTX0L6_bHE 0x006e #define HC_SIMA_HTX0Lc_11HE 0x006f #define HC_SIMA_HTX0L0OS 0x0070 #define HC_SIMA_HTX0TB 0x0071 #define HC_SIMA_HTX0MPMD 0x0072 #define HC_SIMA_HTX0CLODu 0x0073 #define HC_SIMA_HTX0FM 0x0074 #define HC_SIMA_HTX0TRCH 0x0075 #define HC_SIMA_HTX0TRCL 0x0076 #define HC_SIMA_HTX0TBC 0x0077 #define HC_SIMA_HTX0TRAH 0x0078 #define HC_SIMA_HTX0TBLCsat 0x0079 #define HC_SIMA_HTX0TBLCop 0x007a #define HC_SIMA_HTX0TBLMPfog 0x007b #define HC_SIMA_HTX0TBLAsat 0x007c #define HC_SIMA_HTX0TBLRCa 0x007d #define HC_SIMA_HTX0TBLRCb 0x007e #define HC_SIMA_HTX0TBLRCc 0x007f #define HC_SIMA_HTX0TBLRCbias 0x0080 #define HC_SIMA_HTX0TBLRAa 0x0081 #define HC_SIMA_HTX0TBLRFog 0x0082 #define HC_SIMA_HTX0BumpM00 0x0083 #define HC_SIMA_HTX0BumpM01 0x0084 #define HC_SIMA_HTX0BumpM10 0x0085 #define HC_SIMA_HTX0BumpM11 0x0086 #define HC_SIMA_HTX0LScale 0x0087 /*---- end of texture 0 setting ---- 0x008f */ #define HC_SIMA_TX0TX1_OFF 0x0050 /*---- start of texture 1 setting ---- */ #define HC_SIMA_HTX1L0BasL (HC_SIMA_HTX0L0BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L1BasL (HC_SIMA_HTX0L1BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L2BasL (HC_SIMA_HTX0L2BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L3BasL (HC_SIMA_HTX0L3BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L4BasL (HC_SIMA_HTX0L4BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L5BasL (HC_SIMA_HTX0L5BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L6BasL (HC_SIMA_HTX0L6BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L7BasL (HC_SIMA_HTX0L7BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L8BasL (HC_SIMA_HTX0L8BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L9BasL (HC_SIMA_HTX0L9BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LaBasL (HC_SIMA_HTX0LaBasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LbBasL (HC_SIMA_HTX0LbBasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LcBasL (HC_SIMA_HTX0LcBasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LdBasL (HC_SIMA_HTX0LdBasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LeBasL (HC_SIMA_HTX0LeBasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LfBasL (HC_SIMA_HTX0LfBasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L10BasL (HC_SIMA_HTX0L10BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L11BasL (HC_SIMA_HTX0L11BasL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L012BasH (HC_SIMA_HTX0L012BasH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L345BasH (HC_SIMA_HTX0L345BasH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L678BasH (HC_SIMA_HTX0L678BasH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L9abBasH (HC_SIMA_HTX0L9abBasH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LcdeBasH (HC_SIMA_HTX0LcdeBasH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1Lf1011BasH (HC_SIMA_HTX0Lf1011BasH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L0Pit (HC_SIMA_HTX0L0Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L1Pit (HC_SIMA_HTX0L1Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L2Pit (HC_SIMA_HTX0L2Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L3Pit (HC_SIMA_HTX0L3Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L4Pit (HC_SIMA_HTX0L4Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L5Pit (HC_SIMA_HTX0L5Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L6Pit (HC_SIMA_HTX0L6Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L7Pit (HC_SIMA_HTX0L7Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L8Pit (HC_SIMA_HTX0L8Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L9Pit (HC_SIMA_HTX0L9Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LaPit (HC_SIMA_HTX0LaPit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LbPit (HC_SIMA_HTX0LbPit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LcPit (HC_SIMA_HTX0LcPit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LdPit (HC_SIMA_HTX0LdPit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LePit (HC_SIMA_HTX0LePit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LfPit (HC_SIMA_HTX0LfPit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L10Pit (HC_SIMA_HTX0L10Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L11Pit (HC_SIMA_HTX0L11Pit + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L0_5WE (HC_SIMA_HTX0L0_5WE + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L6_bWE (HC_SIMA_HTX0L6_bWE + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1Lc_11WE (HC_SIMA_HTX0Lc_11WE + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L0_5HE (HC_SIMA_HTX0L0_5HE + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L6_bHE (HC_SIMA_HTX0L6_bHE + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1Lc_11HE (HC_SIMA_HTX0Lc_11HE + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1L0OS (HC_SIMA_HTX0L0OS + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TB (HC_SIMA_HTX0TB + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1MPMD (HC_SIMA_HTX0MPMD + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1CLODu (HC_SIMA_HTX0CLODu + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1FM (HC_SIMA_HTX0FM + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TRCH (HC_SIMA_HTX0TRCH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TRCL (HC_SIMA_HTX0TRCL + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBC (HC_SIMA_HTX0TBC + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TRAH (HC_SIMA_HTX0TRAH + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LTC (HC_SIMA_HTX0LTC + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LTA (HC_SIMA_HTX0LTA + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLCsat (HC_SIMA_HTX0TBLCsat + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLCop (HC_SIMA_HTX0TBLCop + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLMPfog (HC_SIMA_HTX0TBLMPfog + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLAsat (HC_SIMA_HTX0TBLAsat + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLRCa (HC_SIMA_HTX0TBLRCa + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLRCb (HC_SIMA_HTX0TBLRCb + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLRCc (HC_SIMA_HTX0TBLRCc + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLRCbias (HC_SIMA_HTX0TBLRCbias + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLRAa (HC_SIMA_HTX0TBLRAa + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1TBLRFog (HC_SIMA_HTX0TBLRFog + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1BumpM00 (HC_SIMA_HTX0BumpM00 + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1BumpM01 (HC_SIMA_HTX0BumpM01 + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1BumpM10 (HC_SIMA_HTX0BumpM10 + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1BumpM11 (HC_SIMA_HTX0BumpM11 + HC_SIMA_TX0TX1_OFF) #define HC_SIMA_HTX1LScale (HC_SIMA_HTX0LScale + HC_SIMA_TX0TX1_OFF) /*---- end of texture 1 setting ---- 0xaf */ #define HC_SIMA_HTXSMD 0x00b0 #define HC_SIMA_HenFIFOAT 0x00b1 #define HC_SIMA_HFBDrawFirst 0x00b2 #define HC_SIMA_HFBBasL 0x00b3 #define HC_SIMA_HTArbRCM 0x00b4 #define HC_SIMA_HTArbRZ 0x00b5 #define HC_SIMA_HTArbWZ 0x00b6 #define HC_SIMA_HTArbRTX 0x00b7 #define HC_SIMA_HTArbRCW 0x00b8 #define HC_SIMA_HTArbE2 0x00b9 #define HC_SIMA_HGEMITout 0x00ba #define HC_SIMA_HFthRTXD 0x00bb #define HC_SIMA_HFthRTXA 0x00bc /* Define the texture palette 0 */ #define HC_SIMA_HTP0 0x0100 #define HC_SIMA_HTP1 0x0200 #define HC_SIMA_FOGTABLE 0x0300 #define HC_SIMA_STIPPLE 0x0400 #define HC_SIMA_HE3Fire 0x0440 #define HC_SIMA_TRANS_SET 0x0441 #define HC_SIMA_HREngSt 0x0442 #define HC_SIMA_HRFIFOempty 0x0443 #define HC_SIMA_HRFIFOfull 0x0444 #define HC_SIMA_HRErr 0x0445 #define HC_SIMA_FIFOstatus 0x0446 /****************************************************************************** ** Define the AGP command header. ******************************************************************************/ #define HC_ACMD_MASK 0xfe000000 #define HC_ACMD_SUB_MASK 0x0c000000 #define HC_ACMD_HCmdA 0xee000000 #define HC_ACMD_HCmdB 0xec000000 #define HC_ACMD_HCmdC 0xea000000 #define HC_ACMD_H1 0xf0000000 #define HC_ACMD_H2 0xf2000000 #define HC_ACMD_H3 0xf4000000 #define HC_ACMD_H4 0xf6000000 #define HC_ACMD_H1IO_MASK 0x000001ff #define HC_ACMD_H2IO1_MASK 0x001ff000 #define HC_ACMD_H2IO2_MASK 0x000001ff #define HC_ACMD_H2IO1_SHIFT 12 #define HC_ACMD_H2IO2_SHIFT 0 #define HC_ACMD_H3IO_MASK 0x000001ff #define HC_ACMD_H3COUNT_MASK 0x01fff000 #define HC_ACMD_H3COUNT_SHIFT 12 #define HC_ACMD_H4ID_MASK 0x000001ff #define HC_ACMD_H4COUNT_MASK 0x01fffe00 #define HC_ACMD_H4COUNT_SHIFT 9 /******************************************************************************** ** Define Header ********************************************************************************/ #define HC_HEADER2 0xF210F110 /******************************************************************************** ** Define Dummy Value ********************************************************************************/ #define HC_DUMMY 0xCCCCCCCC /******************************************************************************** ** Define for DMA use ********************************************************************************/ #define HALCYON_HEADER2 0XF210F110 #define HALCYON_FIRECMD 0XEE100000 #define HALCYON_FIREMASK 0XFFF00000 #define HALCYON_CMDB 0XEC000000 #define HALCYON_CMDBMASK 0XFFFE0000 #define HALCYON_SUB_ADDR0 0X00000000 #define HALCYON_HEADER1MASK 0XFFFFFC00 #define HALCYON_HEADER1 0XF0000000 #define HC_SubA_HAGPBstL 0x0060 #define HC_SubA_HAGPBendL 0x0061 #define HC_SubA_HAGPCMNT 0x0062 #define HC_SubA_HAGPBpL 0x0063 #define HC_SubA_HAGPBpH 0x0064 #define HC_HAGPCMNT_MASK 0x00800000 #define HC_HCmdErrClr_MASK 0x00400000 #define HC_HAGPBendH_MASK 0x0000ff00 #define HC_HAGPBstH_MASK 0x000000ff #define HC_HAGPBendH_SHIFT 8 #define HC_HAGPBstH_SHIFT 0 #define HC_HAGPBpL_MASK 0x00fffffc #define HC_HAGPBpID_MASK 0x00000003 #define HC_HAGPBpID_PAUSE 0x00000000 #define HC_HAGPBpID_JUMP 0x00000001 #define HC_HAGPBpID_STOP 0x00000002 #define HC_HAGPBpH_MASK 0x00ffffff #define VIA_VIDEO_HEADER5 0xFE040000 #define VIA_VIDEO_HEADER6 0xFE050000 #define VIA_VIDEO_HEADER7 0xFE060000 #define VIA_VIDEOMASK 0xFFFF0000 #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_bandwidth.c000066400000000000000000000545411267025031400245740ustar00rootroot00000000000000/* * Copyright 2005-2015 The Openchrome Project * [http://www.freedesktop.org/wiki/Openchrome] * 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" /* * Now that via_bios is no longer such a behemoth and the relevant code has * been moved to via_mode.c, this code should be moved to via_mode.c too, * especially since output abstraction will trim via_mode.c down further. */ static void ViaSetCLE266APrimaryFIFO(ScrnInfoPtr pScrn, Bool Enable) { VIAPtr pVia = VIAPTR(pScrn); CARD32 dwGE230, dwGE298; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSetCLE266APrimaryFIFO: %d\n", Enable)); dwGE298 = VIAGETREG(0x298); VIASETREG(0x298, dwGE298 | 0x20000000); dwGE230 = VIAGETREG(0x230); if (Enable) dwGE230 |= 0x00200000; else dwGE230 &= ~0x00200000; VIASETREG(0x230, dwGE230); dwGE298 = VIAGETREG(0x298); VIASETREG(0x298, dwGE298 & ~0x20000000); } typedef struct { CARD16 X; CARD16 Y; CARD16 Bpp; CARD8 bRamClock; CARD8 bTuningValue; } ViaExpireNumberTable; static ViaExpireNumberTable CLE266AExpireNumber[] = { {1280, 768,32,0x03,0x3}, {1280,1024,32,0x03,0x4}, {1280,1024,32,0x04,0x3}, {1600,1200,16,0x03,0x4}, {1600,1200,32,0x04,0x4}, {1024, 768,32,0x03,0xA}, {1400,1050,16,0x03,0x3}, {1400,1050,32,0x03,0x4}, {1400,1050,32,0x04,0x4}, { 800, 600,32,0x03,0xA}, { 0, 0, 0, 0, 0} }; static ViaExpireNumberTable CLE266CExpireNumber[] = { {1280, 768,32,0x03,0x3}, {1280,1024,32,0x03,0x4}, {1280,1024,32,0x04,0x4}, {1600,1200,32,0x03,0x3}, {1600,1200,32,0x04,0x4}, {1024, 768,32,0x03,0xA}, {1400,1050,32,0x03,0x4}, {1400,1050,32,0x04,0x4}, { 800, 600,32,0x03,0xA}, { 0, 0, 0, 0, 0} }; static ViaExpireNumberTable KM400ExpireNumber[]={ {1280,1024,32,0x03,0x3}, {1280,1024,32,0x04,0x9}, {1280, 768,32,0x03,0x3}, {1280, 768,32,0x04,0x9}, {1400,1050,32,0x03,0x3}, {1400,1050,32,0x04,0x9}, {1600,1200,32,0x03,0x4}, {1600,1200,32,0x04,0xA}, { 0, 0, 0, 0, 0} }; static void ViaSetPrimaryExpireNumber(ScrnInfoPtr pScrn, DisplayModePtr mode, ViaExpireNumberTable *Expire) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSetPrimaryExpireNumber\n")); for (; Expire->X; Expire++) if ((Expire->X == mode->CrtcHDisplay) && (Expire->Y == mode->CrtcVDisplay) && (Expire->Bpp == pScrn->bitsPerPixel) && (Expire->bRamClock == pVia->MemClk)) { ViaSeqMask(hwp, 0x22, Expire->bTuningValue, 0x1F); return; } } void ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSetPrimaryFIFO\n")); /* Standard values. */ ViaSeqMask(hwp, 0x17, 0x1F, 0xFF); if (mode->CrtcHDisplay >= 1600) { ViaSeqMask(hwp, 0x16, 0x0F, 0xBF); ViaSeqMask(hwp, 0x18, 0x4F, 0xFF); } else if (mode->CrtcHDisplay >= 1024) { ViaSeqMask(hwp, 0x16, 0x0C, 0xBF); ViaSeqMask(hwp, 0x18, 0x4C, 0xFF); } else { ViaSeqMask(hwp, 0x16, 0x08, 0xBF); ViaSeqMask(hwp, 0x18, 0x4E, 0xFF); } switch (pVia->Chipset) { case VIA_CLE266: if (CLE266_REV_IS_CX(pVia->ChipRev)) { if (pVia->HasSecondary) { /* SAMM or DuoView case */ if (mode->HDisplay >= 1024) { ViaSeqMask(hwp, 0x16, 0x1C, 0x3F); /* 28 */ hwp->writeSeq(hwp, 0x17, 0x3F); /* 63 */ hwp->writeSeq(hwp, 0x18, 0x57); /* 23 */ } } else { /* Single view or Simultaneous case */ #if 0 if (mode->HDisplay > 1024) { ViaSeqMask(hwp, 0x16, 0x17, 0x3F); /* 23 */ hwp->writeSeq(hwp, 0x17, 0x2F); /* 47 */ hwp->writeSeq(hwp, 0x18, 0x57); /* 23 */ } #endif } ViaSetPrimaryExpireNumber(pScrn, mode, CLE266CExpireNumber); } else { if ((mode->HDisplay > 1024) && pVia->HasSecondary) { ViaSetCLE266APrimaryFIFO(pScrn, TRUE); ViaSeqMask(hwp, 0x16, 0x17, 0x3F); /* 23 */ hwp->writeSeq(hwp, 0x17, 0x2F); /* 47 */ hwp->writeSeq(hwp, 0x18, 0x57); /* 23 */ } ViaSetPrimaryExpireNumber(pScrn, mode, CLE266AExpireNumber); } break; case VIA_KM400: if (pVia->HasSecondary) { /* SAMM or DuoView case */ if ((mode->HDisplay >= 1600) && (pVia->MemClk <= VIA_MEM_DDR200)) { ViaSeqMask(hwp, 0x16, 0x09, 0x3F); /* 9 */ hwp->writeSeq(hwp, 0x17, 0x1C); /* 28 */ } else { ViaSeqMask(hwp, 0x16, 0x1C, 0x3F); /* 28 */ hwp->writeSeq(hwp, 0x17, 0x3F); /* 63 */ } } else { if ((mode->HDisplay > 1280)) ViaSeqMask(hwp, 0x16, 0x1C, 0x3F); /* 28 */ else if (mode->HDisplay > 1024) ViaSeqMask(hwp, 0x16, 0x17, 0x3F); /* 23 */ else ViaSeqMask(hwp, 0x16, 0x10, 0x3F); /* 16 */ hwp->writeSeq(hwp, 0x17, 0x3F); /* 63 */ } hwp->writeSeq(hwp, 0x18, 0x57); /* 23 */ ViaSetPrimaryExpireNumber(pScrn, mode, KM400ExpireNumber); break; case VIA_K8M800: hwp->writeSeq(hwp, 0x17, 0xBF); /* 384/2 - 1 = 191 */ ViaSeqMask(hwp, 0x16, 0x92, 0xBF); /* 328/4 = 82 = 0x52 */ ViaSeqMask(hwp, 0x18, 0x8a, 0xBF); /* 74 */ if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaSeqMask(hwp, 0x22, 0x10, 0x1F); /* 64/4 = 16 */ else ViaSeqMask(hwp, 0x22, 0x00, 0x1F); /* 128/4 = overflow = 0 */ break; /* PM800/PM880/CN400 */ case VIA_PM800: hwp->writeSeq(hwp, 0x17, 0x5F); /* 95 */ ViaSeqMask(hwp, 0x16, 0x20, 0xBF); /* 32 */ ViaSeqMask(hwp, 0x18, 0x10, 0xBF); /* 16 */ if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaSeqMask(hwp, 0x22, 0x10, 0x1F); /* 64/4 = 16 */ else ViaSeqMask(hwp, 0x22, 0x1F, 0x1F); /* 31 */ break; /* P4M800 Pro/VN800/CN700 */ case VIA_P4M800PRO: hwp->writeSeq(hwp, 0x17, 0x2F); ViaSeqMask(hwp, 0x16, 0x14, 0xBF); /* 80/4 = 20 = 0x14 */ ViaSeqMask(hwp, 0x18, 0x08, 0xBF); if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaSeqMask(hwp, 0x22, 0x10, 0x1F); else ViaSeqMask(hwp, 0x22, 0x00, 0x1F); break; case VIA_K8M890: /* depth location: {SR17,0,7} */ hwp->writeSeq(hwp, 0x17, 0xB3); /* 360/2-1 = 179 = 0xB3 */ /* Formula (x & 0x3F) | ((x & 0x40) << 1) */ /* threshold location: {SR16,0,5},{SR16,7,7} */ ViaSeqMask(hwp, 0x16, 0x92, 0xBF); /* 328/4 = 82 = 0x52 */ /* high threshold location: {SR18,0,5},{SR18,7,7} */ ViaSeqMask(hwp, 0x18, 0x8A, 0xBF); /* 296/4 = 74 = 0x4A */ /* display queue expire num location: {SR22,0,4}. */ ViaSeqMask(hwp, 0x22, 0x1F, 0x1F); /* 124/4 = 31 = 0x1F */ break; case VIA_P4M900: /* location: {SR17,0,7} */ hwp->writeSeq(hwp, 0x17, 0x2F); /* 96/2-1 = 47 = 0x2F */ /* location: {SR16,0,5},{SR16,7,7} */ ViaSeqMask(hwp, 0x16, 0x13, 0xBF); /* 76/4 = 19 = 0x13 */ /* location: {SR18,0,5},{SR18,7,7} */ ViaSeqMask(hwp, 0x18, 0x13, 0xBF); /* 76/4 = 19 = 0x13 */ /* location: {SR22,0,4}. */ ViaSeqMask(hwp, 0x22, 0x08, 0x1F); /* 32/4 = 8 = 0x08 */ break; case VIA_P4M890: hwp->writeSeq(hwp, 0x17, 0x2F); /* 96/2-1 = 47 = 0x2F */ ViaSeqMask(hwp, 0x16, 0x13, 0xBF); /* 76/4 = 19 = 0x13 */ ViaSeqMask(hwp, 0x18, 0x10, 0xBF); /* 64/4 = 16 = 0x10 */ ViaSeqMask(hwp, 0x22, 0x08, 0x1F); /* 32/4 = 8 = 0x08 */ break; case VIA_CX700: hwp->writeSeq(hwp, 0x17, 0x5F); ViaSeqMask(hwp, 0x16, 0x20, 0xBF); /* 128/4 = 32 = 0x20 */ ViaSeqMask(hwp, 0x18, 0x20, 0xBF); /* 128/4 = 32 = 0x20 */ ViaSeqMask(hwp, 0x22, 0x1F, 0x1F); /* 124/4 = 31 = 0x1F */ break; case VIA_VX800: hwp->writeSeq(hwp, 0x17, 0x5F); /* 192/2-1 = 95 = 0x5F */ hwp->writeSeq(hwp, 0x16, 0x26); /* 152/4 = 38 = 0x26 */ hwp->writeSeq(hwp, 0x18, 0x26); /* 152/4 = 38 */ hwp->writeSeq(hwp, 0x22, 0x10); /* 64/4 = 16 */ break; case VIA_VX855: 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; 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; } } /* * I've thrown out the LCD requirement. Size > 1024 is not supported * by any currently known TV encoder anyway. -- Luc. * */ void ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSetSecondaryFIFO\n")); switch (pVia->Chipset) { case VIA_CLE266: if (CLE266_REV_IS_CX(pVia->ChipRev)) { if (mode->HDisplay >= 1024) { ViaCrtcMask(hwp, 0x6A, 0x20, 0x20); hwp->writeCrtc(hwp, 0x68, 0xAB);/* depth 10, threshold 11 */ } else { ViaCrtcMask(hwp, 0x6A, 0x00, 0x20); hwp->writeCrtc(hwp, 0x68, 0x67);/* depth 6, threshold 7 */ } } else { if ((pScrn->bitsPerPixel >= 24) && (((mode->VDisplay > 768) && (pVia->MemClk <= VIA_MEM_DDR200)) || ((mode->HDisplay > 1280) && (pVia->MemClk <= VIA_MEM_DDR266)))) { ViaCrtcMask(hwp, 0x6A, 0x20, 0x20); hwp->writeCrtc(hwp, 0x68, 0xAB);/* depth 10, threshold 11 */ } else { ViaCrtcMask(hwp, 0x6A, 0x00, 0x20); hwp->writeCrtc(hwp, 0x68, 0x67);/* depth 6, threshold 7 */ } } break; case VIA_KM400: if ((mode->HDisplay >= 1600) && (pVia->MemClk <= VIA_MEM_DDR200)) { ViaCrtcMask(hwp, 0x6A, 0x20, 0x20); hwp->writeCrtc(hwp, 0x68, 0xEB); /* depth 14, threshold 11 */ } else if ((pScrn->bitsPerPixel == 32) && (((mode->HDisplay > 1024) && (pVia->MemClk <= VIA_MEM_DDR333)) || ((mode->HDisplay >= 1024) && (pVia->MemClk <= VIA_MEM_DDR200)))) { ViaCrtcMask(hwp, 0x6A, 0x20, 0x20); hwp->writeCrtc(hwp, 0x68, 0xCA); /* depth 12, threshold 10 */ } else if ((pScrn->bitsPerPixel == 16) && (((mode->HDisplay > 1280) && (pVia->MemClk <= VIA_MEM_DDR333)) || ((mode->HDisplay >= 1280) && (pVia->MemClk <= VIA_MEM_DDR200)))) { ViaCrtcMask(hwp, 0x6A, 0x20, 0x20); hwp->writeCrtc(hwp, 0x68, 0xAB); /* depth 10, threshold 11 */ } else { ViaCrtcMask(hwp, 0x6A, 0x00, 0x20); hwp->writeCrtc(hwp, 0x68, 0x67); /* depth 6, threshold 7 */ } break; case VIA_K8M800: /* depth: (384 /8 -1 -1) = 46 = 0x2E */ ViaCrtcMask(hwp, 0x68, 0xE0, 0xF0); ViaCrtcMask(hwp, 0x94, 0x00, 0x80); ViaCrtcMask(hwp, 0x95, 0x80, 0x80); /* threshold: (328/4) = 82 = 0x52 */ ViaCrtcMask(hwp, 0x68, 0x02, 0x0F); ViaCrtcMask(hwp, 0x95, 0x50, 0x70); /* preq: 74 = 0x4A */ ViaCrtcMask(hwp, 0x92, 0x0A, 0x0F); ViaCrtcMask(hwp, 0x95, 0x04, 0x07); if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaCrtcMask(hwp, 0x94, 0x10, 0x7F); /* 64/4 */ else ViaCrtcMask(hwp, 0x94, 0x20, 0x7F); /* 128/4 */ break; case VIA_PM800: /* depth: 12 - 1 = 0x0B */ ViaCrtcMask(hwp, 0x68, 0xB0, 0xF0); ViaCrtcMask(hwp, 0x94, 0x00, 0x80); ViaCrtcMask(hwp, 0x95, 0x00, 0x80); /* threshold: 16 = 0x10 */ ViaCrtcMask(hwp, 0x68, 0x00, 0x0F); ViaCrtcMask(hwp, 0x95, 0x10, 0x70); /* preq: 8 = 0x08 */ ViaCrtcMask(hwp, 0x92, 0x08, 0x0F); ViaCrtcMask(hwp, 0x95, 0x00, 0x07); if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaCrtcMask(hwp, 0x94, 0x10, 0x7F); /* 64/4 */ else ViaCrtcMask(hwp, 0x94, 0x20, 0x7F); /* 128/4 */ break; case VIA_P4M800PRO: ViaCrtcMask(hwp, 0x68, 0xA0, 0xF0); ViaCrtcMask(hwp, 0x94, 0x00, 0x80); ViaCrtcMask(hwp, 0x95, 0x00, 0x80); ViaCrtcMask(hwp, 0x68, 0x04, 0x0F); ViaCrtcMask(hwp, 0x95, 0x10, 0x70); ViaCrtcMask(hwp, 0x92, 0x08, 0x0F); ViaCrtcMask(hwp, 0x95, 0x00, 0x07); if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaCrtcMask(hwp, 0x94, 0x10, 0x7F); else ViaCrtcMask(hwp, 0x94, 0x20, 0x7F); break; case VIA_P4M890: /* depth location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */ ViaCrtcMask(hwp, 0x68, 0xB0, 0xF0); /* 96/8-1 = 11 = 0x0B */ ViaCrtcMask(hwp, 0x94, 0x00, 0x80); ViaCrtcMask(hwp, 0x95, 0x00, 0x80); /* location: {CR68,0,3},{CR95,4,6} */ ViaCrtcMask(hwp, 0x68, 0x03, 0x0F); /* 76/4 = 19 = 0x13 */ ViaCrtcMask(hwp, 0x95, 0x10, 0x70); /* location: {CR92,0,3},{CR95,0,2} */ ViaCrtcMask(hwp, 0x92, 0x00, 0x0F); /* 64/4 = 16 = 0x10 */ ViaCrtcMask(hwp, 0x95, 0x01, 0x07); /* location: {CR94,0,6} */ ViaCrtcMask(hwp, 0x94, 0x08, 0x7F); /* 32/4 = 8 = 0x08 */ break; case VIA_K8M890: /* Display Queue Depth, location: {CR68,4,7},{CR94,7,7},{CR95,7,7} */ ViaCrtcMask(hwp, 0x68, 0xC0, 0xF0); /* 360/8-1 = 44 = 0x2C; 0x2C << 4 = 0xC0 */ ViaCrtcMask(hwp, 0x94, 0x00, 0x80); /* 0x2C << 3 = 0x00 */ ViaCrtcMask(hwp, 0x95, 0x80, 0x80); /* 0x2C << 2 = 0x80 */ /* Display Queue Read Threshold 1, location: {CR68,0,3},{CR95,4,6} */ ViaCrtcMask(hwp, 0x68, 0x02, 0x0F); /* 328/4 = 82 = 0x52 */ ViaCrtcMask(hwp, 0x95, 0x50, 0x70); /* location: {CR92,0,3},{CR95,0,2} */ ViaCrtcMask(hwp, 0x92, 0x0A, 0x0F); /* 296/4 = 74 = 0x4A */ ViaCrtcMask(hwp, 0x95, 0x04, 0x07); /* 0x4A >> 4 = 0x04 */ /* Display Expire Number Bits, location: {CR94,0,6} */ ViaCrtcMask(hwp, 0x94, 0x1F, 0x7F); /* 124/4 = 31 = 0x1F */ break; case VIA_P4M900: ViaCrtcMask(hwp, 0x68, 0xB0, 0xF0); ViaCrtcMask(hwp, 0x94, 0x00, 0x80); ViaCrtcMask(hwp, 0x95, 0x00, 0x80); ViaCrtcMask(hwp, 0x68, 0x03, 0x0F); ViaCrtcMask(hwp, 0x95, 0x10, 0x70); ViaCrtcMask(hwp, 0x92, 0x03, 0x0F); ViaCrtcMask(hwp, 0x95, 0x01, 0x07); ViaCrtcMask(hwp, 0x94, 0x08, 0x7F); break; case VIA_CX700: ViaCrtcMask(hwp, 0x68, 0xA0, 0xF0); ViaCrtcMask(hwp, 0x94, 0x00, 0x80); ViaCrtcMask(hwp, 0x95, 0x00, 0x80); ViaCrtcMask(hwp, 0x68, 0x04, 0x0F); ViaCrtcMask(hwp, 0x95, 0x10, 0x70); ViaCrtcMask(hwp, 0x92, 0x08, 0x0F); ViaCrtcMask(hwp, 0x95, 0x00, 0x07); if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaCrtcMask(hwp, 0x94, 0x10, 0x7F); else ViaCrtcMask(hwp, 0x94, 0x20, 0x7F); break; case VIA_VX800: /* {CR68,4,7},{CR94,7,7},{CR95,7,7} : 96/8-1 = 0x0B */ ViaCrtcMask(hwp, 0x68, 0xB0, 0xF0); /* ((0x0B & 0x0F) << 4)) = 0xB0 */ ViaCrtcMask(hwp, 0x94, 0x00, 0x80); /* ((0x0B & 0x10) << 3)) = 0x00 */ ViaCrtcMask(hwp, 0x95, 0x00, 0x80); /* {CR68,0,3},{CR95,4,6} : 64/4 = 0x10 */ ViaCrtcMask(hwp, 0x68, 0x04, 0x0F); ViaCrtcMask(hwp, 0x95, 0x10, 0x70); /* {CR92,0,3},{CR95,0,2} : 32/4 = 0x08 */ ViaCrtcMask(hwp, 0x92, 0x08, 0x0F); ViaCrtcMask(hwp, 0x95, 0x00, 0x07); /* {CR94,0,6} : 128/4 = 0x20 */ if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaCrtcMask(hwp, 0x94, 0x10, 0x7F); else ViaCrtcMask(hwp, 0x94, 0x20, 0x7F); break; case VIA_VX855: /* {CR68,4,7},{CR94,7,7},{CR95,7,7} : 200/8-1 = 24 = 0x18 */ ViaCrtcMask(hwp, 0x68, 0x80, 0xF0); /* ((0x18 & 0x0F) << 4)) = 0x80 */ ViaCrtcMask(hwp, 0x94, 0x80, 0x80); /* ((0x18 & 0x10) << 3)) = 0x80 */ ViaCrtcMask(hwp, 0x95, 0x00, 0x80); /* ((0x18 & 0x20) << 2)) = 0x00 */ /* {CR68,0,3},{CR95,4,6} : 160/4 = 0x28 */ ViaCrtcMask(hwp, 0x68, 0x08, 0x0F); /* (0x28 & 0x0F) = 0x08 */ ViaCrtcMask(hwp, 0x95, 0x20, 0x70); /* (0x28 & 0x70) = 0x20 */ /* {CR92,0,3},{CR95,0,2} : 160/4 = 0x28 */ ViaCrtcMask(hwp, 0x92, 0x08, 0x08); /* (0x28 & 0x0F) = 0x08 */ ViaCrtcMask(hwp, 0x95, 0x02, 0x07); /* ((0x28 & 0x70) >> 4)) = 0x02 */ /* {CR94,0,6} : 320/4 = 0x50 */ if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaCrtcMask(hwp, 0x94, 0x08, 0x7F); else ViaCrtcMask(hwp, 0x94, 0x08, 0x7F); break; case VIA_VX900: /* {CR68,4,7},{CR94,7,7},{CR95,7,7} : 192/8-1 = 23 = 0x17 */ ViaCrtcMask(hwp, 0x68, 0x70, 0xF0); /* ((0x17 & 0x0F) << 4)) = 0x70 */ ViaCrtcMask(hwp, 0x94, 0x80, 0x80); /* ((0x17 & 0x10) << 3)) = 0x80 */ ViaCrtcMask(hwp, 0x95, 0x00, 0x80); /* ((0x17 & 0x20) << 2)) = 0x00 */ /* {CR68,0,3},{CR95,4,6} : 160/4 = 0x28 */ ViaCrtcMask(hwp, 0x68, 0x08, 0x0F); /* (0x28 & 0x0F) = 0x08 */ ViaCrtcMask(hwp, 0x95, 0x20, 0x70); /* (0x28 & 0x70) = 0x20 */ /* {CR92,0,3},{CR95,0,2} : 160/4 = 0x28 */ ViaCrtcMask(hwp, 0x92, 0x08, 0x08); /* (0x28 & 0x0F) = 0x08 */ ViaCrtcMask(hwp, 0x95, 0x02, 0x07); /* ((0x28 & 0x70) >> 4)) = 0x2 */ /* {CR94,0,6} : 320/4 = 0x50 */ if ((mode->HDisplay >= 1400) && (pScrn->bitsPerPixel == 32)) ViaCrtcMask(hwp, 0x94, 0x08, 0x7F); else ViaCrtcMask(hwp, 0x94, 0x08, 0x7F); break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaSetSecondaryFIFO: " "Chipset %d not implemented\n", pVia->Chipset); break; } } /* * Turn off the primary FIFO only for CLE266A. */ 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); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_ch7xxx.c000066400000000000000000000500471267025031400240560ustar00rootroot00000000000000/* * Copyright 2005 Terry Lewis. All Rights Reserved. * Copyright 2005 Philip Langdale. All Rights Reserved. (CH7011 additions) * Copyright 2004 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 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS 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" #include "via_ch7xxx.h" #include #ifdef HAVE_DEBUG /* * */ static void CH7xxxPrintRegs(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; CARD8 i, buf; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for %s\n", pBIOSInfo->TVI2CDev->DevName); for (i = 0; i < pBIOSInfo->TVNumRegs; i++) { xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &buf); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, buf); } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "End of TV registers.\n"); } #endif /* HAVE_DEBUG */ /* * */ I2CDevPtr ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; I2CDevPtr pDev = xf86CreateI2CDevRec(); CARD8 buf; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaCH7xxxDetect\n")); pDev->DevName = "CH7xxx"; pDev->SlaveAddr = Address; pDev->pI2CBus = pBus; if (!xf86I2CDevInit(pDev)) { xf86DestroyI2CDevRec(pDev, TRUE); return NULL; } if (!xf86I2CReadByte(pDev, 0x4B, &buf)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to read from %s Slave %d.\n", pBus->BusName, Address); xf86DestroyI2CDevRec(pDev, TRUE); return NULL; } switch (buf) { case 0x17: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7011 TV Encoder\n"); pBIOSInfo->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; pDev->DevName="CH7019A"; } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7019B LVDS Transmitter/TV Encoder\n"); pBIOSInfo->TVEncoder = VIA_CH7019B; pDev->DevName="CH7019B"; } break; case 0x1B: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected Chrontel CH7017 LVDS Transmitter\n"); pBIOSInfo->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; 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; pDev->DevName="CH7305"; break; default: pBIOSInfo->TVEncoder = VIA_NONETV; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown CH7xxx" " device found. [%x:0x1B contains %x]\n", Address, buf); xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Unknown CH7xxx encoder found\n"); xf86DestroyI2CDevRec(pDev,TRUE); pDev = NULL; break; } return pDev; } /* * */ static void CH7xxxSave(ScrnInfoPtr pScrn) { int i; VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxSave\n")); for (i = 0; i < pBIOSInfo->TVNumRegs; i++) xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &(pBIOSInfo->TVRegs[i])); } static void CH7xxxRestore(ScrnInfoPtr pScrn) { int i; VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxRestore\n")); for (i = 0; i < pBIOSInfo->TVNumRegs; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]); } static CARD8 CH7xxxDACSenseI2C(I2CDevPtr pDev) { CARD8 save, sense; /* Turn all DACP on*/ xf86I2CWriteByte(pDev, 0x49, 0x20); /* Make sure Bypass mode is disabled (DACBP) bit0 is set to '0' */ xf86I2CReadByte(pDev, 0x21, &save); xf86I2CWriteByte(pDev, 0x21, save & ~0x01); /* Set Sense bit0 to '1' */ xf86I2CReadByte(pDev, 0x20, &save); xf86I2CWriteByte(pDev, 0x20, save | 0x01); /* Set Sense bit0 back to '0' */ xf86I2CReadByte(pDev, 0x20, &save); xf86I2CWriteByte(pDev, 0x20, save & ~0x01); /* Read DACT status bits */ xf86I2CReadByte(pDev, 0x20, &sense); return (sense & 0x1F); } /* * A CH7xxx hack. (T. Lewis. S-Video fixed by P. Langdale) * * CH7xxx Cable types (C+S and YcBcR untested and almost certainly wrong) * 0x10 = Composite * 0x0C = S-Video * 0x02 = Composite+S-Video * 0x04 = YcBcR * 0x00 = Nothing Connected */ static Bool CH7xxxDACSense(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxDACDetect\n")); /* is this needed? IH */ if (!pBIOSInfo->TVI2CDev || !pBIOSInfo->TVEncoder) return FALSE; sense = CH7xxxDACSenseI2C(pBIOSInfo->TVI2CDev); /* I'm sure these case values are correct, * but we should get something in any case. * 0x10 (Composite), 0x0C (S-Video) and 0x00 (Nothing connected) * seem to be correct however. */ switch (sense) { case 0x10: pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: Composite connected.\n"); return TRUE; case 0x0C: pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: S-Video connected.\n"); return TRUE; case 0x02: pBIOSInfo->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CHxxx: Composite+S-Video connected.\n"); return TRUE; case 0x04: pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CHxxx: YcBcR Connected.\n"); return TRUE; case 0x00: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxx: Nothing connected.\n"); return FALSE; default: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CH7xxx: Unknown cable combination: 0x0%2X.\n",sense); return FALSE; } } static CARD8 CH7011ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; 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) && !(strcmp(CH7011Table[i].name, mode->name))) return i; } xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CH7011ModeIndex:" " Mode \"%s\" not found in Table\n", mode->name); return 0xFF; } static CARD8 CH7019ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; 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) && !(strcmp(CH7019Table[i].name, mode->name))) return i; } xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "CH7019ModeIndex:" " Mode \"%s\" not found in Table\n", mode->name); return 0xFF; } /* * */ static ModeStatus CH7xxxModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxModeValid\n")); if ((mode->PrivSize != sizeof(struct CH7xxxModePrivate)) || ((mode->Private != (void *) &CH7xxxModePrivateNTSC) && (mode->Private != (void *) &CH7xxxModePrivatePAL))) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); return MODE_BAD; } if ((pBIOSInfo->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) && (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 (CH7011ModeIndex(pScrn, mode) != 0xFF) return MODE_OK; } else { if (CH7019ModeIndex(pScrn, mode) != 0xFF) return MODE_OK; } return MODE_BAD; } static void CH7xxxModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; CARD8 i, j; VIABIOSTVMASKTableRec Mask; struct CH7xxxTableRec Table; if (pBIOSInfo->TVEncoder == VIA_CH7011) { Table = CH7011Table[CH7011ModeIndex(pScrn, mode)]; Mask = ch7011MaskTable; } else { Table = CH7019Table[CH7019ModeIndex(pScrn, mode)]; Mask = ch7019MaskTable; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7011ModeI2C\n")); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3E); xf86I2CWriteByte(pBIOSInfo->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]); j++; } else { xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, pBIOSInfo->TVRegs[i]); } } if ((pBIOSInfo->TVType == TVTYPE_NTSC) && pBIOSInfo->TVDotCrawl) { CARD16 *DotCrawl = Table.DotCrawlNTSC; CARD8 address, save; for (i = 1; i < (DotCrawl[0] + 1); i++) { address = (CARD8)(DotCrawl[i] & 0xFF); save = (CARD8)(DotCrawl[i] >> 8); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, address, save); } } /* * Only Composite and SVideo have been tested. */ switch(pBIOSInfo->TVOutput){ case TVOUTPUT_COMPOSITE: xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x2E); break; case TVOUTPUT_SVIDEO: xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x32); break; case TVOUTPUT_SC: xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3C); break; case TVOUTPUT_YCBCR: xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3A); break; default: break; } 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); } } static void CH7xxxModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; CARD8 *CRTC, *Misc; int i, j; VIABIOSTVMASKTableRec Mask; struct CH7xxxTableRec Table; if (pBIOSInfo->TVEncoder == VIA_CH7011) { Table = CH7011Table[CH7011ModeIndex(pScrn, mode)]; Mask = ch7011MaskTable; } else { Table = CH7019Table[CH7019ModeIndex(pScrn, mode)]; Mask = ch7019MaskTable; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxModeCrtc\n")); if (pVia->IsSecondary) { switch (pScrn->bitsPerPixel) { case 16: CRTC = Table.CRTC2_16BPP; break; case 24: case 32: CRTC = Table.CRTC2_32BPP; break; case 8: default: CRTC = Table.CRTC2_8BPP; break; } Misc = Table.Misc2; for (i = 0, j = 0; i < Mask.numCRTC2; j++) { if (Mask.CRTC2[j] == 0xFF) { hwp->writeCrtc(hwp, j + 0x50, CRTC[j]); i++; } } if (Mask.misc2 & 0x18) { pBIOSInfo->Clock = (Misc[3] << 8) & Misc[4]; /* VIASetUseExternalClock(hwp); */ } ViaCrtcMask(hwp, 0x6A, 0xC0, 0xC0); ViaCrtcMask(hwp, 0x6B, 0x01, 0x01); ViaCrtcMask(hwp, 0x6C, 0x01, 0x01); /* Disable LCD Scaling */ if (!pVia->SAMM || pVia->FirstInit) hwp->writeCrtc(hwp, 0x79, 0x00);} else { CRTC = Table.CRTC1; Misc = Table.Misc1; for (i = 0, j = 0; i < Mask.numCRTC1; j++) { if (Mask.CRTC1[j] == 0xFF) { hwp->writeCrtc(hwp, j, CRTC[j]); i++; } } ViaCrtcMask(hwp, 0x33, Misc[0], 0x20); hwp->writeCrtc(hwp, 0x6A, Misc[1]); if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) { hwp->writeCrtc(hwp, 0x6B, Misc[2] | 0x81); /* Fix TV clock Polarity for CLE266A2 */ if (pVia->ChipRev == 0x02) hwp->writeCrtc(hwp, 0x6C, Misc[3] | 0x01); } else hwp->writeCrtc(hwp, 0x6B, Misc[2] | 0x01); if (Mask.misc1 & 0x30) { /* CLE266Ax use 2x XCLK */ if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) pBIOSInfo->Clock = 0x471C; else pBIOSInfo->Clock = (Misc[4] << 8) | Misc[5]; } ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); ViaCrtcMask(hwp, 0x6B, 0x01, 0x01); ViaCrtcMask(hwp, 0x6C, 0x01, 0x01); } ViaSeqMask(hwp, 0x1E, 0xC0, 0xC0); /* Enable DI0/DVP0 */ } /* * */ static void CH7xxxTVPower(ScrnInfoPtr pScrn, Bool On) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; if (On){ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxTVPower: On\n")); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x20); }else{ DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CH7xxxTVPower: Off\n")); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x49, 0x3E); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1E, 0xD0); } } static void CH7019LCDPower(ScrnInfoPtr pScrn, Bool On) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; CARD8 W_Buffer[2], R_Buffer[1]; int i; if (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); W_Buffer[0] = 0x66; W_Buffer[1] = 0x20; xf86I2CWriteRead(pBIOSInfo->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); usleep(100); W_Buffer[0] = 0x63; W_Buffer[1] = (R_Buffer[0] | 0x40); xf86I2CWriteRead(pBIOSInfo->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); 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); 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); 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); W_Buffer[1] = R_Buffer[0] & ~0x08; xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); usleep(1); W_Buffer[1] = R_Buffer[0]; xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); break; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxxLCDPower: [%d]CH7019 PLL lock fail!\n", i+1)); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "CH7xxxLCDPower: [%d]0x66 = %X!\n", i+1, R_Buffer[0])); } }else{ 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); W_Buffer[1] &= ~0x01; xf86I2CWriteRead(pBIOSInfo->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); W_Buffer[1] = (R_Buffer[0] | 0x40); xf86I2CWriteRead(pBIOSInfo->TVI2CDev, W_Buffer,2, NULL,0); } } /* * */ void ViaCH7xxxInit(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaCH7xxxInit\n")); switch (pBIOSInfo->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; #ifdef HAVE_DEBUG pBIOSInfo->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; #ifdef HAVE_DEBUG pBIOSInfo->TVPrintRegs = CH7xxxPrintRegs; #endif break; default: DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaCH7xxxInit missing\n")); break; } /* Save before continuing */ if (pBIOSInfo->TVSave) pBIOSInfo->TVSave(pScrn); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_ch7xxx.h000066400000000000000000001256411267025031400240660ustar00rootroot00000000000000/* * Copyright 2005 Terry Lewis. All Rights Reserved. * Copyright 2005 Philip Langdale. All Rights Reserved. (CH7011 additions) * 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 * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS 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_CH7xxx_H_ #define _VIA_CH7xxx_H_ 1 /*+#define VIA_BIOS_MAX_NUM_TV_REG 0x80 +#define VIA_BIOS_MAX_NUM_TV_CRTC 32 +#define VIA_BIOS_NUM_TV_SPECIAL_REG 8 +#define VIA_BIOS_MAX_NUM_TV_PATCH 8 +#define VIA_BIOS_NUM_TV_OTHER 16 */ #define VIA_BIOS_TABLE_NUM_TV_REG 0x23 /* 0x00 - 0x22 */ #define CH_7011_MAX_NUM_REG 0x4C /* 0x00 - 0x4B */ #define CH_7019_MAX_NUM_REG 0x80 /* 0x00 - 0x7F */ #define VIA_BIOS_MAX_NUM_TV_CRTC 32 #define VIA_BIOS_NUM_TV_SPECIAL_REG 8 #define VIA_BIOS_MAX_NUM_TV_PATCH 8 #define VIA_BIOS_NUM_TV_OTHER 16 struct CH7xxxModePrivate { char id[12]; /* "CH7xxx" */ CARD8 Standard; }; static struct CH7xxxModePrivate CH7xxxModePrivateNTSC = { { 'C', 'H', '7', 'x', 'x', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_NTSC, }; static struct CH7xxxModePrivate CH7xxxModePrivatePAL = { { 'C', 'H', '7', 'x', 'x', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_PAL, }; #define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DEFAULT #define MODESUFFIXNTSC 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct CH7xxxModePrivate),(void *)&CH7xxxModePrivateNTSC,0,0.0,0.0 #define MODESUFFIXPAL 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct CH7xxxModePrivate),(void *)&CH7xxxModePrivatePAL,0,0.0,0.0 /* dotclock is just for modeline validation */ static DisplayModeRec CH7011Modes[]={ { MODEPREFIX("640x480"), 23520, 640, 656, 744, 784, 0, 480, 487, 491, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480"), 30000, 640, 680, 808, 1000, 0, 480, 520, 523, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600"), 39900, 800, 840, 976, 1064, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600"), 34500, 800, 816, 880, 920, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768"), 54810, 1024, 1032, 1088, 1160, 0, 768, 780, 792, 945, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768"), 57000, 1024, 1040, 1112, 1200, 0, 768, 829, 840, 950, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("640x480Over"), 20160, 640, 648, 704, 720, 0, 480, 487, 491, 560, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480Over"), 21000, 640, 664, 792, 840, 0, 480, 485, 491, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600Over"), 35910, 800, 840, 984, 1080, 0, 600, 601, 604, 665, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600Over"), 32500, 800, 832, 928, 1000, 0, 600, 600, 604, 650, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768Over"), 50400, 1024, 1040, 1112, 1200, 0, 768, 772, 776, 840, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768Over"), 49500, 1024, 1032, 1112, 1200, 0, 768, 771, 776, 825, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480"), 25200, 720, 728, 776, 840, 0, 480, 511, 515, 600, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x576"), 28500, 720, 728, 744, 760, 0, 576, 635, 643, 750, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480Noscale"), 27972, 720, 736, 768, 888, 0, 480, 480, 483, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x576Noscale"), 28000, 720, 728, 864, 896, 0, 576, 576, 579, 625, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, }; static DisplayModeRec CH7019Modes[]={ { MODEPREFIX("640x480"), 23520, 640, 656, 744, 784, 0, 480, 487, 491, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480"), 30000, 640, 680, 808, 1000, 0, 480, 520, 523, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600"), 39900, 800, 840, 976, 1064, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600"), 34500, 800, 816, 880, 920, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768"), 54810, 1024, 1032, 1088, 1160, 0, 768, 780, 792, 945, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768"), 57000, 1024, 1040, 1112, 1200, 0, 768, 829, 840, 950, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("640x480Over"), 20160, 640, 648, 704, 720, 0, 480, 487, 491, 560, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480Over"), 21000, 640, 664, 792, 840, 0, 480, 485, 491, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600Over"), 35910, 800, 840, 984, 1080, 0, 600, 601, 604, 665, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600Over"), 32500, 800, 832, 928, 1000, 0, 600, 600, 604, 650, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768Over"), 50400, 1024, 1040, 1112, 1200, 0, 768, 772, 776, 840, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768Over"), 49500, 1024, 1032, 1112, 1200, 0, 768, 771, 776, 825, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, }; typedef struct _VIATVMASKTABLE { CARD8 TV[VIA_BIOS_TABLE_NUM_TV_REG]; CARD8 CRTC1[VIA_BIOS_MAX_NUM_TV_CRTC]; CARD8 CRTC2[VIA_BIOS_MAX_NUM_TV_CRTC]; CARD8 misc1; CARD8 misc2; int numTV; int numCRTC1; int numCRTC2; } VIABIOSTVMASKTableRec, *VIABIOSTVMASKTablePtr; struct CH7xxxTableRec { char* name; CARD16 Width; CARD16 Height; int Standard; CARD8 TV[VIA_BIOS_TABLE_NUM_TV_REG]; /*35*/ CARD8 CRTC1[VIA_BIOS_MAX_NUM_TV_CRTC]; CARD8 Misc1[VIA_BIOS_NUM_TV_SPECIAL_REG]; CARD8 Misc2[VIA_BIOS_NUM_TV_SPECIAL_REG]; /*merge these three*/ CARD8 CRTC2_8BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; CARD8 CRTC2_16BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; CARD8 CRTC2_32BPP[VIA_BIOS_MAX_NUM_TV_CRTC]; CARD16 Patch2[VIA_BIOS_MAX_NUM_TV_PATCH]; CARD16 DotCrawlNTSC[VIA_BIOS_NUM_TV_OTHER]; }; static struct CH7xxxTableRec CH7011Table[] = { { "640x480", 640, 480, TVTYPE_NTSC, { 0X6A, /* 0x00 Mode 17 */ 0X3F, /* 0x01 FF Default 0x27 (was 7F) */ 0X7E, /* 0x02 VBW Default 0xBE (was 0x7E) */ 0X8B, /* 0x03 TE Decent Text 0x8B (was 8D) */ 0X28, /* 0x04 SAV Default 0x50 (was 0x21) */ 0X2C, /* 0x05 HP Default 0x50 (was 0x2E) */ 0X05, /* 0x06 VP Default 0x00 (was 0x04) */ 0X83, /* 0x07 BL Default 0x83 */ 0X03, /* 0x08 CE Default 0x03 */ 0X80, /* 0x09 TPC Default 0x80 */ 0X3F, /* 0x0A PLLM Default 0x3F */ 0X7E, /* 0x0B PLLN Default 0x7E */ 0X20, /* 0x0C FSCI Default 0x20 */ 0X80, /* 0x0D FSCI Default 0x80 */ 0X00, /* 0x0E FSCI Default 0x08 (was 00) */ 0X00, /* 0x0F FSCI Default 0xEB (was 00) */ 0, /* 0x10 CIVC */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* We don't touch these */ 0X48, /* 0x1C */ 0X40, /* 0x1D */ 0XD2, /* 0x1E */ 0X80, /* 0x1F */ 0X40, /* 0x20 */ 0, /* 0x21 */ 0, /* 0x22 */ }, { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0X56, 0XBA, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X8, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X2284, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X9217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "640x480", 640, 480, TVTYPE_PAL, { 0X61, /* 0x00 PAL Mode 14 non-OS 640x480 1:1 */ 0X27, /* 0x01 FF Default 0x27 (was 7F) */ 0XBE, /* 0x02 VBW Default 0xBE (was 0x7E) */ 0X8B, /* 0x03 TE Decent Text 0x8B (was 8D) */ 0X28, /* 0x04 SAV Default 0x50 (was 0x21) */ 0X2C, /* 0x05 HP Default 0x50 (was 0x2E) */ 0X05, /* 0x06 VP Default 0x00 (was 0x04) */ 0X83, /* 0x07 BL Default 0x83 */ 0X01, /* 0x08 CE Default 0x03 */ 0X81, /* 0x09 TPC Default 0x80 */ 0X04, /* 0x0A PLLM Default 0x3F */ 0X09, /* 0x0B PLLN Default 0x7E */ 0X26, /* 0x0C FSCI Default 0x20 */ 0X6F, /* 0x0D FSCI Default 0x80 */ 0X1F, /* 0x0E FSCI Default 0x08 */ 0XD0, /* 0x0F FSCI Default 0xEB */ 0, /* 0x10 CIVC */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* We don't touch these */ 0X48, /* 0x1C */ 0X40, /* 0x1D */ 0XD2, /* 0x1E */ 0X80, /* 0x1F */ 0X40, /* 0x20 */ 0, /* 0x21 */ 0, /* 0x22 */ }, { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0X6F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X11, 0, 0XDF, 0, 0, 0XDF, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X3284, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "800x600", 800, 600, TVTYPE_NTSC, { 0XCF, /* 0x00 Mode 29 */ 0X27, /* 0x01 FF Default 0x27 (was 7F) */ 0XBE, /* 0x02 VBW Default 0xBE (was 0x76) */ 0X8B, /* 0x03 TE Decent Text 0x8B (was 8F) */ 0X59, /* 0x04 SAV*/ 0X3C, /* 0x05 HP */ 0X15, /* 0x06 VP */ 0X66, /* 0x07 BL Default 0x83 */ 0X3, /* 0x08 CE Default 0x03 */ 0X88, 0X59, 0X2E, 0X19, 0X8B, 0X3A, 0X63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0X80, 0X63, 0X63, 0X84, 0X69, 0X1A, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X5A84, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X5117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "800x600", 800, 600, TVTYPE_PAL, { 0XC3, 0X7F, 0XE0, 0X8F, 0X39, 0X3F, 0X38, 0X70, 0X3, 0X81, 0X21, 0X56, 0X1F, 0X87, 0X28, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0X73, 0X63, 0X63, 0X97, 0X67, 0X91, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7E, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X3A84, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, /*check these two modes*/ { "1024x768", 1024, 768, TVTYPE_NTSC, { 0XEE, 0X3F, /* 0x01 FF Default 0x27 (was 7F) */ 0X7E, 0X87, 0X49, 0X32, 0X9, 0X83, 0X3, 0X88, 0X47, 0X4D, 0X1B, 0XE4, 0X89, 0X51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0XAF, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XC, 0, 0XFF, 0, 0, 0XFF, 0XB0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0XE, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X4A84, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X6717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "1024x768", 1024, 768, TVTYPE_PAL, { 0XE5, 0X7F, 0XE0, 0X8F, 0XC1, 0X3E, 0X4A, 0X70, 0, 0X81, 0X7, 0X2A, 0X20, 0X6D, 0XC2, 0XD7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0XAA, 0X7F, 0X7F, 0X8E, 0X83, 0X97, 0XE6, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X11, 0, 0XFF, 0, 0, 0XFF, 0XE7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0XE, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, { 0XC284, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "640x480Over", 640, 480, TVTYPE_NTSC, { 0X69, /* 0x00 DM Mode 16 640x480 1/1 */ 0X3F, /* 0x01 FF Default 0x27 (was 7F) */ 0X7E, /* 0x02 VBW Default 0xBE (was 7E) */ 0X03, /* 0x03 TE Decent text 0x83 (was 8D) */ 0X18, /* 0x04 SAV Default 0x50 (was 10) */ 0X19, /* 0x05 HP Default 0x50 */ 0XFB, /* 0x06 VP Default 0x00 */ 0X83, /* 0x07 BL Default 0x83 (NTSC-J 66) */ 0X03, /* 0x08 CE Default 0x03 */ 0X80, /* 0x09 TPC Default 0x80 */ 0X3F, /* 0x0A PLLM Default 0x3F */ 0X6E, /* 0x0B PLLN Default 0x7E */ 0X25, /* 0x0C FSCI Default 0x25 */ 0X24, /* 0x0D FSCI Default 0x24 */ 0X92, /* 0x0E FSCI Default 0x9C (was 92) */ 0X49, /* 0x0F FSCI Default 0x7A (was 49) */ 0X00, /* 0x10 CIVC Default 0x01 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* We don't touch these */ 0X48, /* 0x1C CM Default 0x00 */ 0X40, /* 0x1D IC Default 0x88 */ 0XD2, /* 0x1E GPIO Default 0xC0 */ 0X80, /* 0x1F IDF Default 0x00 */ 0X40, /* 0x20 CD */ 0X00, /* 0x21 DC */ 0X00, /* 0x22 BCO Default 0x00 */ }, /* why is this #ifed, what's the difference? */ #if 0 { 0X55, 0X4F, 0X4F, 0X99, 0X51, 0X18, 0X2E, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE7, 0, 0XDF, 0, 0, 0XDF, 0X2F, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0, 0, 0X87, 0X1C, 0, 0 }, { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, { 0XCF, 0X7F, 0X7F, 0XCF, 0X92, 0X22, 0X87, 0XBC, 0X2F, 0XDF, 0XDF, 0X2F, 0X11, 0XA, 0XFF, 0X24, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, { 0X7107, 0, 0, 0, 0, 0, 0, 0 }, { 0X3, 0X811, 0XF416, 0X9F17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, #else { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0XB, 0X3E, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XEE, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X1184, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0XAD17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, #endif }, { "640x480Over", 640, 480, TVTYPE_PAL, { 0X60, /* 0x00 DM Mode 13 PAL 640x480 OS 5/4 */ 0X27, /* 0x01 FF Default 0x27 (was 7F) */ 0XBE, /* 0x02 VBW Default 0xBE (was 7E) */ 0X83, /* 0x03 TE Decent text 0x8B (was 8D) */ 0X10, /* 0x04 SAV Default 0x50 */ 0X19, /* 0x05 HP Default 0x50 */ 0XFB, /* 0x06 VP Default 0x00 */ 0X83, /* 0x07 BL Default 0x83 */ 0X01, /* 0x08 CE Default 0x03 */ 0X81, /* 0x09 TPC Default 0x80 */ 0X0D, /* 0x0A PLLM Default 0x3F */ 0X0B, /* 0x0B PLLN Default 0x7E */ 0X30, /* 0x0C FSCI Default 0x25 */ 0X0A, /* 0x0D FSCI Default 0x24 */ 0XE7, /* 0x0E FSCI Default 0x9C */ 0XC4, /* 0x0F FSCI Default 0x7A */ 0X00, /* 0x10 CIVC Default 0x01 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* We don't touch these */ 0X48, /* 0x1C CM Default 0x00 */ 0X40, /* 0x1D IC Default 0x88 */ 0XD2, /* 0x1E GPIO Default 0xC0 */ 0X80, /* 0x1F IDF Default 0x00 */ 0X40, /* 0x20 CD */ 0X00, /* 0x21 DC */ 0X00, /* 0x22 BCO Default 0x00 */ }, { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0XF2, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE5, 0, 0XDF, 0, 0, 0XDF, 0XF3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X3184, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "800x600Over", 800, 600, TVTYPE_NTSC, { 0XCE, /* 0x00 Mode 28 */ 0X27, /* 0x01 Default 0x27 (was 7F) */ 0XBE, /* 0x02 Default 0xBE (was 76) */ 0X8F, /* 0x03 */ 0X51, /* 0x04 */ 0X2E, /* 0x05 */ 0X10, /* 0x06 */ 0X83, /* 0x07 */ 0X3, /* 0x08 */ 0X81, /* 0x09 */ 0X13, /* 0x0A */ 0X3E, /* 0x0B */ 0X1C, /* 0x0C */ 0, /* 0x0D */ 0, /* 0x0E */ 0, /* 0x0F */ 0, /* 0x10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0X7D, 0X63, 0X63, 0X81, 0X69, 0X18, 0XBA, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5A, 0, 0X57, 0, 0, 0X57, 0XBB, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X5284, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0XD017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "800x600Over", 800, 600, TVTYPE_PAL, { 0XC1, 0X7F, 0XE0, 0X8F, 0X20, 0X1D, 0X36, 0X70, 0X3, 0X94, 0X39, 0X87, 0X26, 0X79, 0X8C, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0X71, 0X63, 0X63, 0X95, 0X67, 0X90, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X57, 0, 0X57, 0, 0, 0X57, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X2184, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "1024x768Over", 1024, 768, TVTYPE_NTSC, { 0XED, 0X3F, /* 0x01 FF Default 0x27 (was 7F) */ 0X7E, 0X87, 0X49, 0X20, 0, 0X83, 0X3, 0X90, 0X89, 0X35, 0X1F, 0X61, 0X1A, 0X7C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0X46, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X4, 0, 0XFF, 0, 0, 0XFF, 0X47, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X5084, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X4517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "1024x768Over", 1024, 768, TVTYPE_PAL, { 0XE4, 0X7F, 0XA0, 0X8F, 0XB1, 0X28, 0X37, 0X70, 0, 0X81, 0X10, 0X4C, 0X25, 0XF, 0XBA, 0X1B, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0XAA, 0X7F, 0X7F, 0X8E, 0X84, 0X97, 0X69, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7, 0, 0XFF, 0, 0, 0XFF, 0X6A, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XB184, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "720x480", 720, 480, TVTYPE_NTSC, { 0X89, /* 0x00 DM Mode 19 720x480 1/1 */ 0X3F, /* 0x01 FF Default 0x27 (was 7F) */ 0X7E, /* 0x02 VBW Default 0xBE (was 7E) */ 0X03, /* 0x03 TE Decent text 0x83 (was 8D) */ 0X18, /* 0x04 SAV Default 0x50 (was 10) */ 0X19, /* 0x05 HP Default 0x50 */ 0XFB, /* 0x06 VP Default 0x00 */ 0X83, /* 0x07 BL Default 0x83 (NTSC-J 66) */ 0X03, /* 0x08 CE Default 0x03 */ 0X80, /* 0x09 TPC Default 0x80 */ 0X3F, /* 0x0A PLLM Default 0x3F */ 0X7C, /* 0x0B PLLN Default 0x7C */ 0X21, /* 0x0C FSCI Default 0x25 */ 0X04, /* 0x0D FSCI Default 0x04 */ 0X10, /* 0x0E FSCI Default 0x10 */ 0X41, /* 0x0F FSCI Default 0x41 */ 0X00, /* 0x10 CIVC Default 0x01 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* We don't touch these */ 0X48, /* 0x1C CM Default 0x00 */ 0X40, /* 0x1D IC Default 0x88 */ 0XD2, /* 0x1E GPIO Default 0xC0 */ 0X80, /* 0x1F IDF Default 0x00 */ 0X40, /* 0x20 CD */ 0X00, /* 0x21 DC */ 0X00, /* 0x22 BCO Default 0x00 */ }, { 0X64, 0X59, 0X59, 0X88, 0X5B, 0X81, 0X56, 0X3E, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0, 0X4, 0X87, 0X1C, 0, 0 }, { 0, 0, 0, 0X87, 0X1C, 0, 0, 0 }, { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0X2D, 0X5A, 0, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0X5A, 0XB4, 0X40, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, { 0X47, 0XCF, 0XCF, 0X47, 0X9A, 0X23, 0XD9, 0XA, 0X57, 0XDF, 0XDF, 0X57, 0X51, 0XA, 0XFF, 0X3B, 0, 0, 0, 0, 0, 0XB4, 0X68, 0X81, 0, 0, 0X80, 0, 0X80, 0, 0, 0 }, { 0X6E07, 0, 0, 0, 0, 0, 0, 0 }, { 0X3, 0X811, 0XC316, 0X4C17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, /* don't we want 720x576 for pal? */ { "720x480", 720, 480, TVTYPE_PAL, { 0XE4, 0X7F, 0XA0, 0X8F, 0XB1, 0X28, 0X37, 0X70, 0, 0X81, 0X10, 0X4C, 0X25, 0XF, 0XBA, 0X1B, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0, }, { 0XAA, 0X7F, 0X7F, 0X8E, 0X84, 0X97, 0X69, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7, 0, 0XFF, 0, 0, 0XFF, 0X6A, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XB184, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, }; static struct CH7xxxTableRec CH7019Table[] = { { "640x480", 640, 480, TVTYPE_NTSC, { 0X6A, 0X7F, 0X7E, 0X8D, 0X21, 0X2E, 0X4, 0X83, 0X3, 0X80, 0X3F, 0X7E, 0X20, 0X80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0 }, { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0X56, 0XBA, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X8, 0, 0XDF, 0, 0, 0XDF, 0X57, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XEF, 0X57, 0XDF, 0XDF, 0X57, 0X11, 0XA, 0X8, 0X50, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X2284, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X9217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "640x480", 640, 480, TVTYPE_PAL, { 0X61, 0X7F, 0XE0, 0X8F, 0X31, 0X35, 0X33, 0X6E, 0X3, 0X81, 0X4, 0X9, 0X26, 0X6F, 0X1F, 0XD0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0 }, { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0X6F, 0XBA, 0, 0X40, 0, 0, 0, 0, 0, 0, 0X11, 0, 0XDF, 0, 0, 0XDF, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0X1E, 0X70, 0XDF, 0XDF, 0X70, 0X51, 0XA, 0X11, 0X5D, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X3284, 0, 0, 0, 0, 0, 0, 0 }, }, { "800x600", 800, 600, TVTYPE_NTSC, { 0XCF, 0X7F, 0X76, 0X8F, 0X59, 0X3C, 0X15, 0X83, 0X3, 0X88, 0X59, 0X2E, 0X19, 0X8B, 0X3A, 0X63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X80, 0X63, 0X63, 0X84, 0X69, 0X1A, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5C, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X27, 0X1F, 0X1F, 0X27, 0XE3, 0X34, 0X48, 0XD6, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X5C, 0X5D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X5A84, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X5117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, }, { "800x600", 800, 600, TVTYPE_PAL, { 0XC3, 0X7F, 0XE0, 0X8F, 0X39, 0X3F, 0X38, 0X70, 0X3, 0X81, 0X21, 0X56, 0X1F, 0X87, 0X28, 0X18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X73, 0X63, 0X63, 0X97, 0X67, 0X91, 0XEC, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7E, 0, 0X57, 0, 0, 0X57, 0XED, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XBF, 0X1F, 0X1F, 0XBF, 0XDB, 0X33, 0X38, 0X8E, 0XED, 0X57, 0X57, 0XED, 0X52, 0X12, 0X74, 0X4D, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X3A84, 0, 0, 0, 0, 0, 0, 0 }, }, { "1024x768", 1024, 768, TVTYPE_NTSC, { 0XEE, 0X7F, 0X7E, 0X87, 0X49, 0X32, 0X9, 0X83, 0X3, 0X88, 0X47, 0X4D, 0X1B, 0XE4, 0X89, 0X51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0XAF, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XC, 0, 0XFF, 0, 0, 0XFF, 0XB0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0XE, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X3F, 0XB0, 0XFF, 0XFF, 0XB0, 0X9A, 0X13, 0XC, 0X7A, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X4A84, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X6717, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "1024x768", 1024, 768, TVTYPE_PAL, { 0XE5, 0X7F, 0XE0, 0X8F, 0XC1, 0X3E, 0X4A, 0X70, 0, 0X81, 0X7, 0X2A, 0X20, 0X6D, 0XC2, 0XD7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0XAA, 0X7F, 0X7F, 0X8E, 0X83, 0X97, 0XE6, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X11, 0, 0XFF, 0, 0, 0XFF, 0XE7, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0XE, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XBE, 0XE7, 0XFF, 0XFF, 0XE7, 0X9A, 0X13, 0X7, 0X7B, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X8E, 0, 0, 0 }, { 0XC284, 0, 0, 0, 0, 0, 0, 0 }, }, { "640x480Over", 640, 480, TVTYPE_NTSC, { 0X69, 0X7F, 0X7E, 0X8D, 0X10, 0X19, 0, 0X83, 0X3, 0X80, 0X3F, 0X6E, 0X25, 0X24, 0X92, 0X49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X5D, 0X4F, 0X4F, 0X81, 0X52, 0X9E, 0XB, 0X3E, 0, 0X60, 0, 0, 0, 0, 0, 0, 0XEE, 0, 0XDF, 0, 0, 0XDF, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X7F, 0X7F, 0XF, 0X9A, 0X23, 0X8F, 0XFF, 0XC, 0XDF, 0XDF, 0XC, 0X11, 0XA, 0XEE, 0X31, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X1184, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0XAD17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "640x480Over", 640, 480, TVTYPE_PAL, { 0X60, 0X7F, 0XE0, 0X8F, 0X31, 0X1B, 0X2D, 0X6E, 0X3, 0X81, 0XD, 0X14, 0X30, 0XA, 0XE7, 0XC4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X64, 0X4F, 0X4F, 0X88, 0X53, 0X83, 0XF2, 0X1F, 0, 0X40, 0, 0, 0, 0, 0, 0, 0XE5, 0, 0XDF, 0, 0, 0XDF, 0XF3, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0X28, 0X50, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0X50, 0XA0, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X47, 0X7F, 0X7F, 0X47, 0X9A, 0X23, 0X95, 0XFF, 0XF3, 0XDF, 0XDF, 0XF3, 0X9, 0X9, 0XE5, 0X40, 0, 0, 0, 0, 0, 0XA0, 0X40, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X3184, 0, 0, 0, 0, 0, 0, 0 }, }, { "800x600Over", 800, 600, TVTYPE_NTSC, { 0XCE, 0X7F, 0X76, 0X8F, 0X51, 0X2E, 0X10, 0X83, 0X3, 0X81, 0X13, 0X3E, 0X1C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X7D, 0X63, 0X63, 0X81, 0X69, 0X18, 0XBA, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X5A, 0, 0X57, 0, 0, 0X57, 0XBB, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XF, 0X1F, 0X1F, 0XF, 0XE3, 0X34, 0X44, 0XC6, 0XBB, 0X57, 0X57, 0XBB, 0X52, 0X12, 0X3F, 0X59, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X5284, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0XD017, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "800x600Over", 800, 600, TVTYPE_PAL, { 0XC1, 0X7F, 0XE0, 0X8F, 0X20, 0X1D, 0X36, 0X70, 0X3, 0X94, 0X39, 0X87, 0X26, 0X79, 0X8C, 0XC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X71, 0X63, 0X63, 0X95, 0X67, 0X90, 0X6F, 0XF0, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X57, 0, 0X57, 0, 0, 0X57, 0X70, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0X20, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0X32, 0X64, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0X64, 0XC8, 0X40, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XAF, 0X1F, 0X1F, 0XAF, 0XDB, 0X33, 0X35, 0X8E, 0X70, 0X57, 0X57, 0X70, 0X52, 0X12, 0X57, 0X5A, 0, 0, 0, 0, 0, 0XC8, 0X90, 0X81, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X2184, 0, 0, 0, 0, 0, 0, 0 }, }, { "1024x768Over", 1024, 768, TVTYPE_NTSC, { 0XED, 0X7F, 0X7E, 0X87, 0X49, 0X20, 0, 0X83, 0X3, 0X90, 0X89, 0X35, 0X1F, 0X61, 0X1A, 0X7C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0X8C, 0X7F, 0X7F, 0X90, 0X81, 0X8, 0X46, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X4, 0, 0XFF, 0, 0, 0XFF, 0X47, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X87, 0XFF, 0XFF, 0X87, 0X23, 0X34, 0X9, 0X38, 0X47, 0XFF, 0XFF, 0X47, 0X9A, 0X13, 0X4, 0X6F, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X5084, 0, 0, 0, 0, 0, 0, 0 }, { 0X2, 0X811, 0X4517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, { "1024x768Over", 1024, 768, TVTYPE_PAL, { 0XE4, 0X7F, 0XA0, 0X8F, 0XB1, 0X28, 0X37, 0X70, 0, 0X81, 0X10, 0X4C, 0X25, 0XF, 0XBA, 0X1B, 0X1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0X48, 0X40, 0XD2, 0X80, 0X40, 0, 0}, { 0XAA, 0X7F, 0X7F, 0X8E, 0X84, 0X97, 0X69, 0XF5, 0, 0X60, 0, 0, 0, 0, 0, 0, 0X7, 0, 0XFF, 0, 0, 0XFF, 0X6A, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0X40, 0X80, 0, 0X47, 0X1C, 0, 0 }, { 0, 0, 0, 0X47, 0X1C, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X40, 0X80, 0, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0X80, 0, 0X41, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0X77, 0XFF, 0XFF, 0X77, 0X2B, 0X35, 0X1B, 0XB7, 0X6A, 0XFF, 0XFF, 0X6A, 0X9A, 0X13, 0X7, 0X77, 0, 0, 0, 0, 0, 0, 0, 0X86, 0, 0, 0X80, 0X20, 0X90, 0, 0, 0 }, { 0XB184, 0, 0, 0, 0, 0, 0, 0 }, } }; static const VIABIOSTVMASKTableRec ch7011MaskTable = { { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF }, { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, 0X3F, 0X38,24,13,22 }; static const VIABIOSTVMASKTableRec ch7019MaskTable = { { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF }, { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0XFF, 0, 0, 0, 0, 0, 0, 0XFF, 0, 0XFF, 0, 0, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0, 0, 0, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0XFF, 0XFF, 0XFF, 0, 0, 0 }, 0X3F, 0X38,24,13,22 }; #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_display.c000066400000000000000000001465741267025031400243050ustar00rootroot00000000000000/* * Copyright 2005-2015 The Openchrome Project * [http://www.freedesktop.org/wiki/Openchrome] * 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" /* * Enables the second display channel. */ void ViaSecondDisplayChannelEnable(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSecondDisplayChannelEnable\n")); ViaCrtcMask(hwp, 0x6A, 0x00, 1 << 6); ViaCrtcMask(hwp, 0x6A, 1 << 7, 1 << 7); ViaCrtcMask(hwp, 0x6A, 1 << 6, 1 << 6); } /* * Disables the second display channel. */ void ViaSecondDisplayChannelDisable(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSecondDisplayChannelDisable\n")); ViaCrtcMask(hwp, 0x6A, 0x00, 1 << 6); ViaCrtcMask(hwp, 0x6A, 0x00, 1 << 7); ViaCrtcMask(hwp, 0x6A, 1 << 6, 1 << 6); } /* * Initial settings for displays. */ void ViaDisplayInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplayInit\n")); ViaSecondDisplayChannelDisable(pScrn); 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); } /* * Enables simultaneous mode. */ void ViaDisplayEnableSimultaneous(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplayEnableSimultaneous\n")); ViaCrtcMask(hwp, 0x6B, 0x08, 0x08); } /* * Disables simultaneous mode. */ void ViaDisplayDisableSimultaneous(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplayDisableSimultaneous\n")); ViaCrtcMask(hwp, 0x6B, 0x00, 0x08); } /* * 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); } static void ViaCRTCSetGraphicsRegisters(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); /* graphics registers */ hwp->writeGr(hwp, 0x00, 0x00); hwp->writeGr(hwp, 0x01, 0x00); hwp->writeGr(hwp, 0x02, 0x00); hwp->writeGr(hwp, 0x03, 0x00); hwp->writeGr(hwp, 0x04, 0x00); hwp->writeGr(hwp, 0x05, 0x40); hwp->writeGr(hwp, 0x06, 0x05); hwp->writeGr(hwp, 0x07, 0x0F); hwp->writeGr(hwp, 0x08, 0xFF); ViaGrMask(hwp, 0x20, 0, 0xFF); ViaGrMask(hwp, 0x21, 0, 0xFF); ViaGrMask(hwp, 0x22, 0, 0xFF); } static void ViaCRTCSetAttributeRegisters(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); CARD8 i; /* attribute registers */ for (i = 0; i <= 0xF; i++) { hwp->writeAttr(hwp, i, i); } hwp->writeAttr(hwp, 0x10, 0x41); hwp->writeAttr(hwp, 0x11, 0xFF); hwp->writeAttr(hwp, 0x12, 0x0F); hwp->writeAttr(hwp, 0x13, 0x00); hwp->writeAttr(hwp, 0x14, 0x00); } void VIALoadRgbLut(ScrnInfoPtr pScrn, int start, int numColors, LOCO *colors) { vgaHWPtr hwp = VGAHWPTR(pScrn); int i, j; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIALoadRgbLut\n")); hwp->enablePalette(hwp); hwp->writeDacMask(hwp, 0xFF); /* We need the same palette contents for both 16 and 24 bits, but X doesn't * play: X's colormap handling is hopelessly intertwined with almost every * X subsystem. So we just space out RGB values over the 256*3. */ switch (pScrn->bitsPerPixel) { case 16: for (i = start; i < numColors; i++) { hwp->writeDacWriteAddr(hwp, i * 4); for (j = 0; j < 4; j++) { hwp->writeDacData(hwp, colors[i / 2].red); hwp->writeDacData(hwp, colors[i].green); hwp->writeDacData(hwp, colors[i / 2].blue); } } break; case 8: case 24: case 32: for (i = start; i < numColors; i++) { hwp->writeDacWriteAddr(hwp, i); hwp->writeDacData(hwp, colors[i].red); hwp->writeDacData(hwp, colors[i].green); hwp->writeDacData(hwp, colors[i].blue); } break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unsupported bitdepth: %d\n", pScrn->bitsPerPixel); break; } hwp->disablePalette(hwp); } void ViaGammaDisable(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: ViaSeqMask(hwp, 0x16, 0x00, 0x80); break; default: ViaCrtcMask(hwp, 0x33, 0x00, 0x80); break; } /* Disable gamma on secondary */ /* This is needed or the hardware will lockup */ ViaSeqMask(hwp, 0x1A, 0x00, 0x01); ViaCrtcMask(hwp, 0x6A, 0x00, 0x02); switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: case VIA_K8M800: case VIA_PM800: break; default: ViaCrtcMask(hwp, 0x6A, 0x00, 0x20); break; } } void ViaCRTCInit(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); hwp->writeSeq(hwp, 0x10, 0x01); /* unlock extended registers */ ViaCrtcMask(hwp, 0x47, 0x00, 0x01); /* unlock CRT registers */ ViaCRTCSetGraphicsRegisters(pScrn); ViaCRTCSetAttributeRegisters(pScrn); } void ViaFirstCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); CARD16 temp; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaFirstCRTCSetMode\n")); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting up %s\n", mode->name)); ViaCrtcMask(hwp, 0x11, 0x00, 0x80); /* modify starting address */ ViaCrtcMask(hwp, 0x03, 0x80, 0x80); /* enable vertical retrace access */ /* Set Misc Register */ temp = 0x23; if (mode->Flags & V_NHSYNC) temp |= 0x40; if (mode->Flags & V_NVSYNC) temp |= 0x80; temp |= 0x0C; /* Undefined/external clock */ hwp->writeMiscOut(hwp, temp); /* Sequence registers */ hwp->writeSeq(hwp, 0x00, 0x00); #if 0 if (mode->Flags & V_CLKDIV2) hwp->writeSeq(hwp, 0x01, 0x09); else #endif hwp->writeSeq(hwp, 0x01, 0x01); hwp->writeSeq(hwp, 0x02, 0x0F); hwp->writeSeq(hwp, 0x03, 0x00); hwp->writeSeq(hwp, 0x04, 0x0E); ViaSeqMask(hwp, 0x15, 0x02, 0x02); /* bpp */ switch (pScrn->bitsPerPixel) { case 8: /* Only CLE266.AX use 6bits LUT. */ if (pVia->Chipset == VIA_CLE266 && pVia->ChipRev < 15) ViaSeqMask(hwp, 0x15, 0x22, 0xFE); else ViaSeqMask(hwp, 0x15, 0xA2, 0xFE); break; case 16: ViaSeqMask(hwp, 0x15, 0xB6, 0xFE); break; case 24: case 32: ViaSeqMask(hwp, 0x15, 0xAE, 0xFE); break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unhandled bitdepth: %d\n", pScrn->bitsPerPixel); break; } switch (pVia->ChipId) { case VIA_CX700: case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: break; default: ViaSeqMask(hwp, 0x16, 0x08, 0xBF); ViaSeqMask(hwp, 0x17, 0x1F, 0xFF); ViaSeqMask(hwp, 0x18, 0x4E, 0xFF); ViaSeqMask(hwp, 0x1A, 0x08, 0xF9); break; } /* Crtc registers */ /* horizontal total : 4100 */ temp = (mode->CrtcHTotal >> 3) - 5; hwp->writeCrtc(hwp, 0x00, temp & 0xFF); ViaCrtcMask(hwp, 0x36, temp >> 5, 0x08); /* horizontal address : 2048 */ temp = (mode->CrtcHDisplay >> 3) - 1; hwp->writeCrtc(hwp, 0x01, temp & 0xFF); /* horizontal blanking start : 2048 */ /* temp = (mode->CrtcHDisplay >> 3) - 1; */ temp = (mode->CrtcHBlankStart >> 3) - 1; hwp->writeCrtc(hwp, 0x02, temp & 0xFF); /* If HblankStart has more bits anywhere, add them here */ /* horizontal blanking end : start + 1025 */ /* temp = (mode->CrtcHTotal >> 3) - 1; */ temp = (mode->CrtcHBlankEnd >> 3) - 1; ViaCrtcMask(hwp, 0x03, temp, 0x1F); ViaCrtcMask(hwp, 0x05, temp << 2, 0x80); ViaCrtcMask(hwp, 0x33, temp >> 1, 0x20); /* CrtcHSkew ??? */ /* horizontal sync start : 4095 */ temp = mode->CrtcHSyncStart >> 3; hwp->writeCrtc(hwp, 0x04, temp & 0xFF); ViaCrtcMask(hwp, 0x33, temp >> 4, 0x10); /* horizontal sync end : start + 256 */ temp = mode->CrtcHSyncEnd >> 3; ViaCrtcMask(hwp, 0x05, temp, 0x1F); /* vertical total : 2049 */ temp = mode->CrtcVTotal - 2; hwp->writeCrtc(hwp, 0x06, temp & 0xFF); ViaCrtcMask(hwp, 0x07, temp >> 8, 0x01); ViaCrtcMask(hwp, 0x07, temp >> 4, 0x20); ViaCrtcMask(hwp, 0x35, temp >> 10, 0x01); /* vertical address : 2048 */ temp = mode->CrtcVDisplay - 1; hwp->writeCrtc(hwp, 0x12, temp & 0xFF); ViaCrtcMask(hwp, 0x07, temp >> 7, 0x02); ViaCrtcMask(hwp, 0x07, temp >> 3, 0x40); ViaCrtcMask(hwp, 0x35, temp >> 8, 0x04); /* Primary starting address -> 0x00, adjustframe does the rest */ hwp->writeCrtc(hwp, 0x0C, 0x00); hwp->writeCrtc(hwp, 0x0D, 0x00); ViaCrtcMask(hwp, 0x48, 0x00, 0x03); /* is this even possible on CLE266A ? */ hwp->writeCrtc(hwp, 0x34, 0x00); /* vertical sync start : 2047 */ temp = mode->CrtcVSyncStart; hwp->writeCrtc(hwp, 0x10, temp & 0xFF); ViaCrtcMask(hwp, 0x07, temp >> 6, 0x04); ViaCrtcMask(hwp, 0x07, temp >> 2, 0x80); ViaCrtcMask(hwp, 0x35, temp >> 9, 0x02); /* vertical sync end : start + 16 -- other bits someplace? */ ViaCrtcMask(hwp, 0x11, mode->CrtcVSyncEnd, 0x0F); /* line compare: We are not doing splitscreen so 0x3FFF */ hwp->writeCrtc(hwp, 0x18, 0xFF); ViaCrtcMask(hwp, 0x07, 0x10, 0x10); ViaCrtcMask(hwp, 0x09, 0x40, 0x40); ViaCrtcMask(hwp, 0x33, 0x06, 0x07); ViaCrtcMask(hwp, 0x35, 0x10, 0x10); /* zero Maximum scan line */ ViaCrtcMask(hwp, 0x09, 0x00, 0x1F); hwp->writeCrtc(hwp, 0x14, 0x00); /* vertical blanking start : 2048 */ /* temp = mode->CrtcVDisplay - 1; */ temp = mode->CrtcVBlankStart - 1; hwp->writeCrtc(hwp, 0x15, temp & 0xFF); ViaCrtcMask(hwp, 0x07, temp >> 5, 0x08); ViaCrtcMask(hwp, 0x09, temp >> 4, 0x20); ViaCrtcMask(hwp, 0x35, temp >> 7, 0x08); /* vertical blanking end : start + 257 */ /* temp = mode->CrtcVTotal - 1; */ temp = mode->CrtcVBlankEnd - 1; hwp->writeCrtc(hwp, 0x16, temp); /* FIXME: check if this is really necessary here */ switch (pVia->ChipId) { case VIA_CX700: case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: break; default: /* some leftovers */ hwp->writeCrtc(hwp, 0x08, 0x00); ViaCrtcMask(hwp, 0x32, 0, 0xFF); /* ? */ ViaCrtcMask(hwp, 0x33, 0, 0xC8); break; } /* offset */ temp = (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3)) >> 3; /* Make sure that this is 32-byte aligned. */ if (temp & 0x03) { temp += 0x03; temp &= ~0x03; } hwp->writeCrtc(hwp, 0x13, temp & 0xFF); ViaCrtcMask(hwp, 0x35, temp >> 3, 0xE0); /* fetch count */ temp = (mode->CrtcHDisplay * (pScrn->bitsPerPixel >> 3)) >> 3; /* Make sure that this is 32-byte aligned. */ if (temp & 0x03) { temp += 0x03; temp &= ~0x03; } hwp->writeSeq(hwp, 0x1C, ((temp >> 1)+1) & 0xFF); ViaSeqMask(hwp, 0x1D, temp >> 9, 0x03); switch (pVia->ChipId) { case VIA_CX700: case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: break; default: /* some leftovers */ ViaCrtcMask(hwp, 0x32, 0, 0xFF); ViaCrtcMask(hwp, 0x33, 0, 0xC8); break; } } void ViaFirstCRTCSetStartingAddress(xf86CrtcPtr crtc, int x, int y) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); CARD32 Base; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaFirstCRTCSetStartingAddress\n")); Base = (y * pScrn->displayWidth + x) * (pScrn->bitsPerPixel / 8); Base = (Base + drmmode->front_bo->offset) >> 1; hwp->writeCrtc(hwp, 0x0C, (Base & 0xFF00) >> 8); hwp->writeCrtc(hwp, 0x0D, Base & 0xFF); /* FIXME The proper starting address for CR48 is 0x1F - Bits[28:24] */ if (!(pVia->Chipset == VIA_CLE266 && CLE266_REV_IS_AX(pVia->ChipRev))) ViaCrtcMask(hwp, 0x48, Base >> 24, 0x0F); /* CR34 are fire bits. Must be written after CR0C CR0D CR48. */ hwp->writeCrtc(hwp, 0x34, (Base & 0xFF0000) >> 16); } void ViaSecondCRTCSetStartingAddress(xf86CrtcPtr crtc, int x, int y) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); CARD32 Base, tmp; Base = (y * pScrn->displayWidth + x) * (pScrn->bitsPerPixel / 8); Base = (Base + drmmode->front_bo->offset) >> 3; tmp = hwp->readCrtc(hwp, 0x62) & 0x01; tmp |= (Base & 0x7F) << 1; hwp->writeCrtc(hwp, 0x62, tmp); hwp->writeCrtc(hwp, 0x63, (Base & 0x7F80) >> 7); hwp->writeCrtc(hwp, 0x64, (Base & 0x7F8000) >> 15); hwp->writeCrtc(hwp, 0xA3, (Base & 0x03800000) >> 23); } void ViaSecondCRTCHorizontalQWCount(ScrnInfoPtr pScrn, int width) { vgaHWPtr hwp = VGAHWPTR(pScrn); CARD16 temp; /* fetch count */ temp = (width * (pScrn->bitsPerPixel >> 3)) >> 3; /* Make sure that this is 32-byte aligned. */ if (temp & 0x03) { temp += 0x03; temp &= ~0x03; } hwp->writeCrtc(hwp, 0x65, (temp >> 1) & 0xFF); ViaCrtcMask(hwp, 0x67, temp >> 7, 0x0C); } void ViaSecondCRTCHorizontalOffset(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); CARD16 temp; /* offset */ temp = (pScrn->displayWidth * (pScrn->bitsPerPixel >> 3)) >> 3; /* Make sure that this is 32-byte aligned. */ if (temp & 0x03) { temp += 0x03; temp &= ~0x03; } hwp->writeCrtc(hwp, 0x66, temp & 0xFF); ViaCrtcMask(hwp, 0x67, temp >> 8, 0x03); } void ViaSecondCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); CARD16 temp; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "mode: %p\n", mode); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "mode->name: %p\n", mode->name); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "mode->name: %s\n", mode->name); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSecondCRTCSetMode\n")); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting up %s\n", mode->name)); /* bpp */ switch (pScrn->bitsPerPixel) { case 8: ViaCrtcMask(hwp, 0x67, 0x00, 0xC0); break; case 16: ViaCrtcMask(hwp, 0x67, 0x40, 0xC0); break; case 24: case 32: ViaCrtcMask(hwp, 0x67, 0xC0, 0xC0); break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unhandled bitdepth: %d\n", pScrn->bitsPerPixel); break; } switch (pVia->ChipId) { case VIA_CX700: case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: break; default: ViaSeqMask(hwp, 0x16, 0x08, 0xBF); ViaSeqMask(hwp, 0x17, 0x1F, 0xFF); ViaSeqMask(hwp, 0x18, 0x4E, 0xFF); ViaSeqMask(hwp, 0x1A, 0x08, 0xF9); break; } /* Crtc registers */ /* horizontal total : 4096 */ temp = mode->CrtcHTotal - 1; hwp->writeCrtc(hwp, 0x50, temp & 0xFF); ViaCrtcMask(hwp, 0x55, temp >> 8, 0x0F); /* horizontal address : 2048 */ temp = mode->CrtcHDisplay - 1; hwp->writeCrtc(hwp, 0x51, temp & 0xFF); ViaCrtcMask(hwp, 0x55, temp >> 4, 0x70); /* horizontal blanking start : 2048 */ /* temp = mode->CrtcHDisplay - 1; */ temp = mode->CrtcHBlankStart - 1; hwp->writeCrtc(hwp, 0x52, temp & 0xFF); ViaCrtcMask(hwp, 0x54, temp >> 8, 0x07); /* horizontal blanking end : 4096 */ /* temp = mode->CrtcHTotal - 1; */ temp = mode->CrtcHBlankEnd - 1; hwp->writeCrtc(hwp, 0x53, temp & 0xFF); ViaCrtcMask(hwp, 0x54, temp >> 5, 0x38); ViaCrtcMask(hwp, 0x5D, temp >> 5, 0x40); /* horizontal sync start : 2047 */ temp = mode->CrtcHSyncStart; hwp->writeCrtc(hwp, 0x56, temp & 0xFF); ViaCrtcMask(hwp, 0x54, temp >> 2, 0xC0); ViaCrtcMask(hwp, 0x5C, temp >> 3, 0x80); if (pVia->ChipId != VIA_CLE266 && pVia->ChipId != VIA_KM400) ViaCrtcMask(hwp, 0x5D, temp >> 4, 0x80); /* horizontal sync end : sync start + 512 */ temp = mode->CrtcHSyncEnd; hwp->writeCrtc(hwp, 0x57, temp & 0xFF); ViaCrtcMask(hwp, 0x5C, temp >> 2, 0x40); /* vertical total : 2048 */ temp = mode->CrtcVTotal - 1; hwp->writeCrtc(hwp, 0x58, temp & 0xFF); ViaCrtcMask(hwp, 0x5D, temp >> 8, 0x07); /* vertical address : 2048 */ temp = mode->CrtcVDisplay - 1; hwp->writeCrtc(hwp, 0x59, temp & 0xFF); ViaCrtcMask(hwp, 0x5D, temp >> 5, 0x38); /* vertical blanking start : 2048 */ /* temp = mode->CrtcVDisplay - 1; */ temp = mode->CrtcVBlankStart - 1; hwp->writeCrtc(hwp, 0x5A, temp & 0xFF); ViaCrtcMask(hwp, 0x5C, temp >> 8, 0x07); /* vertical blanking end : 2048 */ /* temp = mode->CrtcVTotal - 1; */ temp = mode->CrtcVBlankEnd - 1; hwp->writeCrtc(hwp, 0x5B, temp & 0xFF); ViaCrtcMask(hwp, 0x5C, temp >> 5, 0x38); /* vertical sync start : 2047 */ temp = mode->CrtcVSyncStart; hwp->writeCrtc(hwp, 0x5E, temp & 0xFF); ViaCrtcMask(hwp, 0x5F, temp >> 3, 0xE0); /* vertical sync end : start + 32 */ temp = mode->CrtcVSyncEnd; ViaCrtcMask(hwp, 0x5F, temp, 0x1F); switch (pVia->ChipId) { case VIA_CX700: case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: break; default: /* some leftovers */ hwp->writeCrtc(hwp, 0x08, 0x00); ViaCrtcMask(hwp, 0x32, 0, 0xFF); /* ? */ ViaCrtcMask(hwp, 0x33, 0, 0xC8); break; } ViaSecondCRTCHorizontalOffset(pScrn); ViaSecondCRTCHorizontalQWCount(pScrn, mode->CrtcHDisplay); } /* * Checks for limitations imposed by the available VGA timing registers. */ static ModeStatus ViaFirstCRTCModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaFirstCRTCModeValid\n")); if (mode->CrtcHTotal > 4100) return MODE_BAD_HVALUE; if (mode->CrtcHDisplay > 2048) return MODE_BAD_HVALUE; if (mode->CrtcHBlankStart > 2048) return MODE_BAD_HVALUE; if ((mode->CrtcHBlankEnd - mode->CrtcHBlankStart) > 1025) return MODE_HBLANK_WIDE; if (mode->CrtcHSyncStart > 4095) return MODE_BAD_HVALUE; if ((mode->CrtcHSyncEnd - mode->CrtcHSyncStart) > 256) return MODE_HSYNC_WIDE; if (mode->CrtcVTotal > 2049) return MODE_BAD_VVALUE; if (mode->CrtcVDisplay > 2048) return MODE_BAD_VVALUE; if (mode->CrtcVSyncStart > 2047) return MODE_BAD_VVALUE; if ((mode->CrtcVSyncEnd - mode->CrtcVSyncStart) > 16) return MODE_VSYNC_WIDE; if (mode->CrtcVBlankStart > 2048) return MODE_BAD_VVALUE; if ((mode->CrtcVBlankEnd - mode->CrtcVBlankStart) > 257) return MODE_VBLANK_WIDE; return MODE_OK; } static ModeStatus ViaSecondCRTCModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSecondCRTCModeValid\n")); if (mode->CrtcHTotal > 4096) return MODE_BAD_HVALUE; if (mode->CrtcHDisplay > 2048) return MODE_BAD_HVALUE; if (mode->CrtcHBlankStart > 2048) return MODE_BAD_HVALUE; if (mode->CrtcHBlankEnd > 4096) return MODE_HBLANK_WIDE; if (mode->CrtcHSyncStart > 2047) return MODE_BAD_HVALUE; if ((mode->CrtcHSyncEnd - mode->CrtcHSyncStart) > 512) return MODE_HSYNC_WIDE; if (mode->CrtcVTotal > 2048) return MODE_BAD_VVALUE; if (mode->CrtcVDisplay > 2048) return MODE_BAD_VVALUE; if (mode->CrtcVBlankStart > 2048) return MODE_BAD_VVALUE; if (mode->CrtcVBlankEnd > 2048) return MODE_VBLANK_WIDE; if (mode->CrtcVSyncStart > 2047) return MODE_BAD_VVALUE; if ((mode->CrtcVSyncEnd - mode->CrtcVSyncStart) > 32) return MODE_VSYNC_WIDE; return MODE_OK; } /* * Not tested yet */ void ViaShadowCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaShadowCRTCSetMode\n")); vgaHWPtr hwp = VGAHWPTR(pScrn); CARD16 temp; temp = (mode->CrtcHTotal >> 3) - 5; hwp->writeCrtc(hwp, 0x6D, temp & 0xFF); ViaCrtcMask(hwp, 0x71, temp >> 5, 0x08); temp = (mode->CrtcHBlankEnd >> 3) - 1; hwp->writeCrtc(hwp, 0x6E, temp & 0xFF); temp = mode->CrtcVTotal - 2; hwp->writeCrtc(hwp, 0x6F, temp & 0xFF); ViaCrtcMask(hwp, 0x71, temp >> 8, 0x07); temp = mode->CrtcVDisplay - 1; hwp->writeCrtc(hwp, 0x70, temp & 0xFF); ViaCrtcMask(hwp, 0x71, temp >> 4, 0x70); temp = mode->CrtcVBlankStart - 1; hwp->writeCrtc(hwp, 0x72, temp & 0xFF); ViaCrtcMask(hwp, 0x74, temp >> 4, 0x70); temp = mode->CrtcVTotal - 1; hwp->writeCrtc(hwp, 0x73, temp & 0xFF); ViaCrtcMask(hwp, 0x74, temp >> 8, 0x07); ViaCrtcMask(hwp, 0x76, mode->CrtcVSyncEnd, 0x0F); temp = mode->CrtcVSyncStart; hwp->writeCrtc(hwp, 0x75, temp & 0xFF); ViaCrtcMask(hwp, 0x76, temp >> 4, 0x70); } static void iga1_crtc_dpms(xf86CrtcPtr crtc, int mode) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; if (pVia->pVbe) { ViaVbeDPMS(pScrn, mode); } else { switch (mode) { case DPMSModeOn: if (pBIOSInfo->SimultaneousEnabled) ViaDisplayEnableSimultaneous(pScrn); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: if (pBIOSInfo->SimultaneousEnabled) ViaDisplayDisableSimultaneous(pScrn); break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS mode %d\n", mode); break; } //vgaHWSaveScreen(pScrn->pScreen, mode); } } static void iga1_crtc_save(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe && pVia->vbeSR) { ViaVbeSaveRestore(pScrn, MODE_SAVE); } else { VIASave(pScrn); } vgaHWUnlock(hwp); } static void iga1_crtc_restore(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe && pVia->vbeSR) ViaVbeSaveRestore(pScrn, MODE_RESTORE); else VIARestore(pScrn); /* A soft reset helps to avoid a 3D hang on VT switch. */ switch (pVia->Chipset) { case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: break; default: hwp->writeSeq(hwp, 0x1A, pVia->SavedReg.SR1A | 0x40); break; } vgaHWLock(hwp); } static Bool iga1_crtc_lock(xf86CrtcPtr crtc) { return FALSE; } static void iga1_crtc_unlock(xf86CrtcPtr crtc) { } static Bool iga1_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); CARD32 temp; ModeStatus modestatus; if (pVia->pVbe) return TRUE; if ((mode->Clock < pScrn->clockRanges->minClock) || (mode->Clock > pScrn->clockRanges->maxClock)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock for mode \"%s\" outside of allowed range (%u (%u - %u))\n", mode->name, mode->Clock, pScrn->clockRanges->minClock, pScrn->clockRanges->maxClock); return FALSE; } modestatus = ViaFirstCRTCModeValid(pScrn, mode); if (modestatus != MODE_OK) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not using mode \"%s\" : %s.\n", mode->name, xf86ModeStatusToString(modestatus)); return FALSE; } temp = mode->CrtcHDisplay * mode->CrtcVDisplay * mode->VRefresh * (pScrn->bitsPerPixel >> 3); if (pVia->pBIOSInfo->Bandwidth < temp) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Required bandwidth is not available. (%u > %u)\n", (unsigned)temp, (unsigned)pVia->pBIOSInfo->Bandwidth); return FALSE; } return TRUE; } static void iga1_crtc_prepare (xf86CrtcPtr crtc) { } static void iga1_crtc_set_origin(xf86CrtcPtr crtc, int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe) { ViaVbeAdjustFrame(pScrn, x, y); } else { ViaFirstCRTCSetStartingAddress(crtc, x, y); } VIAVidAdjustFrame(pScrn, x, y); } static void iga1_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode, int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); if (!pVia->pVbe) { if (!vgaHWInit(pScrn, adjusted_mode)) return; if (pVia->UseLegacyModeSwitch) { ViaModePrimaryLegacy(crtc, adjusted_mode); } else { ViaCRTCInit(pScrn); ViaModeFirstCRTC(pScrn, adjusted_mode); if (pVia->pBIOSInfo->SimultaneousEnabled) ViaDisplayEnableSimultaneous(pScrn); else ViaDisplayDisableSimultaneous(pScrn); } } else { if (!ViaVbeSetMode(pScrn, adjusted_mode)) return; } iga1_crtc_set_origin(crtc, crtc->x, crtc->y); } static void iga1_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, int size) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); int SR1A, SR1B, CR67, CR6A; LOCO colors[size]; int i; for (i = 0; i < size; i++) { colors[i].red = red[i] >> 8; colors[i].green = green[i] >> 8; colors[i].blue = blue[i] >> 8; } if (pScrn->bitsPerPixel != 8) { switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: ViaSeqMask(hwp, 0x16, 0x80, 0x80); break; default: ViaCrtcMask(hwp, 0x33, 0x80, 0x80); break; } ViaSeqMask(hwp, 0x1A, 0x00, 0x01); VIALoadRgbLut(pScrn, 0, size, colors); } else { SR1A = hwp->readSeq(hwp, 0x1A); SR1B = hwp->readSeq(hwp, 0x1B); CR67 = hwp->readCrtc(hwp, 0x67); CR6A = hwp->readCrtc(hwp, 0x6A); for (i = 0; i < size; i++) { hwp->writeDacWriteAddr(hwp, i); hwp->writeDacData(hwp, colors[i].red); hwp->writeDacData(hwp, colors[i].green); hwp->writeDacData(hwp, colors[i].blue); } } } static void * iga1_crtc_shadow_allocate (xf86CrtcPtr crtc, int width, int height) { return NULL; } static PixmapPtr iga1_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) { return NULL; } static void iga1_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 iga1_crtc_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg) { ScrnInfoPtr pScrn = crtc->scrn; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); CARD32 temp; 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) return; switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: temp = VIAGETREG(PRIM_HI_CTRL); VIASETREG(PRIM_HI_CTRL, temp & 0xFFFFFFFE); break; default: temp = VIAGETREG(HI_CONTROL); VIASETREG(HI_CONTROL, temp & 0xFFFFFFFE); break; } xf86_config->cursor_fg = fg; xf86_config->cursor_bg = bg; } static void iga1_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); 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; } switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: VIASETREG(PRIM_HI_POSSTART, ((x << 16) | (y & 0x07ff))); VIASETREG(PRIM_HI_CENTEROFFSET, ((xoff << 16) | (yoff & 0x07ff))); break; default: VIASETREG(HI_POSSTART, ((x << 16) | (y & 0x07ff))); VIASETREG(HI_CENTEROFFSET, ((xoff << 16) | (yoff & 0x07ff))); break; } } static void iga1_crtc_show_cursor (xf86CrtcPtr crtc) { drmmode_crtc_private_ptr iga = crtc->driver_private; ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: VIASETREG(PRIM_HI_FBOFFSET, iga->cursor_bo->offset); VIASETREG(PRIM_HI_CTRL, 0x36000005); break; default: /* Mono Cursor Display Path [bit31]: Primary */ VIASETREG(HI_FBOFFSET, iga->cursor_bo->offset); VIASETREG(HI_CONTROL, 0x76000005); break; } } static void iga1_crtc_hide_cursor (xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); CARD32 temp; switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: temp = VIAGETREG(PRIM_HI_CTRL); VIASETREG(PRIM_HI_CTRL, temp & 0xFFFFFFFA); break; default: temp = VIAGETREG(HI_CONTROL); /* Hardware cursor disable [bit0] */ VIASETREG(HI_CONTROL, temp & 0xFFFFFFFA); break; } } static void iga_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); } static void iga_crtc_commit(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); if (crtc->scrn->pScreen != NULL && pVia->drmmode.hwcursor) xf86_reload_cursors(crtc->scrn->pScreen); } static void iga_crtc_destroy(xf86CrtcPtr crtc) { if (crtc->driver_private) free(crtc->driver_private); } static const xf86CrtcFuncsRec iga1_crtc_funcs = { .dpms = iga1_crtc_dpms, .save = iga1_crtc_save, .restore = iga1_crtc_restore, .lock = iga1_crtc_lock, .unlock = iga1_crtc_unlock, .mode_fixup = iga1_crtc_mode_fixup, .prepare = iga1_crtc_prepare, .mode_set = iga1_crtc_mode_set, .commit = iga_crtc_commit, .gamma_set = iga1_crtc_gamma_set, .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 = iga_crtc_load_cursor_argb, #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2 .set_origin = iga1_crtc_set_origin, #endif .destroy = iga_crtc_destroy, }; static void iga2_crtc_dpms(xf86CrtcPtr crtc, int mode) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; if (pVia->pVbe) { ViaVbeDPMS(pScrn, mode); } else { switch (mode) { case DPMSModeOn: if (pBIOSInfo->SimultaneousEnabled) ViaDisplayEnableSimultaneous(pScrn); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: if (pBIOSInfo->SimultaneousEnabled) ViaDisplayDisableSimultaneous(pScrn); break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid DPMS mode %d\n", mode); break; } //vgaHWSaveScreen(pScrn->pScreen, mode); } } static void iga2_crtc_save(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe && pVia->vbeSR) ViaVbeSaveRestore(pScrn, MODE_SAVE); else VIASave(pScrn); vgaHWUnlock(hwp); } static void iga2_crtc_restore(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe && pVia->vbeSR) ViaVbeSaveRestore(pScrn, MODE_RESTORE); else VIARestore(pScrn); vgaHWLock(hwp); } static Bool iga2_crtc_lock(xf86CrtcPtr crtc) { return FALSE; } static void iga2_crtc_unlock(xf86CrtcPtr crtc) { } static Bool iga2_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); CARD32 temp; ModeStatus modestatus; if (pVia->pVbe) return TRUE; if ((mode->Clock < pScrn->clockRanges->minClock) || (mode->Clock > pScrn->clockRanges->maxClock)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Clock for mode \"%s\" outside of allowed range (%u (%u - %u))\n", mode->name, mode->Clock, pScrn->clockRanges->minClock, pScrn->clockRanges->maxClock); return FALSE; } modestatus = ViaFirstCRTCModeValid(pScrn, mode); if (modestatus != MODE_OK) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not using mode \"%s\" : %s.\n", mode->name, xf86ModeStatusToString(modestatus)); return FALSE; } temp = mode->CrtcHDisplay * mode->CrtcVDisplay * mode->VRefresh * (pScrn->bitsPerPixel >> 3); if (pVia->pBIOSInfo->Bandwidth < temp) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Required bandwidth is not available. (%u > %u)\n", (unsigned)temp, (unsigned)pVia->pBIOSInfo->Bandwidth); return FALSE; } return TRUE; } static void iga2_crtc_prepare (xf86CrtcPtr crtc) { } static void iga2_crtc_set_origin(xf86CrtcPtr crtc, int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe) { ViaVbeAdjustFrame(pScrn, x, y); } else { ViaSecondCRTCSetStartingAddress(crtc, x, y); } VIAVidAdjustFrame(pScrn, x, y); } static void iga2_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode, int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe) { if (!ViaVbeSetMode(pScrn, adjusted_mode)) return; } else { if (!vgaHWInit(pScrn, adjusted_mode)) return; if (pVia->UseLegacyModeSwitch) { ViaModeSecondaryLegacy(crtc, adjusted_mode); } else { ViaCRTCInit(pScrn); ViaModeSecondCRTC(pScrn, adjusted_mode); ViaSecondDisplayChannelEnable(pScrn); if (pVia->pBIOSInfo->SimultaneousEnabled) ViaDisplayEnableSimultaneous(pScrn); else ViaDisplayDisableSimultaneous(pScrn); } } iga2_crtc_set_origin(crtc, crtc->x, crtc->y); } static void iga2_crtc_gamma_set(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, int size) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); int SR1A, SR1B, CR67, CR6A; LOCO colors[size]; int i; for (i = 0; i < size; i++) { colors[i].red = red[i] >> 8; colors[i].green = green[i] >> 8; colors[i].blue = blue[i] >> 8; } if (pScrn->bitsPerPixel != 8) { if (!(pVia->Chipset == VIA_CLE266 && CLE266_REV_IS_AX(pVia->ChipRev))) { ViaSeqMask(hwp, 0x1A, 0x01, 0x01); ViaCrtcMask(hwp, 0x6A, 0x02, 0x02); switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: case VIA_K8M800: case VIA_PM800: break; default: ViaCrtcMask(hwp, 0x6A, 0x20, 0x20); break; } VIALoadRgbLut(pScrn, 0, size, colors); } } else { SR1A = hwp->readSeq(hwp, 0x1A); SR1B = hwp->readSeq(hwp, 0x1B); CR67 = hwp->readCrtc(hwp, 0x67); CR6A = hwp->readCrtc(hwp, 0x6A); ViaSeqMask(hwp, 0x1A, 0x01, 0x01); ViaSeqMask(hwp, 0x1B, 0x80, 0x80); ViaCrtcMask(hwp, 0x67, 0x00, 0xC0); ViaCrtcMask(hwp, 0x6A, 0xC0, 0xC0); for (i = 0; i < size; i++) { hwp->writeDacWriteAddr(hwp, i); hwp->writeDacData(hwp, colors[i].red); hwp->writeDacData(hwp, colors[i].green); hwp->writeDacData(hwp, colors[i].blue); } hwp->writeSeq(hwp, 0x1A, SR1A); hwp->writeSeq(hwp, 0x1B, SR1B); hwp->writeCrtc(hwp, 0x67, CR67); hwp->writeCrtc(hwp, 0x6A, CR6A); /* Screen 0 palette was changed by mode setting of Screen 1, * so load it again. */ for (i = 0; i < size; i++) { hwp->writeDacWriteAddr(hwp, i); hwp->writeDacData(hwp, colors[i].red); hwp->writeDacData(hwp, colors[i].green); hwp->writeDacData(hwp, colors[i].blue); } } } static void * iga2_crtc_shadow_allocate (xf86CrtcPtr crtc, int width, int height) { return NULL; } static PixmapPtr iga2_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) { return NULL; } static void 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; VIAPtr pVia = VIAPTR(pScrn); CARD32 pixel, temp, *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; switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: temp = VIAGETREG(HI_CONTROL); VIASETREG(HI_CONTROL, temp & 0xFFFFFFFE); break; default: temp = VIAGETREG(HI_CONTROL); VIASETREG(HI_CONTROL, temp & 0xFFFFFFFE); height = width = 32; break; } 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; VIAPtr pVia = VIAPTR(pScrn); 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; } switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: VIASETREG(HI_POSSTART, ((x << 16) | (y & 0x07ff))); VIASETREG(HI_CENTEROFFSET, ((xoff << 16) | (yoff & 0x07ff))); break; default: VIASETREG(HI_POSSTART, ((x << 16) | (y & 0x07ff))); VIASETREG(HI_CENTEROFFSET, ((xoff << 16) | (yoff & 0x07ff))); break; } } static void iga2_crtc_show_cursor(xf86CrtcPtr crtc) { drmmode_crtc_private_ptr iga = crtc->driver_private; ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: VIASETREG(HI_FBOFFSET, iga->cursor_bo->offset); VIASETREG(HI_CONTROL, 0xB6000005); break; default: /* Mono Cursor Display Path [bit31]: Secondary */ /* FIXME For CLE266 and KM400 try to enable 32x32 cursor size [bit1] */ VIASETREG(HI_FBOFFSET, iga->cursor_bo->offset); VIASETREG(HI_CONTROL, 0xF6000005); break; } } static void iga2_crtc_hide_cursor(xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); CARD32 temp; switch(pVia->Chipset) { case VIA_CX700: case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: temp = VIAGETREG(HI_CONTROL); VIASETREG(HI_CONTROL, temp & 0xFFFFFFFA); break; default: temp = VIAGETREG(HI_CONTROL); /* Hardware cursor disable [bit0] */ VIASETREG(HI_CONTROL, temp & 0xFFFFFFFA); break; } } static const xf86CrtcFuncsRec iga2_crtc_funcs = { .dpms = iga2_crtc_dpms, .save = iga2_crtc_save, .restore = iga2_crtc_restore, .lock = iga2_crtc_lock, .unlock = iga2_crtc_unlock, .mode_fixup = iga2_crtc_mode_fixup, .prepare = iga2_crtc_prepare, .mode_set = iga2_crtc_mode_set, .commit = iga_crtc_commit, .gamma_set = iga2_crtc_gamma_set, .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 = iga_crtc_load_cursor_argb, #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) > 2 .set_origin = iga2_crtc_set_origin, #endif .destroy = iga_crtc_destroy, }; Bool UMSCrtcInit(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) ClockRangePtr clockRanges; #else ClockRangesPtr clockRanges; #endif int max_pitch, max_height; VIABIOSInfoPtr pBIOSInfo; xf86CrtcPtr iga1, iga2; /* Read memory bandwidth from registers. */ pVia->MemClk = hwp->readCrtc(hwp, 0x3D) >> 4; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected MemClk %d\n", pVia->MemClk)); if (pVia->MemClk >= VIA_MEM_END) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "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) { /* Use jumper to determine TV type. */ if (hwp->readCrtc(hwp, 0x3B) & 0x02) { pBIOSInfo->TVType = TVTYPE_PAL; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected TV standard: PAL.\n")); } else { pBIOSInfo->TVType = TVTYPE_NTSC; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Detected TV standard: NTSC.\n")); } } if (pVia->drmmode.hwcursor) { if (!xf86LoadSubModule(pScrn, "ramdac")) return FALSE; } if (!xf86LoadSubModule(pScrn, "i2c")) return FALSE; else ViaI2CInit(pScrn); if (!xf86LoadSubModule(pScrn, "ddc")) return FALSE; pVia->pVbe = NULL; if (pVia->useVBEModes) { /* VBE doesn't properly initialise int10 itself. */ if (xf86LoadSubModule(pScrn, "int10") && xf86LoadSubModule(pScrn, "vbe")) { pVia->pVbe = VBEExtendedInit(NULL, pVia->EntityIndex, SET_BIOS_SCRATCH | RESTORE_BIOS_SCRATCH); } if (!pVia->pVbe) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VBE initialisation failed." " Using builtin code to set modes.\n"); else ConfiguredMonitor = vbeDoEDID(pVia->pVbe, NULL); } /* * Set up ClockRanges, which describe what clock ranges are * available, and what sort of modes they can be used for. */ #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,8,0,0,0) clockRanges = xnfalloc(sizeof(ClockRange)); #else clockRanges = xnfalloc(sizeof(ClockRanges)); #endif clockRanges->next = NULL; clockRanges->minClock = 20000; clockRanges->maxClock = 230000; clockRanges->clockIndex = -1; clockRanges->interlaceAllowed = TRUE; clockRanges->doubleScanAllowed = FALSE; pScrn->clockRanges = clockRanges; /* * Now handle the outputs */ iga1_rec = (drmmode_crtc_private_ptr) xnfcalloc(sizeof(drmmode_crtc_private_rec), 1); if (!iga1_rec) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "IGA1 Rec allocation failed.\n"); return FALSE; } iga1 = xf86CrtcCreate(pScrn, &iga1_crtc_funcs); if (!iga1) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CrtcCreate failed.\n"); free(iga1_rec); return FALSE; } iga1_rec->drmmode = &pVia->drmmode; iga1_rec->index = 0; iga1->driver_private = iga1_rec; iga2_rec = (drmmode_crtc_private_ptr) xnfcalloc(sizeof(drmmode_crtc_private_rec), 1); if (!iga2_rec) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "IGA1 Rec allocation failed.\n"); xf86CrtcDestroy(iga1); return FALSE; } iga2 = xf86CrtcCreate(pScrn, &iga2_crtc_funcs); if (!iga2) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CrtcCreate failed.\n"); xf86CrtcDestroy(iga1); free(iga2_rec); return FALSE; } iga2_rec->drmmode = &pVia->drmmode; iga2_rec->index = 1; iga2->driver_private = iga2_rec; /* * CLE266A: * Max Line Pitch: 4080, (FB corruption when higher, driver problem?) * Max Height: 4096 (and beyond) * * CLE266A: primary AdjustFrame can use only 24 bits, so we are limited * to 12x11 bits; 4080x2048 (~2:1), 3344x2508 (4:3), or 2896x2896 (1:1). * TODO Test CLE266Cx, KM400, KM400A, K8M800, CN400 please. * * We should be able to limit the memory available for a mode to 32 MB, * but miScanLineWidth fails to catch this properly (apertureSize). */ switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: case VIA_K8M800: case VIA_PM800: case VIA_P4M800PRO: max_pitch = 3344; max_height = 2508; break; case VIA_CX700: case VIA_P4M890: case VIA_K8M890: case VIA_P4M900: max_pitch = 8192/(pScrn->bitsPerPixel >> 3)-1; max_height = max_pitch; break; default: max_pitch = 16384/(pScrn->bitsPerPixel >> 3)-1; max_height = max_pitch; break; } /* Init HI_X0 for cursor */ switch (pVia->Chipset) { case VIA_CX700: /* case VIA_CN750: */ case VIA_P4M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: /* set 0 as transparent color key for IGA 2 */ VIASETREG(HI_TRANSPARENT_COLOR, 0); VIASETREG(HI_INVTCOLOR, 0X00FFFFFF); VIASETREG(ALPHA_V3_PREFIFO_CONTROL, 0xE0000); VIASETREG(ALPHA_V3_FIFO_CONTROL, 0xE0F0000); /* set 0 as transparent color key for IGA 1 */ VIASETREG(PRIM_HI_TRANSCOLOR, 0); VIASETREG(PRIM_HI_FIFO, 0x0D000D0F); VIASETREG(PRIM_HI_INVTCOLOR, 0x00FFFFFF); VIASETREG(V327_HI_INVTCOLOR, 0x00FFFFFF); break; default: VIASETREG(HI_TRANSPARENT_COLOR, 0); VIASETREG(HI_INVTCOLOR, 0X00FFFFFF); VIASETREG(ALPHA_V3_PREFIFO_CONTROL, 0xE0000); VIASETREG(ALPHA_V3_FIFO_CONTROL, 0xE0F0000); break; } xf86CrtcSetSizeRange(pScrn, 320, 200, max_pitch, max_height); ViaOutputsDetect(pScrn); if (pVia->pVbe) { if (!ViaVbeModePreInit(pScrn)) return FALSE; } return TRUE; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_dmabuffer.h000066400000000000000000000054361267025031400245670ustar00rootroot00000000000000/* * Copyright (C) Thomas Hellstrom (2005) * * 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_DMABUFFER_H #define VIA_DMABUFFER_H #include "via_3d_reg.h" typedef struct _ViaCommandBuffer { ScrnInfoPtr pScrn; CARD32 *buf; CARD32 waitFlags; unsigned pos; unsigned bufSize; int mode; int header_start; int rindex; Bool has3dState; void (*flushFunc) (struct _ViaCommandBuffer * cb); } ViaCommandBuffer; #define VIA_DMASIZE 16384 #define H1_ADDR(val) (((val) >> 2) | 0xF0000000) #define WAITFLAGS(flags) \ (cb)->waitFlags |= (flags) #define BEGIN_RING(size) \ do { \ if (cb->flushFunc && (cb->pos > (cb->bufSize-(size)))) { \ cb->flushFunc(cb); \ } \ } while(0) #define BEGIN_H2(paraType, h2size) \ do{ \ BEGIN_RING((h2size)+6); \ if (cb->mode == 2 && (paraType) == cb->rindex) \ break; \ if (cb->pos & 1) \ OUT_RING(HC_DUMMY); \ cb->header_start = cb->pos; \ cb->rindex = paraType; \ cb->mode = 2; \ OUT_RING(HALCYON_HEADER2); \ OUT_RING((paraType) << 16); \ if (!cb->has3dState && ((paraType) != HC_ParaType_CmdVdata)) { \ cb->has3dState = TRUE; \ } \ } while(0); #define OUT_RING(val) do{ \ (cb)->buf[(cb)->pos++] = (val); \ } while(0); #define OUT_RING_QW(val1, val2) \ do { \ (cb)->buf[(cb)->pos++] = (val1); \ (cb)->buf[(cb)->pos++] = (val2); \ } while (0) #define ADVANCE_RING \ cb->flushFunc(cb) #define RING_VARS \ ViaCommandBuffer *cb = &pVia->cb #define OUT_RING_H1(val1, val2) \ OUT_RING_QW(H1_ADDR(val1), val2) #define OUT_RING_SubA(val1, val2) \ OUT_RING(((val1) << HC_SubA_SHIFT) | ((val2) & HC_Para_MASK)) #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_dri.c000066400000000000000000000761751267025031400234150ustar00rootroot00000000000000/* * Copyright 2005-2015 The Openchrome Project * [http://www.freedesktop.org/wiki/Openchrome] * 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 "xf86.h" #include "xf86_OSproc.h" #include "xf86Priv.h" #include "xf86Pci.h" #define _XF86DRI_SERVER_ #include "GL/glxtokens.h" #include "sarea.h" #include "via_driver.h" #include "via_drm.h" #include "via_dri.h" #include "xf86drm.h" #ifndef DRIINFO_MAJOR_VERSION #define DRIINFO_MAJOR_VERSION 4 #endif #ifndef DRIINFO_MINOR_VERSION #define DRIINFO_MINOR_VERSION 0 #endif #define VIDEO 0 #define AGP 1 #define AGP_CMDBUF_PAGES 512 #define AGP_CMDBUF_SIZE (AGP_PAGE_SIZE * AGP_CMDBUF_PAGES) #define VIA_AGP_MODE_MASK 0x17 #define VIA_AGPv3_MODE 0x08 #define VIA_AGPv3_8X_MODE 0x02 #define VIA_AGPv3_4X_MODE 0x01 #define VIA_AGP_4X_MODE 0x04 #define VIA_AGP_2X_MODE 0x02 #define VIA_AGP_1X_MODE 0x01 #define VIA_AGP_FW_MODE 0x10 extern void GlxSetVisualConfigs(int nconfigs, __GLXvisualConfig * configs, void **configprivs); typedef struct { int major; int minor; int patchlevel; } ViaDRMVersion; static char VIAKernelDriverName[] = "via"; static char VIAClientDriverName[] = "unichrome"; static const ViaDRMVersion drmExpected = { 1, 3, 0 }; static const ViaDRMVersion drmCompat = { 2, 0, 0 }; static Bool VIAInitVisualConfigs(ScreenPtr pScreen); static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia); static Bool VIACreateContext(ScreenPtr pScreen, VisualPtr visual, drm_context_t hwContext, void *pVisualConfigPriv, DRIContextType contextStore); static void VIADestroyContext(ScreenPtr pScreen, drm_context_t hwContext, DRIContextType contextStore); static void VIADRISwapContext(ScreenPtr pScreen, DRISyncType syncType, DRIContextType readContextType, void *readContextStore, DRIContextType writeContextType, void *writeContextStore); static void VIADRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index); static void VIADRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, RegionPtr prgnSrc, CARD32 index); void kickVblank(ScrnInfoPtr pScrn) { /* * Switching mode will clear registers that make vblank * interrupts happen. If the driver thinks interrupts * are enabled, make sure vblank interrupts go through. * registers are not documented in VIA docs. */ VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; if (pVIADRI->irqEnabled) hwp->writeCrtc(hwp, 0x11, hwp->readCrtc(hwp, 0x11) | 0x30); } static void VIADRIIrqInit(ScrnInfoPtr pScrn, VIADRIPtr pVIADRI) { VIAPtr pVia = VIAPTR(pScrn); pVIADRI->irqEnabled = drmGetInterruptFromBusID (pVia->drmmode.fd, #ifdef HAVE_PCIACCESS ((pVia->PciInfo->domain << 8) | pVia->PciInfo->bus), pVia->PciInfo->dev, pVia->PciInfo->func #else ((pciConfigPtr)pVia->PciInfo->thisCard)->busnum, ((pciConfigPtr)pVia->PciInfo->thisCard)->devnum, ((pciConfigPtr)pVia->PciInfo->thisCard)->funcnum #endif ); if ((drmCtlInstHandler(pVia->drmmode.fd, pVIADRI->irqEnabled))) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[drm] Failure adding IRQ handler. " "Falling back to IRQ-free operation.\n"); pVIADRI->irqEnabled = 0; } if (pVIADRI->irqEnabled) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] IRQ handler installed, using IRQ %d.\n", pVIADRI->irqEnabled); } static void VIADRIIrqExit(ScrnInfoPtr pScrn, VIADRIPtr pVIADRI) { VIAPtr pVia = VIAPTR(pScrn); if (pVIADRI->irqEnabled) { if (drmCtlUninstHandler(pVia->drmmode.fd)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] IRQ handler uninstalled.\n"); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] Could not uninstall IRQ handler.\n"); } } } void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; if (pVIADRI->ringBufActive) { drm_via_dma_init_t ringBufInit; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Cleaning up DMA ring-buffer.\n"); ringBufInit.func = VIA_CLEANUP_DMA; if (drmCommandWrite(pVia->drmmode.fd, DRM_VIA_DMA_INIT, &ringBufInit, sizeof(ringBufInit))) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[drm] Failed to clean up DMA ring-buffer: %d\n", errno); } pVIADRI->ringBufActive = 0; } } Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; if (pVIADRI->ringBufActive) return TRUE; if (pVia->agpEnable) { drm_via_dma_init_t ringBufInit; if ((pVia->drmVerMajor == 1) && (pVia->drmVerMinor <= 3)) return FALSE; /* * Info from code-snippet on DRI-DEVEL list; Erdi Chen. */ switch (pVia->ChipId) { case PCI_CHIP_VT3314: case PCI_CHIP_VT3259: pVIADRI->reg_pause_addr = 0x40c; break; default: pVIADRI->reg_pause_addr = 0x418; break; } ringBufInit.offset = pVia->agpSize; ringBufInit.size = AGP_CMDBUF_SIZE; ringBufInit.reg_pause_addr = pVIADRI->reg_pause_addr; ringBufInit.func = VIA_INIT_DMA; if (drmCommandWrite(pVia->drmmode.fd, DRM_VIA_DMA_INIT, &ringBufInit, sizeof(ringBufInit))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] Failed to initialize DMA ring-buffer: %d\n", errno); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Initialized AGP ring-buffer, size 0x%lx at AGP " "offset 0x%lx.\n", ringBufInit.size, ringBufInit.offset); pVIADRI->ringBufActive = 1; } return TRUE; } static Bool VIASetAgpMode(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); CARD32 mode = drmAgpGetMode(pVia->drmmode.fd); unsigned int vendor = drmAgpVendorId(pVia->drmmode.fd); unsigned int device = drmAgpDeviceId(pVia->drmmode.fd); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Detected AGP " "vendor 0x%04x, device 0x%04x\n", vendor, device); mode &= ~VIA_AGP_MODE_MASK; if (mode & VIA_AGPv3_MODE) { mode |= VIA_AGPv3_8X_MODE; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Found AGP v3 " "compatible device. Trying AGP 8X mode.\n"); } else { mode |= VIA_AGP_4X_MODE; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Didn't find any AGP v3 " "compatible device. Trying AGP 4X mode.\n"); } mode |= VIA_AGP_FW_MODE; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Trying to enable AGP fast writes.\n"); if (drmAgpEnable(pVia->drmmode.fd, mode) < 0) return FALSE; return TRUE; } static Bool VIADRIAgpInit(ScrnInfoPtr pScrn) { unsigned long agpCmdSize, agp_phys; VIAPtr pVia = VIAPTR(pScrn); drm_handle_t handle; drmAddress agpaddr; drm_via_agp_t agp; int agpPages; pVia->agpSize = 0; if (drmAgpAcquire(pVia->drmmode.fd) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] drmAgpAcquire failed %d\n", errno); return FALSE; } if (!VIASetAgpMode(pScrn)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] VIASetAgpMode failed\n"); drmAgpRelease(pVia->drmmode.fd); return FALSE; } agpCmdSize = (pVia->agpEnable) ? AGP_CMDBUF_SIZE : 0; if (pVia->agpMem * 1024 < agpCmdSize + AGP_PAGE_SIZE) { pVia->agpMem = (agpCmdSize + AGP_PAGE_SIZE) / 1024; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Forcing AGP size to %d kB\n", pVia->agpMem); } agpPages = (pVia->agpMem * 1024 + AGP_PAGE_SIZE - 1) / AGP_PAGE_SIZE; if (drmAgpAlloc(pVia->drmmode.fd, agpPages * AGP_PAGE_SIZE, 0, &agp_phys, &pVia->agpHandle) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] drmAgpAlloc failed\n"); drmAgpRelease(pVia->drmmode.fd); return FALSE; } if (drmAgpBind(pVia->drmmode.fd, pVia->agpHandle, 0) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] drmAgpBind failed\n"); drmAgpFree(pVia->drmmode.fd, pVia->agpHandle); drmAgpRelease(pVia->drmmode.fd); return FALSE; } /* * Place the ring-buffer last in the AGP region, and restrict the * public map not to include the buffer for security reasons. */ pVia->agpSize = agpPages * AGP_PAGE_SIZE - agpCmdSize; pVia->agpAddr = drmAgpBase(pVia->drmmode.fd); agp.offset = 0; agp.size = pVia->agpSize; if (drmCommandWrite(pVia->drmmode.fd, DRM_VIA_AGP_INIT, &agp, sizeof(drm_via_agp_t)) < 0) { drmAgpUnbind(pVia->drmmode.fd, pVia->agpHandle); drmAgpFree(pVia->drmmode.fd, pVia->agpHandle); drmAgpRelease(pVia->drmmode.fd); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] drmAgpEnabled succeeded\n"); /* Allocate all of AGP memory */ if (drmAddMap(pVia->drmmode.fd, 0, pVia->agpSize, DRM_AGP, 0, &handle) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] Failed to map public agp area.\n"); pVia->agpSize = 0; drmAgpUnbind(pVia->drmmode.fd, pVia->agpHandle); drmAgpFree(pVia->drmmode.fd, pVia->agpHandle); drmAgpRelease(pVia->drmmode.fd); return FALSE; } drmMap(pVia->drmmode.fd, handle, pVia->agpSize, &agpaddr); pVia->agpMappedAddr = agpaddr; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] agpAddr = 0x%08lx\n", pVia->agpAddr); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] agpSize = 0x%08x\n", pVia->agpSize); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] agp physical addr = %p\n", pVia->agpMappedAddr); return TRUE; } static Bool VIADRIFBInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); drm_via_fb_t fb; fb.offset = pVia->FBFreeStart; fb.size = pVia->FBFreeEnd; if (drmCommandWrite(pVia->drmmode.fd, DRM_VIA_FB_INIT, &fb, sizeof(drm_via_fb_t)) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] Failed to initialize frame buffer area.\n"); return FALSE; } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Using %d KB for DRM memory heap.\n", fb.size >> 10); return TRUE; } } static Bool VIAInitVisualConfigs(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); int numConfigs = 0; __GLXvisualConfig *pConfigs = 0; VIAConfigPrivPtr pVIAConfigs = 0; VIAConfigPrivPtr *pVIAConfigPtrs = 0; int i, db, stencil, accum; if (pScrn->bitsPerPixel == 16 || pScrn->bitsPerPixel == 32) { numConfigs = 12; if (!(pConfigs = (__GLXvisualConfig *) calloc(sizeof(__GLXvisualConfig), numConfigs))) return FALSE; if (!(pVIAConfigs = (VIAConfigPrivPtr) calloc(sizeof(VIAConfigPrivRec), numConfigs))) { free(pConfigs); return FALSE; } if (!(pVIAConfigPtrs = (VIAConfigPrivPtr *) calloc(sizeof(VIAConfigPrivPtr), numConfigs))) { free(pConfigs); free(pVIAConfigs); return FALSE; } for (i = 0; i < numConfigs; i++) pVIAConfigPtrs[i] = &pVIAConfigs[i]; i = 0; for (accum = 0; accum <= 1; accum++) { /* 32bpp depth buffer disabled, as Mesa has limitations */ for (stencil = 0; stencil <= 2; stencil++) { for (db = 0; db <= 1; db++) { pConfigs[i].vid = -1; pConfigs[i].class = -1; pConfigs[i].rgba = TRUE; pConfigs[i].redSize = -1; pConfigs[i].greenSize = -1; pConfigs[i].blueSize = -1; pConfigs[i].redMask = -1; pConfigs[i].greenMask = -1; pConfigs[i].blueMask = -1; if (pScrn->bitsPerPixel == 32) { pConfigs[i].alphaSize = 8; pConfigs[i].alphaMask = 0xFF000000; } else { pConfigs[i].alphaSize = 0; pConfigs[i].alphaMask = 0; } if (accum) { pConfigs[i].accumRedSize = 16; pConfigs[i].accumGreenSize = 16; pConfigs[i].accumBlueSize = 16; if (pScrn->bitsPerPixel == 32) pConfigs[i].accumAlphaSize = 16; else pConfigs[i].accumAlphaSize = 0; } else { pConfigs[i].accumRedSize = 0; pConfigs[i].accumGreenSize = 0; pConfigs[i].accumBlueSize = 0; pConfigs[i].accumAlphaSize = 0; } if (!db) pConfigs[i].doubleBuffer = TRUE; else pConfigs[i].doubleBuffer = FALSE; pConfigs[i].stereo = FALSE; pConfigs[i].bufferSize = -1; switch (stencil) { case 0: pConfigs[i].depthSize = 24; pConfigs[i].stencilSize = 8; break; case 1: pConfigs[i].depthSize = 16; pConfigs[i].stencilSize = 0; break; case 2: pConfigs[i].depthSize = 0; pConfigs[i].stencilSize = 0; break; case 3: pConfigs[i].depthSize = 32; pConfigs[i].stencilSize = 0; break; } pConfigs[i].auxBuffers = 0; pConfigs[i].level = 0; if (accum) pConfigs[i].visualRating = GLX_SLOW_VISUAL_EXT; else pConfigs[i].visualRating = GLX_NONE_EXT; pConfigs[i].transparentPixel = GLX_NONE_EXT; pConfigs[i].transparentRed = 0; pConfigs[i].transparentGreen = 0; pConfigs[i].transparentBlue = 0; pConfigs[i].transparentAlpha = 0; pConfigs[i].transparentIndex = 0; i++; } } } if (i != numConfigs) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] Incorrect " "initialization of visuals. Disabling DRI.\n"); if (pConfigs) free(pConfigs); if (pVIAConfigs) free(pVIAConfigs); if (pVIAConfigPtrs) free(pVIAConfigPtrs); return FALSE; } } pVia->numVisualConfigs = numConfigs; pVia->pVisualConfigs = pConfigs; pVia->pVisualConfigsPriv = pVIAConfigs; GlxSetVisualConfigs(numConfigs, pConfigs, (void **)pVIAConfigPtrs); return TRUE; } Bool VIADRI1ScreenInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); int major, minor, patch; DRIInfoPtr pDRIInfo; VIADRIPtr pVIADRI; /* If symbols or version check fails, we still want this to be NULL. */ pVia->pDRIInfo = NULL; drmClose(pVia->drmmode.fd); /* Check that the GLX, DRI, and DRM modules have been loaded by testing * for canonical symbols in each module. */ if (!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) return FALSE; if (!xf86LoaderCheckSymbol("drmAvailable")) return FALSE; if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] VIADRI1ScreenInit failed (libdri.a is too old).\n"); return FALSE; } /* Check the DRI version. */ DRIQueryVersion(&major, &minor, &patch); if (major != DRIINFO_MAJOR_VERSION || minor < DRIINFO_MINOR_VERSION) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] VIADRI1ScreenInit failed -- FALSE mismatch.\n" "[dri] libdri is %d.%d.%d, but %d.%d.x is needed.\n" "[dri] Disabling DRI.\n", major, minor, patch, DRIINFO_MAJOR_VERSION, DRIINFO_MINOR_VERSION); return FALSE; } pVia->pDRIInfo = DRICreateInfoRec(); if (!pVia->pDRIInfo) return FALSE; pDRIInfo = pVia->pDRIInfo; pDRIInfo->drmDriverName = VIAKernelDriverName; switch (pVia->Chipset) { case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: pDRIInfo->clientDriverName = "swrast"; break; default: pDRIInfo->clientDriverName = VIAClientDriverName; break; } pDRIInfo->busIdString = DRICreatePCIBusID(pVia->PciInfo); pDRIInfo->ddxDriverMajorVersion = VIA_DRIDDX_VERSION_MAJOR; pDRIInfo->ddxDriverMinorVersion = VIA_DRIDDX_VERSION_MINOR; pDRIInfo->ddxDriverPatchVersion = VIA_DRIDDX_VERSION_PATCH; #if (DRIINFO_MAJOR_VERSION == 5) pDRIInfo->frameBufferPhysicalAddress = (pointer) pVia->FrameBufferBase; #else pDRIInfo->frameBufferPhysicalAddress = pVia->FrameBufferBase; #endif pDRIInfo->frameBufferSize = pVia->videoRambytes; pDRIInfo->frameBufferStride = (pScrn->displayWidth * pScrn->bitsPerPixel / 8); pDRIInfo->ddxDrawableTableEntry = VIA_MAX_DRAWABLES; if (SAREA_MAX_DRAWABLES < VIA_MAX_DRAWABLES) pDRIInfo->maxDrawableTableEntry = SAREA_MAX_DRAWABLES; else pDRIInfo->maxDrawableTableEntry = VIA_MAX_DRAWABLES; #ifdef NOT_DONE /* FIXME: need to extend DRI protocol to pass this size back to client * for SAREA mapping that includes a device private record. */ pDRIInfo->SAREASize = ((sizeof(XF86DRISAREARec) + 0xfff) & 0x1000); /* round to page */ /* + shared memory device private rec */ #else /* For now the mapping works by using a fixed size defined * in the SAREA header. */ if (sizeof(XF86DRISAREARec) + sizeof(drm_via_sarea_t) > SAREA_MAX) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Data does not fit in SAREA\n"); DRIDestroyInfoRec(pVia->pDRIInfo); pVia->pDRIInfo = NULL; return FALSE; } pDRIInfo->SAREASize = SAREA_MAX; #endif if (!(pVIADRI = (VIADRIPtr) calloc(sizeof(VIADRIRec), 1))) { DRIDestroyInfoRec(pVia->pDRIInfo); pVia->pDRIInfo = NULL; return FALSE; } pDRIInfo->devPrivate = pVIADRI; pDRIInfo->devPrivateSize = sizeof(VIADRIRec); pDRIInfo->contextSize = sizeof(VIADRIContextRec); pDRIInfo->CreateContext = VIACreateContext; pDRIInfo->DestroyContext = VIADestroyContext; pDRIInfo->SwapContext = VIADRISwapContext; pDRIInfo->InitBuffers = VIADRIInitBuffers; pDRIInfo->MoveBuffers = VIADRIMoveBuffers; pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; if (!DRIScreenInit(pScreen, pDRIInfo, &pVia->drmmode.fd)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] DRIScreenInit failed. Disabling DRI.\n"); free(pDRIInfo->devPrivate); pDRIInfo->devPrivate = NULL; DRIDestroyInfoRec(pVia->pDRIInfo); pVia->pDRIInfo = NULL; pVia->drmmode.fd = -1; return FALSE; } if (!(VIAInitVisualConfigs(pScreen))) { VIADRICloseScreen(pScreen); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] visual configs initialized.\n"); /* DRIScreenInit doesn't add all the common mappings. * Add additional mappings here. */ if (!VIADRIMapInit(pScreen, pVia)) { VIADRICloseScreen(pScreen); return FALSE; } pVIADRI->regs.size = VIA_MMIO_REGSIZE; pVIADRI->regs.handle = pVia->registerHandle; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] mmio Registers = 0x%08lx\n", (unsigned long)pVIADRI->regs.handle); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] mmio mapped.\n"); return TRUE; } void VIADRICloseScreen(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); VIADRIPtr pVIADRI; VIADRIRingBufferCleanup(pScrn); if (pVia->agpSize) { drmUnmap(pVia->agpMappedAddr, pVia->agpSize); drmRmMap(pVia->drmmode.fd, pVia->agpHandle); drmAgpUnbind(pVia->drmmode.fd, pVia->agpHandle); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Freeing agp memory\n"); drmAgpFree(pVia->drmmode.fd, pVia->agpHandle); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Releasing agp module\n"); drmAgpRelease(pVia->drmmode.fd); } DRICloseScreen(pScreen); drm_bo_free(pScrn, pVia->driOffScreenMem); if (pVia->pDRIInfo) { if ((pVIADRI = (VIADRIPtr) pVia->pDRIInfo->devPrivate)) { VIADRIIrqExit(pScrn, pVIADRI); free(pVIADRI); pVia->pDRIInfo->devPrivate = NULL; } DRIDestroyInfoRec(pVia->pDRIInfo); pVia->pDRIInfo = NULL; } if (pVia->pVisualConfigs) { free(pVia->pVisualConfigs); pVia->pVisualConfigs = NULL; } if (pVia->pVisualConfigsPriv) { free(pVia->pVisualConfigsPriv); pVia->pVisualConfigsPriv = NULL; } } /* TODO: xserver receives driver's swapping event and does something * according the data initialized in this function. */ static Bool VIACreateContext(ScreenPtr pScreen, VisualPtr visual, drm_context_t hwContext, void *pVisualConfigPriv, DRIContextType contextStore) { return TRUE; } static void VIADestroyContext(ScreenPtr pScreen, drm_context_t hwContext, DRIContextType contextStore) { } Bool VIADRIFinishScreenInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); VIADRIPtr pVIADRI; pVia->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; pVia->agpDMA = FALSE; pVIADRI = (VIADRIPtr) pVia->pDRIInfo->devPrivate; pVIADRI->drixinerama = FALSE; if (pVia->driSize < pVia->Bpl) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[drm] No DRM framebuffer heap available.\n" "[drm] Please increase the frame buffer\n" "[drm] memory area in the BIOS. Disabling DRI.\n"); return FALSE; } if (pVia->driSize < 3 * (pScrn->virtualY * pVia->Bpl)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[drm] The DRM heap and pixmap cache memory may be too\n" "[drm] small for optimal performance. Please increase\n" "[drm] the frame buffer memory area in the BIOS.\n"); } pVia->driOffScreenMem = drm_bo_alloc(pScrn, pVia->driSize, 16, TTM_PL_FLAG_VRAM); DRIFinishScreenInit(pScreen); /* Set SAREA value. */ { drm_via_sarea_t *saPriv; saPriv = (drm_via_sarea_t *) DRIGetSAREAPrivate(pScreen); assert(saPriv); memset(saPriv, 0, sizeof(*saPriv)); saPriv->ctxOwner = -1; } pVIADRI->deviceID = pVia->Chipset; pVIADRI->width = pScrn->virtualX; pVIADRI->height = pScrn->virtualY; pVIADRI->mem = pScrn->videoRam * 1024; pVIADRI->bytesPerPixel = (pScrn->bitsPerPixel + 7) / 8; pVIADRI->sarea_priv_offset = sizeof(XF86DRISAREARec); /* TODO */ pVIADRI->scrnX = pVIADRI->width; pVIADRI->scrnY = pVIADRI->height; /* Initialize IRQ. */ if (pVia->DRIIrqEnable) VIADRIIrqInit(pScrn, pVIADRI); pVIADRI->ringBufActive = 0; VIADRIRingBufferInit(pScrn); pVia->agpDMA = pVia->dma2d && pVIADRI->ringBufActive; return TRUE; } static void VIADRISwapContext(ScreenPtr pScreen, DRISyncType syncType, DRIContextType oldContextType, void *oldContext, DRIContextType newContextType, void *newContext) { #if 0 ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); #endif return; } static void VIADRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 index) { #if 0 ScreenPtr pScreen = pWin->drawable.pScreen; ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); #endif return; } static void VIADRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, RegionPtr prgnSrc, CARD32 index) { #if 0 ScreenPtr pScreen = pParent->drawable.pScreen; ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); #endif return; } /* Initialize the kernel data structures. */ Bool VIADRIKernelInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); drm_via_init_t drmInfo; pVia->IsPCI = !VIADRIAgpInit(pScrn); if (pVia->IsPCI) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] Using PCI.\n"); else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] Using AGP.\n"); if (!(VIADRIFBInit(pScrn))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] Frame buffer initialization failed.\n"); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] Frame buffer initialized.\n"); memset(&drmInfo, 0, sizeof(drm_via_init_t)); drmInfo.func = VIA_INIT_MAP; drmInfo.sarea_priv_offset = sizeof(XF86DRISAREARec); drmInfo.fb_offset = pVia->frameBufferHandle; drmInfo.mmio_offset = pVia->registerHandle; if (pVia->IsPCI) { drmInfo.agpAddr = 0; } else { /*For AMD64*/ #ifndef __x86_64__ drmInfo.agpAddr = (CARD32)pVia->agpAddr; #else drmInfo.agpAddr = (CARD64)pVia->agpAddr; #endif } if ((drmCommandWrite(pVia->drmmode.fd, DRM_VIA_MAP_INIT, &drmInfo, sizeof(drm_via_init_t))) < 0) return FALSE; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] Kernel data initialized.\n"); return TRUE; } /* Add a map for the MMIO registers. */ static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); int flags = DRM_READ_ONLY; if (drmAddMap(pVia->drmmode.fd, pVia->MmioBase, VIA_MMIO_REGSIZE, DRM_REGISTERS, flags, &pVia->registerHandle) < 0) { return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] register handle = 0x%08lx\n", (unsigned long)pVia->registerHandle); if (drmAddMap(pVia->drmmode.fd, pVia->FrameBufferBase, pVia->videoRambytes, DRM_FRAME_BUFFER, 0, &pVia->frameBufferHandle) < 0) { return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] framebuffer handle = 0x%08lx\n", (unsigned long)pVia->frameBufferHandle); return TRUE; } #define DRM_VIA_BLIT_MAX_SIZE (2048*2048*4) static int viaDRIFBMemcpy(int fd, struct buffer_object *vram, unsigned char *addr, Bool toFB) { unsigned long fbOffset = vram->offset, size = vram->size, curSize; drm_via_dmablit_t blit; int err; do { curSize = (size > DRM_VIA_BLIT_MAX_SIZE) ? DRM_VIA_BLIT_MAX_SIZE : size; blit.num_lines = 1; blit.line_length = curSize; blit.fb_addr = fbOffset; blit.fb_stride = ALIGN_TO(curSize, 16); blit.mem_addr = addr; blit.mem_stride = blit.fb_stride; blit.to_fb = (toFB) ? 1 : 0; do { err = drmCommandWriteRead(fd, DRM_VIA_DMA_BLIT, &blit, sizeof(blit)); } while (-EAGAIN == err); if (err) return err; do { err = drmCommandWriteRead(fd, DRM_VIA_BLIT_SYNC, &blit.sync, sizeof(blit.sync)); } while (-EAGAIN == err); if (err) return err; fbOffset += curSize; addr += curSize; size -= curSize; } while (size > 0); return 0; } void viaDRIOffscreenSave(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); unsigned long srcSize = pVia->driOffScreenMem->size; int err; if (pVia->driOffScreenSave) free(pVia->driOffScreenSave); pVia->driOffScreenSave = malloc(srcSize + 16); if (pVia->driOffScreenSave) { void *dst, *src = drm_bo_map(pScrn, pVia->driOffScreenMem); dst = (void *) ALIGN_TO((unsigned long) pVia->driOffScreenSave, 16); if ((pVia->drmVerMajor == 2) && (pVia->drmVerMinor >= 8)) { err = viaDRIFBMemcpy(pVia->drmmode.fd, pVia->driOffScreenMem, dst, FALSE); if (!err) return; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Hardware backup of DRI offscreen memory failed: %s.\n" "\tUsing slow software backup instead.\n", strerror(-err)); } memcpy(dst, src, srcSize); drm_bo_unmap(pScrn, pVia->driOffScreenMem); } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Out of memory trying to backup DRI offscreen memory.\n"); } return; } void viaDRIOffscreenRestore(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); if (pVia->driOffScreenSave) { void *src, *dst = drm_bo_map(pScrn, pVia->driOffScreenMem); src = pVia->driOffScreenSave; memcpy(dst, src, pVia->driOffScreenMem->size); free(pVia->driOffScreenSave); pVia->driOffScreenSave = NULL; drm_bo_unmap(pScrn, pVia->driOffScreenMem); } else { } } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_dri.h000066400000000000000000000045421267025031400234070ustar00rootroot00000000000000/* * 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. */ /* * Keep this file in perfect sync between the ddx and dri drivers. * At least bump the VIA_DRIDDX_VERSION defines appropriately. * */ #ifndef _VIA_DRI_H_ #define _VIA_DRI_H_ 1 #define VIA_MAX_DRAWABLES 256 #define VIA_DRIDDX_VERSION_MAJOR 5 #define VIA_DRIDDX_VERSION_MINOR 0 #define VIA_DRIDDX_VERSION_PATCH 0 #if !defined(XFree86Server) && !defined(_XDEFS_H) typedef int Bool; #endif typedef struct { drm_handle_t handle; drmSize size; } viaRegion, *viaRegionPtr; typedef struct { viaRegion regs; int deviceID; int width; int height; int mem; int bytesPerPixel; int priv1; int priv2; Bool drixinerama; int backOffset; int depthOffset; int textureOffset; int textureSize; int irqEnabled; unsigned int scrnX, scrnY; int sarea_priv_offset; int ringBufActive; unsigned int reg_pause_addr; } VIADRIRec, *VIADRIPtr; typedef struct { int dummy; } VIAConfigPrivRec, *VIAConfigPrivPtr; typedef struct { int dummy; } VIADRIContextRec, *VIADRIContextPtr; Bool VIADRIKernelInit(ScrnInfoPtr pScrn); void kickVblank(ScrnInfoPtr pScrn); #endif /* _VIA_DRI_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_driver.c000066400000000000000000002021651267025031400241200ustar00rootroot00000000000000/* * Copyright 2005-2015 The Openchrome Project * [http://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 "shadow.h" #include "globals.h" #ifdef HAVE_XEXTPROTO_71 #include #else #define DPMS_SERVER #include #endif #include "version.h" #include "via_driver.h" #include "drm_fourcc.h" #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 #include "xf86RAC.h" #endif #include "xf86Crtc.h" #ifdef HAVE_DRI #include "dri.h" #else #include "drm_fourcc.h" #endif /* RandR support */ #include "xf86RandR12.h" typedef struct { int major; int minor; int patchlevel; } ViaDRMVersion; static const ViaDRMVersion drmExpected = { 1, 3, 0 }; static const ViaDRMVersion drmCompat = { 3, 1, 0 }; /* Prototypes. */ static void VIAIdentify(int flags); #ifdef HAVE_PCIACCESS static Bool via_pci_probe(DriverPtr drv, int entity_num, struct pci_device *dev, intptr_t match_data); #else /* !HAVE_PCIACCESS */ static Bool VIAProbe(DriverPtr drv, int flags); #endif static Bool VIASetupDefaultOptions(ScrnInfoPtr pScrn); static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags); static Bool VIAScreenInit(SCREEN_INIT_ARGS_DECL); static const OptionInfoRec *VIAAvailableOptions(int chipid, int busid); #ifdef HAVE_PCIACCESS #define VIA_DEVICE_MATCH(d,i) \ { 0x1106, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) } static const struct pci_id_match via_device_match[] = { VIA_DEVICE_MATCH (PCI_CHIP_VT3204, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3259, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_CLE3122, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3205, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3314, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3336, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3364, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3324, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3327, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3353, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3409, 0 ), VIA_DEVICE_MATCH (PCI_CHIP_VT3410, 0 ), { 0, 0, 0 }, }; #endif /* HAVE_PCIACCESS */ _X_EXPORT DriverRec VIA = { VIA_VERSION, DRIVER_NAME, VIAIdentify, #ifdef HAVE_PCIACCESS NULL, #else VIAProbe, #endif VIAAvailableOptions, NULL, 0, NULL, #ifdef HAVE_PCIACCESS via_device_match, via_pci_probe #endif }; /* Supported chipsets */ static SymTabRec VIAChipsets[] = { {VIA_CLE266, "CLE266"}, {VIA_KM400, "KM400 / KM400A / KN400 / P4M800"}, {VIA_K8M800, "K8M800 / K8N800"}, {VIA_PM800, "PM800 / PN800 / PM880 / CN333 / CN400"}, {VIA_P4M800PRO, "P4M800 Pro / VN800 / CN700"}, {VIA_CX700, "CX700 / VX700"}, {VIA_P4M890, "P4M890 / VN890 / CN800"}, {VIA_K8M890, "K8M890 / K8N890"}, {VIA_P4M900, "P4M900 / VN896 / CN896"}, {VIA_VX800, "VX800 / VX820"}, {VIA_VX855, "VX855 / VX875"}, {VIA_VX900, "VX900"}, {-1, NULL} }; /* Mapping a PCI device ID to a chipset family identifier. */ static PciChipsets VIAPciChipsets[] = { {VIA_CLE266, PCI_CHIP_CLE3122, VIA_RES_SHARED}, {VIA_KM400, PCI_CHIP_VT3205, VIA_RES_SHARED}, {VIA_K8M800, PCI_CHIP_VT3204, VIA_RES_SHARED}, {VIA_PM800, PCI_CHIP_VT3259, VIA_RES_SHARED}, {VIA_P4M800PRO, PCI_CHIP_VT3314, VIA_RES_SHARED}, {VIA_CX700, PCI_CHIP_VT3324, VIA_RES_SHARED}, {VIA_P4M890, PCI_CHIP_VT3327, VIA_RES_SHARED}, {VIA_K8M890, PCI_CHIP_VT3336, VIA_RES_SHARED}, {VIA_P4M900, PCI_CHIP_VT3364, VIA_RES_SHARED}, {VIA_VX800, PCI_CHIP_VT3353, VIA_RES_SHARED}, {VIA_VX855, PCI_CHIP_VT3409, VIA_RES_SHARED}, {VIA_VX900, PCI_CHIP_VT3410, VIA_RES_SHARED}, {-1, -1, VIA_RES_UNDEF} }; typedef enum { #ifdef HAVE_DEBUG OPTION_PRINTVGAREGS, OPTION_PRINTTVREGS, OPTION_I2CSCAN, #endif OPTION_VBEMODES, OPTION_NOACCEL, OPTION_ACCELMETHOD, OPTION_EXA_NOCOMPOSITE, OPTION_EXA_SCRATCH_SIZE, OPTION_SWCURSOR, OPTION_SHADOW_FB, OPTION_ROTATION_TYPE, OPTION_ROTATE, OPTION_VIDEORAM, OPTION_ACTIVEDEVICE, OPTION_I2CDEVICES, OPTION_BUSWIDTH, OPTION_CENTER, OPTION_PANELSIZE, OPTION_FORCEPANEL, OPTION_TVDOTCRAWL, OPTION_TVTYPE, OPTION_TVOUTPUT, OPTION_TVDIPORT, OPTION_DISABLEVQ, OPTION_DISABLEIRQ, OPTION_TVDEFLICKER, OPTION_AGP_DMA, OPTION_2D_DMA, OPTION_XV_DMA, OPTION_VBE_SAVERESTORE, OPTION_MAX_DRIMEM, OPTION_AGPMEM, OPTION_DISABLE_XV_BW_CHECK, OPTION_MODE_SWITCH_METHOD } 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_VBEMODES, "VBEModes", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {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_ACTIVEDEVICE, "ActiveDevice", 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_TVDIPORT, "TVPort", 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_VBE_SAVERESTORE, "VbeSaveRestore", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_DISABLE_XV_BW_CHECK, "DisableXvBWCheck", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_MODE_SWITCH_METHOD, "ModeSwitchMethod", OPTV_ANYSTR, {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} }; #ifdef XFree86LOADER static MODULESETUPPROTO(VIASetup); static XF86ModuleVersionInfo VIAVersRec = { "openchrome", "http://www.freedesktop.org/wiki/Openchrome/", MODINFOSTRING1, MODINFOSTRING2, #ifdef XORG_VERSION_CURRENT XORG_VERSION_CURRENT, #else XF86_VERSION_CURRENT, #endif VIA_MAJOR_VERSION, VIA_MINOR_VERSION, VIA_PATCHLEVEL, ABI_CLASS_VIDEODRV, ABI_VIDEODRV_VERSION, MOD_CLASS_VIDEODRV, {0, 0, 0, 0} }; _X_EXPORT XF86ModuleData openchromeModuleData = { &VIAVersRec, VIASetup, NULL }; static pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin) { static Bool setupDone = FALSE; /* Only be loaded once */ if (!setupDone) { setupDone = TRUE; xf86AddDriver(&VIA, module, #ifdef HAVE_PCIACCESS HaveDriverFuncs #else 0 #endif ); return (pointer) 1; } else { if (errmaj) *errmaj = LDR_ONCEONLY; return NULL; } } /* VIASetup */ #endif /* XFree86LOADER */ static const OptionInfoRec * VIAAvailableOptions(int chipid, int busid) { return VIAOptions; } static Bool VIASwitchMode(SWITCH_MODE_ARGS_DECL) { SCRN_INFO_PTR(arg); return xf86SetSingleMode(pScrn, mode, RR_Rotate_0); } static void VIAAdjustFrame(ADJUST_FRAME_ARGS_DECL) { SCRN_INFO_PTR(arg); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAAdjustFrame %dx%d\n", x, y)); for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; xf86CrtcSetOrigin(crtc, x, y); } } static Bool VIAEnterVT_internal(ScrnInfoPtr pScrn, int flags) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAEnterVT\n")); for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; 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) output->funcs->save(output); } if (!xf86SetDesiredModes(pScrn)) return FALSE; if (!flags) { /* Restore video status. */ if (!pVia->IsSecondary) viaRestoreVideo(pScrn); #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { kickVblank(pScrn); VIADRIRingBufferInit(pScrn); viaDRIOffscreenRestore(pScrn); DRIUnlock(xf86ScrnToScreen(pScrn)); } #endif } return TRUE; } static Bool VIAEnterVT(VT_FUNC_ARGS_DECL) { SCRN_INFO_PTR(arg); return VIAEnterVT_internal(pScrn, 0); } static void VIALeaveVT(VT_FUNC_ARGS_DECL) { 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")); #ifdef HAVE_DRI 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; viaAccelSync(pScrn); VIADRIRingBufferCleanup(pScrn); viaDRIOffscreenSave(pScrn); if (pVia->VQEnable) viaDisableVQ(pScrn); } #endif /* Save video status and turn off all video activities. */ if (!pVia->IsSecondary) viaSaveVideo(pScrn); for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; 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) crtc->funcs->restore(crtc); } pScrn->vtSema = FALSE; } static void VIAFreeRec(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFreeRec\n")); if (!pScrn->driverPrivate) return; VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; if (pBIOSInfo) { if (pBIOSInfo->TVI2CDev) xf86DestroyI2CDevRec(pBIOSInfo->TVI2CDev, TRUE); pVia->pBIOSInfo = NULL; free(pBIOSInfo); } if (VIAPTR(pScrn)->pVbe) vbeFree(VIAPTR(pScrn)->pVbe); if (pVia->VideoRegs) free(pVia->VideoRegs); VIAUnmapMem(pScrn); free(pScrn->driverPrivate); pScrn->driverPrivate = NULL; } /* VIAFreeRec */ /* * This only gets called when a screen is being deleted. It does not * get called routinely at the end of a server generation. */ static void VIAFreeScreen(FREE_SCREEN_ARGS_DECL) { SCRN_INFO_PTR(arg); VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAFreeScreen\n")); if (pVia->directRenderingType != DRI_2) VIAUnmapMem(pScrn); VIAFreeRec(pScrn); if (!pVia->KMS && xf86LoaderCheckSymbol("vgaHWFreeHWRec")) vgaHWFreeHWRec(pScrn); } static void VIAIdentify(int flags) { xf86PrintChipsets("OPENCHROME", "Driver for VIA Chrome chipsets", VIAChipsets); } #ifdef HAVE_PCIACCESS static Bool 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); if (scrn != NULL) { scrn->driverVersion = VIA_VERSION; scrn->driverName = DRIVER_NAME; scrn->name = "CHROME"; scrn->Probe = NULL; entity = xf86GetEntityInfo(entity_num); scrn->PreInit = VIAPreInit; scrn->ScreenInit = VIAScreenInit; scrn->SwitchMode = VIASwitchMode; scrn->AdjustFrame = VIAAdjustFrame; scrn->EnterVT = VIAEnterVT; scrn->LeaveVT = VIALeaveVT; scrn->FreeScreen = VIAFreeScreen; xf86Msg(X_NOTICE, "VIA Technologies does not support this driver in any way.\n"); xf86Msg(X_NOTICE, "For support, please refer to" " http://www.freedesktop.org/wiki/Openchrome/.\n"); #ifdef BUILDCOMMENT xf86Msg(X_NOTICE, BUILDCOMMENT"\n"); #endif } return scrn != NULL; } #else /* !HAVE_PCIACCESS */ static Bool VIAProbe(DriverPtr drv, int flags) { GDevPtr *devSections; int *usedChips; int numDevSections; int numUsed; Bool foundScreen = FALSE; int i; /* sanity checks */ if ((numDevSections = xf86MatchDevice(DRIVER_NAME, &devSections)) <= 0) return FALSE; if (xf86GetPciVideoInfo() == NULL) return FALSE; numUsed = xf86MatchPciInstances(DRIVER_NAME, PCI_VIA_VENDOR_ID, VIAChipsets, VIAPciChipsets, devSections, numDevSections, drv, &usedChips); free(devSections); if (numUsed <= 0) return FALSE; xf86Msg(X_NOTICE, "VIA Technologies does not support this driver in any way.\n"); xf86Msg(X_NOTICE, "For support, please refer to" " http://www.freedesktop.org/wiki/Openchrome/.\n"); #ifdef BUILDCOMMENT xf86Msg(X_NOTICE, BUILDCOMMENT"\n"); #endif if (flags & PROBE_DETECT) { foundScreen = TRUE; } else { for (i = 0; i < numUsed; i++) { ScrnInfoPtr pScrn = xf86AllocateScreen(drv, 0); EntityInfoPtr pEnt; if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], VIAPciChipsets, 0, 0, 0, 0, 0))) { pScrn->driverVersion = VIA_VERSION; pScrn->driverName = DRIVER_NAME; pScrn->name = "CHROME"; pScrn->Probe = VIAProbe; pScrn->PreInit = VIAPreInit; pScrn->ScreenInit = VIAScreenInit; pScrn->SwitchMode = VIASwitchMode; pScrn->AdjustFrame = VIAAdjustFrame; pScrn->EnterVT = VIAEnterVT; pScrn->LeaveVT = VIALeaveVT; pScrn->FreeScreen = VIAFreeScreen; foundScreen = TRUE; } #if 0 xf86ConfigActivePciEntity(pScrn, usedChips[i], VIAPciChipsets, NULL, NULL, NULL, NULL, NULL); #endif pEnt = xf86GetEntityInfo(usedChips[i]); /* CLE266 supports dual-head; mark the entity as sharable. */ if (pEnt->chipset == VIA_CLE266 || pEnt->chipset == VIA_KM400) { static int instance = 0; DevUnion *pPriv; xf86SetEntitySharable(usedChips[i]); xf86SetEntityInstanceForScreen(pScrn, pScrn->entityList[0], instance); if (gVIAEntityIndex < 0) { gVIAEntityIndex = xf86AllocateEntityPrivateIndex(); pPriv = xf86GetEntityPrivate(pScrn->entityList[0], gVIAEntityIndex); if (!pPriv->ptr) { VIAEntPtr pVIAEnt; pPriv->ptr = xnfcalloc(sizeof(VIAEntRec), 1); pVIAEnt = pPriv->ptr; pVIAEnt->IsDRIEnabled = FALSE; pVIAEnt->BypassSecondary = FALSE; pVIAEnt->HasSecondary = FALSE; pVIAEnt->IsSecondaryRestored = FALSE; } } instance++; } free(pEnt); } } free(usedChips); return foundScreen; } /* VIAProbe */ #endif /* !HAVE_PCIACCESS */ static int LookupChipSet(PciChipsets *pset, int chipSet) { while (pset->numChipset >= 0) { if (pset->numChipset == chipSet) return pset->PCIid; pset++; } return -1; } static int LookupChipID(PciChipsets *pset, int ChipID) { /* Is there a function to do this for me? */ while (pset->numChipset >= 0) { if (pset->PCIid == ChipID) return pset->numChipset; pset++; } return -1; } static Bool VIASetupDefaultOptions(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; 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; pVia->useVBEModes = FALSE; pVia->vbeSR = FALSE; #ifdef HAVE_DEBUG pVia->disableXvBWCheck = FALSE; #endif pVia->maxDriSize = 0; pVia->agpMem = AGP_SIZE / 1024; pVia->ActiveDevice = 0x00; 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; pVia->useLegacyVBE = TRUE; pVia->UseLegacyModeSwitch = FALSE; pBIOSInfo->TVDIPort = VIA_DI_PORT_DVP1; switch (pVia->Chipset) { case VIA_CLE266: pBIOSInfo->TVDIPort = VIA_DI_PORT_DVP0; pVia->UseLegacyModeSwitch = TRUE; 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; pBIOSInfo->TVDIPort = VIA_DI_PORT_DVP0; break; case VIA_K8M800: pVia->DRIIrqEnable = FALSE; break; case VIA_PM800: /* Use new mode switch to resolve many resolution and display bugs (switch to console) */ /* FIXME The video playing (XV) is not working correctly after turn on new mode switch */ pVia->VideoEngine = VIDEO_ENGINE_CME; break; case VIA_P4M800PRO: /* New mode switch resolve bug with gamma set #282 */ /* and with Xv after hibernate #240 */ 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; pVia->useLegacyVBE = FALSE; /* FIXME: this needs to be tested */ pVia->dmaXV = FALSE; pBIOSInfo->TVDIPort = VIA_DI_PORT_DVP0; 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; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetRec\n")); if (pScrn->driverPrivate) return TRUE; /* allocate VIARec */ pVia = (VIARec *) xnfcalloc(sizeof(VIARec), 1); if (pVia) { pVia->pBIOSInfo = xnfcalloc(sizeof(VIABIOSInfoRec), 1); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; if (pBIOSInfo) { pBIOSInfo->TVI2CDev = NULL; pVia->VideoRegs = (video_via_regs *) xnfcalloc(sizeof(video_via_regs), 1); if (!pVia->VideoRegs) { free(pBIOSInfo); free(pVia); } else { pScrn->driverPrivate = pVia; ret = TRUE; } } } return ret; } /* VIAGetRec */ static int map_legacy_formats(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; } static Bool via_xf86crtc_resize(ScrnInfoPtr scrn, int width, int height) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); struct buffer_object *old_front = NULL, *new_front = NULL; int cpp = (scrn->bitsPerPixel + 7) >> 3, fd, i; int old_width, old_height, old_dwidth, format; ScreenPtr screen = scrn->pScreen; VIAPtr pVia = VIAPTR(scrn); void *new_pixels = NULL; uint32_t old_fb_id; Bool ret = FALSE; PixmapPtr ppix; if (scrn->virtualX == width && scrn->virtualY == height) return TRUE; format = map_legacy_formats(scrn->bitsPerPixel, scrn->depth); new_front = drm_bo_alloc_surface(scrn, width, height, format, 16, TTM_PL_FLAG_VRAM); if (!new_front) goto fail; xf86DrvMsg(scrn->scrnIndex, X_INFO, "Allocate new frame buffer %dx%d stride %lu\n", width, height, new_front->pitch); new_pixels = drm_bo_map(scrn, new_front); if (!new_pixels) goto fail; if (pVia->shadowFB) { new_pixels = malloc(height * new_front->pitch); if (!new_pixels) goto fail; free(pVia->ShadowPtr); pVia->ShadowPtr = new_pixels; } ppix = screen->GetScreenPixmap(screen); if (!screen->ModifyPixmapHeader(ppix, width, height, -1, -1, new_front->pitch, new_pixels)) goto fail; #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,9,99,1,0) scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr; #endif scrn->virtualX = width; scrn->virtualY = height; scrn->displayWidth = new_front->pitch / cpp; for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; drmmode_crtc_private_ptr drmmode_crtc; drmmode_ptr drmmode; if (!xf86CrtcInUse(crtc) || !crtc->driver_private) continue; drmmode_crtc = crtc->driver_private; drmmode = drmmode_crtc->drmmode; if (drmmode->front_bo != new_front) { old_front = drmmode->front_bo; old_fb_id = drmmode->fb_id; fd = drmmode->fd; drmmode->front_bo = new_front; drmmode->fb_id = 0; } ret = xf86CrtcSetMode(crtc, &crtc->desiredMode, crtc->rotation, crtc->x, crtc->y); if (!ret) { drmmode->front_bo = old_front; drmmode->fb_id = old_fb_id; xf86DrvMsg(scrn->scrnIndex, X_INFO, "xf86CrtcSetMode failed\n"); goto fail; } } #ifdef HAVE_DRI if (pVia->KMS && old_fb_id) drmModeRmFB(fd, old_fb_id); #endif drm_bo_unmap(scrn, old_front); drm_bo_free(scrn, old_front); return ret; fail: if (new_front) { drm_bo_unmap(scrn, new_front); drm_bo_free(scrn, new_front); } scrn->virtualY = old_height; scrn->virtualX = old_width; scrn->displayWidth = old_dwidth; return FALSE; } static const xf86CrtcConfigFuncsRec via_xf86crtc_config_funcs = { via_xf86crtc_resize }; static Bool 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 DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAPreInit\n")); if (pScrn->numEntities > 1) return FALSE; if (flags & PROBE_DETECT) return FALSE; if (!VIAGetRec(pScrn)) { return FALSE; } pVia = VIAPTR(pScrn); pVia->IsSecondary = FALSE; pEnt = xf86GetEntityInfo(pScrn->entityList[0]); #ifndef HAVE_PCIACCESS if (pEnt->resources) { free(pEnt); VIAFreeRec(pScrn); return FALSE; } #endif pVia->EntityIndex = pEnt->index; if (xf86IsEntityShared(pScrn->entityList[0])) { if (xf86IsPrimInitDone(pScrn->entityList[0])) { DevUnion *pPriv; VIAEntPtr pVIAEnt; VIAPtr pVia1; pVia->IsSecondary = TRUE; pPriv = xf86GetEntityPrivate(pScrn->entityList[0], gVIAEntityIndex); pVIAEnt = pPriv->ptr; if (pVIAEnt->BypassSecondary) { free(pEnt); VIAFreeRec(pScrn); return FALSE; } pVIAEnt->pSecondaryScrn = pScrn; pVIAEnt->HasSecondary = TRUE; pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn); pVia1->HasSecondary = TRUE; pVia->sharedData = pVia1->sharedData; } else { DevUnion *pPriv; VIAEntPtr pVIAEnt; xf86SetPrimInitDone(pScrn->entityList[0]); pPriv = xf86GetEntityPrivate(pScrn->entityList[0], gVIAEntityIndex); pVia->sharedData = xnfcalloc(sizeof(ViaSharedRec), 1); pVIAEnt = pPriv->ptr; pVIAEnt->pPrimaryScrn = pScrn; pVIAEnt->IsDRIEnabled = FALSE; pVIAEnt->BypassSecondary = FALSE; pVIAEnt->HasSecondary = FALSE; pVIAEnt->RestorePrimary = FALSE; pVIAEnt->IsSecondaryRestored = FALSE; } } else { pVia->sharedData = xnfcalloc(sizeof(ViaSharedRec), 1); } pVia->PciInfo = xf86GetPciInfoForEntity(pEnt->index); #ifndef HAVE_PCIACCESS xf86RegisterResources(pEnt->index, NULL, ResNone); #endif if (pEnt->device->chipset && *pEnt->device->chipset) { from = X_CONFIG; pScrn->chipset = pEnt->device->chipset; pVia->Chipset = xf86StringToToken(VIAChipsets, pScrn->chipset); pVia->ChipId = LookupChipSet(VIAPciChipsets, pVia->Chipset); } else if (pEnt->device->chipID >= 0) { from = X_CONFIG; pVia->ChipId = pEnt->device->chipID; pVia->Chipset = LookupChipID(VIAPciChipsets, pVia->ChipId); pScrn->chipset = (char *)xf86TokenToString(VIAChipsets, pVia->Chipset); xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipID override: 0x%04X\n", pEnt->device->chipID); } else { from = X_PROBED; pVia->ChipId = DEVICE_ID(pVia->PciInfo); pVia->Chipset = LookupChipID(VIAPciChipsets, pVia->ChipId); pScrn->chipset = (char *)xf86TokenToString(VIAChipsets, pVia->Chipset); } xf86DrvMsg(pScrn->scrnIndex, from, "Chipset: %s\n", pScrn->chipset); if (pEnt->device->chipRev >= 0) { pVia->ChipRev = pEnt->device->chipRev; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "ChipRev override: %d\n", pVia->ChipRev); } else { /* Read PCI bus 0, dev 0, function 0, index 0xF6 to get chip revision */ #ifdef HAVE_PCIACCESS struct pci_device *bridge = pci_device_get_parent_bridge(pVia->PciInfo); uint8_t rev = 0; pci_device_cfg_read_u8(bridge, &rev, 0xF6); pVia->ChipRev = rev; #else pVia->ChipRev = pciReadByte(pciTag(0, 0, 0), 0xF6); #endif } 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"); drmVer = drmGetVersion(pVia->drmmode.fd); if (drmVer) { pVia->drmVerMajor = drmVer->version_major; pVia->drmVerMinor = drmVer->version_minor; pVia->drmVerPL = 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"); pVia->directRenderingType = DRI_2; pVia->NoAccel = TRUE; } } } 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 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)) { VIAFreeRec(pScrn); return FALSE; } 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); VIAFreeRec(pScrn); return FALSE; } } xf86PrintDepthBpp(pScrn); if (pScrn->depth == 32) { pScrn->depth = 24; } if (pScrn->depth > 8) { rgb zeros = { 0, 0, 0 }; if (!xf86SetWeight(pScrn, zeros, zeros)) { VIAFreeRec(pScrn); return FALSE; } else { /* TODO check weight returned is supported */ ; } } if (!xf86SetDefaultVisual(pScrn, -1)) { return FALSE; } 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); VIAFreeRec(pScrn); return FALSE; } } /* 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)) { VIAFreeRec(pScrn); return FALSE; } 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); if ((s = xf86GetOptValString(VIAOptions, OPTION_MODE_SWITCH_METHOD))) { if (!xf86NameCmp(s, "legacy")) { if (pVia->UseLegacyModeSwitch) { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Already using \"legacy\" as ModeSwitchMethod, " "did not force anything.\n"); } else { pVia->UseLegacyModeSwitch = TRUE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced ModeSwitchMethod to \"legacy\".\n"); } } else if (!xf86NameCmp(s, "new")) { if (pVia->UseLegacyModeSwitch) { pVia->UseLegacyModeSwitch = FALSE; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced ModeSwitchMethod to \"new\".\n"); } else { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Already using \"new\" as ModeSwitchMethod, " "did not force anything.\n"); } } else { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid" "value for Option \"ModeSwitchMethod\".\n", s); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Valid options are \"legacy\" or \"new\".\n"); } } /* 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); 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"); } 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; if ((s = (char *)xf86GetOptValString(VIAOptions, OPTION_ACCELMETHOD))) { if (!xf86NameCmp(s, "EXA")) { from = X_CONFIG; pVia->useEXA = TRUE; } else if (!xf86NameCmp(s, "XAA")) { from = X_CONFIG; pVia->useEXA = TRUE; } } xf86DrvMsg(pScrn->scrnIndex, from, "Using %s acceleration architecture.\n", pVia->useEXA ? "EXA" : "XAA"); //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 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 "); //pVia->useVBEModes = FALSE; from = xf86GetOptValBool(VIAOptions, OPTION_VBEMODES, &pVia->useVBEModes) ? X_CONFIG : X_DEFAULT; xf86DrvMsg(pScrn->scrnIndex, from, "Will %senable VBE modes.\n", (pVia->useVBEModes) ? "" : "not "); //pVia->vbeSR = FALSE; from = xf86GetOptValBool(VIAOptions, OPTION_VBE_SAVERESTORE, &pVia->vbeSR) ? X_CONFIG : X_DEFAULT; xf86DrvMsg(pScrn->scrnIndex, from, "VBE VGA register save & restore " "will %sbe used\n\tif VBE modes are enabled.\n", (pVia->vbeSR) ? "" : "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); /* ActiveDevice Option for device selection */ //pVia->ActiveDevice = 0x00; if ((s = xf86GetOptValString(VIAOptions, OPTION_ACTIVEDEVICE))) { if (strstr(s, "CRT")) pVia->ActiveDevice |= VIA_DEVICE_CRT; if (strstr(s, "LCD")) pVia->ActiveDevice |= VIA_DEVICE_LCD; if (strstr(s, "DFP")) pVia->ActiveDevice |= VIA_DEVICE_DFP; if (strstr(s, "TV")) pVia->ActiveDevice |= VIA_DEVICE_TV; } 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"); } /* TV DI Port */ if ((s = xf86GetOptValString(VIAOptions, OPTION_TVDIPORT))) { if (!xf86NameCmp(s, "DVP0")) { pBIOSInfo->TVDIPort = VIA_DI_PORT_DVP0; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Port is DVP0.\n"); } else if (!xf86NameCmp(s, "DVP1")) { pBIOSInfo->TVDIPort = VIA_DI_PORT_DVP1; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Port is DVP1.\n"); } else if (!xf86NameCmp(s, "DFPHigh")) { pBIOSInfo->TVDIPort = VIA_DI_PORT_DFPHIGH; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Port is DFPHigh.\n"); } else if (!xf86NameCmp(s, "DFPLow")) { pBIOSInfo->TVDIPort = VIA_DI_PORT_DFPLOW; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "TV Output Port is DFPLow.\n"); } } else { xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "No default TV output port 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 */ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "...Finished parsing config file options.\n"); ViaCheckCardId(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; } if (!xf86NameCmp(pVia->Id->String, "OLPC XO 1.5")) pVia->I2CDevices &= ~VIA_I2C_BUS2; /* CRTC handling */ xf86CrtcConfigInit(pScrn, &via_xf86crtc_config_funcs); if (pVia->KMS) { if (!KMSCrtcInit(pScrn, &pVia->drmmode)) { VIAFreeRec(pScrn); return FALSE; } } else { if (!UMSCrtcInit(pScrn)) { VIAFreeRec(pScrn); return FALSE; } } if (!xf86InitialConfiguration(pScrn, TRUE)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Initial configuration failed\n"); return FALSE; } if (!pScrn->modes) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); return FALSE; } /* Initialize the colormap */ Gamma zeros = { 0.0, 0.0, 0.0 }; if (!xf86SetGamma(pScrn, zeros)) { VIAFreeRec(pScrn); return FALSE; } /* 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; /* Set display resolution */ xf86SetDpi(pScrn, 0, 0); if (xf86LoadSubModule(pScrn, "fb") == NULL) { VIAFreeRec(pScrn); return FALSE; } if (!pVia->NoAccel) { XF86ModReqInfo req; int errmaj, errmin; memset(&req, 0, sizeof(req)); req.majorversion = 2; req.minorversion = 0; if (!LoadSubModule(pScrn->module, "exa", NULL, NULL, NULL, &req, &errmaj, &errmin)) { LoaderErrorMsg(NULL, "exa", errmaj, errmin); VIAFreeRec(pScrn); return FALSE; } } if (pVia->shadowFB) { if (!xf86LoadSubModule(pScrn, "shadow")) { VIAFreeRec(pScrn); return FALSE; } } return TRUE; } static void LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO * colors, VisualPtr pVisual) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); CARD16 lut_r[256], lut_g[256], lut_b[256]; int i, j, k, index; for (k = 0; k < xf86_config->num_crtc; k++) { xf86CrtcPtr crtc = xf86_config->crtc[k]; switch (pScrn->depth) { case 15: for (i = 0; i < numColors; i++) { index = indices[i]; for (j = 0; j < 8; j++) { lut_r[index * 8 + j] = colors[index].red << 8; lut_g[index * 8 + j] = colors[index].green << 8; lut_b[index * 8 + j] = colors[index].blue << 8; } } break; case 16: for (i = 0; i < numColors; i++) { index = indices[i]; if (index <= 31) { for (j = 0; j < 8; j++) { lut_r[index * 8 + j] = colors[index].red << 8; lut_b[index * 8 + j] = colors[index].blue << 8; } } for (j = 0; j < 4; j++) lut_g[index * 4 + j] = colors[index].green << 8; } break; default: for (i = 0; i < numColors; i++) { index = indices[i]; lut_r[index] = colors[index].red << 8; lut_g[index] = colors[index].green << 8; lut_b[index] = colors[index].blue << 8; } break; } /* Make the change through RandR */ #ifdef RANDR_12_INTERFACE RRCrtcGammaSet(crtc->randr_crtc, lut_r, lut_g, lut_b); #else /*RANDR_12_INTERFACE*/ crtc->funcs->gamma_set(crtc, lut_r, lut_g, lut_b, 256); #endif } } static void * viaShadowWindow(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); int stride; stride = (pScrn->displayWidth * pScrn->bitsPerPixel) / 8; *size = stride; return ((uint8_t *) drm_bo_map(pScrn, pVia->drmmode.front_bo) + row * stride + offset); } static Bool VIACreateScreenResources(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); PixmapPtr rootPixmap; void *surface; pScreen->CreateScreenResources = pVia->CreateScreenResources; if (!(*pScreen->CreateScreenResources)(pScreen)) return FALSE; pScreen->CreateScreenResources = VIACreateScreenResources; rootPixmap = pScreen->GetScreenPixmap(pScreen); #ifdef HAVE_DRI drmmode_uevent_init(pScrn, &pVia->drmmode); #endif surface = drm_bo_map(pScrn, pVia->drmmode.front_bo); if (!surface) return FALSE; if (pVia->shadowFB) surface = pVia->ShadowPtr; if (!pScreen->ModifyPixmapHeader(rootPixmap, pScrn->virtualX, pScrn->virtualY, -1, -1, pVia->drmmode.front_bo->pitch, surface)) return FALSE; if (pVia->shadowFB) { if (!shadowAdd(pScreen, rootPixmap, shadowUpdatePackedWeak(), viaShadowWindow, 0, NULL)) return FALSE; } return TRUE; } static Bool VIACloseScreen(CLOSE_SCREEN_ARGS_DECL) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIACloseScreen\n")); if (pVia->directRenderingType != DRI_2) viaExitVideo(pScrn); viaExitAccel(pScreen); if (pVia->ShadowPtr) { shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); free(pVia->ShadowPtr); pVia->ShadowPtr = NULL; } /* Is the display currently visible? */ if (pScrn->vtSema) VIALeaveVT(VT_FUNC_ARGS(0)); #ifdef HAVE_DRI drmmode_uevent_fini(pScrn, &pVia->drmmode); #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) drmModeRmFB(pVia->drmmode.fd, pVia->drmmode.fb_id); #endif pVia->drmmode.fb_id = 0; drm_bo_free(pScrn, pVia->drmmode.front_bo); } #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) VIADRICloseScreen(pScreen); if (pVia->KMS) { drmmode_uevent_fini(pScrn, &pVia->drmmode); if (drmDropMaster(pVia->drmmode.fd)) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "drmDropMaster failed: %s\n", strerror(errno)); } #endif pScrn->vtSema = FALSE; pScreen->CloseScreen = pVia->CloseScreen; return (*pScreen->CloseScreen) (CLOSE_SCREEN_ARGS); } static Bool VIAScreenInit(SCREEN_INIT_ARGS_DECL) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); int format; 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 if (!drm_bo_manager_init(pScrn)) return FALSE; 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; if (!drm_bo_map(pScrn, pVia->drmmode.front_bo)) return FALSE; if (!pVia->NoAccel && !UMSAccelInit(pScrn->pScreen)) 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); pVia->shadowFB = FALSE; pVia->ShadowPtr = malloc(pitch * pScrn->virtualY); if (pVia->ShadowPtr) { if (shadowSetup(pScreen)) pVia->shadowFB = TRUE; } } if (!fbScreenInit(pScreen, NULL, pScrn->virtualX, pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth, pScrn->bitsPerPixel)) return FALSE; xf86SetBlackWhitePixels(pScreen); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- B & W\n")); if (pScrn->bitsPerPixel > 8) { VisualPtr visual; visual = pScreen->visuals + pScreen->numVisuals; while (--visual >= pScreen->visuals) { if ((visual->class | DynamicClass) == DirectColor) { visual->offsetRed = pScrn->offset.red; visual->offsetGreen = pScrn->offset.green; visual->offsetBlue = pScrn->offset.blue; visual->redMask = pScrn->mask.red; visual->greenMask = pScrn->mask.green; visual->blueMask = pScrn->mask.blue; } } } /* Must be after RGB ordering is fixed. */ fbPictureInit(pScreen, NULL, 0); if (!pVia->NoAccel && !viaInitExa(pScreen)) return FALSE; xf86SetBackingStore(pScreen); #if 0 xf86SetSilkenMouse(pScreen); #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Backing store set up\n")); 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; switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: flags |= HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1; size = 32; cursorSize = ((size * size) >> 3) * 2; 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; break; } 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); } if (!xf86_cursors_init(pScreen, size, size, flags)) { pVia->drmmode.hwcursor = FALSE; xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Hardware cursor initialization failed\n"); } } pScrn->vtSema = TRUE; pScreen->SaveScreen = xf86SaveScreen; pVia->CloseScreen = pScreen->CloseScreen; pScreen->CloseScreen = VIACloseScreen; pVia->CreateScreenResources = pScreen->CreateScreenResources; pScreen->CreateScreenResources = VIACreateScreenResources; if (!xf86CrtcScreenInit(pScreen)) return FALSE; 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; if (pVia->directRenderingType != DRI_2) { #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { if (!VIADRIFinishScreenInit(pScreen)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering disabled\n"); pVia->directRenderingType = DRI_NONE; } else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "direct rendering enabled\n"); } #endif if (!pVia->NoAccel) viaFinishInitAccel(pScreen); viaInitVideo(pScrn->pScreen); } if (serverGeneration == 1) xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); #ifdef HAVE_DEBUG if (pVia->PrintVGARegs) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit: Printing VGA registers.\n"); ViaVgahwPrint(VGAHWPTR(pScrn)); } if (pVia->PrintTVRegs) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAScreenInit: Printing TV registers.\n"); ViaTVPrintRegs(pScrn); } #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "- Done\n")); return TRUE; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_driver.h000066400000000000000000000403701267025031400241230ustar00rootroot00000000000000/* * 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_DRIVER_H_ #define _VIA_DRIVER_H_ 1 //#define VIA_DEBUG_COMPOSITE 1 #define HAVE_DEBUG 1 #ifdef HAVE_DEBUG #define DEBUG(x) x #else #define DEBUG(x) #endif #include "vgaHW.h" #include "xf86.h" #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 #include "xf86Resources.h" #endif #include "xf86Pci.h" #include "xf86_OSproc.h" #include "compiler.h" #include "xf86Cursor.h" #include "mipointer.h" #include "micmap.h" #include "fourcc.h" #include "fb.h" #include "xf86Crtc.h" #include "xf86RandR12.h" #include "xf86cmap.h" #include "vbe.h" #ifdef HAVE_DRI #define _XF86DRI_SERVER_ #include "xf86dri.h" #include "sarea.h" #include "dri.h" #include "drm_fourcc.h" #include "GL/glxint.h" #include "via_dri.h" #include "via_drmclient.h" #include "via_drm.h" #endif #include "exa.h" #include "via_memmgr.h" #include "via_regs.h" #include "via_kms.h" #include "via_ums.h" #include "via_dmabuffer.h" #include "via_3d.h" #include "via_xv.h" #include "via_xv_overlay.h" #include "via_eng_regs.h" #ifdef HAVE_PCIACCESS #include #else #include "xf86PciInfo.h" #endif #include #include "via_vt1632.h" #include "compat-api.h" #define VIA_AGP_UPL_SIZE (1024*128) #define VIA_DMA_DL_SIZE (1024*128) #define VIA_SCRATCH_SIZE (4*1024*1024) /* * Pixmap sizes below which we don't try to do hw accel. */ #define VIA_MIN_COMPOSITE 400 #define VIA_MIN_UPLOAD 4000 #define VIA_MIN_TEX_UPLOAD 200 #define VIA_MIN_DOWNLOAD 200 #define AGP_PAGE_SIZE 4096 #define AGP_PAGES 8192 #define AGP_SIZE (AGP_PAGE_SIZE * AGP_PAGES) #define DRIVER_NAME "openchrome" #define VIA_VERSION ((VIA_MAJOR_VERSION << 24) | (VIA_MINOR_VERSION << 16) | VIA_PATCHLEVEL) #define VIA_VQ_SIZE (256 * 1024) #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 #define VIA_RES_SHARED RES_SHARED_VGA #define VIA_RES_UNDEF RES_UNDEFINED #else #define VIA_RES_SHARED NULL #define VIA_RES_UNDEF NULL #endif /* Video Engines */ #define VIDEO_ENGINE_UNK 0 /* Unknown video engine */ #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 SR08, SR0A, SR0F; /* extended Sequencer registers */ CARD8 SR10, SR11, SR12, SR13,SR14,SR15,SR16; CARD8 SR17, SR18, SR19, SR1A,SR1B,SR1C,SR1D,SR1E; CARD8 SR1F, SR20, SR21, SR22,SR23,SR24,SR25,SR26; CARD8 SR27, SR28, SR29, SR2A,SR2B,SR2C,SR2D,SR2E; CARD8 SR2F, SR30, SR31, SR32,SR33,SR34,SR40,SR41; CARD8 SR42, SR43, SR44, SR45,SR46,SR47,SR48,SR49; CARD8 SR4A, SR4B, SR4C, SR4D; /* extended CRTC registers */ CARD8 CR0C, CR0D; CARD8 CR13, CR30, CR31, CR32, CR33, CR34, CR35, CR36; CARD8 CR37, CR38, CR39, CR3A, CR40, CR41, CR42, CR43; CARD8 CR44, CR45, CR46, CR47, CR48, CR49, CR4A; CARD8 CR97, CR99, CR9B, CR9F, CRA0, CRA1, CRA2; CARD8 CRTCRegs[68]; /* CARD8 LCDRegs[0x40];*/ /* TMDS/LVDS Control */ CARD8 CRD2; } VIARegRec, *VIARegPtr; /* * variables that need to be shared among different screens. */ typedef struct { Bool b3DRegsInitialized; } ViaSharedRec, *ViaSharedPtr; enum dri_type { DRI_NONE, DRI_1, DRI_2 }; #ifdef HAVE_DRI #define VIA_XVMC_MAX_BUFFERS 2 #define VIA_XVMC_MAX_CONTEXTS 4 #define VIA_XVMC_MAX_SURFACES 20 typedef struct { struct buffer_object *memory_ref; unsigned long offsets[VIA_XVMC_MAX_BUFFERS]; } ViaXvMCSurfacePriv; typedef struct { drm_context_t drmCtx; } ViaXvMCContextPriv; typedef struct { XID contexts[VIA_XVMC_MAX_CONTEXTS]; XID surfaces[VIA_XVMC_MAX_SURFACES]; ViaXvMCSurfacePriv *sPrivs[VIA_XVMC_MAX_SURFACES]; ViaXvMCContextPriv *cPrivs[VIA_XVMC_MAX_CONTEXTS]; int nContexts,nSurfaces; drm_handle_t mmioBase,fbBase,sAreaBase; unsigned sAreaSize; drmAddress sAreaAddr; unsigned activePorts; }ViaXvMC, *ViaXvMCPtr; #endif typedef struct _twodContext { CARD32 mode; CARD32 cmd; CARD32 fgColor; CARD32 bgColor; CARD32 pattern0; CARD32 pattern1; CARD32 patternAddr; CARD32 keyControl; unsigned srcOffset; unsigned srcPitch; unsigned Bpp; unsigned bytesPPShift; Bool clipping; Bool dashed; int clipX1; int clipX2; int clipY1; int clipY2; } ViaTwodContext; typedef struct{ /* textMode */ CARD8 *state, *pstate; /* SVGA state */ int statePage, stateSize, stateMode; /* vbe version */ int major, minor; } ViaVbeModeInfo; typedef struct _VIA { VIARegRec SavedReg; int Bpp, Bpl; Bool KMS; Bool FirstInit; unsigned long videoRambytes; int FBFreeStart; int FBFreeEnd; int driSize; int maxDriSize; struct buffer_object *vq_bo; int VQStart; int VQEnd; /* These are physical addresses. */ unsigned long FrameBufferBase; unsigned long MmioBase; /* These are linear addresses. */ unsigned char* MapBase; unsigned char* MpegMapBase; unsigned char* BltBase; unsigned char* MapBaseDense; unsigned char* FBBase; CARD8 MemClk; /* Here are all the Options */ Bool VQEnable; Bool NoAccel; Bool shadowFB; Rotation rotate; Bool vbeSR; int agpMem; CreateScreenResourcesProcPtr CreateScreenResources; CloseScreenProcPtr CloseScreen; #ifdef HAVE_PCIACCESS struct pci_device *PciInfo; #else pciVideoPtr PciInfo; PCITAG PciTag; #endif int Chipset; int ChipId; int ChipRev; int EntityIndex; /* vbe */ vbeInfoPtr pVbe; ViaVbeModeInfo vbeMode; Bool useVBEModes; Bool useLegacyVBE; /* Support for shadowFB and rotation */ unsigned char* ShadowPtr; /* Support for EXA acceleration */ ViaTwodContext td; Via3DState v3d; Via3DState *lastToUpload; ViaCommandBuffer cb; int accelMarker; struct buffer_object *exa_sync_bo; struct buffer_object *exaMem; CARD32 markerOffset; void *markerBuf; CARD32 curMarker; CARD32 lastMarkerRead; Bool agpDMA; Bool nPOT[VIA_NUM_TEXUNITS]; const unsigned *HqvCmeRegs; ExaDriverPtr exaDriverPtr; ExaOffscreenArea *exa_scratch; unsigned int exa_scratch_next; Bool useEXA; void *maskP; CARD32 maskFormat; Bool componentAlpha; void *srcP; CARD32 srcFormat; unsigned scratchOffset; int exaScratchSize; char * scratchAddr; Bool noComposite; struct buffer_object *scratchBuffer; #ifdef HAVE_DRI struct buffer_object *texAGPBuffer; char * dBounce; #endif /* Rotation */ Bool RandRRotation; /* BIOS Info Ptr */ VIABIOSInfoPtr pBIOSInfo; struct ViaCardIdStruct* Id; /* I2C & DDC */ I2CBusPtr pI2CBus1; I2CBusPtr pI2CBus2; I2CBusPtr pI2CBus3; /* MHS */ Bool IsSecondary; Bool HasSecondary; Bool SAMM; drmmode_rec drmmode; enum dri_type directRenderingType; #ifdef HAVE_DRI Bool XvMCEnabled; DRIInfoPtr pDRIInfo; int numVisualConfigs; __GLXvisualConfig* pVisualConfigs; VIAConfigPrivPtr pVisualConfigsPriv; drm_handle_t agpHandle; drm_handle_t registerHandle; drm_handle_t frameBufferHandle; unsigned long agpAddr; drmAddress agpMappedAddr; unsigned int agpSize; Bool IsPCI; ViaXvMC xvmc; int drmVerMajor; int drmVerMinor; int drmVerPL; struct buffer_object *driOffScreenMem; void * driOffScreenSave; #endif Bool DRIIrqEnable; Bool agpEnable; Bool dma2d; Bool dmaXV; CARD8 ActiveDevice; /* Option */ /* Video */ int VideoEngine; swovRec swov; CARD32 VideoStatus; VIAHWDiff HWDiff; unsigned long dwV1, dwV3; unsigned long dwFrameNum; CARD32* VidRegBuffer; /* Temporary buffer for video overlay registers. */ unsigned long VidRegCursor; /* Write cursor for VidRegBuffer. */ unsigned long old_dwUseExtendedFIFO; ViaSharedPtr sharedData; Bool useDmaBlit; void *displayMap; CARD32 displayOffset; CARD8 I2CDevices; /* Option */ #ifdef HAVE_DEBUG Bool disableXvBWCheck; Bool DumpVGAROM; Bool PrintVGARegs; Bool PrintTVRegs; Bool I2CScan; #endif /* HAVE_DEBUG */ Bool UseLegacyModeSwitch; video_via_regs* VideoRegs; } VIARec, *VIAPtr; #define VIAPTR(p) ((VIAPtr)((p)->driverPrivate)) typedef struct { Bool IsDRIEnabled; Bool HasSecondary; Bool BypassSecondary; /*These two registers are used to make sure the CRTC2 is restored before CRTC_EXT, otherwise it could lead to blank screen.*/ Bool IsSecondaryRestored; Bool RestorePrimary; ScrnInfoPtr pSecondaryScrn; ScrnInfoPtr pPrimaryScrn; } VIAEntRec, *VIAEntPtr; /* In via_exa.c. */ Bool viaInitExa(ScreenPtr pScreen); Bool viaAccelSetMode(int bpp, ViaTwodContext * tdc); void viaAccelSync(ScrnInfoPtr); void viaExitAccel(ScreenPtr); void viaFinishInitAccel(ScreenPtr); Bool viaOrder(CARD32 val, CARD32 * shift); CARD32 viaBitExpandHelper(CARD32 pixel, CARD32 bits); Bool viaCheckUpload(ScrnInfoPtr pScrn, Via3DState * v3d); void viaPixelARGB8888(unsigned format, void *pixelP, CARD32 * argb8888); Bool viaExpandablePixel(int format); void viaAccelFillPixmap(ScrnInfoPtr, unsigned long, unsigned long, int, int, int, int, int, unsigned long); void viaAccelTextureBlit(ScrnInfoPtr, unsigned long, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned, unsigned long, unsigned, unsigned, unsigned, unsigned, int); #ifdef VIA_DEBUG_COMPOSITE void viaExaCompositePictDesc(PicturePtr pict, char *string, int n); void viaExaPrintCompositeInfo(char *info, CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst); #endif /* In via_exa_h2.c */ Bool viaExaPrepareSolid_H2(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg); void viaExaSolid_H2(PixmapPtr pPixmap, int x1, int y1, int x2, int y2); void viaExaDoneSolidCopy_H2(PixmapPtr pPixmap); Bool viaExaPrepareCopy_H2(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, int ydir, int alu, Pixel planeMask); void viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, int width, int height); Bool viaExaCheckComposite_H2(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture); Bool viaExaPrepareComposite_H2(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst); void viaExaComposite_H2(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height); int viaAccelMarkSync_H2(ScreenPtr); /* In via_exa_h6.c */ Bool viaExaPrepareSolid_H6(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg); void viaExaSolid_H6(PixmapPtr pPixmap, int x1, int y1, int x2, int y2); void viaExaDoneSolidCopy_H6(PixmapPtr pPixmap); Bool viaExaPrepareCopy_H6(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, int ydir, int alu, Pixel planeMask); void viaExaCopy_H6(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, int width, int height); Bool viaExaCheckComposite_H6(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture); Bool viaExaPrepareComposite_H6(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst); void viaExaComposite_H6(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height); int viaAccelMarkSync_H6(ScreenPtr); /* 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); /* 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_memcpy.c */ typedef void (*vidCopyFunc)(unsigned char *, const unsigned char *, int, int, int, int); extern vidCopyFunc viaVidCopyInit( char *copyType, ScreenPtr pScreen ); /* In via_xwmc.c */ #ifdef HAVE_DRI /* Basic init and exit functions */ void ViaInitXVMC(ScreenPtr pScreen); void ViaCleanupXVMC(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr *XvAdaptors, int XvAdaptorCount); int viaXvMCInitXv(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt); /* Returns the size of the fake Xv Image used as XvMC command buffer to the X server*/ unsigned long viaXvMCPutImageSize(ScrnInfoPtr pScrn); #endif /* via_i2c.c */ void ViaI2CInit(ScrnInfoPtr pScrn); #ifdef HAVE_DRI Bool VIADRI1ScreenInit(ScreenPtr pScreen); void VIADRICloseScreen(ScreenPtr pScreen); Bool VIADRIFinishScreenInit(ScreenPtr pScreen); void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn); Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn); void viaDRIOffscreenRestore(ScrnInfoPtr pScrn); void viaDRIOffscreenSave(ScrnInfoPtr pScrn); 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); void ViaDisplayEnableSimultaneous(ScrnInfoPtr pScrn); #endif /* _VIA_DRIVER_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_drm.h000066400000000000000000000235471267025031400234210ustar00rootroot00000000000000/* * 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 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. */ #ifndef _VIA_DRM_H_ #define _VIA_DRM_H_ #include "drm.h" /* WARNING: These defines must be the same as what the Xserver uses. * if you change them, you must change the defines in the Xserver. */ #ifndef _VIA_DEFINES_ #define _VIA_DEFINES_ #define VIA_NR_SAREA_CLIPRECTS 8 #define VIA_NR_XVMC_PORTS 10 #define VIA_NR_XVMC_LOCKS 5 #define VIA_MAX_CACHELINE_SIZE 64 #define XVMCLOCKPTR(saPriv,lockNo) \ ((volatile struct drm_hw_lock *)(((((unsigned long) (saPriv)->XvMCLockArea) + \ (VIA_MAX_CACHELINE_SIZE - 1)) & \ ~(VIA_MAX_CACHELINE_SIZE - 1)) + \ VIA_MAX_CACHELINE_SIZE*(lockNo))) /* Each region is a minimum of 64k, and there are at most 64 of them. */ #define VIA_NR_TEX_REGIONS 64 #define VIA_LOG_MIN_TEX_REGION_SIZE 16 #endif #define VIA_UPLOAD_TEX0IMAGE 0x1 /* handled clientside */ #define VIA_UPLOAD_TEX1IMAGE 0x2 /* handled clientside */ #define VIA_UPLOAD_CTX 0x4 #define VIA_UPLOAD_BUFFERS 0x8 #define VIA_UPLOAD_TEX0 0x10 #define VIA_UPLOAD_TEX1 0x20 #define VIA_UPLOAD_CLIPRECTS 0x40 #define VIA_UPLOAD_ALL 0xff /* VIA specific ioctls */ #define DRM_VIA_ALLOCMEM 0x00 #define DRM_VIA_FREEMEM 0x01 #define DRM_VIA_AGP_INIT 0x02 #define DRM_VIA_FB_INIT 0x03 #define DRM_VIA_MAP_INIT 0x04 #define DRM_VIA_DEC_FUTEX 0x05 #define DRM_VIA_OLD_GEM_CREATE 0x06 #define DRM_VIA_DMA_INIT 0x07 #define DRM_VIA_CMDBUFFER 0x08 #define DRM_VIA_FLUSH 0x09 #define DRM_VIA_PCICMD 0x0a #define DRM_VIA_CMDBUF_SIZE 0x0b #define NOT_USED #define DRM_VIA_WAIT_IRQ 0x0d #define DRM_VIA_DMA_BLIT 0x0e #define DRM_VIA_BLIT_SYNC 0x0f /* KMS ioctls */ #define DRM_VIA_GETPARAM 0x10 #define DRM_VIA_SETPARAM 0x11 #define DRM_VIA_GEM_CREATE 0x12 #define DRM_VIA_GEM_WAIT 0x13 #define DRM_VIA_GEM_STATE 0x14 #define DRM_IOCTL_VIA_ALLOCMEM DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_ALLOCMEM, drm_via_mem_t) #define DRM_IOCTL_VIA_FREEMEM DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_FREEMEM, drm_via_mem_t) #define DRM_IOCTL_VIA_AGP_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_AGP_INIT, drm_via_agp_t) #define DRM_IOCTL_VIA_FB_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_FB_INIT, drm_via_fb_t) #define DRM_IOCTL_VIA_MAP_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_MAP_INIT, drm_via_init_t) #define DRM_IOCTL_VIA_DEC_FUTEX DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_DEC_FUTEX, drm_via_futex_t) #define DRM_IOCTL_VIA_OLD_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_OLD_GEM_CREATE, struct drm_via_gem_object) #define DRM_IOCTL_VIA_DMA_INIT DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_DMA_INIT, drm_via_dma_init_t) #define DRM_IOCTL_VIA_CMDBUFFER DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_CMDBUFFER, drm_via_cmdbuffer_t) #define DRM_IOCTL_VIA_FLUSH DRM_IO( DRM_COMMAND_BASE + DRM_VIA_FLUSH) #define DRM_IOCTL_VIA_PCICMD DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_PCICMD, drm_via_cmdbuffer_t) #define DRM_IOCTL_VIA_CMDBUF_SIZE DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_CMDBUF_SIZE, \ drm_via_cmdbuf_size_t) #define DRM_IOCTL_VIA_WAIT_IRQ DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_WAIT_IRQ, drm_via_irqwait_t) #define DRM_IOCTL_VIA_DMA_BLIT DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_DMA_BLIT, drm_via_dmablit_t) #define DRM_IOCTL_VIA_BLIT_SYNC DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_BLIT_SYNC, drm_via_blitsync_t) /* KMS ioctls */ #define DRM_IOCTL_VIA_GETPARAM DRM_IOR(DRM_COMMAND_BASE + DRM_VIA_GETPARAM, struct drm_via_param) #define DRM_IOCTL_VIA_SETPARAM DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_SETPARAM, struct drm_via_param) #define DRM_IOCTL_VIA_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_GEM_CREATE, struct drm_via_gem_object) #define DRM_IOCTL_VIA_GEM_WAIT DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_GEM_WAIT, struct drm_via_gem_wait) #define DRM_IOCTL_VIA_GEM_STATE DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_GEM_STATE, struct drm_via_gem_object) /* Indices into buf.Setup where various bits of state are mirrored per * context and per buffer. These can be fired at the card as a unit, * or in a piecewise fashion as required. */ #define VIA_TEX_SETUP_SIZE 8 /* Flags for clear ioctl */ #define VIA_FRONT 0x1 #define VIA_BACK 0x2 #define VIA_DEPTH 0x4 #define VIA_STENCIL 0x8 #define VIA_MEM_VIDEO 0 /* matches drm constant */ #define VIA_MEM_AGP 1 /* matches drm constant */ #define VIA_MEM_SYSTEM 2 #define VIA_MEM_MIXED 3 #define VIA_MEM_UNKNOWN 4 typedef struct { __u32 offset; __u32 size; } drm_via_agp_t; typedef struct { __u32 offset; __u32 size; } drm_via_fb_t; typedef struct { __u32 context; __u32 type; __u32 size; unsigned long index; unsigned long offset; } drm_via_mem_t; typedef struct _drm_via_init { enum { VIA_INIT_MAP = 0x01, VIA_CLEANUP_MAP = 0x02 } func; unsigned long sarea_priv_offset; unsigned long fb_offset; unsigned long mmio_offset; unsigned long agpAddr; } drm_via_init_t; typedef struct _drm_via_futex { enum { VIA_FUTEX_WAIT = 0x00, VIA_FUTEX_WAKE = 0X01 } func; __u32 ms; __u32 lock; __u32 val; } drm_via_futex_t; typedef struct _drm_via_dma_init { enum { VIA_INIT_DMA = 0x01, VIA_CLEANUP_DMA = 0x02, VIA_DMA_INITIALIZED = 0x03 } func; unsigned long offset; unsigned long size; unsigned long reg_pause_addr; } drm_via_dma_init_t; typedef struct _drm_via_cmdbuffer { char __user *buf; unsigned long size; } drm_via_cmdbuffer_t; /* Warning: If you change the SAREA structure you must change the Xserver * structure as well */ typedef struct _drm_via_tex_region { unsigned char next, prev; /* indices to form a circular LRU */ unsigned char inUse; /* owned by a client, or free? */ int age; /* tracked by clients to update local LRU's */ } drm_via_tex_region_t; typedef struct _drm_via_sarea { unsigned int dirty; unsigned int nbox; struct drm_clip_rect boxes[VIA_NR_SAREA_CLIPRECTS]; drm_via_tex_region_t texList[VIA_NR_TEX_REGIONS + 1]; int texAge; /* last time texture was uploaded */ int ctxOwner; /* last context to upload state */ int vertexPrim; /* * Below is for XvMC. * We want the lock integers alone on, and aligned to, a cache line. * Therefore this somewhat strange construct. */ char XvMCLockArea[VIA_MAX_CACHELINE_SIZE * (VIA_NR_XVMC_LOCKS + 1)]; unsigned int XvMCDisplaying[VIA_NR_XVMC_PORTS]; unsigned int XvMCSubPicOn[VIA_NR_XVMC_PORTS]; unsigned int XvMCCtxNoGrabbed; /* Last context to hold decoder */ /* Used by the 3d driver only at this point, for pageflipping: */ unsigned int pfCurrentOffset; } drm_via_sarea_t; typedef struct _drm_via_cmdbuf_size { enum { VIA_CMDBUF_SPACE = 0x01, VIA_CMDBUF_LAG = 0x02 } func; int wait; __u32 size; } drm_via_cmdbuf_size_t; typedef enum { VIA_IRQ_ABSOLUTE = 0x0, VIA_IRQ_RELATIVE = 0x1, VIA_IRQ_SIGNAL = 0x10000000, VIA_IRQ_FORCE_SEQUENCE = 0x20000000 } via_irq_seq_type_t; #define VIA_IRQ_FLAGS_MASK 0xF0000000 enum drm_via_irqs { drm_via_irq_hqv0 = 0, drm_via_irq_hqv1, drm_via_irq_dma0_dd, drm_via_irq_dma0_td, drm_via_irq_dma1_dd, drm_via_irq_dma1_td, drm_via_irq_num }; struct drm_via_wait_irq_request { unsigned irq; via_irq_seq_type_t type; __u32 sequence; __u32 signal; }; typedef union drm_via_irqwait { struct drm_via_wait_irq_request request; struct drm_wait_vblank_reply reply; } drm_via_irqwait_t; typedef struct drm_via_blitsync { __u32 sync_handle; unsigned engine; } drm_via_blitsync_t; /* - * Below,"flags" is currently unused but will be used for possible future * extensions like kernel space bounce buffers for bad alignments and * blit engine busy-wait polling for better latency in the absence of * interrupts. */ typedef struct drm_via_dmablit { __u32 num_lines; __u32 line_length; __u32 fb_addr; __u32 fb_stride; unsigned char *mem_addr; __u32 mem_stride; __u32 flags; int to_fb; drm_via_blitsync_t sync; } drm_via_dmablit_t; /* Ioctl to query kernel params: */ #define VIA_PARAM_CHIPSET_ID 0 #define VIA_PARAM_REVISION_ID 1 struct drm_via_param { uint64_t param; uint64_t value; }; struct drm_via_gem_object { /** * Requested size for the object. * * The (page-aligned) allocated size for the object will be returned. */ uint64_t size; /* * Place the memory at the proper byte alignment. */ uint32_t alignment; /** * Format of data i.e tile pitch, for linear it is zero */ uint32_t pitch; /** * Give hints where to allocate this object. */ uint32_t domains; /** * chmod values applied to a buffer. */ uint32_t mode_t; /** * Offset to start of memory region. */ uint64_t offset; /** * Returned handle need to mmap the buffer. */ uint64_t map_handle; /** * Returned handle for the object. * * Object handles are nonzero. */ uint32_t handle; /** * Version to tell how to handle this data. */ uint32_t version; }; struct drm_via_gem_wait { /* the buffer object handle */ uint32_t handle; uint32_t no_wait; }; #endif /* _VIA_DRM_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_drmclient.h000066400000000000000000000065621267025031400246160ustar00rootroot00000000000000/* * Copyright (C) 2005 The Unichrome Project, 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. */ #ifndef _VIA_DRMCLIENT_H #define _VIA_DRMCLIENT_H #include "stdint.h" #include "drm.h" #include "xf86drm.h" #ifdef X_NEED_DRMLOCK #define drm_hw_lock_t drmLock #endif #define UNICHROME_LOCK(fd, lockNo, saPriv, context, lastcontext, ret) \ do { \ volatile drm_hw_lock_t *lockPtr = XVMCLOCKPTR((saPriv), (lockNo)); \ unsigned lockVal; \ DRM_CAS_RESULT(__ret); \ \ ret = 0; \ lockVal = lockPtr->lock & ~(DRM_LOCK_HELD | DRM_LOCK_CONT); \ DRM_CAS(lockPtr, lockVal, (context) | DRM_LOCK_HELD, __ret); \ if (__ret) { \ drm_via_futex_t fx; \ \ lockVal = lockPtr->lock; \ if (! (lockVal & DRM_LOCK_HELD)) continue; \ if ((lockVal & ~(DRM_LOCK_HELD | DRM_LOCK_CONT) ) \ == (context)) { \ lastcontext = lockVal & ~(DRM_LOCK_HELD | DRM_LOCK_CONT); \ break; \ } \ fx.val = lockVal | DRM_LOCK_CONT; \ DRM_CAS( lockPtr, lockVal, fx.val, __ret); \ lockVal = lockPtr->lock; \ if (__ret) continue; \ fx.func = VIA_FUTEX_WAIT; \ fx.lock = (lockNo); \ fx.ms = 10; \ ret = drmCommandWrite((fd), DRM_VIA_DEC_FUTEX, \ &fx,sizeof(fx)); \ lastcontext = lockVal; \ if (ret) break; \ continue; \ } else { \ lastcontext = lockVal; \ break; \ } \ } while (1) \ #define UNICHROME_UNLOCK(fd, lockNo, saPriv, context) \ do { \ volatile drm_hw_lock_t *lockPtr = XVMCLOCKPTR((saPriv), (lockNo)); \ \ if ((lockPtr->lock & ~DRM_LOCK_CONT) == \ ((context) | DRM_LOCK_HELD)) { \ DRM_CAS_RESULT(__ret); \ DRM_CAS(lockPtr,(context) | DRM_LOCK_HELD, context, __ret); \ if (__ret) { \ drm_via_futex_t fx; \ fx.func = VIA_FUTEX_WAKE; \ fx.lock = lockNo; \ DRM_CAS(lockPtr, (context) | DRM_LOCK_HELD | \ DRM_LOCK_CONT, \ context, __ret); \ drmCommandWrite((fd), DRM_VIA_DEC_FUTEX, &fx, \ sizeof(fx)); \ } \ } \ } while (0) \ #define UNICHROME_LOCK_DECODER1 0 #define UNICHROME_LOCK_DECODER2 1 #define UNICHROME_LOCK_HQV 4 #define __user #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_eng_regs.h000066400000000000000000000734771267025031400244370ustar00rootroot00000000000000/* * 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_ENG_REGS_H_ #define _VIA_H_ 1 #include #include #include #include #include #include /* Video status flag */ #define VIDEO_HIDE 0x00000000 /*Video off*/ #define VIDEO_SHOW 0x80000000 /*Video on*/ #define VIDEO_ACTIVE 0x10000000 /*Video active*/ #define VIDEO_MPEG_INUSE 0x08000000 /*Video is used with MPEG */ #define VIDEO_HQV_INUSE 0x04000000 /*Video is used with HQV*/ #define VIDEO_CAPTURE0_INUSE 0x02000000 /*Video is used with CAPTURE 0*/ #define VIDEO_CAPTURE1_INUSE 0x00000000 /*Video is used with CAPTURE 1*/ #define VIDEO_1_INUSE 0x01000000 /*Video 1 is used with software flip*/ #define VIDEO_3_INUSE 0x00000000 /*Video 3 is used with software flip*/ #define VIDEO_ON 0x00100000 #define MPEG_USE_V1 0x00010000 /*[16] : 1:MPEG use V1, 0:MPEG use V3*/ #define MPEG_USE_V3 0x00000000 /*[16] : 1:MPEG use V1, 0:MPEG use V3*/ #define MPEG_USE_HQV 0x00020000 /*[17] : 1:MPEG use HQV,0:MPEG not use HQV*/ #define MPEG_USE_HW_FLIP 0x00040000 /*[18] : 1:MPEG use H/W flip,0:MPEG use S/W flip*/ #define MPEG_USE_SW_FLIP 0x00000000 /*[18] : 1:MPEG use H/W flip,0:MPEG use S/W flip*/ #define CAP0_USE_V1 0x00001000 /*[12] : 1:Capture 0 use V1, 0:Capture 0 use V3*/ #define CAP0_USE_V3 0x00000000 /*[12] : 1:Capture 0 use V1, 0:Capture 0 use V3*/ #define CAP0_USE_HQV 0x00002000 /*[13] : 1:Capture 0 use HQV,0:Capture 0 not use HQV*/ #define CAP0_USE_HW_FLIP 0x00004000 /*[14] : 1:Capture 0 use H/W flip,0:Capture 0 use S/W flip*/ #define CAP0_USE_CCIR656 0x00008000 /*[15] : 1:Capture 0 use CCIR656,0:Capture 0 CCIR601*/ #define CAP1_USE_V1 0x00000100 /*[ 8] : 1:Capture 1 use V1, 0:Capture 1 use V3*/ #define CAP1_USE_V3 0x00000000 /*[ 8] : 1:Capture 1 use V1, 0:Capture 1 use V3*/ #define CAP1_USE_HQV 0x00000200 /*[ 9] : 1:Capture 1 use HQV,0:Capture 1 not use HQV*/ #define CAP1_USE_HW_FLIP 0x00000400 /*[10] : 1:Capture 1 use H/W flip,0:Capture 1 use S/W flip */ #define SW_USE_V1 0x00000010 /*[ 4] : 1:Capture 1 use V1, 0:Capture 1 use V3 */ #define SW_USE_V3 0x00000000 /*[ 4] : 1:Capture 1 use V1, 0:Capture 1 use V3 */ #define SW_USE_HQV 0x00000020 /*[ 5] : 1:Capture 1 use HQV,0:Capture 1 not use HQV */ /* #define VIDEO1_INUSE 0x00000010 //[ 4] : 1:Video 1 is used with S/W flip #define VIDEO1_USE_HQV 0x00000020 //[ 5] : 1:Video 1 use HQV with S/W flip #define VIDEO3_INUSE 0x00000001 //[ 0] : 1:Video 3 is used with S/W flip #define VIDEO3_USE_HQV 0x00000002 //[ 1] : 1:Video 3 use HQV with S/W flip */ /* H/W registers for Video Engine */ /* * bus master */ #define PCI_MASTER_ENABLE 0x01 #define PCI_MASTER_SCATTER 0x00 #define PCI_MASTER_SINGLE 0x02 #define PCI_MASTER_GUI 0x00 #define PCI_MASTER_VIDEO 0x04 #define PCI_MASTER_INPUT 0x00 #define PCI_MASTER_OUTPUT 0x08 /* * video registers */ #define V_FLAGS 0x200 #define V_CAP_STATUS 0x204 #define V_FLIP_STATUS 0x204 #define V_ALPHA_WIN_START 0x208 #define V_ALPHA_WIN_END 0x20C #define V_ALPHA_CONTROL 0x210 #define V_CRT_STARTADDR 0x214 #define V_CRT_STARTADDR_2 0x218 #define V_ALPHA_STRIDE 0x21C #define V_COLOR_KEY 0x220 #define V_ALPHA_STARTADDR 0x224 #define V_CHROMAKEY_LOW 0x228 #define V_CHROMAKEY_HIGH 0x22C #define V1_CONTROL 0x230 #define V12_QWORD_PER_LINE 0x234 #define V1_STARTADDR_1 0x238 #define V1_STARTADDR_Y1 V1_STARTADDR_1 #define V1_STRIDE 0x23C #define V1_WIN_START_Y 0x240 #define V1_WIN_START_X 0x242 #define V1_WIN_END_Y 0x244 #define V1_WIN_END_X 0x246 #define V1_STARTADDR_2 0x248 #define V1_STARTADDR_Y2 V1_STARTADDR_2 #define V1_ZOOM_CONTROL 0x24C #define V1_MINI_CONTROL 0x250 #define V1_STARTADDR_0 0x254 #define V1_STARTADDR_Y0 V1_STARTADDR_0 #define V_FIFO_CONTROL 0x258 #define V1_STARTADDR_3 0x25C #define V1_STARTADDR_Y3 V1_STARTADDR_3 #define HI_CONTROL 0x260 #define SND_COLOR_KEY 0x264 #define ALPHA_V3_PREFIFO_CONTROL 0x268 #define V1_SOURCE_HEIGHT 0x26C #define HI_TRANSPARENT_COLOR 0x270 #define V_DISPLAY_TEMP 0x274 /* No use */ #define ALPHA_V3_FIFO_CONTROL 0x278 #define V3_SOURCE_WIDTH 0x27C #define V3_COLOR_KEY 0x280 #define V1_ColorSpaceReg_1 0x284 #define V1_ColorSpaceReg_2 0x288 #define V1_STARTADDR_CB0 0x28C #define V1_OPAQUE_CONTROL 0x290 /* To be deleted */ #define V3_OPAQUE_CONTROL 0x294 /* To be deleted */ #define V_COMPOSE_MODE 0x298 #define V3_STARTADDR_2 0x29C #define V3_CONTROL 0x2A0 #define V3_STARTADDR_0 0x2A4 #define V3_STARTADDR_1 0x2A8 #define V3_STRIDE 0x2AC #define V3_WIN_START_Y 0x2B0 #define V3_WIN_START_X 0x2B2 #define V3_WIN_END_Y 0x2B4 #define V3_WIN_END_X 0x2B6 #define V3_ALPHA_QWORD_PER_LINE 0x2B8 #define V3_ZOOM_CONTROL 0x2BC #define V3_MINI_CONTROL 0x2C0 #define V3_ColorSpaceReg_1 0x2C4 #define V3_ColorSpaceReg_2 0x2C8 #define V3_DISPLAY_TEMP 0x2CC /* No use */ #define V1_STARTADDR_CB1 0x2E4 #define V1_STARTADDR_CB2 0x2E8 #define V1_STARTADDR_CB3 0x2EC #define V1_STARTADDR_CR0 0x2F0 #define V1_STARTADDR_CR1 0x2F4 #define V1_STARTADDR_CR2 0x2F8 #define V1_STARTADDR_CR3 0x2FC /*CN400 and older Hardware Icon engine register*/ #define HI_POSSTART 0x208 #define HI_CENTEROFFSET 0x20C #define HI_FBOFFSET 0x224 #define HI_CONTROL 0x260 #define HI_TRANSPARENT_COLOR 0x270 #define HI_INVTCOLOR 0x274 /* VT3324 primary Hardware Icon engine register */ #define PRIM_HI_POSEND 0x290 #define V327_HI_INVTCOLOR 0x2E4 #define PRIM_HI_FIFO 0x2E8 #define PRIM_HI_TRANSCOLOR 0x2EC #define PRIM_HI_CTRL 0x2F0 #define PRIM_HI_FBOFFSET 0x2F4 #define PRIM_HI_POSSTART 0x2F8 #define PRIM_HI_CENTEROFFSET 0x2FC #define PRIM_HI_INVTCOLOR 0x120C /* Video Capture Engine Registers * Capture Port 1 */ #define CAP0_MASKS 0x100 #define CAP1_MASKS 0x104 #define CAP0_CONTROL 0x110 #define CAP0_H_RANGE 0x114 #define CAP0_V_RANGE 0x118 #define CAP0_SCAL_CONTROL 0x11C #define CAP0_VBI_H_RANGE 0x120 #define CAP0_VBI_V_RANGE 0x124 #define CAP0_VBI_STARTADDR 0x128 #define CAP0_VBI_STRIDE 0x12C #define CAP0_ANCIL_COUNT 0x130 #define CAP0_MAXCOUNT 0x134 #define CAP0_VBIMAX_COUNT 0x138 #define CAP0_DATA_COUNT 0x13C #define CAP0_FB_STARTADDR0 0x140 #define CAP0_FB_STARTADDR1 0x144 #define CAP0_FB_STARTADDR2 0x148 #define CAP0_STRIDE 0x150 /* Capture Port 2 */ #define CAP1_CONTROL 0x154 #define CAP1_SCAL_CONTROL 0x160 #define CAP1_VBI_H_RANGE 0x164 /*To be deleted*/ #define CAP1_VBI_V_RANGE 0x168 /*To be deleted*/ #define CAP1_VBI_STARTADDR 0x16C /*To be deleted*/ #define CAP1_VBI_STRIDE 0x170 /*To be deleted*/ #define CAP1_ANCIL_COUNT 0x174 /*To be deleted*/ #define CAP1_MAXCOUNT 0x178 #define CAP1_VBIMAX_COUNT 0x17C /*To be deleted*/ #define CAP1_DATA_COUNT 0x180 #define CAP1_FB_STARTADDR0 0x184 #define CAP1_FB_STARTADDR1 0x188 #define CAP1_STRIDE 0x18C /* SUBPICTURE Registers */ #define SUBP_CONTROL_STRIDE 0x3C0 #define SUBP_STARTADDR 0x3C4 #define RAM_TABLE_CONTROL 0x3C8 #define RAM_TABLE_READ 0x3CC /* HQV Registers*/ #define HQV_CONTROL 0x3D0 #define HQV_SRC_STARTADDR_Y 0x3D4 #define HQV_SRC_STARTADDR_U 0x3D8 #define HQV_SRC_STARTADDR_V 0x3DC #define HQV_SRC_FETCH_LINE 0x3E0 #define HQV_FILTER_CONTROL 0x3E4 #define HQV_MINIFY_CONTROL 0x3E8 #define HQV_DST_STARTADDR0 0x3EC #define HQV_DST_STARTADDR1 0x3F0 #define HQV_DST_STARTADDR2 0x3FC #define HQV_DST_STRIDE 0x3F4 #define HQV_SRC_STRIDE 0x3F8 #define HQV_H_SCALE_CONTROL 0x3B0 #define HQV_V_SCALE_CONTROL 0x3B4 #define PRO_HQV1_OFFSET 0x1000 /* * Video command definition */ /* #define V_ALPHA_CONTROL 0x210 */ #define ALPHA_WIN_EXPIRENUMBER_4 0x00040000 #define ALPHA_WIN_CONSTANT_FACTOR_4 0x00004000 #define ALPHA_WIN_CONSTANT_FACTOR_12 0x0000c000 #define ALPHA_WIN_BLENDING_CONSTANT 0x00000000 #define ALPHA_WIN_BLENDING_ALPHA 0x00000001 #define ALPHA_WIN_BLENDING_GRAPHIC 0x00000002 #define ALPHA_WIN_PREFIFO_THRESHOLD_12 0x000c0000 #define ALPHA_WIN_FIFO_THRESHOLD_8 0x000c0000 #define ALPHA_WIN_FIFO_DEPTH_16 0x00100000 /* V_CHROMAKEY_LOW 0x228 */ #define V_CHROMAKEY_V3 0x80000000 /* V1_CONTROL 0x230 */ #define V1_ENABLE 0x00000001 #define V1_FULL_SCREEN 0x00000002 #define V1_YUV422 0x00000000 #define V1_RGB32 0x00000004 #define V1_RGB15 0x00000008 #define V1_RGB16 0x0000000C #define V1_YCbCr420 0x00000010 #define V1_COLORSPACE_SIGN 0x00000080 #define V1_SRC_IS_FIELD_PIC 0x00000200 #define V1_SRC_IS_FRAME_PIC 0x00000000 #define V1_BOB_ENABLE 0x00400000 #define V1_FIELD_BASE 0x00000000 #define V1_FRAME_BASE 0x01000000 #define V1_SWAP_SW 0x00000000 #define V1_SWAP_HW_HQV 0x02000000 #define V1_SWAP_HW_CAPTURE 0x04000000 #define V1_SWAP_HW_MC 0x06000000 /* #define V1_DOUBLE_BUFFERS 0x00000000 */ /* #define V1_QUADRUPLE_BUFFERS 0x18000000 */ #define V1_EXPIRE_NUM 0x00050000 #define V1_EXPIRE_NUM_A 0x000a0000 #define V1_EXPIRE_NUM_F 0x000f0000 /* jason */ #define V1_FIFO_EXTENDED 0x00200000 #define V1_ON_PRI 0x00000000 #define V1_ON_SND_DISPLAY 0x80000000 #define V1_FIFO_32V1_32V2 0x00000000 #define V1_FIFO_48V1_32V2 0x00200000 #define V1_PREFETCH_ON_3336 0x40000000 /*V1_PREFETCH_ON*/ #define V1_GAMMA_ENABLE_3336 0x20000000 /*V1_Gamma_ENABLE*/ /* V12_QWORD_PER_LINE 0x234 */ #define V1_FETCH_COUNT 0x3ff00000 #define V1_FETCHCOUNT_ALIGNMENT 0x0000000f #define V1_FETCHCOUNT_UNIT 0x00000004 /* Doubld QWORD */ /* V1_STRIDE */ #define V1_STRIDE_YMASK 0x00001fff #define V1_STRIDE_UVMASK 0x1ff00000 /* V1_ZOOM_CONTROL 0x24C */ #define V1_X_ZOOM_ENABLE 0x80000000 #define V1_Y_ZOOM_ENABLE 0x00008000 /* V1_MINI_CONTROL 0x250 */ #define V1_X_INTERPOLY 0x00000002 /* X interpolation */ #define V1_Y_INTERPOLY 0x00000001 /* Y interpolation */ #define V1_YCBCR_INTERPOLY 0x00000004 /* Y, Cb, Cr all interpolation */ #define V1_X_DIV_2 0x01000000 #define V1_X_DIV_4 0x03000000 #define V1_X_DIV_8 0x05000000 #define V1_X_DIV_16 0x07000000 #define V1_Y_DIV_2 0x00010000 #define V1_Y_DIV_4 0x00030000 #define V1_Y_DIV_8 0x00050000 #define V1_Y_DIV_16 0x00070000 /* V1_STARTADDR0 0x254 */ #define SW_FLIP_ODD 0x08000000 /* V_FIFO_CONTROL 0x258 * IA2 has 32 level FIFO for packet mode video format * 32 level FIFO for planar mode video YV12. with extension reg 230 bit 21 enable * 16 level FIFO for planar mode video YV12. with extension reg 230 bit 21 disable * BCos of 128 bits. 1 level in IA2 = 2 level in VT3122 */ #define V1_FIFO_DEPTH12 0x0000000B #define V1_FIFO_DEPTH16 0x0000000F #define V1_FIFO_DEPTH32 0x0000001F #define V1_FIFO_DEPTH48 0x0000002F #define V1_FIFO_DEPTH64 0x0000003F #define V1_FIFO_THRESHOLD6 0x00000600 #define V1_FIFO_THRESHOLD8 0x00000800 #define V1_FIFO_THRESHOLD12 0x00000C00 #define V1_FIFO_THRESHOLD16 0x00001000 #define V1_FIFO_THRESHOLD24 0x00001800 #define V1_FIFO_THRESHOLD32 0x00002000 #define V1_FIFO_THRESHOLD40 0x00002800 #define V1_FIFO_THRESHOLD48 0x00003000 #define V1_FIFO_THRESHOLD56 0x00003800 #define V1_FIFO_THRESHOLD61 0x00003D00 #define V1_FIFO_PRETHRESHOLD10 0x0A000000 #define V1_FIFO_PRETHRESHOLD12 0x0C000000 #define V1_FIFO_PRETHRESHOLD29 0x1d000000 #define V1_FIFO_PRETHRESHOLD40 0x28000000 #define V1_FIFO_PRETHRESHOLD44 0x2c000000 #define V1_FIFO_PRETHRESHOLD56 0x38000000 #define V1_FIFO_PRETHRESHOLD61 0x3D000000 #define VIDEO_FIFO_DEPTH_VT3336 225 #define VIDEO_FIFO_THRESHOLD_VT3336 200 #define VIDEO_FIFO_PRETHRESHOLD_VT3336 250 #define VIDEO_EXPIRE_NUM_VT3336 31 /* Those values are only valid for IGA1 */ #define VIDEO_FIFO_DEPTH_VT3409 400 #define VIDEO_FIFO_THRESHOLD_VT3409 320 #define VIDEO_FIFO_PRETHRESHOLD_VT3409 230 #define VIDEO_EXPIRE_NUM_VT3409 160 /* ALPHA_V3_FIFO_CONTROL 0x278 * IA2 has 32 level FIFO for packet mode video format * 32 level FIFO for planar mode video YV12. with extension reg 230 bit 21 enable * 16 level FIFO for planar mode video YV12. with extension reg 230 bit 21 disable * 8 level FIFO for ALPHA * BCos of 128 bits. 1 level in IA2 = 2 level in VT3122 */ #define V3_FIFO_DEPTH16 0x0000000F #define V3_FIFO_DEPTH24 0x00000017 #define V3_FIFO_DEPTH32 0x0000001F #define V3_FIFO_DEPTH48 0x0000002F #define V3_FIFO_DEPTH64 0x0000003F #define V3_FIFO_THRESHOLD8 0x00000800 #define V3_FIFO_THRESHOLD12 0x00000C00 #define V3_FIFO_THRESHOLD16 0x00001000 #define V3_FIFO_THRESHOLD24 0x00001800 #define V3_FIFO_THRESHOLD29 0x00001D00 #define V3_FIFO_THRESHOLD32 0x00002000 #define V3_FIFO_THRESHOLD40 0x00002800 #define V3_FIFO_THRESHOLD48 0x00003000 #define V3_FIFO_THRESHOLD56 0x00003800 #define V3_FIFO_THRESHOLD61 0x00003D00 #define V3_FIFO_PRETHRESHOLD10 0x0000000A #define V3_FIFO_PRETHRESHOLD12 0x0000000C #define V3_FIFO_PRETHRESHOLD29 0x0000001d #define V3_FIFO_PRETHRESHOLD40 0x00000028 #define V3_FIFO_PRETHRESHOLD44 0x0000002c #define V3_FIFO_PRETHRESHOLD56 0x00000038 #define V3_FIFO_PRETHRESHOLD61 0x0000003D #define V3_FIFO_MASK 0x0000007F #define V3_FIFO_MASK_3314 0x000000FF #define ALPHA_FIFO_DEPTH8 0x00070000 #define ALPHA_FIFO_THRESHOLD4 0x04000000 #define ALPHA_FIFO_MASK 0xffff0000 #define ALPHA_FIFO_PRETHRESHOLD4 0x00040000 /* IA2 */ #define ColorSpaceValue_1 0x140020f2 #define ColorSpaceValue_2 0x0a0a2c00 #define ColorSpaceValue_1_3123C0 0x13000DED #define ColorSpaceValue_2_3123C0 0x13171000 #define ColorSpaceValue_1_32045 0x13000DED #define ColorSpaceValue_2_32045 0x13171000 /* For TV setting */ #define ColorSpaceValue_1TV 0x140020f2 #define ColorSpaceValue_2TV 0x0a0a2c00 /* V_COMPOSE_MODE 0x298 */ #define SELECT_VIDEO_IF_COLOR_KEY 0x00000001 /* select video if (color key),otherwise select graphics */ #define SELECT_VIDEO3_IF_COLOR_KEY 0x00000020 /* For 3123C0, select video3 if (color key),otherwise select graphics */ #define SELECT_VIDEO_IF_CHROMA_KEY 0x00000002 /* 0x0000000a //select video if (chroma key ),otherwise select graphics */ #define ALWAYS_SELECT_VIDEO 0x00000000 /* always select video,Chroma key and Color key disable */ #define COMPOSE_V1_V3 0x00000000 /* V1 on top of V3 */ #define COMPOSE_V3_V1 0x00100000 /* V3 on top of V1 */ #define COMPOSE_V1_TOP 0x00000000 #define COMPOSE_V3_TOP 0x00100000 #define V1_COMMAND_FIRE 0x80000000 /* V1 commands fire */ #define V3_COMMAND_FIRE 0x40000000 /* V3 commands fire */ #define V_COMMAND_LOAD 0x20000000 /* Video register always loaded */ #define V_COMMAND_LOAD_VBI 0x10000000 /* Video register always loaded at vbi without waiting source flip */ #define V3_COMMAND_LOAD 0x08000000 /* CLE_C0 Video3 register always loaded */ #define V3_COMMAND_LOAD_VBI 0x00000100 /* CLE_C0 Video3 register always loaded at vbi without waiting source flip */ #define SECOND_DISPLAY_COLOR_KEY_ENABLE 0x00010000 /* V3_ZOOM_CONTROL 0x2bc */ #define V3_X_ZOOM_ENABLE 0x80000000 #define V3_Y_ZOOM_ENABLE 0x00008000 /* V3_MINI_CONTROL 0x2c0 */ #define V3_X_INTERPOLY 0x00000002 /* X interpolation */ #define V3_Y_INTERPOLY 0x00000001 /* Y interpolation */ #define V3_YCBCR_INTERPOLY 0x00000004 /* Y, Cb, Cr all interpolation */ #define V3_X_DIV_2 0x01000000 #define V3_X_DIV_4 0x03000000 #define V3_X_DIV_8 0x05000000 #define V3_X_DIV_16 0x07000000 #define V3_Y_DIV_2 0x00010000 #define V3_Y_DIV_4 0x00030000 #define V3_Y_DIV_8 0x00050000 #define V3_Y_DIV_16 0x00070000 /* SUBP_CONTROL_STRIDE 0x3c0 */ #define SUBP_HQV_ENABLE 0x00010000 #define SUBP_IA44 0x00020000 #define SUBP_AI44 0x00000000 #define SUBP_STRIDE_MASK 0x00001fff #define SUBP_CONTROL_MASK 0x00070000 /* RAM_TABLE_CONTROL 0x3c8 */ #define RAM_TABLE_RGB_ENABLE 0x00000007 /* CAPTURE0_CONTROL 0x310 */ #define C0_ENABLE 0x00000001 #define BUFFER_2_MODE 0x00000000 #define BUFFER_3_MODE 0x00000004 #define BUFFER_4_MODE 0x00000006 #define SWAP_YUYV 0x00000000 #define SWAP_UYVY 0x00000100 #define SWAP_YVYU 0x00000200 #define SWAP_VYUY 0x00000300 #define IN_601_8 0x00000000 #define IN_656_8 0x00000010 #define IN_601_16 0x00000020 #define IN_656_16 0x00000030 #define DEINTER_ODD 0x00000000 #define DEINTER_EVEN 0x00001000 #define DEINTER_ODD_EVEN 0x00002000 #define DEINTER_FRAME 0x00003000 #define VIP_1 0x00000000 #define VIP_2 0x00000400 #define H_FILTER_2 0x00010000 #define H_FILTER_4 0x00020000 #define H_FILTER_8_1331 0x00030000 #define H_FILTER_8_12221 0x00040000 #define VIP_ENABLE 0x00000008 #define EN_FIELD_SIG 0x00000800 #define VREF_INVERT 0x00100000 #define FIELD_INPUT_INVERSE 0x00400000 #define FIELD_INVERSE 0x40000000 #define C1_H_MINI_EN 0x00000800 #define C0_H_MINI_EN 0x00000800 #define C1_V_MINI_EN 0x04000000 #define C0_V_MINI_EN 0x04000000 #define C1_H_MINI_2 0x00000400 /* CAPTURE1_CONTROL 0x354 */ #define C1_ENABLE 0x00000001 /* V3_CONTROL 0x2A0 */ #define V3_ENABLE 0x00000001 #define V3_FULL_SCREEN 0x00000002 #define V3_YUV422 0x00000000 #define V3_RGB32 0x00000004 #define V3_RGB15 0x00000008 #define V3_RGB16 0x0000000C #define V3_COLORSPACE_SIGN 0x00000080 #define V3_EXPIRE_NUM 0x00040000 #define V3_EXPIRE_NUM_F 0x000f0000 #define V3_EXPIRE_NUM_3204 0x00100000 #define V3_EXPIRE_NUM_3205 0x00080000 #define V3_BOB_ENABLE 0x00400000 #define V3_FIELD_BASE 0x00000000 #define V3_FRAME_BASE 0x01000000 #define V3_SWAP_SW 0x00000000 #define V3_SWAP_HW_HQV 0x02000000 #define V3_FLIP_HW_CAPTURE0 0x04000000 #define V3_FLIP_HW_CAPTURE1 0x06000000 /* V3_ALPHA_FETCH_COUNT 0x2B8 */ #define V3_FETCH_COUNT 0x3ff00000 #define ALPHA_FETCH_COUNT 0x000003ff /* HQV_CONTROL 0x3D0 */ #define HQV_RGB32 0x00000000 #define HQV_RGB16 0x20000000 #define HQV_RGB15 0x30000000 #define HQV_YUV422 0x80000000 #define HQV_YUV420 0xC0000000 #define HQV_ENABLE 0x08000000 #define HQV_SRC_SW 0x00000000 #define HQV_SRC_MC 0x01000000 #define HQV_SRC_CAPTURE0 0x02000000 #define HQV_SRC_CAPTURE1 0x03000000 #define HQV_FLIP_EVEN 0x00000000 #define HQV_FLIP_ODD 0x00000020 #define HQV_SW_FLIP 0x00000010 /* Write 1 to flip HQV buffer */ #define HQV_DEINTERLACE 0x00010000 /* First line of odd field will be repeated 3 times */ #define HQV_FIELD_2_FRAME 0x00020000 /* Src is field. Display each line 2 times */ #define HQV_FRAME_2_FIELD 0x00040000 /* Src is field. Display field */ #define HQV_FRAME_UV 0x00000000 /* Src is Non-interleaved */ #define HQV_FIELD_UV 0x00100000 /* Src is interleaved */ #define HQV_IDLE 0x00000008 #define HQV_FLIP_STATUS 0x00000001 #define HQV_DOUBLE_BUFF 0x00000000 #define HQV_TRIPLE_BUFF 0x04000000 #define HQV_SUBPIC_FLIP 0x00008000 #define HQV_FIFO_STATUS 0x00001000 #define HQV_GEN_IRQ 0x00000080 #define HQV_FIFO_DEPTH_1 0x00010000 /* for CME engine */ #define HQV_SW_FLIP_QUEUE_ENABLE 0x00100000 /* for hwDiff->dwNewScaleCtl */ #define HQV_H_SCALE_ENABLE 0x80000000 #define HQV_H_SCALE_UP 0x00000000 #define HQV_H_SCALE_DOWN_FOURTH_TO_1 0x10000000 #define HQV_H_SCALE_DOWN_FOURTH_TO_EIGHTH 0x20000000 #define HQV_H_SCALE_DOWN_UNDER_EIGHTH 0x30000000 #define HQV_V_SCALE_ENABLE 0x80000000 #define HQV_V_SCALE_UP 0x00000000 #define HQV_V_SCALE_DOWN 0x10000000 /* HQV Default Vodeo Color 0x3B8 */ #define HQV_FIX_COLOR 0x0643212c /* HQV_FILTER_CONTROL 0x3E4 */ #define HQV_H_LOWPASS_2TAP 0x00000001 #define HQV_H_LOWPASS_4TAP 0x00000002 #define HQV_H_LOWPASS_8TAP1 0x00000003 /* To be deleted */ #define HQV_H_LOWPASS_8TAP2 0x00000004 /* To be deleted */ #define HQV_H_HIGH_PASS 0x00000008 #define HQV_H_LOW_PASS 0x00000000 #define HQV_V_LOWPASS_2TAP 0x00010000 #define HQV_V_LOWPASS_4TAP 0x00020000 #define HQV_V_LOWPASS_8TAP1 0x00030000 #define HQV_V_LOWPASS_8TAP2 0x00040000 #define HQV_V_HIGH_PASS 0x00080000 #define HQV_V_LOW_PASS 0x00000000 #define HQV_H_HIPASS_F1_DEFAULT 0x00000040 #define HQV_H_HIPASS_F2_DEFAULT 0x00000000 #define HQV_V_HIPASS_F1_DEFAULT 0x00400000 #define HQV_V_HIPASS_F2_DEFAULT 0x00000000 #define HQV_H_HIPASS_F1_2TAP 0x00000050 #define HQV_H_HIPASS_F2_2TAP 0x00000100 #define HQV_V_HIPASS_F1_2TAP 0x00500000 #define HQV_V_HIPASS_F2_2TAP 0x01000000 #define HQV_H_HIPASS_F1_4TAP 0x00000060 #define HQV_H_HIPASS_F2_4TAP 0x00000200 #define HQV_V_HIPASS_F1_4TAP 0x00600000 #define HQV_V_HIPASS_F2_4TAP 0x02000000 #define HQV_H_HIPASS_F1_8TAP 0x00000080 #define HQV_H_HIPASS_F2_8TAP 0x00000400 #define HQV_V_HIPASS_F1_8TAP 0x00800000 #define HQV_V_HIPASS_F2_8TAP 0x04000000 /* IA2 NEW */ #define HQV_V_FILTER2 0x00080000 #define HQV_H_FILTER2 0x00000008 #define HQV_H_TAP2_11 0x00000041 #define HQV_H_TAP4_121 0x00000042 #define HQV_H_TAP4_1111 0x00000401 #define HQV_H_TAP8_1331 0x00000221 #define HQV_H_TAP8_12221 0x00000402 #define HQV_H_TAP16_1991 0x00000159 #define HQV_H_TAP16_141041 0x0000026A #define HQV_H_TAP32 0x0000015A #define HQV_V_TAP2_11 0x00410000 #define HQV_V_TAP4_121 0x00420000 #define HQV_V_TAP4_1111 0x04010000 #define HQV_V_TAP8_1331 0x02210000 #define HQV_V_TAP8_12221 0x04020000 #define HQV_V_TAP16_1991 0x01590000 #define HQV_V_TAP16_141041 0x026A0000 #define HQV_V_TAP32 0x015A0000 #define HQV_V_FILTER_DEFAULT 0x00420000 #define HQV_H_FILTER_DEFAULT 0x00000040 /* HQV_MINI_CONTROL 0x3E8 */ #define HQV_H_MINIFY_ENABLE 0x00000800 #define HQV_H_MINIFY_DOWN 0x00001000 #define HQV_V_MINIFY_ENABLE 0x08000000 #define HQV_V_MINIFY_DOWN 0x10000000 #define HQV_VDEBLOCK_FILTER 0x80000000 #define HQV_HDEBLOCK_FILTER 0x00008000 /* new added registers for VT3409.For some registers have different meanings * but the same address,we add postfix _409 to distinguish */ #define HQV_COLOR_ADJUSTMENT_PRE_CTRL1 0x360 #define HQV_COLOR_ADJUSTMENT_PRE_CTRL2 0x364 #define HQV_COLOR_ADJUSTMENT_PRE_CTRL3 0x368 #define HQV_COLOR_ADJUSTMENT_PRE_CTRL4 0x36C #define HQV_SRC_DATA_OFFSET_CTRL1_409 0x370 #define HQV_SRC_DATA_OFFSET_CTRL2_409 0x374 #define HQV_SRC_DATA_OFFSET_CTRL3_409 0x378 #define HQV_SRC_DATA_OFFSET_CTRL4_409 0x37C #define HQV_DST_DATA_OFFSET_CTRL1 0x380 #define HQV_DST_DATA_OFFSET_CTRL2 0x384 #define HQV_DST_DATA_OFFSET_CTRL3 0x388 #define HQV_DST_DATA_OFFSET_CTRL4 0x38C #define HQV_SHARPNESS_DECODER_HANDSHAKE_CTRL_410 0x3A4 #define HQV_RESIDUE_PIXEL_FRAME_STARTADDR 0x3BC #define HQV_BACKGROUND_DATA_OFFSET 0x3CC #define HQV_SUBP_HSCALE_CTRL 0x3E0 #define HQV_SUBP_VSCALE_CTRL 0x3E8 /* Add new HQV Registers for VT3353: */ #define HQV_SRC_DATA_OFFSET_CONTROL1 0x380 #define HQV_SRC_DATA_OFFSET_CONTROL2 0x384 #define HQV_SRC_DATA_OFFSET_CONTROL3 0x388 #define HQV_SRC_DATA_OFFSET_CONTROL4 0x38C #define HQV_HW_TUNING_PERFORMANCE 0x390 #define HQV_EXTENDED_CONTROL 0x394 #define HQV_STATIC_RECORD_FB_STARTADDR 0x398 #define HQV_STATIC_RECORD_FB_STRIDE 0x39C #define HQV_COLOR_ADJUSTMENT_CONTROL1 0x3A0 #define HQV_COLOR_ADJUSTMENT_CONTROL2 0x3A4 #define HQV_COLOR_ADJUSTMENT_CONTROL3 0x3A8 #define HQV_COLOR_ADJUSTMENT_CONTROL5 0x3AC #define HQV_DEFAULT_VIDEO_COLOR 0x3B8 #define CHROMA_KEY_LOW 0x00FFFFFF #define CHROMA_KEY_HIGH 0x00FFFFFF /* V_CAP_STATUS */ #define V_ST_UPDATE_NOT_YET 0x00000003 #define V1_ST_UPDATE_NOT_YET 0x00000001 #define V3_ST_UPDATE_NOT_YET 0x00000008 #define VBI_STATUS 0x00000002 /* * Macros for Video MMIO */ #ifndef V4L2 #define MPGOutD(port, data) *((volatile CARD32 *)(pVia->MpegMapBase +(port))) = (data) #define MPGInD(port) *((volatile CARD32 *)(pVia->MpegMapBase +(port))) #endif /* * Macros for GE MMIO */ #define GEInW(port) *((volatile CARD16 *)(lpGEMMIO + (port))) #define GEInD(port) *((volatile CARD32 *)(lpGEMMIO + (port))) #define GEOutW(port, data) *((volatile CARD16 *)(lpGEMMIO + (port))) = (data) #define GEOutD(port, data) *((volatile CARD32 *)(lpGEMMIO + (port))) = (data) /* * MPEG 1/2 Slice Engine (at 0xC00 relative to base) */ #define MPG_CONTROL 0x00 #define MPG_CONTROL_STRUCT 0x03 #define MPG_CONTROL_STRUCT_TOP 0x01 #define MPG_CONTROL_STRUCT_BOTTOM 0x02 #define MPG_CONTROL_STRUCT_FRAME 0x03 /* Use TOP if interlaced */ #define MPG_CONTROL_TYPE 0x3C #define MPG_CONTROL_TYPE_I (0x01 << 2) #define MPG_CONTROL_TYPE_B (0x02 << 2) #define MPG_CONTROL_TYPE_P (0x03 << 3) #define MPG_CONTROL_ALTSCAN 0x40 #define MPG_BLOCK 0x08 /* Unsure */ #define MPG_COMMAND 0x0C #define MPG_DATA1 0x10 #define MPG_DATA2 0x14 #define MPG_DATA3 0x18 #define MPG_DATA4 0x1C #define MPG_YPHYSICAL(x) (0x20 + 12*(x)) #define MPG_CbPHYSICAL(x) (0x24 + 12*(x)) #define MPG_CrPHYSICAL(x) (0x28 + 12*(x)) #define MPG_PITCH 0x50 #define MPG_STATUS 0x54 #define MPG_MATRIX_IDX 0x5C #define MPG_MATRIX_IDX_INTRA 0x00 #define MPG_MATRIX_IDX_NON 0x01 #define MPG_MATRIX_DATA 0x60 #define MPG_SLICE_CTRL_1 0x90 #define MPG_SLICE_MBAMAX 0x2FFF #define MPG_SLICE_PREDICTIVE_DCT 0x4000 #define MPG_SLICE_TOP_FIRST 0x8000 #define MPG_SLICE_MACROBLOCK_WIDTH(x) ((x)<<18) /* in 64's */ #define MPG_SLICE_CTRL_2 0x94 #define MPG_SLICE_CONCEAL_MVEC 0x0000001 #define MPG_SLICE_QSCALE_TYPE 0x0000002 #define MPG_SLICE_DCPRECISION 0x000000C #define MPG_SLICE_MACROBQUOT 0x0FFFFF0 #define MPG_SLICE_INTRAVLC 0x1000000 #define MPG_SLICE_CTRL_3 0x98 #define MPG_SLICE_FHMVR 0x0000003 #define MPG_SLICE_FVMVR 0x000000C #define MPG_SLICE_BHMVR 0x0000030 #define MPG_SLICE_BVMVR 0x00000C0 #define MPG_SLICE_SECOND_FIELD 0x0100000 #define MPG_SLICE_RESET 0x0400000 #define MPG_SLICE_LENGTH 0x9C #define MPG_SLICE_DATA 0xA0 #ifdef HAVE_PCIACCESS #define VIA_MEMBASE(p,n) (p)->regions[(n)].base_addr #define VENDOR_ID(p) (p)->vendor_id #define DEVICE_ID(p) (p)->device_id #define SUBVENDOR_ID(p) (p)->subvendor_id #define SUBSYS_ID(p) (p)->subdevice_id #define CHIP_REVISION(p) (p)->revision #else #define VIA_MEMBASE(p,n) (p)->memBase[n] #define VENDOR_ID(p) (p)->vendor #define DEVICE_ID(p) (p)->chipType #define SUBVENDOR_ID(p) (p)->subsysVendor #define SUBSYS_ID(p) (p)->subsysCard #define CHIP_REVISION(p) (p)->chipRev #endif #endif /* _VIA_ENG_REGS_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_exa.c000066400000000000000000000740401267025031400234010ustar00rootroot00000000000000/* * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. * Copyright 2006 Thomas Hellström. 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. */ /* * 2D acceleration functions for the VIA/S3G UniChrome IGPs. * * Mostly rewritten, and modified for EXA support, by Thomas Hellström. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "miline.h" #include #include #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. */ static void viaDumpDMA(ViaCommandBuffer *cb) { register CARD32 *bp = cb->buf; CARD32 *endp = bp + cb->pos; while (bp != endp) { if (((bp - cb->buf) & 3) == 0) { ErrorF("\n %04lx: ", (unsigned long)(bp - cb->buf)); } ErrorF("0x%08x ", (unsigned)*bp++); } ErrorF("\n"); } void viaFlushPCI(ViaCommandBuffer *cb) { register CARD32 *bp = cb->buf; CARD32 transSetting; CARD32 *endp = bp + cb->pos; unsigned loop = 0; register CARD32 offset = 0; register CARD32 value; VIAPtr pVia = VIAPTR(cb->pScrn); while (bp < endp) { if (*bp == HALCYON_HEADER2) { if (++bp == endp) return; VIASETREG(VIA_REG_TRANSET, transSetting = *bp++); while (bp < endp) { if ((transSetting != HC_ParaType_CmdVdata) && ((*bp == HALCYON_HEADER2) || (*bp & HALCYON_HEADER1MASK) == HALCYON_HEADER1)) break; VIASETREG(VIA_REG_TRANSPACE, *bp++); } } else if ((*bp & HALCYON_HEADER1MASK) == HALCYON_HEADER1) { while (bp < endp) { if (*bp == HALCYON_HEADER2) break; if (offset == 0) { /* * Not doing this wait will probably stall the processor * for an unacceptable amount of time in VIASETREG while * other high priority interrupts may be pending. */ switch (pVia->Chipset) { case VIA_VX800: case VIA_VX855: case VIA_VX900: while ((VIAGETREG(VIA_REG_STATUS) & (VIA_CMD_RGTR_BUSY_H5 | VIA_2D_ENG_BUSY_H5)) && (loop++ < MAXLOOP)) ; break; case VIA_P4M890: case VIA_K8M890: case VIA_P4M900: while ((VIAGETREG(VIA_REG_STATUS) & (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY)) && (loop++ < MAXLOOP)) ; break; default: while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_EMPTY) && (loop++ < MAXLOOP)) ; while ((VIAGETREG(VIA_REG_STATUS) & (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY)) && (loop++ < MAXLOOP)) ; } } offset = (*bp++ & 0x0FFFFFFF) << 2; value = *bp++; VIASETREG(offset, value); } } else { ErrorF("Command stream parser error.\n"); } } cb->pos = 0; cb->mode = 0; cb->has3dState = FALSE; } #ifdef HAVE_DRI /* * Flush the command buffer using DRM. If in PCI mode, we can bypass DRM, * but not for command buffers that contain 3D engine state, since then * the DRM command verifier will lose track of the 3D engine state. */ static void viaFlushDRIEnabled(ViaCommandBuffer *cb) { ScrnInfoPtr pScrn = cb->pScrn; VIAPtr pVia = VIAPTR(pScrn); char *tmp = (char *)cb->buf; int tmpSize; drm_via_cmdbuffer_t b; /* Align end of command buffer for AGP DMA. */ OUT_RING_H1(0x2f8, 0x67676767); if (pVia->agpDMA && cb->mode == 2 && cb->rindex != HC_ParaType_CmdVdata && (cb->pos & 1)) { OUT_RING(HC_DUMMY); } tmpSize = cb->pos * sizeof(CARD32); if (pVia->agpDMA || (pVia->directRenderingType && cb->has3dState)) { cb->mode = 0; cb->has3dState = FALSE; while (tmpSize > 0) { b.size = (tmpSize > VIA_DMASIZE) ? VIA_DMASIZE : tmpSize; tmpSize -= b.size; b.buf = tmp; tmp += b.size; if (drmCommandWrite(pVia->drmmode.fd, ((pVia->agpDMA) ? DRM_VIA_CMDBUFFER : DRM_VIA_PCICMD), &b, sizeof(b))) { ErrorF("DRM command buffer submission failed.\n"); viaDumpDMA(cb); return; } } cb->pos = 0; } else { viaFlushPCI(cb); } } #endif /* * Initialize a command buffer. Some fields are currently not used since they * are intended for Unichrome Pro group A video commands. */ static int viaSetupCBuffer(ScrnInfoPtr pScrn, ViaCommandBuffer *cb, unsigned size) { #ifdef HAVE_DRI VIAPtr pVia = VIAPTR(pScrn); #endif cb->pScrn = pScrn; cb->bufSize = ((size == 0) ? VIA_DMASIZE : size) >> 2; cb->buf = (CARD32 *) calloc(cb->bufSize, sizeof(CARD32)); if (!cb->buf) return BadAlloc; cb->waitFlags = 0; cb->pos = 0; cb->mode = 0; cb->header_start = 0; cb->rindex = 0; cb->has3dState = FALSE; cb->flushFunc = viaFlushPCI; #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { cb->flushFunc = viaFlushDRIEnabled; } #endif return Success; } /* * Free resources associated with a command buffer. */ static void viaTearDownCBuffer(ViaCommandBuffer *cb) { if (cb && cb->buf) { free(cb->buf); cb->buf = NULL; } } /* * Update our 2D state (TwoDContext) with a new mode. */ Bool viaAccelSetMode(int bpp, ViaTwodContext * tdc) { switch (bpp) { case 16: tdc->mode = VIA_GEM_16bpp; tdc->bytesPPShift = 1; return TRUE; case 32: tdc->mode = VIA_GEM_32bpp; tdc->bytesPPShift = 2; return TRUE; case 8: tdc->mode = VIA_GEM_8bpp; tdc->bytesPPShift = 0; return TRUE; default: tdc->bytesPPShift = 0; return FALSE; } } /* * Switch 2D state clipping on. */ void viaSetClippingRectangle(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2) { VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; tdc->clipping = TRUE; tdc->clipX1 = (x1 & 0xFFFF); tdc->clipY1 = y1; tdc->clipX2 = (x2 & 0xFFFF); tdc->clipY2 = y2; } /* * Check if we need to force upload of the whole 3D state (when other * clients or subsystems have touched the 3D engine). Also tell DRI * clients and subsystems that we have touched the 3D engine. */ Bool viaCheckUpload(ScrnInfoPtr pScrn, Via3DState * v3d) { VIAPtr pVia = VIAPTR(pScrn); Bool forceUpload; forceUpload = (pVia->lastToUpload != v3d); pVia->lastToUpload = v3d; #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { volatile drm_via_sarea_t *saPriv = (drm_via_sarea_t *) DRIGetSAREAPrivate(pScrn->pScreen); int myContext = DRIGetContext(pScrn->pScreen); forceUpload = forceUpload || (saPriv->ctxOwner != myContext); saPriv->ctxOwner = myContext; } #endif return forceUpload; } Bool viaOrder(CARD32 val, CARD32 * shift) { *shift = 0; while (val > (1 << *shift)) (*shift)++; return (val == (1 << *shift)); } /* * Helper for bitdepth expansion. */ CARD32 viaBitExpandHelper(CARD32 pixel, CARD32 bits) { CARD32 component, mask, tmp; component = pixel & ((1 << bits) - 1); mask = (1 << (8 - bits)) - 1; tmp = component << (8 - bits); return ((component & 1) ? (tmp | mask) : tmp); } /* * Extract the components from a pixel of the given format to an argb8888 pixel. * This is used to extract data from one-pixel repeat pixmaps. * Assumes little endian. */ void viaPixelARGB8888(unsigned format, void *pixelP, CARD32 * argb8888) { CARD32 bits, shift, pixel, bpp; bpp = PICT_FORMAT_BPP(format); if (bpp <= 8) { pixel = *((CARD8 *) pixelP); } else if (bpp <= 16) { pixel = *((CARD16 *) pixelP); } else { pixel = *((CARD32 *) pixelP); } switch (PICT_FORMAT_TYPE(format)) { case PICT_TYPE_A: bits = PICT_FORMAT_A(format); *argb8888 = viaBitExpandHelper(pixel, bits) << 24; return; case PICT_TYPE_ARGB: shift = 0; bits = PICT_FORMAT_B(format); *argb8888 = viaBitExpandHelper(pixel, bits); shift += bits; bits = PICT_FORMAT_G(format); *argb8888 |= viaBitExpandHelper(pixel >> shift, bits) << 8; shift += bits; bits = PICT_FORMAT_R(format); *argb8888 |= viaBitExpandHelper(pixel >> shift, bits) << 16; shift += bits; bits = PICT_FORMAT_A(format); *argb8888 |= ((bits) ? viaBitExpandHelper(pixel >> shift, bits) : 0xFF) << 24; return; case PICT_TYPE_ABGR: shift = 0; bits = PICT_FORMAT_B(format); *argb8888 = viaBitExpandHelper(pixel, bits) << 16; shift += bits; bits = PICT_FORMAT_G(format); *argb8888 |= viaBitExpandHelper(pixel >> shift, bits) << 8; shift += bits; bits = PICT_FORMAT_R(format); *argb8888 |= viaBitExpandHelper(pixel >> shift, bits); shift += bits; bits = PICT_FORMAT_A(format); *argb8888 |= ((bits) ? viaBitExpandHelper(pixel >> shift, bits) : 0xFF) << 24; return; default: break; } return; } Bool viaExpandablePixel(int format) { int formatType = PICT_FORMAT_TYPE(format); return (formatType == PICT_TYPE_A || formatType == PICT_TYPE_ABGR || formatType == PICT_TYPE_ARGB); } #ifdef VIA_DEBUG_COMPOSITE void viaExaCompositePictDesc(PicturePtr pict, char *string, int n) { char format[20]; char size[20]; if (!pict) { snprintf(string, n, "None"); return; } switch (pict->format) { case PICT_x8r8g8b8: snprintf(format, 20, "RGB8888"); break; case PICT_a8r8g8b8: snprintf(format, 20, "ARGB8888"); break; case PICT_r5g6b5: snprintf(format, 20, "RGB565 "); break; case PICT_x1r5g5b5: snprintf(format, 20, "RGB555 "); break; case PICT_a8: snprintf(format, 20, "A8 "); break; case PICT_a1: snprintf(format, 20, "A1 "); break; default: snprintf(format, 20, "0x%x", (int)pict->format); break; } if (pict->pDrawable) { snprintf(size, 20, "%dx%d%s", pict->pDrawable->width, pict->pDrawable->height, pict->repeat ? " R" : ""); snprintf(string, n, "0x%lx: fmt %s (%s)", (long)pict->pDrawable, format, size); } } void viaExaPrintCompositeInfo(char *info, CARD8 op, PicturePtr pSrc, PicturePtr pMask, PicturePtr pDst) { char sop[20]; char srcdesc[40], maskdesc[40], dstdesc[40]; switch (op) { case PictOpClear: sprintf(sop, "PictOpClear "); break; case PictOpSrc: sprintf(sop, "PictOpSrc "); break; case PictOpDst: sprintf(sop, "PictOpDst "); break; case PictOpOver: sprintf(sop, "PictOpOver "); break; case PictOpOutReverse: sprintf(sop, "PictOpOutReverse "); break; case PictOpAdd: sprintf(sop, "PictOpAdd "); break; default: sprintf(sop, "PictOp%d ", op); } viaExaCompositePictDesc(pSrc, srcdesc, 40); viaExaCompositePictDesc(pMask, maskdesc, 40); viaExaCompositePictDesc(pDst, dstdesc, 40); ErrorF("Composite fallback: %s, \n" " op %s, \n" " src %s, \n" " mask %s, \n" " dst %s, \n", info, sop, srcdesc, maskdesc, dstdesc); } #endif /* VIA_DEBUG_COMPOSITE */ /* * Wait for acceleration engines idle. An expensive way to sync. */ void viaAccelSync(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); int loop = 0; mem_barrier(); switch (pVia->Chipset) { case VIA_VX800: case VIA_VX855: case VIA_VX900: while ((VIAGETREG(VIA_REG_STATUS) & (VIA_CMD_RGTR_BUSY_H5 | VIA_2D_ENG_BUSY_H5 | VIA_3D_ENG_BUSY_H5)) && (loop++ < MAXLOOP)) ; break; case VIA_P4M890: case VIA_K8M890: case VIA_P4M900: while ((VIAGETREG(VIA_REG_STATUS) & (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && (loop++ < MAXLOOP)) ; break; default: while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_EMPTY) && (loop++ < MAXLOOP)) ; while ((VIAGETREG(VIA_REG_STATUS) & (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && (loop++ < MAXLOOP)) ; break; } } /* * Wait for the value to get blitted, or in the PCI case for engine idle. */ static void viaAccelWaitMarker(ScreenPtr pScreen, int marker) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); CARD32 uMarker = marker; if (pVia->agpDMA) { while ((pVia->lastMarkerRead - uMarker) > (1 << 24)) pVia->lastMarkerRead = *(CARD32 *) pVia->markerBuf; } else { viaAccelSync(pScrn); } } #ifdef HAVE_DRI static int viaAccelDMADownload(ScrnInfoPtr pScrn, unsigned long fbOffset, unsigned srcPitch, unsigned char *dst, unsigned dstPitch, unsigned w, unsigned h) { VIAPtr pVia = VIAPTR(pScrn); drm_via_dmablit_t blit[2], *curBlit; unsigned char *sysAligned = NULL; Bool doSync[2], useBounceBuffer; unsigned pitch, numLines[2]; int curBuf, err, i, ret, blitHeight; ret = 0; useBounceBuffer = (((unsigned long)dst & 15) || (dstPitch & 15)); doSync[0] = FALSE; doSync[1] = FALSE; curBuf = 1; blitHeight = h; pitch = dstPitch; if (useBounceBuffer) { pitch = ALIGN_TO(dstPitch, 16); blitHeight = VIA_DMA_DL_SIZE / pitch; } while (doSync[0] || doSync[1] || h != 0) { curBuf = 1 - curBuf; curBlit = &blit[curBuf]; if (doSync[curBuf]) { do { err = drmCommandWrite(pVia->drmmode.fd, DRM_VIA_BLIT_SYNC, &curBlit->sync, sizeof(curBlit->sync)); } while (err == -EAGAIN); if (err) return err; doSync[curBuf] = FALSE; if (useBounceBuffer) { for (i = 0; i < numLines[curBuf]; ++i) { memcpy(dst, curBlit->mem_addr, w); dst += dstPitch; curBlit->mem_addr += pitch; } } } if (h == 0) continue; curBlit->num_lines = (h > blitHeight) ? blitHeight : h; h -= curBlit->num_lines; numLines[curBuf] = curBlit->num_lines; sysAligned = (unsigned char *)pVia->dBounce + (curBuf * VIA_DMA_DL_SIZE); sysAligned = (unsigned char *) ALIGN_TO((unsigned long)sysAligned, 16); curBlit->mem_addr = (useBounceBuffer) ? sysAligned : dst; curBlit->line_length = w; curBlit->mem_stride = pitch; curBlit->fb_addr = fbOffset; curBlit->fb_stride = srcPitch; curBlit->to_fb = 0; fbOffset += curBlit->num_lines * srcPitch; do { err = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_DMA_BLIT, curBlit, sizeof(*curBlit)); } while (err == -EAGAIN); if (err) { ret = err; h = 0; continue; } doSync[curBuf] = TRUE; } return ret; } /* * Use PCI DMA if we can. If the system alignments don't match, we're using * an aligned bounce buffer for pipelined PCI DMA and memcpy. * Throughput for large transfers is around 65 MB/s. */ static Bool viaExaDownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, char *dst, int dst_pitch) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pSrc->drawable.pScreen); unsigned wBytes = (pSrc->drawable.bitsPerPixel * w + 7) >> 3; unsigned srcPitch = exaGetPixmapPitch(pSrc), srcOffset; char *bounceAligned = NULL; VIAPtr pVia = VIAPTR(pScrn); unsigned totSize; if (!w || !h) return TRUE; srcOffset = x * pSrc->drawable.bitsPerPixel; if (srcOffset & 3) return FALSE; srcOffset = exaGetPixmapOffset(pSrc) + y * srcPitch + (srcOffset >> 3); totSize = wBytes * h; exaWaitSync(pScrn->pScreen); if (totSize < VIA_MIN_DOWNLOAD) { bounceAligned = (char *) drm_bo_map(pScrn, pVia->drmmode.front_bo) + srcOffset; while (h--) { memcpy(dst, bounceAligned, wBytes); dst += dst_pitch; bounceAligned += srcPitch; } return TRUE; } if (!pVia->directRenderingType) return FALSE; if ((srcPitch & 3) || (srcOffset & 3)) { ErrorF("VIA EXA download src_pitch misaligned\n"); return FALSE; } if (viaAccelDMADownload(pScrn, srcOffset, srcPitch, (unsigned char *)dst, dst_pitch, wBytes, h)) return FALSE; return TRUE; } /* * Upload to framebuffer memory using memcpy to AGP pipelined with a * 3D engine texture operation from AGP to framebuffer. The AGP buffers (2) * should be kept rather small for optimal pipelining. */ static Bool viaExaTexUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, char *src, int src_pitch) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); unsigned dstPitch = exaGetPixmapPitch(pDst), dstOffset; unsigned wBytes = (w * pDst->drawable.bitsPerPixel + 7) >> 3; int i, sync[2], yOffs, bufH, bufOffs, height, format; CARD32 texWidth, texHeight, texPitch; VIAPtr pVia = VIAPTR(pScrn); Via3DState *v3d = &pVia->v3d; char *dst, *texAddr; Bool buf; if (!w || !h) return TRUE; if (wBytes * h < VIA_MIN_TEX_UPLOAD) { dstOffset = x * pDst->drawable.bitsPerPixel; if (dstOffset & 3) return FALSE; dst = (char *) drm_bo_map(pScrn, pVia->drmmode.front_bo) + (exaGetPixmapOffset(pDst) + y * dstPitch + (dstOffset >> 3)); exaWaitSync(pScrn->pScreen); while (h--) { memcpy(dst, src, wBytes); dst += dstPitch; src += src_pitch; } return TRUE; } if (!pVia->texAGPBuffer->ptr) return FALSE; switch (pDst->drawable.bitsPerPixel) { case 32: format = PICT_a8r8g8b8; break; case 16: format = PICT_r5g6b5; break; default: return FALSE; } dstOffset = exaGetPixmapOffset(pDst); if (pVia->nPOT[0]) { texPitch = ALIGN_TO(wBytes, 32); height = VIA_AGP_UPL_SIZE / texPitch; } else { viaOrder(wBytes, &texPitch); if (texPitch < 3) texPitch = 3; height = VIA_AGP_UPL_SIZE >> texPitch; texPitch = 1 << texPitch; } if (height > 1024) height = 1024; viaOrder(w, &texWidth); texWidth = 1 << texWidth; texHeight = height << 1; bufOffs = texPitch * height; texAddr = (char *) drm_bo_map(pScrn, pVia->texAGPBuffer); v3d->setDestination(v3d, dstOffset, dstPitch, format); v3d->setDrawing(v3d, 0x0c, 0xFFFFFFFF, 0x000000FF, 0x00); v3d->setFlags(v3d, 1, TRUE, TRUE, FALSE); if (!v3d->setTexture(v3d, 0, (unsigned long) texAddr, texPitch, pVia->nPOT[0], texWidth, texHeight, format, via_single, via_single, via_src, TRUE)) return FALSE; v3d->emitState(v3d, &pVia->cb, viaCheckUpload(pScrn, v3d)); v3d->emitClipRect(v3d, &pVia->cb, 0, 0, pDst->drawable.width, pDst->drawable.height); buf = 1; yOffs = 0; sync[0] = -1; sync[1] = -1; while (h) { buf = (buf) ? 0 : 1; bufH = (h > height) ? height : h; dst = texAddr + ((buf) ? bufOffs : 0); if (sync[buf] >= 0) pVia->exaDriverPtr->WaitMarker(pScrn->pScreen, sync[buf]); for (i = 0; i < bufH; ++i) { memcpy(dst, src, wBytes); dst += texPitch; src += src_pitch; } v3d->emitQuad(v3d, &pVia->cb, x, y + yOffs, 0, (buf) ? height : 0, 0, 0, w, bufH); sync[buf] = pVia->exaDriverPtr->MarkSync(pScrn->pScreen); h -= bufH; yOffs += bufH; } if (sync[buf] >= 0) pVia->exaDriverPtr->WaitMarker(pScrn->pScreen, sync[buf]); return TRUE; } #endif /* HAVE_DRI */ #define EXAOPT_MIGRATION_HEURISTIC 0 Bool viaInitExa(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ExaDriverPtr pExa = exaDriverAlloc(); Bool nPOTSupported = TRUE; VIAPtr pVia = VIAPTR(pScrn); /* * nPOT textures. DRM versions below 2.11.0 don't allow them. * Also some CLE266 hardware may not allow nPOT textures for * texture engine 1. We need to figure that out. */ #ifdef HAVE_DRI nPOTSupported = ((!pVia->directRenderingType) || (pVia->drmVerMajor > 2) || ((pVia->drmVerMajor == 2) && (pVia->drmVerMinor >= 11))); #endif pVia->nPOT[0] = nPOTSupported; pVia->nPOT[1] = nPOTSupported; if (Success != viaSetupCBuffer(pScrn, &pVia->cb, 0)) { pVia->NoAccel = TRUE; return FALSE; } if (!pExa) return FALSE; memset(pExa, 0, sizeof(*pExa)); pExa->exa_major = EXA_VERSION_MAJOR; pExa->exa_minor = EXA_VERSION_MINOR; pExa->memoryBase = pVia->FBBase; pExa->memorySize = pVia->FBFreeEnd; pExa->offScreenBase = pScrn->virtualY * pVia->Bpl; pExa->pixmapOffsetAlign = 32; pExa->pixmapPitchAlign = 16; pExa->flags = EXA_OFFSCREEN_PIXMAPS | (pVia->nPOT[1] ? 0 : EXA_OFFSCREEN_ALIGN_POT); /* HW Limitation are described here: * * 1. H2/H5/H6 2D source and destination: * Pitch: (1 << 14) - 1 = 16383 * Dimension: (1 << 12) = 4096 * X, Y position: (1 << 12) - 1 = 4095. * * 2. H2 3D engine Render target: * Pitch: (1 << 14) - 1 = 16383 * Clip Rectangle: 0 - 2047 * * 3. H5/H6 3D engine Render target: * Pitch: ((1 << 10) - 1)*32 = 32736 * Clip Rectangle: Color Window, 12bits. As Spec saied: 0 - 2048 * Scissor is the same as color window. */ pExa->maxX = 2047; pExa->maxY = 2047; pExa->WaitMarker = viaAccelWaitMarker; switch (pVia->Chipset) { case VIA_VX800: case VIA_VX855: case VIA_VX900: pExa->MarkSync = viaAccelMarkSync_H6; pExa->PrepareSolid = viaExaPrepareSolid_H6; pExa->Solid = viaExaSolid_H6; pExa->DoneSolid = viaExaDoneSolidCopy_H6; pExa->PrepareCopy = viaExaPrepareCopy_H6; pExa->Copy = viaExaCopy_H6; pExa->DoneCopy = viaExaDoneSolidCopy_H6; break; default: pExa->MarkSync = viaAccelMarkSync_H2; pExa->PrepareSolid = viaExaPrepareSolid_H2; pExa->Solid = viaExaSolid_H2; pExa->DoneSolid = viaExaDoneSolidCopy_H2; pExa->PrepareCopy = viaExaPrepareCopy_H2; pExa->Copy = viaExaCopy_H2; pExa->DoneCopy = viaExaDoneSolidCopy_H2; break; } #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { #ifdef linux pExa->DownloadFromScreen = viaExaDownloadFromScreen; #endif /* linux */ switch (pVia->Chipset) { case VIA_K8M800: case VIA_KM400: pExa->UploadToScreen = NULL; //viaExaTexUploadToScreen; break; default: pExa->UploadToScreen = NULL; //viaExaUploadToScreen; break; } } #endif /* HAVE_DRI */ if (!pVia->noComposite) { switch (pVia->Chipset) { case VIA_VX800: case VIA_VX855: case VIA_VX900: pExa->CheckComposite = viaExaCheckComposite_H6; pExa->PrepareComposite = viaExaPrepareComposite_H6; pExa->Composite = viaExaComposite_H6; pExa->DoneComposite = viaExaDoneSolidCopy_H6; break; default: pExa->CheckComposite = viaExaCheckComposite_H2; pExa->PrepareComposite = viaExaPrepareComposite_H2; pExa->Composite = viaExaComposite_H2; pExa->DoneComposite = viaExaDoneSolidCopy_H2; break; } } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[EXA] Disabling EXA accelerated composite.\n"); } if (!exaDriverInit(pScreen, pExa)) { free(pExa); return FALSE; } pVia->exaDriverPtr = pExa; viaInit3DState(&pVia->v3d); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[EXA] Enabled EXA acceleration.\n"); return TRUE; } /* * Allocate a command buffer and buffers for accelerated upload, download, * and EXA scratch area. The scratch area resides primarily in AGP memory, * but reverts to FB if AGP is not available. */ void viaFinishInitAccel(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); int size; #ifdef HAVE_DRI if (pVia->directRenderingType && pVia->useEXA) { pVia->dBounce = calloc(VIA_DMA_DL_SIZE * 2, 1); if (!pVia->IsPCI) { /* Allocate upload and scratch space. */ if (pVia->exaDriverPtr->UploadToScreen == viaExaTexUploadToScreen) { size = VIA_AGP_UPL_SIZE * 2; pVia->texAGPBuffer = drm_bo_alloc(pScrn, size, 32, TTM_PL_FLAG_TT); if (pVia->texAGPBuffer) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocated %u kiB of AGP memory for " "system-to-framebuffer transfer.\n", size / 1024); pVia->texAGPBuffer->offset = (pVia->texAGPBuffer->offset + 31) & ~31; } } size = pVia->exaScratchSize * 1024; pVia->scratchBuffer = drm_bo_alloc(pScrn, size, 32, TTM_PL_FLAG_TT); if (pVia->scratchBuffer) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocated %u kiB of AGP memory for " "EXA scratch area.\n", size / 1024); pVia->scratchOffset = (pVia->scratchBuffer->offset + 31) & ~31; pVia->scratchAddr = drm_bo_map(pScrn, pVia->scratchBuffer); } } } #endif /* HAVE_DRI */ if (!pVia->scratchAddr && pVia->useEXA) { size = pVia->exaScratchSize * 1024 + 32; pVia->scratchBuffer = drm_bo_alloc(pScrn, size, 32, TTM_PL_FLAG_SYSTEM); if (pVia->scratchBuffer) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocated %u kiB of framebuffer memory for " "EXA scratch area.\n", pVia->exaScratchSize); pVia->scratchOffset = pVia->scratchBuffer->offset; pVia->scratchAddr = drm_bo_map(pScrn, pVia->scratchBuffer); } } memset(pVia->markerBuf, 0, pVia->exa_sync_bo->size); } /* * Free the used acceleration resources. */ void viaExitAccel(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); viaAccelSync(pScrn); viaTearDownCBuffer(&pVia->cb); if (pVia->useEXA) { #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) { if (pVia->texAGPBuffer) { drm_bo_free(pScrn, pVia->texAGPBuffer); pVia->texAGPBuffer = NULL; } if (pVia->scratchBuffer) { drm_bo_free(pScrn, pVia->scratchBuffer); pVia->scratchBuffer = NULL; } } if (pVia->dBounce) free(pVia->dBounce); #endif /* HAVE_DRI */ if (pVia->scratchBuffer) { drm_bo_free(pScrn, pVia->scratchBuffer); pVia->scratchBuffer = NULL; } if (pVia->vq_bo) { drm_bo_unmap(pScrn, pVia->vq_bo); drm_bo_free(pScrn, pVia->vq_bo); } if (pVia->exa_sync_bo) { drm_bo_unmap(pScrn, pVia->exa_sync_bo); drm_bo_free(pScrn, pVia->exa_sync_bo); } if (pVia->exaDriverPtr) { exaDriverFini(pScreen); } free(pVia->exaDriverPtr); pVia->exaDriverPtr = NULL; return; } } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_exa_h2.c000066400000000000000000000427531267025031400240000ustar00rootroot00000000000000/* * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. * Copyright 2006 Thomas Hellström. 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. */ /* * 2D acceleration functions for the VIA/S3G UniChrome IGPs. * * Mostly rewritten, and modified for EXA support, by Thomas Hellström. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "miline.h" #include "via_driver.h" #include "via_regs.h" #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. */ static Bool viaAccelPlaneMaskHelper_H2(ViaTwodContext * tdc, CARD32 planeMask) { CARD32 modeMask = (1 << ((1 << tdc->bytesPPShift) << 3)) - 1; CARD32 curMask = 0x00000000; CARD32 curByteMask; int i; if ((planeMask & modeMask) != modeMask) { /* Masking doesn't work in 8bpp. */ if (modeMask == 0xFF) { tdc->keyControl &= 0x0FFFFFFF; return FALSE; } /* Translate the bit planemask to a byte planemask. */ for (i = 0; i < (1 << tdc->bytesPPShift); ++i) { curByteMask = (0xFF << (i << 3)); if ((planeMask & curByteMask) == 0) { curMask |= (1 << i); } else if ((planeMask & curByteMask) != curByteMask) { tdc->keyControl &= 0x0FFFFFFF; return FALSE; } } ErrorF("DEBUG: planeMask 0x%08x, curMask 0%02x\n", (unsigned)planeMask, (unsigned)curMask); tdc->keyControl = (tdc->keyControl & 0x0FFFFFFF) | (curMask << 28); } return TRUE; } /* * Emit transparency state and color to the command buffer. */ static void viaAccelTransparentHelper_H2(VIAPtr pVia, CARD32 keyControl, CARD32 transColor, Bool usePlaneMask) { ViaTwodContext *tdc = &pVia->td; RING_VARS; tdc->keyControl &= ((usePlaneMask) ? 0xF0000000 : 0x00000000); tdc->keyControl |= (keyControl & 0x0FFFFFFF); BEGIN_RING(4); OUT_RING_H1(VIA_REG_KEYCONTROL, tdc->keyControl); if (keyControl) { OUT_RING_H1(VIA_REG_SRCCOLORKEY, transColor); } } /* * Mark Sync using the 2D blitter for AGP. NoOp for PCI. * In the future one could even launch a NULL PCI DMA command * to have an interrupt generated, provided it is possible to * write to the PCI DMA engines from the AGP command stream. */ int viaAccelMarkSync_H2(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); RING_VARS; ++pVia->curMarker; /* Wrap around without affecting the sign bit. */ pVia->curMarker &= 0x7FFFFFFF; if (pVia->agpDMA) { BEGIN_RING(16); OUT_RING_H1(VIA_REG_KEYCONTROL, 0x00); OUT_RING_H1(VIA_REG_GEMODE, VIA_GEM_32bpp); OUT_RING_H1(VIA_REG_DSTBASE, pVia->markerOffset >> 3); OUT_RING_H1(VIA_REG_PITCH, VIA_PITCH_ENABLE); OUT_RING_H1(VIA_REG_DSTPOS, 0); OUT_RING_H1(VIA_REG_DIMENSION, 0); OUT_RING_H1(VIA_REG_FGCOLOR, pVia->curMarker); OUT_RING_H1(VIA_REG_GECMD, (0xF0 << 24) | VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT); ADVANCE_RING; } return pVia->curMarker; } /* * Exa functions. It is assumed that EXA does not exceed the blitter limits. */ Bool viaExaPrepareSolid_H2(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; RING_VARS; if (exaGetPixmapPitch(pPixmap) & 7) return FALSE; if (!viaAccelSetMode(pPixmap->drawable.depth, tdc)) return FALSE; if (!viaAccelPlaneMaskHelper_H2(tdc, planeMask)) return FALSE; viaAccelTransparentHelper_H2(pVia, 0x0, 0x0, TRUE); tdc->cmd = VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT | VIAACCELPATTERNROP(alu); tdc->fgColor = fg; return TRUE; } void viaExaSolid_H2(PixmapPtr pPixmap, int x1, int y1, int x2, int y2) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); CARD32 dstOffset = exaGetPixmapOffset(pPixmap); CARD32 dstPitch = exaGetPixmapPitch(pPixmap); int w = x2 - x1, h = y2 - y1; VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; RING_VARS; BEGIN_RING(14); OUT_RING_H1(VIA_REG_GEMODE, tdc->mode); OUT_RING_H1(VIA_REG_DSTBASE, dstOffset >> 3); OUT_RING_H1(VIA_REG_PITCH, VIA_PITCH_ENABLE | (dstPitch >> 3) << 16); OUT_RING_H1(VIA_REG_DSTPOS, (y1 << 16) | (x1 & 0xFFFF)); OUT_RING_H1(VIA_REG_DIMENSION, ((h - 1) << 16) | (w - 1)); OUT_RING_H1(VIA_REG_FGCOLOR, tdc->fgColor); OUT_RING_H1(VIA_REG_GECMD, tdc->cmd); ADVANCE_RING; } void viaExaDoneSolidCopy_H2(PixmapPtr pPixmap) { } Bool viaExaPrepareCopy_H2(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, int ydir, int alu, Pixel planeMask) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; RING_VARS; if (pSrcPixmap->drawable.bitsPerPixel != pDstPixmap->drawable.bitsPerPixel) return FALSE; if ((tdc->srcPitch = exaGetPixmapPitch(pSrcPixmap)) & 3) return FALSE; if (exaGetPixmapPitch(pDstPixmap) & 7) return FALSE; tdc->srcOffset = exaGetPixmapOffset(pSrcPixmap); tdc->cmd = VIA_GEC_BLT | VIAACCELCOPYROP(alu); if (xdir < 0) tdc->cmd |= VIA_GEC_DECX; if (ydir < 0) tdc->cmd |= VIA_GEC_DECY; if (!viaAccelSetMode(pDstPixmap->drawable.bitsPerPixel, tdc)) return FALSE; if (!viaAccelPlaneMaskHelper_H2(tdc, planeMask)) return FALSE; viaAccelTransparentHelper_H2(pVia, 0x0, 0x0, TRUE); return TRUE; } void viaExaCopy_H2(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, int width, int height) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); CARD32 dstOffset = exaGetPixmapOffset(pDstPixmap), val; CARD32 dstPitch = exaGetPixmapPitch(pDstPixmap); VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; if (!width || !height) return; if (tdc->cmd & VIA_GEC_DECY) { srcY += height - 1; dstY += height - 1; } if (tdc->cmd & VIA_GEC_DECX) { srcX += width - 1; dstX += width - 1; } 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); OUT_RING_H1(VIA_REG_DSTBASE, dstOffset >> 3); OUT_RING_H1(VIA_REG_PITCH, val); OUT_RING_H1(VIA_REG_SRCPOS, (srcY << 16) | (srcX & 0xFFFF)); OUT_RING_H1(VIA_REG_DSTPOS, (dstY << 16) | (dstX & 0xFFFF)); OUT_RING_H1(VIA_REG_DIMENSION, ((height - 1) << 16) | (width - 1)); OUT_RING_H1(VIA_REG_GECMD, tdc->cmd); ADVANCE_RING; } Bool viaExaCheckComposite_H2(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPicture->pDrawable->pScreen); VIAPtr pVia = VIAPTR(pScrn); Via3DState *v3d = &pVia->v3d; if (!pSrcPicture->pDrawable) return FALSE; /* Reject small composites early. They are done much faster in software. */ if (!pSrcPicture->repeat && pSrcPicture->pDrawable->width * pSrcPicture->pDrawable->height < VIA_MIN_COMPOSITE) return FALSE; if (pMaskPicture && pMaskPicture->pDrawable && !pMaskPicture->repeat && pMaskPicture->pDrawable->width * pMaskPicture->pDrawable->height < VIA_MIN_COMPOSITE) return FALSE; if (pMaskPicture && pMaskPicture->repeat && pMaskPicture->repeatType != RepeatNormal) return FALSE; if (pMaskPicture && pMaskPicture->componentAlpha) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Component Alpha operation", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } if (!v3d->opSupported(op)) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Operator not supported", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } /* * FIXME: A8 destination formats are currently not supported and do not * seem supported by the hardware, although there are some leftover * register settings apparent in the via_3d_reg.h file. We need to fix this * (if important), by using component ARGB8888 operations with bitmask. */ if (!v3d->dstSupported(pDstPicture->format)) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo(" Destination format not supported", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } if (v3d->texSupported(pSrcPicture->format)) { if (pMaskPicture && (PICT_FORMAT_A(pMaskPicture->format) == 0 || !v3d->texSupported(pMaskPicture->format))) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Mask format not supported", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } return TRUE; } #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Src format not supported", op, pSrcPicture, pMaskPicture, pDstPicture); #endif 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, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) { CARD32 height, width; ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); Via3DState *v3d = &pVia->v3d; int curTex = 0; ViaTexBlendingModes srcMode; Bool isAGP; unsigned long offset; /* Workaround: EXA crash with new libcairo2 on a VIA VX800 (#298) */ /* TODO Add real source only pictures */ if (!pSrc) { ErrorF("pSrc is NULL\n"); return FALSE; } v3d->setDestination(v3d, exaGetPixmapOffset(pDst), exaGetPixmapPitch(pDst), pDstPicture->format); v3d->setCompositeOperator(v3d, op); v3d->setDrawing(v3d, 0x0c, 0xFFFFFFFF, 0x000000FF, 0xFF); viaOrder(pSrc->drawable.width, &width); viaOrder(pSrc->drawable.height, &height); /* * For one-pixel repeat mask pictures we avoid using multitexturing by * modifying the src's texture blending equation and feed the pixel * value as a constant alpha for the src's texture. Multitexturing on the * Unichromes seems somewhat slow, so this speeds up translucent windows. */ srcMode = via_src; pVia->maskP = NULL; if (pMaskPicture && (pMaskPicture->pDrawable->height == 1) && (pMaskPicture->pDrawable->width == 1) && pMaskPicture->repeat && viaExpandablePixel(pMaskPicture->format)) { pVia->maskP = pMask->devPrivate.ptr; pVia->maskFormat = pMaskPicture->format; pVia->componentAlpha = pMaskPicture->componentAlpha; srcMode = ((pMaskPicture->componentAlpha) ? via_src_onepix_comp_mask : via_src_onepix_mask); } /* * One-Pixel repeat src pictures go as solid color instead of textures. * Speeds up window shadows. */ pVia->srcP = NULL; if (pSrcPicture && pSrcPicture->repeat && (pSrcPicture->pDrawable->height == 1) && (pSrcPicture->pDrawable->width == 1) && viaExpandablePixel(pSrcPicture->format)) { pVia->srcP = pSrc->devPrivate.ptr; pVia->srcFormat = pSrcPicture->format; } /* Exa should be smart enough to eliminate this IN operation. */ if (pVia->srcP && pVia->maskP) { ErrorF("Bad one-pixel IN composite operation. " "EXA needs to be smarter.\n"); return FALSE; } if (!pVia->srcP) { offset = exaGetPixmapOffset(pSrc); isAGP = viaIsAGP(pVia, pSrc, &offset); if (!isAGP && !viaExaIsOffscreen(pSrc)) return FALSE; if (!v3d->setTexture(v3d, curTex, offset, exaGetPixmapPitch(pSrc), pVia->nPOT[curTex], 1 << width, 1 << height, pSrcPicture->format, via_repeat, via_repeat, srcMode, isAGP)) { return FALSE; } curTex++; } if (pMaskPicture && !pVia->maskP) { offset = exaGetPixmapOffset(pMask); isAGP = viaIsAGP(pVia, pMask, &offset); if (!isAGP && !viaExaIsOffscreen(pMask)) return FALSE; viaOrder(pMask->drawable.width, &width); viaOrder(pMask->drawable.height, &height); if (!v3d->setTexture(v3d, curTex, offset, exaGetPixmapPitch(pMask), pVia->nPOT[curTex], 1 << width, 1 << height, pMaskPicture->format, via_repeat, via_repeat, ((pMaskPicture->componentAlpha) ? via_comp_mask : via_mask), isAGP)) { return FALSE; } curTex++; } v3d->setFlags(v3d, curTex, FALSE, TRUE, TRUE); v3d->emitState(v3d, &pVia->cb, viaCheckUpload(pScrn, v3d)); v3d->emitClipRect(v3d, &pVia->cb, 0, 0, pDst->drawable.width, pDst->drawable.height); return TRUE; } void viaExaComposite_H2(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); Via3DState *v3d = &pVia->v3d; CARD32 col; if (pVia->maskP) { viaPixelARGB8888(pVia->maskFormat, pVia->maskP, &col); v3d->setTexBlendCol(v3d, 0, pVia->componentAlpha, col); } if (pVia->srcP) { viaPixelARGB8888(pVia->srcFormat, pVia->srcP, &col); v3d->setDrawing(v3d, 0x0c, 0xFFFFFFFF, col & 0x00FFFFFF, col >> 24); srcX = maskX; srcY = maskY; } if (pVia->maskP || pVia->srcP) v3d->emitState(v3d, &pVia->cb, viaCheckUpload(pScrn, v3d)); v3d->emitQuad(v3d, &pVia->cb, dstX, dstY, srcX, srcY, maskX, maskY, width, height); } void viaAccelTextureBlit(ScrnInfoPtr pScrn, unsigned long srcOffset, unsigned srcPitch, unsigned w, unsigned h, unsigned srcX, unsigned srcY, unsigned srcFormat, unsigned long dstOffset, unsigned dstPitch, unsigned dstX, unsigned dstY, unsigned dstFormat, int rotate) { VIAPtr pVia = VIAPTR(pScrn); CARD32 wOrder, hOrder; Via3DState *v3d = &pVia->v3d; viaOrder(w, &wOrder); viaOrder(h, &hOrder); v3d->setDestination(v3d, dstOffset, dstPitch, dstFormat); v3d->setDrawing(v3d, 0x0c, 0xFFFFFFFF, 0x000000FF, 0x00); v3d->setFlags(v3d, 1, TRUE, TRUE, FALSE); v3d->setTexture(v3d, 0, srcOffset, srcPitch, TRUE, 1 << wOrder, 1 << hOrder, srcFormat, via_single, via_single, via_src, FALSE); v3d->emitState(v3d, &pVia->cb, viaCheckUpload(pScrn, v3d)); v3d->emitClipRect(v3d, &pVia->cb, dstX, dstY, w, h); v3d->emitQuad(v3d, &pVia->cb, dstX, dstY, srcX, srcY, 0, 0, w, h); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_exa_h6.c000066400000000000000000000417011267025031400237740ustar00rootroot00000000000000/* * Copyright 1998-2008 VIA Technologies, Inc. All Rights Reserved. * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved. * Copyright 2006 Thomas Hellström. 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. */ /* * 2D acceleration functions for the VIA/S3G UniChrome IGPs. * * Mostly rewritten, and modified for EXA support, by Thomas Hellström. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include "miline.h" #include "via_driver.h" #include "via_regs.h" #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. */ static Bool viaAccelPlaneMaskHelper_H6(ViaTwodContext * tdc, CARD32 planeMask) { CARD32 modeMask = (1 << ((1 << tdc->bytesPPShift) << 3)) - 1; CARD32 curMask = 0x00000000; CARD32 curByteMask; int i; if ((planeMask & modeMask) != modeMask) { /* Masking doesn't work in 8bpp. */ if (modeMask == 0xFF) { tdc->keyControl &= 0x0FFFFFFF; return FALSE; } /* Translate the bit planemask to a byte planemask. */ for (i = 0; i < (1 << tdc->bytesPPShift); ++i) { curByteMask = (0xFF << (i << 3)); if ((planeMask & curByteMask) == 0) { curMask |= (1 << i); } else if ((planeMask & curByteMask) != curByteMask) { tdc->keyControl &= 0x0FFFFFFF; return FALSE; } } ErrorF("DEBUG: planeMask 0x%08x, curMask 0%02x\n", (unsigned)planeMask, (unsigned)curMask); tdc->keyControl = (tdc->keyControl & 0x0FFFFFFF) | (curMask << 28); } return TRUE; } /* * Emit transparency state and color to the command buffer. */ static void viaAccelTransparentHelper_H6(VIAPtr pVia, CARD32 keyControl, CARD32 transColor, Bool usePlaneMask) { ViaTwodContext *tdc = &pVia->td; RING_VARS; tdc->keyControl &= ((usePlaneMask) ? 0xF0000000 : 0x00000000); tdc->keyControl |= (keyControl & 0x0FFFFFFF); BEGIN_RING(4); OUT_RING_H1(VIA_REG_KEYCONTROL_M1, tdc->keyControl); if (keyControl) { OUT_RING_H1(VIA_REG_SRCCOLORKEY_M1, transColor); } } /* * Mark Sync using the 2D blitter for AGP. NoOp for PCI. * In the future one could even launch a NULL PCI DMA command * to have an interrupt generated, provided it is possible to * write to the PCI DMA engines from the AGP command stream. */ int viaAccelMarkSync_H6(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); RING_VARS; ++pVia->curMarker; /* Wrap around without affecting the sign bit. */ pVia->curMarker &= 0x7FFFFFFF; if (pVia->agpDMA) { BEGIN_RING(16); OUT_RING_H1(VIA_REG_KEYCONTROL_M1, 0x00); OUT_RING_H1(VIA_REG_GEMODE_M1, VIA_GEM_32bpp); OUT_RING_H1(VIA_REG_DSTBASE_M1, pVia->curMarker >> 3); OUT_RING_H1(VIA_REG_PITCH_M1, 0); OUT_RING_H1(VIA_REG_DSTPOS_M1, 0); OUT_RING_H1(VIA_REG_DIMENSION_M1, 0); OUT_RING_H1(VIA_REG_MONOPATFGC_M1, pVia->curMarker); OUT_RING_H1(VIA_REG_GECMD_M1, (0xF0 << 24) | VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT); ADVANCE_RING; } return pVia->curMarker; } /* * Exa functions. It is assumed that EXA does not exceed the blitter limits. */ Bool viaExaPrepareSolid_H6(PixmapPtr pPixmap, int alu, Pixel planeMask, Pixel fg) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; RING_VARS; if (exaGetPixmapPitch(pPixmap) & 7) return FALSE; if (!viaAccelSetMode(pPixmap->drawable.depth, tdc)) return FALSE; if (!viaAccelPlaneMaskHelper_H6(tdc, planeMask)) return FALSE; viaAccelTransparentHelper_H6(pVia, 0x0, 0x0, TRUE); tdc->cmd = VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT | VIAACCELPATTERNROP(alu); tdc->fgColor = fg; return TRUE; } void viaExaSolid_H6(PixmapPtr pPixmap, int x1, int y1, int x2, int y2) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pPixmap->drawable.pScreen); CARD32 dstOffset = exaGetPixmapOffset(pPixmap); CARD32 dstPitch = exaGetPixmapPitch(pPixmap); int w = x2 - x1, h = y2 - y1; VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; RING_VARS; BEGIN_RING(14); OUT_RING_H1(VIA_REG_GEMODE_M1, tdc->mode); OUT_RING_H1(VIA_REG_DSTBASE_M1, dstOffset >> 3); OUT_RING_H1(VIA_REG_PITCH_M1, (dstPitch >> 3) << 16); OUT_RING_H1(VIA_REG_DSTPOS_M1, (y1 << 16) | (x1 & 0xFFFF)); OUT_RING_H1(VIA_REG_DIMENSION_M1, ((h - 1) << 16) | (w - 1)); OUT_RING_H1(VIA_REG_MONOPATFGC_M1, tdc->fgColor); OUT_RING_H1(VIA_REG_GECMD_M1, tdc->cmd); ADVANCE_RING; } void viaExaDoneSolidCopy_H6(PixmapPtr pPixmap) { } Bool viaExaPrepareCopy_H6(PixmapPtr pSrcPixmap, PixmapPtr pDstPixmap, int xdir, int ydir, int alu, Pixel planeMask) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; RING_VARS; if (pSrcPixmap->drawable.bitsPerPixel != pDstPixmap->drawable.bitsPerPixel) return FALSE; if ((tdc->srcPitch = exaGetPixmapPitch(pSrcPixmap)) & 3) return FALSE; if (exaGetPixmapPitch(pDstPixmap) & 7) return FALSE; tdc->srcOffset = exaGetPixmapOffset(pSrcPixmap); tdc->cmd = VIA_GEC_BLT | VIAACCELCOPYROP(alu); if (xdir < 0) tdc->cmd |= VIA_GEC_DECX; if (ydir < 0) tdc->cmd |= VIA_GEC_DECY; if (!viaAccelSetMode(pDstPixmap->drawable.bitsPerPixel, tdc)) return FALSE; if (!viaAccelPlaneMaskHelper_H6(tdc, planeMask)) return FALSE; viaAccelTransparentHelper_H6(pVia, 0x0, 0x0, TRUE); return TRUE; } void viaExaCopy_H6(PixmapPtr pDstPixmap, int srcX, int srcY, int dstX, int dstY, int width, int height) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPixmap->drawable.pScreen); CARD32 dstOffset = exaGetPixmapOffset(pDstPixmap), val; CARD32 dstPitch = exaGetPixmapPitch(pDstPixmap); VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; if (!width || !height) return; RING_VARS; if (tdc->cmd & VIA_GEC_DECY) { srcY += height - 1; dstY += height - 1; } if (tdc->cmd & VIA_GEC_DECX) { srcX += width - 1; dstX += width - 1; } val = (dstPitch >> 3) << 16 | (tdc->srcPitch >> 3); BEGIN_RING(16); OUT_RING_H1(VIA_REG_GEMODE_M1, tdc->mode); OUT_RING_H1(VIA_REG_SRCBASE_M1, tdc->srcOffset >> 3); OUT_RING_H1(VIA_REG_DSTBASE_M1, dstOffset >> 3); OUT_RING_H1(VIA_REG_PITCH_M1, val); OUT_RING_H1(VIA_REG_SRCPOS_M1, (srcY << 16) | (srcX & 0xFFFF)); OUT_RING_H1(VIA_REG_DSTPOS_M1, (dstY << 16) | (dstX & 0xFFFF)); OUT_RING_H1(VIA_REG_DIMENSION_M1, ((height - 1) << 16) | (width - 1)); OUT_RING_H1(VIA_REG_GECMD_M1, tdc->cmd); ADVANCE_RING; } Bool viaExaCheckComposite_H6(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDstPicture->pDrawable->pScreen); VIAPtr pVia = VIAPTR(pScrn); Via3DState *v3d = &pVia->v3d; if (!pSrcPicture->pDrawable) { return FALSE; } /* Reject small composites early. They are done much faster in software. */ if (!pSrcPicture->repeat && pSrcPicture->pDrawable->width * pSrcPicture->pDrawable->height < VIA_MIN_COMPOSITE) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Source picture too small", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } if (pMaskPicture && pMaskPicture->pDrawable && !pMaskPicture->repeat && pMaskPicture->pDrawable->width * pMaskPicture->pDrawable->height < VIA_MIN_COMPOSITE) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Mask picture too small", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } if (pMaskPicture && pMaskPicture->repeat && pMaskPicture->repeatType != RepeatNormal) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Repeat is different than normal", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } if (pMaskPicture && pMaskPicture->componentAlpha) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Component Alpha operation", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } if (!v3d->opSupported(op)) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Operator not supported", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } /* * FIXME: A8 destination formats are currently not supported and do not * seem supported by the hardware, although there are some leftover * register settings apparent in the via_3d_reg.h file. We need to fix this * (if important), by using component ARGB8888 operations with bitmask. */ if (!v3d->dstSupported(pDstPicture->format)) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Destination format not supported", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } if (v3d->texSupported(pSrcPicture->format)) { if (pMaskPicture && (PICT_FORMAT_A(pMaskPicture->format) == 0 || !v3d->texSupported(pMaskPicture->format))) { #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Mask format not supported", op, pSrcPicture, pMaskPicture, pDstPicture); #endif return FALSE; } return TRUE; } #ifdef VIA_DEBUG_COMPOSITE viaExaPrintCompositeInfo("Src format not supported",op, pSrcPicture, pMaskPicture, pDstPicture); #endif 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, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) { CARD32 height, width; ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); Via3DState *v3d = &pVia->v3d; int curTex = 0; ViaTexBlendingModes srcMode; Bool isAGP; unsigned long offset; /* Workaround: EXA crash with new libcairo2 on a VIA VX800 (#298) */ /* TODO Add real source only pictures */ if (!pSrc) { ErrorF("pSrc is NULL\n"); return FALSE; } v3d->setDestination(v3d, exaGetPixmapOffset(pDst), exaGetPixmapPitch(pDst), pDstPicture->format); v3d->setCompositeOperator(v3d, op); v3d->setDrawing(v3d, 0x0c, 0xFFFFFFFF, 0x000000FF, 0xFF); viaOrder(pSrc->drawable.width, &width); viaOrder(pSrc->drawable.height, &height); /* * For one-pixel repeat mask pictures we avoid using multitexturing by * modifying the src's texture blending equation and feed the pixel * value as a constant alpha for the src's texture. Multitexturing on the * Unichromes seems somewhat slow, so this speeds up translucent windows. */ srcMode = via_src; pVia->maskP = NULL; if (pMaskPicture && (pMaskPicture->pDrawable->height == 1) && (pMaskPicture->pDrawable->width == 1) && pMaskPicture->repeat && viaExpandablePixel(pMaskPicture->format)) { pVia->maskP = pMask->devPrivate.ptr; pVia->maskFormat = pMaskPicture->format; pVia->componentAlpha = pMaskPicture->componentAlpha; srcMode = ((pMaskPicture->componentAlpha) ? via_src_onepix_comp_mask : via_src_onepix_mask); } /* * One-Pixel repeat src pictures go as solid color instead of textures. * Speeds up window shadows. */ pVia->srcP = NULL; if (pSrcPicture && pSrcPicture->repeat && (pSrcPicture->pDrawable->height == 1) && (pSrcPicture->pDrawable->width == 1) && viaExpandablePixel(pSrcPicture->format)) { pVia->srcP = pSrc->devPrivate.ptr; pVia->srcFormat = pSrcPicture->format; } /* Exa should be smart enough to eliminate this IN operation. */ if (pVia->srcP && pVia->maskP) { ErrorF("Bad one-pixel IN composite operation. " "EXA needs to be smarter.\n"); return FALSE; } if (!pVia->srcP) { offset = exaGetPixmapOffset(pSrc); isAGP = viaIsAGP(pVia, pSrc, &offset); if (!isAGP && !viaExaIsOffscreen(pSrc)) return FALSE; if (!v3d->setTexture(v3d, curTex, offset, exaGetPixmapPitch(pSrc), pVia->nPOT[curTex], 1 << width, 1 << height, pSrcPicture->format, via_repeat, via_repeat, srcMode, isAGP)) { return FALSE; } curTex++; } if (pMaskPicture && !pVia->maskP) { offset = exaGetPixmapOffset(pMask); isAGP = viaIsAGP(pVia, pMask, &offset); if (!isAGP && !viaExaIsOffscreen(pMask)) return FALSE; viaOrder(pMask->drawable.width, &width); viaOrder(pMask->drawable.height, &height); if (!v3d->setTexture(v3d, curTex, offset, exaGetPixmapPitch(pMask), pVia->nPOT[curTex], 1 << width, 1 << height, pMaskPicture->format, via_repeat, via_repeat, ((pMaskPicture->componentAlpha) ? via_comp_mask : via_mask), isAGP)) { return FALSE; } curTex++; } v3d->setFlags(v3d, curTex, FALSE, TRUE, TRUE); v3d->emitState(v3d, &pVia->cb, viaCheckUpload(pScrn, v3d)); v3d->emitClipRect(v3d, &pVia->cb, 0, 0, pDst->drawable.width, pDst->drawable.height); return TRUE; } void viaExaComposite_H6(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, int dstX, int dstY, int width, int height) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pDst->drawable.pScreen); VIAPtr pVia = VIAPTR(pScrn); Via3DState *v3d = &pVia->v3d; CARD32 col; if (pVia->maskP) { viaPixelARGB8888(pVia->maskFormat, pVia->maskP, &col); v3d->setTexBlendCol(v3d, 0, pVia->componentAlpha, col); } if (pVia->srcP) { viaPixelARGB8888(pVia->srcFormat, pVia->srcP, &col); v3d->setDrawing(v3d, 0x0c, 0xFFFFFFFF, col & 0x00FFFFFF, col >> 24); srcX = maskX; srcY = maskY; } if (pVia->maskP || pVia->srcP) v3d->emitState(v3d, &pVia->cb, viaCheckUpload(pScrn, v3d)); v3d->emitQuad(v3d, &pVia->cb, dstX, dstY, srcX, srcY, maskX, maskY, width, height); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_i2c.c000066400000000000000000000320061267025031400232750ustar00rootroot00000000000000/* * Copyright 2004 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. */ /* * Implements three I2C buses through registers SR26, SR2C, and SR31. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "via_driver.h" #define SDA_READ 0x04 #define SCL_READ 0x08 #define SDA_WRITE 0x10 #define SCL_WRITE 0x20 /* * First I2C Bus: Typically used for detecting a VGA monitor. */ static void ViaI2C1PutBits(I2CBusPtr Bus, int clock, int data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; CARD8 value = 0x01; /* Enable */ if (clock) value |= SCL_WRITE; if (data) value |= SDA_WRITE; ViaSeqMask(hwp, 0x26, value, 0x01 | SCL_WRITE | SDA_WRITE); } static void ViaI2C1GetBits(I2CBusPtr Bus, int *clock, int *data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; CARD8 value = hwp->readSeq(hwp, 0x26); *clock = (value & SCL_READ) != 0; *data = (value & SDA_READ) != 0; } static I2CBusPtr ViaI2CBus1Init(ScrnInfoPtr pScrn) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered ViaI2CBus1Init.\n")); I2CBusPtr pI2CBus = xf86CreateI2CBusRec(); vgaHWPtr hwp = VGAHWPTR(pScrn); if (!pI2CBus) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CreateI2CBusRec failed.\n")); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Initialization of I2C Bus 1 failed.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus1Init.\n")); return NULL; } pI2CBus->BusName = "I2C Bus 1"; 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; if (!xf86I2CBusInit(pI2CBus)) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86I2CBusInit failed.\n")); xf86DestroyI2CBusRec(pI2CBus, TRUE, FALSE); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Initialization of I2C Bus 1 failed.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus1Init.\n")); return NULL; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus1Init.\n")); return pI2CBus; } /* * Second I2C Bus: Used to detect a DVI monitor, VGA monitor via * a DVI-I connector, or TV encoders. */ static void ViaI2C2PutBits(I2CBusPtr Bus, int clock, int data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; CARD8 value = 0x01; /* Enable */ if (clock) value |= SCL_WRITE; if (data) value |= SDA_WRITE; ViaSeqMask(hwp, 0x31, value, 0x01 | SCL_WRITE | SDA_WRITE); } static void ViaI2C2GetBits(I2CBusPtr Bus, int *clock, int *data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; CARD8 value = hwp->readSeq(hwp, 0x31); *clock = (value & SCL_READ) != 0; *data = (value & SDA_READ) != 0; } static I2CBusPtr ViaI2CBus2Init(ScrnInfoPtr pScrn) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered ViaI2CBus2Init.\n")); I2CBusPtr pI2CBus = xf86CreateI2CBusRec(); vgaHWPtr hwp = VGAHWPTR(pScrn); if (!pI2CBus) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CreateI2CBusRec failed.\n")); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Initialization of I2C Bus 2 failed.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus2Init.\n")); return NULL; } pI2CBus->BusName = "I2C Bus 2"; pI2CBus->scrnIndex = pScrn->scrnIndex; pI2CBus->I2CPutBits = ViaI2C2PutBits; pI2CBus->I2CGetBits = ViaI2C2GetBits; pI2CBus->DriverPrivate.ptr = hwp; if (!xf86I2CBusInit(pI2CBus)) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86I2CBusInit failed.\n")); xf86DestroyI2CBusRec(pI2CBus, TRUE, FALSE); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Initialization of I2C Bus 2 failed.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus2Init.\n")); return NULL; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus2Init.\n")); return pI2CBus; } /* * Third I2C Bus: Implemented via manipulation of GPIO (General * Purpose I/O) pins. */ static Bool ViaI2C3Start(I2CBusPtr b, int timeout) { vgaHWPtr hwp = b->DriverPrivate.ptr; ViaSeqMask(hwp, 0x2C, 0xF0, 0xF0); b->I2CUDelay(b, b->RiseFallTime); ViaSeqMask(hwp, 0x2C, 0x00, 0x10); b->I2CUDelay(b, b->HoldTime); ViaSeqMask(hwp, 0x2C, 0x00, 0x20); b->I2CUDelay(b, b->HoldTime); return TRUE; } static Bool ViaI2C3Address(I2CDevPtr d, I2CSlaveAddr addr) { I2CBusPtr b = d->pI2CBus; #ifdef X_NEED_I2CSTART if (b->I2CStart(d->pI2CBus, d->StartTimeout)) { #else if (ViaI2C3Start(d->pI2CBus, d->StartTimeout)) { #endif if (b->I2CPutByte(d, addr & 0xFF)) { if ((addr & 0xF8) != 0xF0 && (addr & 0xFE) != 0x00) return TRUE; if (b->I2CPutByte(d, (addr >> 8) & 0xFF)) return TRUE; } b->I2CStop(d); } return FALSE; } static void ViaI2C3Stop(I2CDevPtr d) { I2CBusPtr b = d->pI2CBus; vgaHWPtr hwp = b->DriverPrivate.ptr; ViaSeqMask(hwp, 0x2C, 0xC0, 0xF0); b->I2CUDelay(b, b->RiseFallTime); ViaSeqMask(hwp, 0x2C, 0x20, 0x20); b->I2CUDelay(b, b->HoldTime); ViaSeqMask(hwp, 0x2C, 0x10, 0x10); b->I2CUDelay(b, b->HoldTime); ViaSeqMask(hwp, 0x2C, 0x00, 0x20); b->I2CUDelay(b, b->HoldTime); } static void ViaI2C3PutBit(I2CBusPtr b, Bool sda, int timeout) { vgaHWPtr hwp = b->DriverPrivate.ptr; if (sda) ViaSeqMask(hwp, 0x2C, 0x50, 0x50); else ViaSeqMask(hwp, 0x2C, 0x40, 0x50); b->I2CUDelay(b, b->RiseFallTime / 5); ViaSeqMask(hwp, 0x2C, 0xA0, 0xA0); b->I2CUDelay(b, b->HoldTime); b->I2CUDelay(b, timeout); ViaSeqMask(hwp, 0x2C, 0x80, 0xA0); b->I2CUDelay(b, b->RiseFallTime / 5); } static Bool ViaI2C3PutByte(I2CDevPtr d, I2CByte data) { I2CBusPtr b = d->pI2CBus; vgaHWPtr hwp = b->DriverPrivate.ptr; Bool ret; int i; for (i = 7; i >= 0; i--) ViaI2C3PutBit(b, (data >> i) & 0x01, b->BitTimeout); /* Raise first to avoid false positives. */ ViaSeqMask(hwp, 0x2C, 0x50, 0x50); ViaSeqMask(hwp, 0x2C, 0x00, 0x40); b->I2CUDelay(b, b->RiseFallTime); ViaSeqMask(hwp, 0x2C, 0xA0, 0xA0); if (hwp->readSeq(hwp, 0x2C) & 0x04) ret = FALSE; else ret = TRUE; ViaSeqMask(hwp, 0x2C, 0x80, 0xA0); b->I2CUDelay(b, b->RiseFallTime); return ret; } static Bool ViaI2C3GetBit(I2CBusPtr b, int timeout) { vgaHWPtr hwp = b->DriverPrivate.ptr; Bool ret; ViaSeqMask(hwp, 0x2c, 0x80, 0xC0); b->I2CUDelay(b, b->RiseFallTime / 5); ViaSeqMask(hwp, 0x2c, 0xA0, 0xA0); b->I2CUDelay(b, 3 * b->HoldTime); b->I2CUDelay(b, timeout); if (hwp->readSeq(hwp, 0x2C) & 0x04) ret = TRUE; else ret = FALSE; ViaSeqMask(hwp, 0x2C, 0x80, 0xA0); b->I2CUDelay(b, b->HoldTime); b->I2CUDelay(b, b->RiseFallTime / 5); return ret; } static Bool ViaI2C3GetByte(I2CDevPtr d, I2CByte * data, Bool last) { I2CBusPtr b = d->pI2CBus; vgaHWPtr hwp = b->DriverPrivate.ptr; int i; *data = 0x00; for (i = 7; i >= 0; i--) if (ViaI2C3GetBit(b, b->BitTimeout)) *data |= 0x01 << i; if (last) /* send NACK */ ViaSeqMask(hwp, 0x2C, 0x50, 0x50); else /* send ACK */ ViaSeqMask(hwp, 0x2C, 0x40, 0x50); ViaSeqMask(hwp, 0x2C, 0xA0, 0xA0); b->I2CUDelay(b, b->HoldTime); ViaSeqMask(hwp, 0x2C, 0x80, 0xA0); return TRUE; } static void ViaI2C3SimplePutBits(I2CBusPtr Bus, int clock, int data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; CARD8 value = 0xC0; if (clock) value |= SCL_WRITE; if (data) value |= SDA_WRITE; ViaSeqMask(hwp, 0x2C, value, 0xC0 | SCL_WRITE | SDA_WRITE); } static void ViaI2C3SimpleGetBits(I2CBusPtr Bus, int *clock, int *data) { vgaHWPtr hwp = Bus->DriverPrivate.ptr; CARD8 value = hwp->readSeq(hwp, 0x2C); *clock = (value & SCL_READ) != 0; *data = (value & SDA_READ) != 0; } static I2CBusPtr ViaI2CBus3Init(ScrnInfoPtr pScrn) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered ViaI2CBus3Init.\n")); I2CBusPtr pI2CBus = xf86CreateI2CBusRec(); vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); if (!pI2CBus) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86CreateI2CBusRec failed.\n")); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Initialization of I2C Bus 3 failed.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus3Init.\n")); return NULL; } pI2CBus->BusName = "I2C Bus 3"; 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; #ifdef X_NEED_I2CSTART 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; } if (!xf86I2CBusInit(pI2CBus)) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86I2CBusInit failed.\n")); xf86DestroyI2CBusRec(pI2CBus, TRUE, FALSE); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Initialization of I2C Bus 3 failed.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus3Init.\n")); return NULL; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CBus3Init.\n")); return pI2CBus; } #ifdef HAVE_DEBUG static void ViaI2CScan(I2CBusPtr Bus) { CARD8 i; DEBUG(xf86DrvMsg(Bus->scrnIndex, X_INFO, "Entered ViaI2CScan.\n")); xf86DrvMsg(Bus->scrnIndex, X_INFO, "Scanning %s.\n", Bus->BusName); for (i = 0x10; i < 0xF0; i += 2) if (xf86I2CProbeAddress(Bus, i)) xf86DrvMsg(Bus->scrnIndex, X_PROBED, "Found slave on %s " "- 0x%02X.\n", Bus->BusName, i); DEBUG(xf86DrvMsg(Bus->scrnIndex, X_INFO, "Exiting ViaI2CScan.\n")); } #endif /* HAVE_DEBUG */ void ViaI2CInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); 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); #ifdef HAVE_DEBUG if (pVia->I2CScan) { if (pVia->pI2CBus2) ViaI2CScan(pVia->pI2CBus2); if (pVia->pI2CBus3) ViaI2CScan(pVia->pI2CBus3); } #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting ViaI2CInit.\n")); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_id.c000066400000000000000000000612351267025031400232220ustar00rootroot00000000000000/* * Copyright 2005-2015 The Openchrome Project * [http://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" /* * There's no reason for this to be known outside of via_id.o; * only a pointer to a single entry will ever be used outside. */ static struct ViaCardIdStruct ViaCardId[] = { /*** CLE266 ***/ {"ECS CLE266 (1.0)", VIA_CLE266, 0x1019, 0x1B43, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"LT21 VA28", VIA_CLE266, 0x1019, 0x1B44, VIA_DEVICE_CRT}, {"ECS G320", VIA_CLE266, 0x1019, 0xB320, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Asustek Terminator C3V", VIA_CLE266, 0x1043, 0x8155, VIA_DEVICE_CRT}, {"VIA VT3122 (CLE266)-EPIA M/MII/...", VIA_CLE266, 0x1106, 0x3122, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"MSI MS-6723", VIA_CLE266, 0x1462, 0X7238, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"Clevo T200V", VIA_CLE266, 0x1558, 0x200A, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Biostar ARKplus III", VIA_CLE266, 0x1565, 0x3204, VIA_DEVICE_CRT | VIA_DEVICE_TV}, /* FS454 TV encoder */ /*** KM400, KM400A, KN400, P4M800 ***/ {"ECS KM400-M2", VIA_KM400, 0x1019, 0x1842, VIA_DEVICE_CRT}, {"Acer Aspire 135x", VIA_KM400, 0x1025, 0x0033, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"Asustek A7V8X-MX", VIA_KM400, 0x1043, 0x80ED, VIA_DEVICE_CRT}, {"Asustek A7V8X-LA", VIA_KM400, 0x1043, 0x80F9, VIA_DEVICE_CRT}, {"Asustek A7V8X-MX SE / A7V400-MX", VIA_KM400, 0x1043, 0x8118, VIA_DEVICE_CRT}, {"Asustek Terminator A7VT", VIA_KM400, 0x1043, 0x813E, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"Mitac 8375X", VIA_KM400, 0x1071, 0x8375, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, /* aka "UMAX 585T" */ {"Soltek SL-75MIV2", VIA_KM400, 0x1106, 0x0000, VIA_DEVICE_CRT}, /* VIA/0x0000 */ {"VIA VT3205 (KM400)", VIA_KM400, 0x1106, 0x3205, VIA_DEVICE_CRT | VIA_DEVICE_TV}, /* borrowed by Soltek SL-B7C-FGR */ {"VIA VT7205 (KM400A)", VIA_KM400, 0x1106, 0x7205, VIA_DEVICE_CRT}, /* borrowed by Biostar iDEQ 200V/Chaintech 7VIF4 */ {"Shuttle MK40V", VIA_KM400, 0x1297, 0x0240, VIA_DEVICE_CRT}, {"Shuttle FX43", VIA_KM400, 0x1297, 0xF643, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"Giga-byte 7VM400(A)M", VIA_KM400, 0x1458, 0xD000, VIA_DEVICE_CRT}, {"MSI KM4(A)M-V", VIA_KM400, 0x1462, 0x7061, VIA_DEVICE_CRT}, /* aka "DFI KM400-MLV" */ {"MSI PM8M2-V", VIA_KM400, 0x1462, 0x7071, VIA_DEVICE_CRT}, {"MSI PM8M-V", VIA_KM400, 0x1462, 0x7104, VIA_DEVICE_CRT}, {"MSI KM4(A)M-L", VIA_KM400, 0x1462, 0x7348, VIA_DEVICE_CRT}, {"Abit VA-10 (1)", VIA_KM400, 0x147B, 0x140B, VIA_DEVICE_CRT}, {"Abit VA-10 (2)", VIA_KM400, 0x147B, 0x140C, VIA_DEVICE_CRT}, {"Abit VA-20", VIA_KM400, 0x147B, 0x1411, VIA_DEVICE_CRT}, {"Averatec 322x", VIA_KM400, 0x14FF, 0x030D, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"FIC K7M-400A", VIA_KM400, 0x1509, 0x9233, VIA_DEVICE_CRT}, {"Biostar M7VIZ", VIA_KM400, 0x1565, 0x1200, VIA_DEVICE_CRT}, {"Biostar P4M800-M7", VIA_KM400, 0x1565, 0x1202, VIA_DEVICE_CRT}, {"Uniwill 755CI", VIA_KM400, 0x1584, 0x800A, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, /* aka "Gericom Hummer Advance", "Maxdata M-Book 1200X" */ {"Packard Bell Quasar2 (MSI MS6786)", VIA_KM400, 0x1631, 0xD002, VIA_DEVICE_CRT}, {"Nec Powermate VL5", VIA_KM400, 0x1631, 0xD003, VIA_DEVICE_CRT}, {"Epox EP-8KMM3I", VIA_KM400, 0x1695, 0x9023, VIA_DEVICE_CRT}, {"ASRock Inc. K7VM2/3/4", VIA_KM400, 0x1849, 0x7205, VIA_DEVICE_CRT}, {"ACorp KM400QP", VIA_KM400, 0x1915, 0x1100, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"Mercury P4VM800M7 (1.0)", VIA_KM400, 0x3344, 0x1122, VIA_DEVICE_CRT}, {"Soyo K7VME", VIA_KM400, 0xA723, 0x10FD, VIA_DEVICE_CRT}, /*** K8M800, K8N800, K8N800A ***/ {"ZX-5360", VIA_K8M800, 0x1019, 0x0F60, VIA_DEVICE_CRT | VIA_DEVICE_LCD }, {"ECS K8M800-M2 (1.0)", VIA_K8M800, 0x1019, 0x1828, VIA_DEVICE_CRT}, {"ECS K8M800-M2 (2.0)", VIA_K8M800, 0x1019, 0x1B45, VIA_DEVICE_CRT}, {"Acer Aspire 136x", VIA_K8M800, 0x1025, 0x006E, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"Asustek K8V-MX", VIA_K8M800, 0x1043, 0x8129, VIA_DEVICE_CRT}, {"Mitac 8399", VIA_K8M800, 0x1071, 0x8399, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, /* aka "Pogolinux Konabook 3100" */ {"Mitac 8889", VIA_K8M800, 0x1071, 0x8889, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"MSI K8M Neo-V (broken pci id)", VIA_K8M800, 0x1106, 0x0204, VIA_DEVICE_CRT}, {"VIA VT3108 (K8M800)", VIA_K8M800, 0x1106, 0x3108, VIA_DEVICE_CRT}, /* borrowed by Asustek A8V-MX */ {"Shuttle FX21", VIA_K8M800, 0x1297, 0x3052, VIA_DEVICE_CRT}, {"Shuttle FX83", VIA_K8M800, 0x1297, 0xF683, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"Sharp Actius AL27", VIA_K8M800, 0x13BD, 0x1044, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Sharp Mebius PC-CS30H", VIA_K8M800, 0x13BD, 0x1047, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Sharp PC-AE30J", VIA_K8M800, 0x13BD, 0x104B, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Giga-byte GA-K8VM800M", VIA_K8M800, 0x1458, 0xD000, VIA_DEVICE_CRT}, {"MSI K8M Neo-V", VIA_K8M800, 0x1462, 0x0320, VIA_DEVICE_CRT}, {"MSI K8MM-V", VIA_K8M800, 0x1462, 0x7142, VIA_DEVICE_CRT}, {"MSI K8MM3-V", VIA_K8M800, 0x1462, 0x7181, VIA_DEVICE_CRT}, {"MSI K9MM-V", VIA_K8M800, 0x1462, 0x7312, VIA_DEVICE_CRT}, {"MSI K8MM-ILSR", VIA_K8M800, 0x1462, 0x7410, VIA_DEVICE_CRT}, {"Abit KV-80", VIA_K8M800, 0x147B, 0x1419, VIA_DEVICE_CRT}, {"Abit KV-81", VIA_K8M800, 0x147B, 0x141A, VIA_DEVICE_CRT}, {"Averatec 327x", VIA_K8M800, 0x14FF, 0x0315, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Twinhead N14RA", VIA_K8M800, 0x14FF, 0x0321, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Averatec 3715", VIA_K8M800, 0x14FF, 0x0322, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Averatec 54xx", VIA_K8M800, 0x1509, 0x3930, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"FIC K8M-800M", VIA_K8M800, 0x1509, 0x6001, VIA_DEVICE_CRT}, {"Clevo L570W", VIA_K8M800, 0x1558, 0x0570, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Mesh Pegasus", VIA_K8M800, 0x1558, 0x4702, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Biostar K8VGA-M", VIA_K8M800, 0x1565, 0x1203, VIA_DEVICE_CRT}, {"DFI K8M800-MLVF", VIA_K8M800, 0x15BD, 0x1002, VIA_DEVICE_CRT}, {"Packard Bell Easynote E6116/E63xx", VIA_K8M800, 0x1631, 0xC008, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"Packard Bell Easynote B3 800/B3340", VIA_K8M800, 0x1631, 0xC009, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Packard Bell Imedia 2097", VIA_K8M800, 0x1631, 0xD007, VIA_DEVICE_CRT}, {"Fujitsu-Siemens Amilo K7610", VIA_K8M800, 0x1734, 0x10B3, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Lenovo ThinkCenter E51 8714", VIA_K8M800, 0x17AA, 0x1008, VIA_DEVICE_CRT}, {"ASRock K8Upgrade-VM800", VIA_K8M800, 0x1849, 0x3108, VIA_DEVICE_CRT}, {"Axper XP-M8VM800", VIA_K8M800, 0x1940, 0xD000, VIA_DEVICE_CRT}, /*** PM800, PM880, PN800, CN333, CN400 ***/ {"VIA VT3118 (PM800)", VIA_PM800, 0x1106, 0x3118, VIA_DEVICE_CRT}, /* borrowed by ECS PM800-M2 */ {"Hasee F700C", VIA_PM800, 0x1071, 0x8650, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Mitac 8666", VIA_PM800, 0x1071, 0x8666, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"Medion MIM2080", VIA_PM800, 0x1071, 0x8965, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"TwinHead E12BL", VIA_PM800, 0x14FF, 0x0314, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"MaxSelect Optima C4", VIA_PM800, 0x1558, 0x5402, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Biostar P4VMA-M", VIA_PM800, 0x1565, 0x1202, VIA_DEVICE_CRT}, {"Sotec WA2330S5", VIA_PM800, 0x161F, 0x2037, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"Packard Bell Easynote R1100", VIA_PM800, 0x1631, 0xC015, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Fujitsu/Siemens Amilo Pro V2010", VIA_PM800, 0x1734, 0x1078, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"Fujitsu/Siemens Amilo L7310", VIA_PM800, 0x1734, 0x10AB, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"ASRock P4VM8", VIA_PM800, 0x1849, 0x3118, VIA_DEVICE_CRT}, {"Chaintech MPM800-3", VIA_PM800, 0x270F, 0x7671, VIA_DEVICE_CRT}, {"KamLAB KINO-LUKE-533-R20", VIA_PM800, 0x3344, 0x1122, VIA_DEVICE_CRT}, /*** P4M800 Pro, VN800, CN700 ***/ {"Clevo/RoverBook Partner E419L", VIA_P4M800PRO, 0x1019, 0x0F75, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Haier A60-440256080BD", VIA_P4M800PRO, 0x1019, 0x0F79, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"PCChips P23G", VIA_P4M800PRO, 0x1019, 0x1623, VIA_DEVICE_CRT}, {"ECS P4M800PRO-M", VIA_P4M800PRO, 0x1019, 0x2122, VIA_DEVICE_CRT}, {"ECS P4M800PRO-M2 (V2.0)", VIA_P4M800PRO, 0x1019, 0x2123, VIA_DEVICE_CRT}, {"ECS C7VCM", VIA_P4M800PRO, 0x1019, 0xAA2D, VIA_DEVICE_CRT}, {"PCChips V21G", VIA_P4M800PRO, 0x1019, 0xAA51, VIA_DEVICE_CRT}, {"Hewlett Packard DX2020", VIA_P4M800PRO, 0x103C, 0x3027, VIA_DEVICE_CRT}, {"Hitachi FLORA Se210 RK1", VIA_P4M800PRO, 0x1043, 0x13E2, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Asustek P5VDC-MX", VIA_P4M800PRO, 0x1043, 0x3344, VIA_DEVICE_CRT}, {"Asustek P5VDC-TVM", VIA_P4M800PRO, 0x1043, 0x81CE, VIA_DEVICE_CRT}, {"Foxconn P4M800P7MB-RS2H", VIA_P4M800PRO, 0x105B, 0x0CF0, VIA_DEVICE_CRT}, {"Gateway MX3210", VIA_P4M800PRO, 0x107B, 0x0216, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"VIA VT3344 (VM800) - EPIA EN", VIA_P4M800PRO, 0x1106, 0x3344, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"Gigabyte GA-8VM800M-775", VIA_P4M800PRO, 0x1458, 0xD000, VIA_DEVICE_CRT}, {"MSI PM8M-V", VIA_P4M800PRO, 0x1462, 0x7104, VIA_DEVICE_CRT}, {"MSI Fuzzy CN700/CN700T/CN700G", VIA_P4M800PRO, 0x1462, 0x7199, VIA_DEVICE_CRT | VIA_DEVICE_TV}, {"MSI PM8M3-V", VIA_P4M800PRO, 0x1462, 0x7211, VIA_DEVICE_CRT}, {"MSI PM8PM", VIA_P4M800PRO, 0x1462, 0x7222, VIA_DEVICE_CRT}, {"Twinhead M6", VIA_P4M800PRO, 0x14FF, 0xA007, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"RoverBook Partner W500", VIA_P4M800PRO, 0x1509, 0x4330, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"FIC PTM800Pro LF", VIA_P4M800PRO, 0x1509, 0x601A, VIA_DEVICE_CRT}, {"Clevo/RoverBook Voyager V511L", VIA_P4M800PRO, 0x1558, 0x0662, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Clevo M5xxS", VIA_P4M800PRO, 0x1558, 0x5406, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Biostar P4M80-M4 / P4VMA-M", VIA_P4M800PRO, 0x1565, 0x1202, VIA_DEVICE_CRT}, {"Biostar P4M800 Pro-M7", VIA_P4M800PRO, 0x1565, 0x1206, VIA_DEVICE_CRT}, {"Packard Bell Lima (ASUS MBP5VDZ-NVM)", VIA_P4M800PRO, 0x1631, 0xE018, VIA_DEVICE_CRT}, {"Fujitsu/Siemens Amilo Pro V2030", VIA_P4M800PRO, 0x1734, 0x109B, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Fujitsu/Siemens Amilo Pro V2035", VIA_P4M800PRO, 0x1734, 0x10AE, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Fujitsu/Siemens Amilo Pro V2055", VIA_P4M800PRO, 0x1734, 0x10CA, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Fujitsu/Siemens Amilo L7320", VIA_P4M800PRO, 0x1734, 0x10CD, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"ASRock P4VM800", VIA_P4M800PRO, 0x1849, 0x3344, VIA_DEVICE_CRT}, {"Asustek P5V800-MX", VIA_P4M800PRO, 0x3344, 0x1122, VIA_DEVICE_CRT}, /*** K8M890 ***/ {"IBM AnyPlace Kiosk 3xx", VIA_K8M890, 0x1106, 0x3230, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Asustek A8V-VM", VIA_K8M890, 0x1043, 0x81B5, VIA_DEVICE_CRT}, {"Asustek M2V-MX SE", VIA_K8M890, 0x1043, 0x8297, VIA_DEVICE_CRT}, {"Foxconn K8M890M2MA-RS2H", VIA_K8M890, 0x105B, 0x0C84, VIA_DEVICE_CRT}, {"Shuttle FX22V1", VIA_K8M890, 0x1297, 0x3080, VIA_DEVICE_CRT}, {"MSI K8M890M2-V", VIA_K8M890, 0x1462, 0x7139, VIA_DEVICE_CRT}, {"MSI K9VGM-V", VIA_K8M890, 0x1462, 0x7253, VIA_DEVICE_CRT}, {"Averatec 226x", VIA_K8M890, 0x14FF, 0xA002, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Fujitsu/Siemens Amilo La 1703", VIA_K8M890, 0x1734, 0x10D9, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Lenovo M3120C", VIA_K8M890, 0x17AA, 0x3020, VIA_DEVICE_CRT}, /*** P4M900, VN896, CN896 ***/ {"VIA Epia SN", VIA_P4M900, 0x0908, 0x1975, VIA_DEVICE_CRT}, {"Hewlett Packard 2133 Mini-Note", VIA_P4M900, 0x103C, 0x3030, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Hewlett Packard Compaq dx2040", VIA_P4M900, 0x103C, 0x3633, VIA_DEVICE_CRT}, {"Asustek P5VD2-VM", VIA_P4M900, 0x1043, 0x81CE, VIA_DEVICE_CRT}, {"Asustek P5VD2-VM SE", VIA_P4M900, 0x1043, 0x8252, VIA_DEVICE_CRT}, {"Foxconn P4M9007MB-8RS2H", VIA_P4M900, 0x105B, 0x0C87, VIA_DEVICE_CRT}, {"Mitac 8515", VIA_P4M900, 0x1071, 0x8515, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Medion Notebook MD96483", VIA_P4M900, 0x1071, 0x8615, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Mitac 8624", VIA_P4M900, 0x1071, 0x8624, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"VIA VB8001 Mini-ITX Board (P4M900)", VIA_P4M900, 0x1106, 0x3371, VIA_DEVICE_CRT}, {"Gigabyte GA-VM900M", VIA_P4M900, 0x1458, 0xD000, VIA_DEVICE_CRT}, {"MSI VR321", VIA_P4M900, 0x1462, 0x3355, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"MSI P4M900M / P4M900M2-F/L", VIA_P4M900, 0x1462, 0x7255, VIA_DEVICE_CRT}, {"MSI PM9M-V", VIA_P4M900, 0x1462, 0x7364, VIA_DEVICE_CRT}, {"MSI P4M900M3-L", VIA_P4M900, 0x1462, 0x7387, VIA_DEVICE_CRT}, {"Twinhead H12V", VIA_P4M900, 0x14FF, 0xA00F, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Twinhead K15V", VIA_P4M900, 0x14FF, 0xA012, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Semp Informática Notebook IS 1462", VIA_P4M900, 0x1509, 0x1D41, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Everex NC1501/NC1503", VIA_P4M900, 0x1509, 0x1E30, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Clevo M660SE", VIA_P4M900, 0x1558, 0x0664, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Clevo M660SR", VIA_P4M900, 0x1558, 0x0669, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Neo Endura 540SLe", VIA_P4M900, 0x1558, 0x5408, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Clevo M54xSR", VIA_P4M900, 0x1558, 0x5409, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Biostar P4M900M-M7 SE", VIA_P4M900, 0x1565, 0x1207, VIA_DEVICE_CRT}, {"Biostar Viotech 3100+", VIA_P4M900, 0x1565, 0x1209, VIA_DEVICE_CRT}, {"Fujitsu/Siemens Amilo Pro V3515", VIA_P4M900, 0x1734, 0x10CB, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Fujitsu/Siemens Amilo Li1705", VIA_P4M900, 0x1734, 0x10F7, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"ASRock P4VM900-SATA2", VIA_P4M900, 0x1849, 0x3371, VIA_DEVICE_CRT}, /*** CX700 ***/ {"VIA VT8454B", VIA_CX700, 0x0908, 0x1975, VIA_DEVICE_CRT}, /* Evaluation board, reference possibly wrong */ {"VIA VT3324 (CX700)", VIA_CX700, 0x1106, 0x3157, VIA_DEVICE_CRT}, {"MSI Fuzzy CX700/CX700D", VIA_CX700, 0x1462, 0x8020, VIA_DEVICE_CRT | VIA_DEVICE_LCD | VIA_DEVICE_TV}, {"Samsung Q1B", VIA_CX700, 0x144D, 0xC02C, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"FIC CE260", VIA_CX700, 0x1509, 0x2D30, VIA_DEVICE_LCD}, {"FIC CE261", VIA_CX700, 0x1509, 0x2F07, VIA_DEVICE_LCD}, {"Gigabyte M704 / RoverPC A700GQ", VIA_CX700, 0x161F, 0x2060, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Packard Bell EasyNote XS", VIA_CX700, 0x1631, 0xC201, VIA_DEVICE_LCD}, /* aka Everex Cloudbook CE1200V */ /*** P4M890, VN890 ***/ {"PCChips P29G", VIA_P4M890, 0x1019, 0x1629, VIA_DEVICE_CRT}, {"ECS P4M890T-M v2.0", VIA_P4M890, 0x1019, 0x2171, VIA_DEVICE_CRT}, {"PCChips ????", VIA_P4M890, 0x1019, 0x2174, VIA_DEVICE_CRT}, {"Asustek P5V-VM ULTRA", VIA_P4M890, 0x1043, 0x81B5, VIA_DEVICE_CRT}, {"Asustek P5V-VM DH", VIA_P4M890, 0x1043, 0x81CE, VIA_DEVICE_CRT}, {"Mitac 8615", VIA_P4M890, 0x1071, 0x8615, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Mitac 8624 (Joybook R41E)", VIA_P4M890, 0x1071, 0x8624, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"VIA VT3343 (P4M890)", VIA_P4M890, 0x1106, 0x3343, VIA_DEVICE_CRT}, {"MSI P4M890M-L/IL (MS-7255)", VIA_P4M890, 0x1462, 0x7255, VIA_DEVICE_CRT}, {"Abit IP-95", VIA_P4M890, 0x147B, 0x1422, VIA_DEVICE_CRT}, {"Biostar P4M890-M7 TE", VIA_P4M890, 0x1565, 0x1207, VIA_DEVICE_CRT}, {"ASRock P4VM890", VIA_P4M890, 0x1849, 0x3343, VIA_DEVICE_CRT}, /*** VX800 ***/ {"VIA Epia M700", VIA_VX800, 0x1106, 0x1122, VIA_DEVICE_CRT}, {"Siragon ML-6200", VIA_VX800, 0x1106, 0x2211, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Guillemot-Hercules ECafe EC900B", VIA_VX800, 0x1106, 0x3349, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"VIA OpenBook", VIA_VX800, 0x1170, 0x0311, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, /* VIA OpenBook eNote VBE8910 */ {"Samsung Q1EX", VIA_VX800, 0x144d, 0xc040, VIA_DEVICE_LCD}, {"Samsung NC20", VIA_VX800, 0x144d, 0xc04e, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Itona DS35S", VIA_VX800, 0x1458, 0xD000, VIA_DEVICE_CRT}, {"FIC CE2A1", VIA_VX800, 0x1509, 0x3002, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Quanta DreamBook Light IL1", VIA_VX800, 0x152d, 0x0771, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Lenovo S12", VIA_VX800, 0x17aa, 0x388c, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Fujitsu Futro S100", VIA_VX800, 0xA0A0, 0x0702, VIA_DEVICE_CRT}, /*** VX855 ***/ {"Dell Optiplex FX130", VIA_VX855, 0x1028, 0x0509, VIA_DEVICE_CRT}, {"VIA VT8562C", VIA_VX855, 0x1106, 0x5122, VIA_DEVICE_CRT}, {"OLPC XO 1.5", VIA_VX855, 0x152D, 0x0833, VIA_DEVICE_LCD}, /*** VX900 ***/ {"Simmtronics SIMM-PC VX900i", VIA_VX900, 0x1019, 0x3126, VIA_DEVICE_CRT}, {"ECS VX900-I", VIA_VX900, 0x1019, 0x7C8E, VIA_DEVICE_CRT}, {"Foxconn L740", VIA_VX900, 0x105B, 0x0CFD, VIA_DEVICE_LCD | VIA_DEVICE_CRT}, {"HP T5550 Thin Client", VIA_VX900, 0x1106, 0x7122, VIA_DEVICE_CRT}, {"Biostar Viotech 3200+", VIA_VX900, 0x1565, 0x120A, VIA_DEVICE_CRT}, {"ASRock PV530", VIA_VX900, 0x1849, 0x7122, VIA_DEVICE_CRT}, {"Fujitsu Futro A300", VIA_VX900, 0xA0A0, 0x080F, VIA_DEVICE_CRT}, /* keep this */ {NULL, VIA_UNKNOWN, 0x0000, 0x0000, VIA_DEVICE_NONE} }; 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); } void ViaCheckCardId(ScrnInfoPtr pScrn) { struct ViaCardIdStruct *Id; VIAPtr pVia = VIAPTR(pScrn); if (pVia->Chipset == VIA_CLE266) ViaDoubleCheckCLE266Revision(pScrn); if ((SUBVENDOR_ID(pVia->PciInfo) == VENDOR_ID(pVia->PciInfo)) && (SUBSYS_ID(pVia->PciInfo) == DEVICE_ID(pVia->PciInfo))) xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Manufacturer plainly copied main PCI IDs to" " subsystem/card IDs.\n"); for (Id = ViaCardId; Id->String; Id++) { if ((Id->Chip == pVia->Chipset) && (Id->Vendor == SUBVENDOR_ID(pVia->PciInfo)) && (Id->Device == SUBSYS_ID(pVia->PciInfo))) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected %s. Card-Ids (%4X|%4X)\n", Id->String, SUBVENDOR_ID(pVia->PciInfo), SUBSYS_ID(pVia->PciInfo)); pVia->ActiveDevice = Id->Outputs; pVia->Id = Id; return; } } xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unknown Card-Ids (%4X|%4X|%4X), Chipset: %s; please report to" " openchrome-users@lists.freedesktop.org\n", DEVICE_ID(pVia->PciInfo), SUBVENDOR_ID(pVia->PciInfo), SUBSYS_ID(pVia->PciInfo), pScrn->chipset); pVia->Id = Id; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_kms.c000066400000000000000000000677051267025031400234300ustar00rootroot00000000000000/* * Copyright © 2007 Red Hat, Inc. * * 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. * * Authors: * Dave Airlie * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "xf86str.h" #include "X11/Xatom.h" #include "micmap.h" #include "xf86cmap.h" #include "xf86DDC.h" #include #include "xf86Crtc.h" #include "via_driver.h" /* DPMS */ #ifdef HAVE_XEXTPROTO_71 #include #else #define DPMS_SERVER #include #endif xf86CrtcPtr window_belongs_to_crtc(ScrnInfoPtr pScrn, int x, int y, int w, int h) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); int largest = 0, area = 0, i; BoxRec crtc_area, overlap; xf86CrtcPtr best = NULL; for (i = 0; i < xf86_config->num_crtc; i++) { xf86CrtcPtr crtc = xf86_config->crtc[i]; if (crtc->enabled) { crtc_area.x1 = crtc->x; crtc_area.x2 = crtc->x + xf86ModeWidth(&crtc->mode, crtc->rotation); crtc_area.y1 = crtc->y; crtc_area.y2 = crtc->y + xf86ModeHeight(&crtc->mode, crtc->rotation); overlap.x1 = crtc_area.x1 > x ? crtc_area.x1 : x; overlap.x2 = crtc_area.x2 < x + w ? crtc_area.x2 : x + w; overlap.y1 = crtc_area.y1 > y ? crtc_area.y1 : y; overlap.y2 = crtc_area.y2 < y ? crtc_area.y2 : y + h; if (overlap.x1 >= overlap.x2 || overlap.y1 >= overlap.y2) overlap.x1 = overlap.x2 = overlap.y1 = overlap.y2 = 0; area = (overlap.x2 - overlap.x1) * (overlap.y2 - overlap.y1); if (area > largest) { area = largest; best = crtc; } } } return best; } static void drmmode_ConvertFromKMode(ScrnInfoPtr pScrn, drmModeModeInfo *kmode, DisplayModePtr mode) { memset(mode, 0, sizeof(DisplayModeRec)); mode->status = MODE_OK; mode->Clock = kmode->clock; mode->HDisplay = kmode->hdisplay; mode->HSyncStart = kmode->hsync_start; mode->HSyncEnd = kmode->hsync_end; mode->HTotal = kmode->htotal; mode->HSkew = kmode->hskew; mode->VDisplay = kmode->vdisplay; mode->VSyncStart = kmode->vsync_start; mode->VSyncEnd = kmode->vsync_end; mode->VTotal = kmode->vtotal; mode->VScan = kmode->vscan; mode->Flags = kmode->flags; //& FLAG_BITS; mode->name = strdup(kmode->name); if (kmode->type & DRM_MODE_TYPE_DRIVER) mode->type = M_T_DRIVER; if (kmode->type & DRM_MODE_TYPE_PREFERRED) mode->type |= M_T_PREFERRED; xf86SetModeCrtc(mode, pScrn->adjustFlags); } static void drmmode_ConvertToKMode(ScrnInfoPtr pScrn, drmModeModeInfo *kmode, DisplayModePtr mode) { memset(kmode, 0, sizeof(*kmode)); kmode->clock = mode->Clock; kmode->hdisplay = mode->HDisplay; kmode->hsync_start = mode->HSyncStart; kmode->hsync_end = mode->HSyncEnd; kmode->htotal = mode->HTotal; kmode->hskew = mode->HSkew; kmode->vdisplay = mode->VDisplay; kmode->vsync_start = mode->VSyncStart; kmode->vsync_end = mode->VSyncEnd; kmode->vtotal = mode->VTotal; kmode->vscan = mode->VScan; kmode->flags = mode->Flags; //& FLAG_BITS; if (mode->name) strncpy(kmode->name, mode->name, DRM_DISPLAY_MODE_LEN); kmode->name[DRM_DISPLAY_MODE_LEN-1] = 0; } static void drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode) { #if 0 xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; /* bonghits in the randr 1.2 - uses dpms to disable crtc - bad buzz */ if (mode == DPMSModeOff) { drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0, 0, 0, NULL, 0, NULL); } #endif } static Bool drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, int x, int y) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; ScrnInfoPtr pScrn = crtc->scrn; int output_count = 0, ret, i; uint32_t *output_ids = NULL; drmModeModeInfo kmode; if (!mode || !xf86CrtcRotate(crtc)) return FALSE; output_ids = calloc(sizeof(uint32_t), xf86_config->num_output); if (!output_ids) return FALSE; for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; drmmode_output_private_ptr drmmode_output; if (output->crtc != crtc) continue; drmmode_output = output->driver_private; output_ids[output_count] = drmmode_output->mode_output->connector_id; output_count++; } drmmode_ConvertToKMode(crtc->scrn, &kmode, mode); if (drmmode->fb_id == 0) { ret = drmModeAddFB(drmmode->fd, pScrn->virtualX, pScrn->virtualY, pScrn->depth, pScrn->bitsPerPixel, drmmode->front_bo->pitch, drmmode->front_bo->handle, &drmmode->fb_id); if (ret < 0) { ErrorF("failed to add fb %d\n", ret); goto done; } } ret = drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, drmmode->fb_id, x, y, output_ids, output_count, &kmode); if (ret) { xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, "failed to set mode: %s", strerror(-ret)); goto done; } if (crtc->scrn->pScreen) xf86CrtcSetScreenSubpixelOrder(crtc->scrn->pScreen); /* go through all the outputs and force DPMS them back on? */ for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; if (output->crtc != crtc) continue; output->funcs->dpms(output, DPMSModeOn); } #if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,0,0,0) crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green, 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); } static void drmmode_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg) { } static void drmmode_set_cursor_position (xf86CrtcPtr crtc, int x, int y) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; drmModeMoveCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, x, y); } static void drmmode_hide_cursor (xf86CrtcPtr crtc) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; drmmode_ptr drmmode = drmmode_crtc->drmmode; drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0, cursor_info->MaxWidth, cursor_info->MaxHeight); } static void drmmode_show_cursor (xf86CrtcPtr crtc) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; uint32_t handle = drmmode_crtc->cursor_bo->handle; drmmode_ptr drmmode = drmmode_crtc->drmmode; drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle, cursor_info->MaxWidth, cursor_info->MaxHeight); } static void drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; xf86CursorInfoPtr cursor_info = xf86_config->cursor_info; uint32_t handle = drmmode_crtc->cursor_bo->handle, *ptr; /* cursor should be mapped already */ ptr = drm_bo_map(crtc->scrn, drmmode_crtc->cursor_bo); memset(ptr, 0x00, drmmode_crtc->cursor_bo->size); memcpy(ptr, image, drmmode_crtc->cursor_bo->size); drm_bo_unmap(crtc->scrn, drmmode_crtc->cursor_bo); if (drmModeSetCursor(drmmode_crtc->drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle, cursor_info->MaxWidth, cursor_info->MaxHeight)) { drmmode_ptr drmmode = drmmode_crtc->drmmode; cursor_info->MaxWidth = cursor_info->MaxHeight = 0; drmmode->hwcursor = FALSE; } } static void drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t *green, uint16_t *blue, int size) { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; drmmode_ptr drmmode = drmmode_crtc->drmmode; drmModeCrtcSetGamma(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, size, red, green, blue); } static const xf86CrtcFuncsRec drmmode_crtc_funcs = { .dpms = drmmode_crtc_dpms, .set_mode_major = drmmode_set_mode_major, .set_cursor_colors = drmmode_set_cursor_colors, .set_cursor_position = drmmode_set_cursor_position, .show_cursor = drmmode_show_cursor, .hide_cursor = drmmode_hide_cursor, .load_cursor_argb = drmmode_load_cursor_argb, .gamma_set = drmmode_crtc_gamma_set, .destroy = NULL, }; static void drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num) { drmmode_crtc_private_ptr drmmode_crtc; xf86CrtcPtr crtc; crtc = xf86CrtcCreate(pScrn, &drmmode_crtc_funcs); if (crtc == NULL) return; drmmode_crtc = xnfcalloc(sizeof(drmmode_crtc_private_rec), 1); drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd, drmmode->mode_res->crtcs[num]); drmmode_crtc->drmmode = drmmode; crtc->driver_private = drmmode_crtc; } /* * Handle KMS xf86Outputs */ static Bool drmmode_property_ignore(drmModePropertyPtr prop) { if (!prop) return TRUE; /* ignore blob prop */ if (prop->flags & DRM_MODE_PROP_BLOB) return TRUE; /* ignore standard property */ if (!strcmp(prop->name, "EDID") || !strcmp(prop->name, "DPMS")) return TRUE; return FALSE; } static void drmmode_output_dpms(xf86OutputPtr output, int mode) { drmmode_output_private_ptr drmmode_output = output->driver_private; drmModeConnectorPtr koutput = drmmode_output->mode_output; drmmode_ptr drmmode = drmmode_output->drmmode; drmModeConnectorSetProperty(drmmode->fd, koutput->connector_id, drmmode_output->dpms_enum_id, mode); return; } static void drmmode_output_create_resources(xf86OutputPtr output) { drmmode_output_private_ptr drmmode_output = output->driver_private; drmModeConnectorPtr mode_output = drmmode_output->mode_output; drmmode_ptr drmmode = drmmode_output->drmmode; drmModePropertyPtr drmmode_prop; int i, j, err; drmmode_output->props = calloc(mode_output->count_props, sizeof(drmmode_prop_rec)); if (!drmmode_output->props) return; drmmode_output->num_props = 0; for (i = 0, j = 0; i < mode_output->count_props; i++) { drmmode_prop = drmModeGetProperty(drmmode->fd, mode_output->props[i]); if (drmmode_property_ignore(drmmode_prop)) { drmModeFreeProperty(drmmode_prop); continue; } drmmode_output->props[j].mode_prop = drmmode_prop; drmmode_output->props[j].value = mode_output->prop_values[i]; drmmode_output->num_props++; j++; } for (i = 0; i < drmmode_output->num_props; i++) { drmmode_prop_ptr p = &drmmode_output->props[i]; drmmode_prop = p->mode_prop; if (drmmode_prop->flags & DRM_MODE_PROP_RANGE) { INT32 range[2]; INT32 value = p->value; p->num_atoms = 1; p->atoms = calloc(p->num_atoms, sizeof(Atom)); 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]; err = RRConfigureOutputProperty(output->randr_output, p->atoms[0], FALSE, TRUE, drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE, 2, range); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRConfigureOutputProperty error, %d\n", err); } err = RRChangeOutputProperty(output->randr_output, p->atoms[0], XA_INTEGER, 32, PropModeReplace, 1, &value, FALSE, TRUE); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRChangeOutputProperty error, %d\n", err); } } else if (drmmode_prop->flags & DRM_MODE_PROP_ENUM) { p->num_atoms = drmmode_prop->count_enums + 1; p->atoms = calloc(p->num_atoms, sizeof(Atom)); if (!p->atoms) continue; p->atoms[0] = MakeAtom(drmmode_prop->name, strlen(drmmode_prop->name), TRUE); for (j = 1; j <= drmmode_prop->count_enums; j++) { struct drm_mode_property_enum *e = &drmmode_prop->enums[j-1]; p->atoms[j] = MakeAtom(e->name, strlen(e->name), TRUE); } err = RRConfigureOutputProperty(output->randr_output, p->atoms[0], FALSE, FALSE, drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE, p->num_atoms - 1, (INT32 *)&p->atoms[1]); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRConfigureOutputProperty error, %d\n", err); } for (j = 0; j < drmmode_prop->count_enums; j++) if (drmmode_prop->enums[j].value == p->value) break; /* there's always a matching value */ err = RRChangeOutputProperty(output->randr_output, p->atoms[0], XA_ATOM, 32, PropModeReplace, 1, &p->atoms[j+1], FALSE, TRUE); if (err != 0) { xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, "RRChangeOutputProperty error, %d\n", err); } } } } static Bool drmmode_output_set_property(xf86OutputPtr output, Atom property, RRPropertyValuePtr value) { drmmode_output_private_ptr drmmode_output = output->driver_private; drmmode_ptr drmmode = drmmode_output->drmmode; int i; for (i = 0; i < drmmode_output->num_props; i++) { drmmode_prop_ptr p = &drmmode_output->props[i]; if (p->atoms[0] != property) continue; if (p->mode_prop->flags & DRM_MODE_PROP_RANGE) { uint32_t val; if (value->type != XA_INTEGER || value->format != 32 || value->size != 1) return FALSE; val = *(uint32_t *)value->data; drmModeConnectorSetProperty(drmmode->fd, drmmode_output->output_id, p->mode_prop->prop_id, (uint64_t)val); return TRUE; } else if (p->mode_prop->flags & DRM_MODE_PROP_ENUM) { const char *name; Atom atom; int j; if (value->type != XA_ATOM || value->format != 32 || value->size != 1) return FALSE; memcpy(&atom, value->data, 4); name = NameForAtom(atom); /* search for matching name string, then set its value down */ for (j = 0; j < p->mode_prop->count_enums; j++) { if (!strcmp(p->mode_prop->enums[j].name, name)) { drmModeConnectorSetProperty(drmmode->fd, drmmode_output->output_id, p->mode_prop->prop_id, p->mode_prop->enums[j].value); return TRUE; } } } } return TRUE; } static Bool drmmode_output_get_property(xf86OutputPtr output, Atom property) { return TRUE; } static xf86OutputStatus drmmode_output_detect(xf86OutputPtr output) { /* go to the hw and retrieve a new output struct */ drmmode_output_private_ptr drmmode_output = output->driver_private; drmmode_ptr drmmode = drmmode_output->drmmode; xf86OutputStatus status; drmModeFreeConnector(drmmode_output->mode_output); drmmode_output->mode_output = drmModeGetConnector(drmmode->fd, drmmode_output->output_id); switch (drmmode_output->mode_output->connection) { case DRM_MODE_CONNECTED: status = XF86OutputStatusConnected; break; case DRM_MODE_DISCONNECTED: status = XF86OutputStatusDisconnected; break; default: case DRM_MODE_UNKNOWNCONNECTION: status = XF86OutputStatusUnknown; break; } return status; } static Bool drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes) { return MODE_OK; } static DisplayModePtr drmmode_output_get_modes(xf86OutputPtr output) { drmmode_output_private_ptr drmmode_output = output->driver_private; drmModeConnectorPtr koutput = drmmode_output->mode_output; drmmode_ptr drmmode = drmmode_output->drmmode; DisplayModePtr Modes = NULL, Mode; drmModePropertyPtr props; xf86MonPtr mon = NULL; int i; /* look for an EDID property */ for (i = 0; i < koutput->count_props; i++) { props = drmModeGetProperty(drmmode->fd, koutput->props[i]); if (props && (props->flags & DRM_MODE_PROP_BLOB)) { if (!strcmp(props->name, "EDID")) { if (drmmode_output->edid_blob) drmModeFreePropertyBlob(drmmode_output->edid_blob); drmmode_output->edid_blob = drmModeGetPropertyBlob(drmmode->fd, koutput->prop_values[i]); } drmModeFreeProperty(props); } } if (drmmode_output->edid_blob) { mon = xf86InterpretEDID(output->scrn->scrnIndex, drmmode_output->edid_blob->data); if (mon && drmmode_output->edid_blob->length > 128) mon->flags |= MONITOR_EDID_COMPLETE_RAWDATA; } xf86OutputSetEDID(output, mon); /* modes should already be available */ for (i = 0; i < koutput->count_modes; i++) { Mode = xnfalloc(sizeof(DisplayModeRec)); drmmode_ConvertFromKMode(output->scrn, &koutput->modes[i], Mode); Modes = xf86ModesAdd(Modes, Mode); } return Modes; } static void drmmode_output_destroy(xf86OutputPtr output) { drmmode_output_private_ptr drmmode_output = output->driver_private; int i; if (drmmode_output->edid_blob) drmModeFreePropertyBlob(drmmode_output->edid_blob); for (i = 0; i < drmmode_output->num_props; i++) { drmModeFreeProperty(drmmode_output->props[i].mode_prop); free(drmmode_output->props[i].atoms); } for (i = 0; i < drmmode_output->mode_output->count_encoders; i++) { drmModeFreeEncoder(drmmode_output->mode_encoders[i]); free(drmmode_output->mode_encoders); } free(drmmode_output->props); drmModeFreeConnector(drmmode_output->mode_output); free(drmmode_output); output->driver_private = NULL; } static const xf86OutputFuncsRec drmmode_output_funcs = { .dpms = drmmode_output_dpms, .create_resources = drmmode_output_create_resources, #ifdef RANDR_12_INTERFACE .set_property = drmmode_output_set_property, .get_property = drmmode_output_get_property, #endif .detect = drmmode_output_detect, .mode_valid = drmmode_output_mode_valid, .get_modes = drmmode_output_get_modes, .destroy = drmmode_output_destroy }; static int subpixel_conv_table[7] = { 0, SubPixelUnknown, SubPixelHorizontalRGB, SubPixelHorizontalBGR, SubPixelVerticalRGB, SubPixelVerticalBGR, SubPixelNone }; const char *output_names[] = { "None", "VGA", "DVI", "DVI", "DVI", "Composite", "S-video", "LVDS", "CTV", "DIN", "DisplayPort", "HDMI", "HDMI", "TV", "eDP" }; static void drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num) { xf86OutputPtr output; drmModeConnectorPtr koutput; drmModeEncoderPtr *kencoders = NULL; drmmode_output_private_ptr drmmode_output; drmModePropertyPtr props; char name[32]; int i; koutput = drmModeGetConnector(drmmode->fd, drmmode->mode_res->connectors[num]); if (!koutput) return; kencoders = calloc(sizeof(drmModeEncoderPtr), koutput->count_encoders); if (!kencoders) { goto out_free_encoders; } for (i = 0; i < koutput->count_encoders; i++) { kencoders[i] = drmModeGetEncoder(drmmode->fd, koutput->encoders[i]); if (!kencoders[i]) { goto out_free_encoders; } } /* need to do smart conversion here for compat with non-kms ATI driver */ snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], koutput->connector_type_id - 1); output = xf86OutputCreate (pScrn, &drmmode_output_funcs, name); if (!output) { goto out_free_encoders; } drmmode_output = calloc(sizeof(drmmode_output_private_rec), 1); if (!drmmode_output) { xf86OutputDestroy(output); goto out_free_encoders; } drmmode_output->output_id = drmmode->mode_res->connectors[num]; drmmode_output->mode_output = koutput; drmmode_output->mode_encoders = kencoders; drmmode_output->drmmode = drmmode; output->mm_width = koutput->mmWidth; output->mm_height = koutput->mmHeight; output->subpixel_order = subpixel_conv_table[koutput->subpixel]; output->interlaceAllowed = TRUE; output->doubleScanAllowed = TRUE; output->driver_private = drmmode_output; output->possible_crtcs = 0x7f; for (i = 0; i < koutput->count_encoders; i++) output->possible_crtcs &= kencoders[i]->possible_crtcs; /* work out the possible clones later */ output->possible_clones = 0; for (i = 0; i < koutput->count_props; i++) { props = drmModeGetProperty(drmmode->fd, koutput->props[i]); if (props && (props->flags & DRM_MODE_PROP_ENUM)) { if (!strcmp(props->name, "DPMS")) { drmmode_output->dpms_enum_id = koutput->props[i]; drmModeFreeProperty(props); break; } drmModeFreeProperty(props); } } return; out_free_encoders: if (kencoders){ for (i = 0; i < koutput->count_encoders; i++) drmModeFreeEncoder(kencoders[i]); free(kencoders); } drmModeFreeConnector(koutput); } 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); xf86OutputPtr clone_output; int index_mask = 0, i; if (drmmode_output->enc_clone_mask == 0) return index_mask; for (i = 0; i < xf86_config->num_output; i++) { clone_output = xf86_config->output[i]; clone_drmout = clone_output->driver_private; if (output == clone_output) continue; if (clone_drmout->enc_mask == 0) continue; if (drmmode_output->enc_clone_mask == clone_drmout->enc_mask) index_mask |= (1 << i); } return index_mask; } static void drmmode_clones_init(ScrnInfoPtr scrn, drmmode_ptr drmmode) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int i, j; for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; drmmode_output_private_ptr drmmode_output; drmmode_output = output->driver_private; drmmode_output->enc_clone_mask = 0xff; /* and all the possible encoder clones for this output together */ for (j = 0; j < drmmode_output->mode_output->count_encoders; j++) { int k; for (k = 0; k < drmmode->mode_res->count_encoders; k++) { if (drmmode->mode_res->encoders[k] == drmmode_output->mode_encoders[j]->encoder_id) drmmode_output->enc_mask |= (1 << k); } drmmode_output->enc_clone_mask &= drmmode_output->mode_encoders[j]->possible_clones; } } for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; output->possible_clones = find_clones(scrn, output); } } Bool KMSCrtcInit(ScrnInfoPtr pScrn, drmmode_ptr drmmode) { int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "KMSCrtcInit\n")); drmmode->scrn = pScrn; drmmode->mode_res = drmModeGetResources(drmmode->fd); if (!drmmode->mode_res) return FALSE; xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width, drmmode->mode_res->max_height); for (i = 0; i < drmmode->mode_res->count_crtcs; i++) if (!xf86IsEntityShared(pScrn->entityList[0]) || pScrn->confScreen->device->screen == i) drmmode_crtc_init(pScrn, drmmode, i); for (i = 0; i < drmmode->mode_res->count_connectors; i++) drmmode_output_init(pScrn, drmmode, i); /* workout clones */ drmmode_clones_init(pScrn, drmmode); return TRUE; } #ifdef HAVE_UDEV static void drmmode_handle_uevents(int fd, void *closure) { drmmode_ptr drmmode = closure; ScrnInfoPtr scrn = drmmode->scrn; struct udev_device *dev; dev = udev_monitor_receive_device(drmmode->uevent_monitor); if (!dev) return; RRGetInfo(xf86ScrnToScreen(scrn), TRUE); udev_device_unref(dev); } #endif void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode) { #ifdef HAVE_UDEV struct udev_monitor *mon; struct udev *u; u = udev_new(); if (!u) return; mon = udev_monitor_new_from_netlink(u, "udev"); if (!mon) { udev_unref(u); return; } if (udev_monitor_filter_add_match_subsystem_devtype(mon, "drm", "drm_minor") < 0 || udev_monitor_enable_receiving(mon) < 0) { udev_monitor_unref(mon); udev_unref(u); return; } drmmode->uevent_handler = xf86AddGeneralHandler(udev_monitor_get_fd(mon), drmmode_handle_uevents, drmmode); drmmode->uevent_monitor = mon; #endif } void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode) { #ifdef HAVE_UDEV if (drmmode->uevent_handler) { struct udev *u = udev_monitor_get_udev(drmmode->uevent_monitor); xf86RemoveGeneralHandler(drmmode->uevent_handler); udev_monitor_unref(drmmode->uevent_monitor); udev_unref(u); } #endif } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_kms.h000066400000000000000000000054511267025031400234230ustar00rootroot00000000000000/* * Copyright © 2007 Red Hat, Inc. * * 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. * * Authors: * Dave Airlie * */ #ifndef DRMMODE_DISPLAY_H #define DRMMODE_DISPLAY_H #ifdef HAVE_DRI #include "xf86drmMode.h" #endif #ifdef HAVE_UDEV #include "libudev.h" #endif typedef struct { int fd; unsigned fb_id; #ifdef HAVE_DRI drmModeResPtr mode_res; drmModeFBPtr mode_fb; drmEventContext event_context; #endif ScrnInfoPtr scrn; #ifdef HAVE_UDEV struct udev_monitor *uevent_monitor; InputHandlerProc uevent_handler; #endif struct buffer_object *front_bo; Bool hwcursor; } drmmode_rec, *drmmode_ptr; typedef struct { drmmode_ptr drmmode; #ifdef HAVE_DRI drmModeCrtcPtr mode_crtc; #endif struct buffer_object *cursor_bo; unsigned rotate_fb_id; int index; } drmmode_crtc_private_rec, *drmmode_crtc_private_ptr; #ifdef HAVE_DRI typedef struct { drmModePropertyPtr mode_prop; uint64_t value; int num_atoms; /* if range prop, num_atoms == 1; if enum prop, num_atoms == num_enums + 1 */ Atom *atoms; } drmmode_prop_rec, *drmmode_prop_ptr; typedef struct { drmmode_ptr drmmode; int output_id; drmModeConnectorPtr mode_output; drmModeEncoderPtr *mode_encoders; drmModePropertyBlobPtr edid_blob; int dpms_enum_id; int num_props; drmmode_prop_ptr props; int enc_mask; int enc_clone_mask; } drmmode_output_private_rec, *drmmode_output_private_ptr; #endif extern xf86CrtcPtr window_belongs_to_crtc(ScrnInfoPtr pScrn, int x, int y, int w, int h); extern Bool KMSCrtcInit(ScrnInfoPtr pScrn, drmmode_ptr drmmode); extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode); extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode); #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_lvds.c000066400000000000000000001510731267025031400235760ustar00rootroot00000000000000/* * Copyright 2007-2015 The Openchrome Project * [http://www.freedesktop.org/wiki/Openchrome] * Copyright 1998-2007 VIA Technologies, Inc. All Rights Reserved. * Copyright 2001-2007 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. */ /* * Integrated LVDS power management functions. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "via_driver.h" #include "via_mode.h" #include /* * Option handling. */ enum ViaPanelOpts { OPTION_BUSWIDTH, OPTION_CENTER, OPTION_FORCEPANEL, OPTION_PANELSIZE }; static OptionInfoRec ViaPanelOptions[] = { {OPTION_BUSWIDTH, "BusWidth", OPTV_ANYSTR, {0}, FALSE}, {OPTION_CENTER, "Center", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_FORCEPANEL, "ForcePanel", OPTV_BOOLEAN, {0}, FALSE}, /* last resort */ {OPTION_PANELSIZE, "PanelSize", OPTV_ANYSTR, {0}, FALSE}, {-1, NULL, OPTV_NONE, {0}, FALSE} }; static ViaPanelModeRec ViaPanelNativeModes[] = { {640, 480}, {800, 600}, {1024, 768}, {1280, 768}, {1280, 1024}, {1400, 1050}, {1600, 1200}, /* 0x6 */ {1280, 800}, /* 0x7 Resolution 1280x800 (Samsung NC20) */ {800, 480}, /* 0x8 For Quanta 800x480 */ {1024, 600}, /* 0x9 Resolution 1024x600 (for HP 2133) */ {1368, 768}, /* 0xA Resolution 1366x768 */ {1920, 1080}, {1920, 1200}, {1280, 1024}, /* 0xD */ {1440, 900}, /* 0xE */ {1280, 720}, /* 0xF 480x640 */ {1200, 900}, /* 0x10 For OLPC 1.5 */ {1360, 768}, /* 0x11 Resolution 1360X768 */ {1024, 768}, /* 0x12 Resolution 1024x768 */ {800, 480} /* 0x13 General 8x4 panel use this setting */ }; #define MODEPREFIX(name) NULL, NULL, name, 0, M_T_DRIVER | M_T_DEFAULT #define MODESUFFIX 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0 static DisplayModeRec OLPCMode = { MODEPREFIX("1200x900"), 57275, 1200, 1208, 1216, 1240, 0, 900, 905, 908, 912, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }; /* 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 static void ViaLVDSSoftwarePowerFirstSequence(ScrnInfoPtr pScrn, Bool on) { 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); /* VEE OFF (unused on vt3353)*/ hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xFB); usleep(TD2); /* DATA OFF */ hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xF7); usleep(TD1); /* VDD OFF */ hwp->writeCrtc(hwp, 0x91, hwp->readCrtc(hwp, 0x91) & 0xEF); } } static void ViaLVDSSoftwarePowerSecondSequence(ScrnInfoPtr pScrn, Bool on) { 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); /* DATA OFF */ hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xF7); /* Delay TD1 msec. */ usleep(TD1); /* VDD OFF */ hwp->writeCrtc(hwp, 0xD3, hwp->readCrtc(hwp, 0xD3) & 0xEF); } } 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); } } static void ViaLVDSHardwarePowerSecondSequence(ScrnInfoPtr pScrn, Bool on) { 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); } } static void ViaLVDSDFPPower(ScrnInfoPtr pScrn, Bool on) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); /* Switch DFP High/Low pads on or off for channels active at EnterVT(). */ ViaSeqMask(hwp, 0x2A, on ? pVia->SavedReg.SR2A : 0, 0x0F); } static void ViaLVDSPowerChannel(ScrnInfoPtr pScrn, Bool on) { vgaHWPtr hwp = VGAHWPTR(pScrn); CARD8 lvdsMask; 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); } } static void ViaLVDSPower(ScrnInfoPtr pScrn, Bool on) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaLVDSPower %d\n", on)); VIAPtr pVia = VIAPTR(pScrn); /* * VX800, CX700 have HW issue, so we'd better use SW power sequence * Fix Ticket #308 */ switch (pVia->Chipset) { case VIA_VX800: case VIA_CX700: ViaLVDSSoftwarePowerFirstSequence(pScrn, on); ViaLVDSSoftwarePowerSecondSequence(pScrn, on); break; default: ViaLVDSHardwarePowerFirstSequence(pScrn, on); ViaLVDSHardwarePowerSecondSequence(pScrn, on); break; } ViaLVDSDFPPower(pScrn, on); ViaLVDSPowerChannel(pScrn, on); } static void via_lvds_create_resources(xf86OutputPtr output) { } #ifdef RANDR_12_INTERFACE static Bool via_lvds_set_property(xf86OutputPtr output, Atom property, RRPropertyValuePtr value) { return FALSE; } static Bool via_lvds_get_property(xf86OutputPtr output, Atom property) { return FALSE; } #endif static void ViaLCDPowerSequence(vgaHWPtr hwp, VIALCDPowerSeqRec Sequence) { int i; 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]); } } static void ViaLCDPower(xf86OutputPtr output, Bool On) { ViaPanelInfoPtr Panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; int i; #ifdef HAVE_DEBUG if (On) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaLCDPower: On.\n"); else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaLCDPower: Off.\n"); #endif /* Enable LCD */ if (On) ViaCrtcMask(hwp, 0x6A, 0x08, 0x08); else ViaCrtcMask(hwp, 0x6A, 0x00, 0x08); if (pBIOSInfo->LCDPower) pBIOSInfo->LCDPower(pScrn, 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 (On) ViaLCDPowerSequence(hwp, powerOn[i]); else ViaLCDPowerSequence(hwp, powerOff[i]); usleep(1); } static void via_lvds_dpms(xf86OutputPtr output, int mode) { ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); if (pVia->pVbe) { ViaVbePanelPower(pVia->pVbe, (mode == DPMSModeOn)); } else { switch (mode) { case DPMSModeOn: switch (pVia->Chipset) { case VIA_P4M900: case VIA_CX700: case VIA_VX800: case VIA_VX855: case VIA_VX900: ViaLVDSPower(pScrn, TRUE); break; } ViaLCDPower(output, TRUE); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: switch (pVia->Chipset) { case VIA_P4M900: case VIA_CX700: case VIA_VX800: case VIA_VX855: case VIA_VX900: ViaLVDSPower(pScrn, FALSE); break; } ViaLCDPower(output, FALSE); break; } } } static void via_lvds_save(xf86OutputPtr output) { } static void via_lvds_restore(xf86OutputPtr output) { ViaLCDPower(output, TRUE); } /* * Try to interpret EDID ourselves. */ static Bool ViaPanelGetSizeFromEDID(ScrnInfoPtr pScrn, xf86MonPtr pMon, int *width, int *height) { int i, max_hsize = 0, vsize = 0; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetPanelSizeFromEDID\n")); /* !!! Why are we not checking VESA modes? */ /* checking standard timings */ for (i = 0; i < STD_TIMINGS; i++) if ((pMon->timings2[i].hsize > 256) && (pMon->timings2[i].hsize > max_hsize)) { max_hsize = pMon->timings2[i].hsize; vsize = pMon->timings2[i].vsize; } if (max_hsize != 0) { *width = max_hsize; *height = vsize; return TRUE; } /* checking detailed monitor section */ /* !!! skip Ranges and standard timings */ /* check detailed timings */ for (i = 0; i < DET_TIMINGS; i++) if (pMon->det_mon[i].type == DT) { struct detailed_timings timing = pMon->det_mon[i].section.d_timings; /* ignore v_active for now */ if ((timing.clock > 15000000) && (timing.h_active > max_hsize)) { max_hsize = timing.h_active; vsize = timing.v_active; } } if (max_hsize != 0) { *width = max_hsize; *height = vsize; return TRUE; } 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; } /* Currently only used by Legacy Mode Setting */ static Bool ViaPanelGetSizeFromDDCv2(ScrnInfoPtr pScrn, int *width) { VIAPtr pVia = VIAPTR(pScrn); CARD8 W_Buffer[1]; CARD8 R_Buffer[4]; I2CDevPtr dev; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetPanelSizeFromDDCv2\n")); if (!xf86I2CProbeAddress(pVia->pI2CBus2, 0xA2)) return FALSE; dev = xf86CreateI2CDevRec(); if (!dev) return FALSE; dev->DevName = "EDID2"; dev->SlaveAddr = 0xA2; dev->ByteTimeout = 2200; /* VESA DDC spec 3 p. 43 (+10 %) */ dev->StartTimeout = 550; dev->BitTimeout = 40; dev->ByteTimeout = 40; dev->AcknTimeout = 40; dev->pI2CBus = pVia->pI2CBus2; if (!xf86I2CDevInit(dev)) { xf86DestroyI2CDevRec(dev, TRUE); return FALSE; } xf86I2CReadByte(dev, 0x00, R_Buffer); if (R_Buffer[0] != 0x20) { xf86DestroyI2CDevRec(dev, TRUE); return FALSE; } /* Found EDID2 Table */ W_Buffer[0] = 0x76; xf86I2CWriteRead(dev, W_Buffer, 1, R_Buffer, 2); xf86DestroyI2CDevRec(dev, TRUE); *width = R_Buffer[0] | (R_Buffer[1] << 8); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetPanelSizeFromDDCv2: %d\n", *width)); return TRUE; } static Bool ViaGetResolutionIndex(ScrnInfoPtr pScrn, ViaPanelInfoPtr Panel, DisplayModePtr mode) { int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaGetResolutionIndex: Looking for %dx%d\n", mode->CrtcHDisplay, mode->CrtcVDisplay)); for (i = 0; ViaResolutionTable[i].Index != VIA_RES_INVALID; i++) { if ((ViaResolutionTable[i].X == mode->CrtcHDisplay) && (ViaResolutionTable[i].Y == mode->CrtcVDisplay)) { Panel->ResolutionIndex = ViaResolutionTable[i].Index; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaGetResolutionIndex:" " %d\n", Panel->ResolutionIndex)); return TRUE; } } Panel->ResolutionIndex = VIA_RES_INVALID; return FALSE; } static int ViaGetVesaMode(ScrnInfoPtr pScrn, DisplayModePtr mode) { int i; for (i = 0; ViaVesaModes[i].Width; i++) if ((ViaVesaModes[i].Width == mode->CrtcHDisplay) && (ViaVesaModes[i].Height == mode->CrtcVDisplay)) { switch (pScrn->bitsPerPixel) { case 8: return ViaVesaModes[i].mode_8b; case 16: return ViaVesaModes[i].mode_16b; case 24: case 32: return ViaVesaModes[i].mode_32b; default: return 0xFFFF; } } return 0xFFFF; } /* * Gets the native panel resolution from scratch pad registers. */ static void ViaPanelGetNativeModeFromScratchPad(xf86OutputPtr output) { ViaPanelInfoPtr panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); CARD8 index; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetNativeModeFromScratchPad\n")); index = hwp->readCrtc(hwp, 0x3F) & 0x0F; panel->NativeModeIndex = index; panel->NativeWidth = ViaPanelNativeModes[index].Width; panel->NativeHeight = ViaPanelNativeModes[index].Height; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Native Panel Resolution is %dx%d\n", panel->NativeWidth, panel->NativeHeight); } /* Used only for Legacy Mode Setting */ static xf86OutputStatus VIAGetPanelSize(xf86OutputPtr output) { xf86OutputStatus status = XF86OutputStatusDisconnected; ViaPanelInfoPtr Panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; char *PanelSizeString[7] = { "640x480", "800x480", "800x600", "1024x768", "1280x768" "1280x1024", "1400x1050", "1600x1200" }; int width = 0; int height = 0; Bool ret; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetPanelSize (UseLegacyModeSwitch)\n")); ret = ViaPanelGetSizeFromDDCv1(output, &width, &height); if (!ret) ret = ViaPanelGetSizeFromDDCv2(pScrn, &width); if (ret) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EDID returned resolution %d x %d \n", width, height)); switch (width) { case 640: Panel->NativeModeIndex = VIA_PANEL6X4; break; case 800: if (height == 480) Panel->NativeModeIndex = VIA_PANEL8X4; else Panel->NativeModeIndex = VIA_PANEL8X6; break; case 1024: Panel->NativeModeIndex = VIA_PANEL10X7; break; case 1280: Panel->NativeModeIndex = VIA_PANEL12X10; break; case 1400: Panel->NativeModeIndex = VIA_PANEL14X10; break; case 1600: Panel->NativeModeIndex = VIA_PANEL16X12; break; default: Panel->NativeModeIndex = VIA_PANEL_INVALID; break; } } else { ViaPanelGetNativeModeFromScratchPad(output); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Unable to get information from EDID. Resolution from Scratchpad: %d \n", Panel->NativeModeIndex)); if (Panel->NativeModeIndex == 0) { /* VIA_PANEL6X4 == 0, but that value equals unset */ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to " "retrieve PanelSize: using default (1024x768)\n"); Panel->NativeModeIndex = VIA_PANEL10X7; } } if (Panel->NativeModeIndex < 7) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using panel at %s.\n", PanelSizeString[Panel->NativeModeIndex]); status = XF86OutputStatusConnected; } else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown panel size " "detected: %d.\n", Panel->NativeModeIndex); return status; } /* * ViaResolutionTable[i].PanelIndex is pBIOSInfo->PanelSize * Panel->PanelIndex is the index to lcdTable. * Only used by Legacy Mode Setting. */ static Bool ViaPanelGetIndex(xf86OutputPtr output, DisplayModePtr mode) { ScrnInfoPtr pScrn = output->scrn; ViaPanelInfoPtr Panel = output->driver_private; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex\n")); Panel->PanelIndex = VIA_BIOS_NUM_PANEL; if (VIAGetPanelSize(output) == XF86OutputStatusDisconnected) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaPanelGetIndex: Panel not detected.\n"); return FALSE; } if (!ViaGetResolutionIndex(pScrn, Panel, mode)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel does not support this" " resolution: %s\n", mode->name); return FALSE; } for (i = 0; ViaResolutionTable[i].Index != VIA_RES_INVALID; i++) { if (ViaResolutionTable[i].PanelIndex == Panel->NativeModeIndex) { Panel->NativeWidth = ViaResolutionTable[i].X; Panel->NativeHeight = ViaResolutionTable[i].Y; break; } } if (ViaResolutionTable[i].Index == VIA_RES_INVALID) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Unable" " to find matching PanelSize in ViaResolutionTable.\n"); return FALSE; } if ((Panel->NativeWidth != mode->CrtcHDisplay) || (Panel->NativeHeight != mode->CrtcVDisplay)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Non-native" " resolutions are broken.\n"); return FALSE; } for (i = 0; i < VIA_BIOS_NUM_PANEL; i++) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex:" "Match Debug: %d == %d)\n", Panel->NativeModeIndex, lcdTable[i].fpSize)); if (lcdTable[i].fpSize == Panel->NativeModeIndex) { int modeNum, tmp; modeNum = ViaGetVesaMode(pScrn, mode); if (modeNum == 0xFFFF) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaPanelGetIndex: " "Unable to determine matching VESA modenumber.\n"); return FALSE; } tmp = 0x01 << (modeNum & 0xF); if ((CARD16) tmp & lcdTable[i].SuptMode[(modeNum >> 4)]) { Panel->PanelIndex = i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex:" "index: %d (%dx%d)\n", Panel->PanelIndex, Panel->NativeWidth, Panel->NativeHeight)); return TRUE; } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Unable" " to match given mode with this PanelSize.\n"); return FALSE; } } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetIndex: Unable" " to match PanelSize with an lcdTable entry.\n"); return FALSE; } static int via_lvds_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) { ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); if (pVia->UseLegacyModeSwitch) { if (!ViaPanelGetIndex(output, pMode)) return MODE_BAD; } else { ViaPanelInfoPtr Panel = output->driver_private; if (Panel->NativeWidth < pMode->HDisplay || Panel->NativeHeight < pMode->VDisplay) return MODE_PANEL; if (!Panel->Scale && Panel->NativeHeight != pMode->VDisplay && Panel->NativeWidth != pMode->HDisplay) return MODE_PANEL; if (!ViaModeDotClockTranslate(pScrn, pMode)) return MODE_NOCLOCK; } return MODE_OK; } static void ViaPanelCenterMode(DisplayModePtr mode, DisplayModePtr adjusted_mode) { int panelHSyncTime = adjusted_mode->HSyncEnd - adjusted_mode->HSyncStart; int panelVSyncTime = adjusted_mode->VSyncEnd - adjusted_mode->VSyncStart; int panelHBlankStart = adjusted_mode->HDisplay; int panelVBlankStart = adjusted_mode->VDisplay; int hBorder = (adjusted_mode->HDisplay - mode->HDisplay)/2; int vBorder = (adjusted_mode->VDisplay - mode->VDisplay)/2; int newHBlankStart = hBorder + mode->HDisplay; int newVBlankStart = vBorder + mode->VDisplay; adjusted_mode->HDisplay = mode->HDisplay; adjusted_mode->HSyncStart = (adjusted_mode->HSyncStart - panelHBlankStart) + newHBlankStart; adjusted_mode->HSyncEnd = adjusted_mode->HSyncStart + panelHSyncTime; adjusted_mode->VDisplay = mode->VDisplay; adjusted_mode->VSyncStart = (adjusted_mode->VSyncStart - panelVBlankStart) + newVBlankStart; adjusted_mode->VSyncEnd = adjusted_mode->VSyncStart + panelVSyncTime; /* Adjust Crtc H and V */ adjusted_mode->CrtcHDisplay = adjusted_mode->HDisplay; adjusted_mode->CrtcHBlankStart = newHBlankStart; adjusted_mode->CrtcHBlankEnd = adjusted_mode->CrtcHTotal - hBorder; adjusted_mode->CrtcHSyncStart = adjusted_mode->HSyncStart; adjusted_mode->CrtcHSyncEnd = adjusted_mode->HSyncEnd; adjusted_mode->CrtcVDisplay = adjusted_mode->VDisplay; adjusted_mode->CrtcVBlankStart = newVBlankStart; adjusted_mode->CrtcVBlankEnd = adjusted_mode->CrtcVTotal - vBorder; adjusted_mode->CrtcVSyncStart = adjusted_mode->VSyncStart; adjusted_mode->CrtcVSyncEnd = adjusted_mode->VSyncEnd; } static Bool via_lvds_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { ViaPanelInfoPtr Panel = output->driver_private; xf86SetModeCrtc(adjusted_mode, 0); if (!Panel->Center && (mode->HDisplay < Panel->NativeWidth || mode->VDisplay < Panel->NativeHeight)) { Panel->Scale = TRUE; } else { Panel->Scale = FALSE; ViaPanelCenterMode(mode, adjusted_mode); } return TRUE; } static void via_lvds_prepare(xf86OutputPtr output) { via_lvds_dpms(output, DPMSModeOff); if (output->crtc) { drmmode_crtc_private_ptr iga = output->crtc->driver_private; CARD8 value = 0x00; /* Value for IGA 1 */ ScrnInfoPtr pScrn = output->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); /* IGA 2 */ if (iga->index) value = 0x10; ViaCrtcMask(hwp, 0x99, value, value); } } static void via_lvds_commit(xf86OutputPtr output) { via_lvds_dpms(output, DPMSModeOn); } /* * Broken, only does native mode decently. I (Luc) personally broke this. * Only for LegacyModeSetting. */ static void VIASetLCDMode(xf86OutputPtr output, DisplayModePtr mode) { ViaPanelInfoPtr Panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; VIALCDModeTableRec Table = lcdTable[Panel->PanelIndex]; int resIdx, port, offset, data, misc, i, j; CARD8 modeNum = 0; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASetLCDMode\n")); if (Panel->NativeModeIndex == VIA_PANEL12X10) hwp->writeCrtc(hwp, 0x89, 0x07); /* LCD Expand Mode Y Scale Flag */ Panel->scaleY = FALSE; /* Set LCD InitTb Regs */ if (Panel->BusWidth == VIA_DI_12BIT) { if (pVia->IsSecondary) pBIOSInfo->Clock = Table.InitTb.LCDClk_12Bit; else { pBIOSInfo->Clock = Table.InitTb.VClk_12Bit; /* for some reason still to be defined this is necessary */ ViaSetSecondaryDotclock(pScrn, Table.InitTb.LCDClk_12Bit); } } else { if (pVia->IsSecondary) pBIOSInfo->Clock = Table.InitTb.LCDClk; else { pBIOSInfo->Clock = Table.InitTb.VClk; ViaSetSecondaryDotclock(pScrn, Table.InitTb.LCDClk); } } ViaSetUseExternalClock(hwp); for (i = 0; i < Table.InitTb.numEntry; i++) { port = Table.InitTb.port[i]; offset = Table.InitTb.offset[i]; data = Table.InitTb.data[i]; ViaVgahwWrite(hwp, 0x300 + port, offset, 0x301 + port, data); } if ((mode->CrtcHDisplay != Panel->NativeWidth) || (mode->CrtcVDisplay != Panel->NativeHeight)) { VIALCDModeEntryPtr Main; VIALCDMPatchEntryPtr Patch1, Patch2; int numPatch1, numPatch2; resIdx = VIA_RES_INVALID; /* Find MxxxCtr & MxxxExp Index and * HWCursor Y Scale (PanelSize Y / Res. Y) */ Panel->resY = mode->CrtcVDisplay; switch (Panel->ResolutionIndex) { case VIA_RES_640X480: resIdx = 0; break; case VIA_RES_800X600: resIdx = 1; break; case VIA_RES_1024X768: resIdx = 2; break; case VIA_RES_1152X864: resIdx = 3; break; case VIA_RES_1280X768: case VIA_RES_1280X960: case VIA_RES_1280X1024: if (Panel->NativeModeIndex == VIA_PANEL12X10) resIdx = VIA_RES_INVALID; else resIdx = 4; break; default: resIdx = VIA_RES_INVALID; break; } if ((mode->CrtcHDisplay == 640) && (mode->CrtcVDisplay == 400)) resIdx = 0; if (resIdx == VIA_RES_INVALID) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "VIASetLCDMode: Failed " "to find a suitable Panel Size index.\n"); return; } if (Panel->Center) { Main = &(Table.MCtr[resIdx]); Patch1 = Table.MPatchDP1Ctr; numPatch1 = Table.numMPatchDP1Ctr; Patch2 = Table.MPatchDP2Ctr; numPatch2 = Table.numMPatchDP2Ctr; } else { /* expand! */ /* LCD Expand Mode Y Scale Flag */ Panel->scaleY = TRUE; Main = &(Table.MExp[resIdx]); Patch1 = Table.MPatchDP1Exp; numPatch1 = Table.numMPatchDP1Exp; Patch2 = Table.MPatchDP2Exp; numPatch2 = Table.numMPatchDP2Exp; } /* Set Main LCD Registers */ for (i = 0; i < Main->numEntry; i++) { ViaVgahwWrite(hwp, 0x300 + Main->port[i], Main->offset[i], 0x301 + Main->port[i], Main->data[i]); } if (Panel->BusWidth == VIA_DI_12BIT) { if (pVia->IsSecondary) pBIOSInfo->Clock = Main->LCDClk_12Bit; else pBIOSInfo->Clock = Main->VClk_12Bit; } else { if (pVia->IsSecondary) pBIOSInfo->Clock = Main->LCDClk; else pBIOSInfo->Clock = Main->VClk; } j = ViaGetVesaMode(pScrn, mode); if (j == 0xFFFF) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "VIASetLCDMode: " "Unable to determine matching VESA modenumber.\n"); return; } for (i = 0; i < modeFix.numEntry; i++) { if (modeFix.reqMode[i] == j) { modeNum = modeFix.fixMode[i]; break; } } /* Set LCD Mode patch registers. */ for (i = 0; i < numPatch2; i++, Patch2++) { if (Patch2->Mode == modeNum) { if (!Panel->Center && (mode->CrtcHDisplay == Panel->NativeWidth)) Panel->scaleY = FALSE; for (j = 0; j < Patch2->numEntry; j++) { ViaVgahwWrite(hwp, 0x300 + Patch2->port[j], Patch2->offset[j], 0x301 + Patch2->port[j], Patch2->data[j]); } if (Panel->BusWidth == VIA_DI_12BIT) { if (pVia->IsSecondary) pBIOSInfo->Clock = Patch2->LCDClk_12Bit; else pBIOSInfo->Clock = Patch2->VClk_12Bit; } else { if (pVia->IsSecondary) pBIOSInfo->Clock = Patch2->LCDClk; else pBIOSInfo->Clock = Patch2->VClk; } break; } } /* Set LCD Secondary Mode Patch registers. */ if (pVia->IsSecondary) { for (i = 0; i < numPatch1; i++, Patch1++) { if (Patch1->Mode == modeNum) { for (j = 0; j < Patch1->numEntry; j++) { ViaVgahwWrite(hwp, 0x300 + Patch1->port[j], Patch1->offset[j], 0x301 + Patch1->port[j], Patch1->data[j]); } break; } } } } /* LCD patch 3D5.02 */ misc = hwp->readCrtc(hwp, 0x01); hwp->writeCrtc(hwp, 0x02, misc); /* Enable LCD */ if (!pVia->IsSecondary) { /* CRT Display Source Bit 6 - 0: CRT, 1: LCD */ ViaSeqMask(hwp, 0x16, 0x40, 0x40); /* Enable Simultaneous */ if (Panel->BusWidth == VIA_DI_12BIT) { hwp->writeCrtc(hwp, 0x6B, 0xA8); if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) hwp->writeCrtc(hwp, 0x93, 0xB1); else hwp->writeCrtc(hwp, 0x93, 0xAF); } else { ViaCrtcMask(hwp, 0x6B, 0x08, 0x08); hwp->writeCrtc(hwp, 0x93, 0x00); } hwp->writeCrtc(hwp, 0x6A, 0x48); } else { /* CRT Display Source Bit 6 - 0: CRT, 1: LCD */ ViaSeqMask(hwp, 0x16, 0x00, 0x40); /* Enable SAMM */ if (Panel->BusWidth == VIA_DI_12BIT) { ViaCrtcMask(hwp, 0x6B, 0x20, 0x20); if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) hwp->writeCrtc(hwp, 0x93, 0xB1); else hwp->writeCrtc(hwp, 0x93, 0xAF); } else { hwp->writeCrtc(hwp, 0x6B, 0x00); hwp->writeCrtc(hwp, 0x93, 0x00); } hwp->writeCrtc(hwp, 0x6A, 0xC8); } } static void ViaPanelScale(ScrnInfoPtr pScrn, int resWidth, int resHeight, int panelWidth, int panelHeight) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); int horScalingFactor = 0; int verScalingFactor = 0; CARD8 cra2 = 0; CARD8 cr77 = 0; CARD8 cr78 = 0; CARD8 cr79 = 0; CARD8 cr9f = 0; Bool scaling = FALSE; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelScale: %d,%d -> %d,%d\n", resWidth, resHeight, panelWidth, panelHeight)); if (resWidth < panelWidth) { /* Load Horizontal Scaling Factor */ if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) { horScalingFactor = ((resWidth - 1) * 4096) / (panelWidth - 1); /* Horizontal scaling enabled */ cra2 = 0xC0; cr9f = horScalingFactor & 0x0003; /* HSCaleFactor[1:0] at CR9F[1:0] */ } else { /* TODO: Need testing */ horScalingFactor = ((resWidth - 1) * 1024) / (panelWidth - 1); } cr77 = (horScalingFactor & 0x03FC) >> 2; /* HSCaleFactor[9:2] at CR77[7:0] */ cr79 = (horScalingFactor & 0x0C00) >> 10; /* HSCaleFactor[11:10] at CR79[5:4] */ cr79 <<= 4; scaling = TRUE; } if (resHeight < panelHeight) { /* Load Vertical Scaling Factor */ if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) { verScalingFactor = ((resHeight - 1) * 2048) / (panelHeight - 1); /* Vertical scaling enabled */ cra2 |= 0x08; cr79 |= ((verScalingFactor & 0x0001) << 3); /* VSCaleFactor[0] at CR79[3] */ } else { /* TODO: Need testing */ verScalingFactor = ((resHeight - 1) * 1024) / (panelHeight - 1); } cr78 |= (verScalingFactor & 0x01FE) >> 1; /* VSCaleFactor[8:1] at CR78[7:0] */ cr79 |= ((verScalingFactor & 0x0600) >> 9) << 6; /* VSCaleFactor[10:9] at CR79[7:6] */ scaling = TRUE; } if (scaling) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Scaling factor: horizontal %d (0x%x), vertical %d (0x%x)\n", horScalingFactor, horScalingFactor, verScalingFactor, verScalingFactor)); ViaCrtcMask(hwp, 0x77, cr77, 0xFF); ViaCrtcMask(hwp, 0x78, cr78, 0xFF); ViaCrtcMask(hwp, 0x79, cr79, 0xF8); if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) { ViaCrtcMask(hwp, 0x9F, cr9f, 0x03); } ViaCrtcMask(hwp, 0x79, 0x03, 0x03); } else { /* Disable panel scale */ ViaCrtcMask(hwp, 0x79, 0x00, 0x01); } if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) { ViaCrtcMask(hwp, 0xA2, cra2, 0xC8); } /* Horizontal scaling selection: interpolation */ // ViaCrtcMask(hwp, 0x79, 0x02, 0x02); // else // ViaCrtcMask(hwp, 0x79, 0x00, 0x02); /* Horizontal scaling factor selection original / linear */ //ViaCrtcMask(hwp, 0xA2, 0x40, 0x40); } static void ViaPanelScaleDisable(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); ViaCrtcMask(hwp, 0x79, 0x00, 0x01); /* Disable VX900 down scaling */ if (pVia->Chipset == VIA_VX900) ViaCrtcMask(hwp, 0x89, 0x00, 0x01); if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) ViaCrtcMask(hwp, 0xA2, 0x00, 0xC8); } static void via_lvds_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { ViaPanelInfoPtr Panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); /* * FIXME: pVia->IsSecondary is not working here. We should be able * to detect when the display is using the secondary head. * TODO: This should be enabled for other chipsets as well. */ if (pVia->pVbe) { if (!pVia->useLegacyVBE) { /* * FIXME: Should we always set the panel expansion? * Does it depend on the resolution? */ if (!ViaVbeSetPanelMode(pScrn, !Panel->Center)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to set the panel mode.\n"); } } switch (pVia->Chipset) { case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: /* * Since we are using virtual, we need to adjust * the offset to match the framebuffer alignment. */ if (pScrn->displayWidth != adjusted_mode->CrtcHDisplay) ViaSecondCRTCHorizontalOffset(pScrn); break; } } else { if (!pVia->UseLegacyModeSwitch) { if (Panel->Scale) { ViaPanelScale(pScrn, mode->HDisplay, mode->VDisplay, Panel->NativeWidth, Panel->NativeHeight); } else ViaPanelScaleDisable(pScrn); } else { xf86CrtcPtr crtc = output->crtc; drmmode_crtc_private_ptr iga = crtc->driver_private; if (iga->index) { /* IGA 2 */ if (Panel->PanelIndex != VIA_BIOS_NUM_PANEL) { Panel->SetDVI = TRUE; VIASetLCDMode(output, mode); } } else { /* IGA 1 */ if (ViaPanelGetIndex(output, adjusted_mode)) VIASetLCDMode(output, adjusted_mode); } } } } static int ViaPanelLookUpModeIndex(int width, int height) { int i, index = VIA_PANEL_INVALID; int length = sizeof(ViaPanelNativeModes) / sizeof(ViaPanelModeRec); for (i = 0; i < length; i++) { if (ViaPanelNativeModes[i].Width == width && ViaPanelNativeModes[i].Height == height) { index = i; break; } } return index; } static xf86OutputStatus via_lvds_detect(xf86OutputPtr output) { static const char xoId[] = "OLPC XO 1.5"; xf86OutputStatus status = XF86OutputStatusDisconnected; ViaPanelInfoPtr panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); /* Hardcode panel size for the XO */ if(strcmp(pVia->Id->String, xoId) == 0) { panel->NativeWidth = 1200; panel->NativeHeight = 900; status = XF86OutputStatusConnected; return status; } if (!pVia->UseLegacyModeSwitch) { /* First try to get the mode from EDID. */ if (!panel->NativeWidth || !panel->NativeHeight) { int width, height; Bool ret; ret = ViaPanelGetSizeFromDDCv1(output, &width, &height); if (ret) { panel->NativeModeIndex = ViaPanelLookUpModeIndex(width, height); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelLookUpModeIndex, Width %d, Height %d, NativeModeIndex%d\n", width, height, panel->NativeModeIndex)); if (panel->NativeModeIndex != VIA_PANEL_INVALID) { panel->NativeWidth = width; panel->NativeHeight = height; status = XF86OutputStatusConnected; } } else { CARD8 CR6A = hwp->readCrtc(hwp, 0x6A); CARD8 CR6B = hwp->readCrtc(hwp, 0x6B); CARD8 CR97 = hwp->readCrtc(hwp, 0x97); CARD8 CR99 = hwp->readCrtc(hwp, 0x99); /* First test CRTC2 is out of reset and if its enabled or * simultaneous mode is enabled. Also avoid the secondary * DFP source */ if ((((CR6A & 0xC0) == 0xC0) || (((CR6A & 0xC0) == 0x40) && (CR6B & 0x08))) && (CR97 & 0x10) && (CR99 & 0x10)) { /* Use Vertical addreess register of IGA 2 */ panel->NativeWidth = (hwp->readCrtc(hwp, 0x51) | ((hwp->readCrtc(hwp, 0x55) & 0x70) << 4)) + 1; panel->NativeHeight = (hwp->readCrtc(hwp, 0x59) | ((hwp->readCrtc(hwp, 0x5D) & 0x38) << 5)) + 1; panel->NativeModeIndex = VIA_PANEL6X4; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel Mode probed %dx%d from IGA 2\n", panel->NativeWidth, panel->NativeHeight); status = XF86OutputStatusConnected; } else if (!(CR97 & 0x10) && !(CR99 & 0x10)) { CARD8 val; /* IGA1 Horizontal Overscan register */ panel->NativeWidth = (hwp->readCrtc(hwp, 0x01) + 1) * 8; /* IGA1 default Vertical Overscan register is * incorrect on some devices so use VBlank start */ panel->NativeHeight = (hwp->readCrtc(hwp, 0x15) + 1); val = hwp->readCrtc(hwp, 0x07); panel->NativeHeight |= ((val >> 3) & 0x1) << 8; panel->NativeHeight |= ((val >> 5) & 0x1) << 9; val = hwp->readCrtc(hwp, 0x35); panel->NativeHeight |= ((val >> 3) & 0x1) << 10; panel->NativeModeIndex = VIA_PANEL6X4; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Panel Mode probed %dx%d from IGA 1\n", panel->NativeWidth, panel->NativeHeight); status = XF86OutputStatusConnected; } if (!panel->NativeWidth || !panel->NativeHeight) ViaPanelGetNativeModeFromScratchPad(output); if (panel->NativeWidth && panel->NativeHeight) status = XF86OutputStatusConnected; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NativeMode: %d %d\n", panel->NativeWidth, panel->NativeHeight)); } else status = XF86OutputStatusConnected; } else status = VIAGetPanelSize(output); return status; } static DisplayModePtr via_lvds_get_modes(xf86OutputPtr output) { ViaPanelInfoPtr Panel = output->driver_private; ScrnInfoPtr pScrn = output->scrn; DisplayModePtr p = NULL; if (output->status == XF86OutputStatusConnected) { if (!output->MonInfo) { /* * Generates a display mode for the native panel resolution, * using CVT. */ if (Panel->NativeWidth && Panel->NativeHeight) { VIAPtr pVia = VIAPTR(pScrn); if (!xf86NameCmp(pVia->Id->String, "OLPC XO 1.5")) p = xf86DuplicateMode(&OLPCMode); else p = xf86CVTMode(Panel->NativeWidth, Panel->NativeHeight, 60.0f, FALSE, FALSE); if (p) { p->CrtcHDisplay = p->HDisplay; p->CrtcHSyncStart = p->HSyncStart; p->CrtcHSyncEnd = p->HSyncEnd; p->CrtcHTotal = p->HTotal; p->CrtcHSkew = p->HSkew; p->CrtcVDisplay = p->VDisplay; p->CrtcVSyncStart = p->VSyncStart; p->CrtcVSyncEnd = p->VSyncEnd; p->CrtcVTotal = p->VTotal; p->CrtcVBlankStart = min(p->CrtcVSyncStart, p->CrtcVDisplay); p->CrtcVBlankEnd = max(p->CrtcVSyncEnd, p->CrtcVTotal); p->CrtcHBlankStart = min(p->CrtcHSyncStart, p->CrtcHDisplay); p->CrtcHBlankEnd = max(p->CrtcHSyncEnd, p->CrtcHTotal); p->type = M_T_DRIVER | M_T_PREFERRED; } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Out of memory. Size: %zu bytes\n", sizeof(DisplayModeRec)); } } else { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Invalid panel dimension (%dx%d)\n", Panel->NativeWidth, Panel->NativeHeight); } } else { p = xf86OutputGetEDIDModes(output); } } return p; } static void via_lvds_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, #ifdef RANDR_12_INTERFACE .set_property = via_lvds_set_property, #endif #ifdef RANDR_13_INTERFACE .get_property = via_lvds_get_property, #endif .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, .destroy = via_lvds_destroy, }; /* * Sets the panel dimensions from the configuration * using name with format "9999x9999". */ static void ViaPanelGetNativeModeFromOption(ScrnInfoPtr pScrn, ViaPanelInfoPtr panel, const char *name) { char aux[strlen(name) + 1]; CARD8 length, index; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaPanelGetNativeModeFromOption\n")); panel->NativeModeIndex = VIA_PANEL_INVALID; length = sizeof(ViaPanelNativeModes) / sizeof(ViaPanelModeRec); for (index = 0; index < length; index++) { sprintf(aux, "%dx%d", ViaPanelNativeModes[index].Width, ViaPanelNativeModes[index].Height); if (!xf86NameCmp(name, aux)) { panel->NativeModeIndex = index; panel->NativeWidth = ViaPanelNativeModes[index].Width; panel->NativeHeight = ViaPanelNativeModes[index].Height; break; } } } void via_lvds_init(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; Bool ForcePanel = FALSE; const char *s = NULL; if (!Panel) return; memcpy(Options, ViaPanelOptions, sizeof(ViaPanelOptions)); xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, Options); Panel->NativeModeIndex = VIA_PANEL_INVALID; Panel->BusWidth = VIA_DI_12BIT; if ((s = xf86GetOptValString(Options, OPTION_BUSWIDTH))) { from = X_CONFIG; if (!xf86NameCmp(s, "12BIT")) { Panel->BusWidth = VIA_DI_12BIT; } else if (!xf86NameCmp(s, "24BIT")) { Panel->BusWidth = VIA_DI_24BIT; } } xf86DrvMsg(pScrn->scrnIndex, from, "LVDS-0 : Digital output bus width is %d bits.\n", (Panel->BusWidth == VIA_DI_12BIT) ? 12 : 24); /* 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"); /* Force the use of the Panel? */ from = xf86GetOptValBool(Options, OPTION_FORCEPANEL, &ForcePanel) ? X_CONFIG : X_DEFAULT; xf86DrvMsg(pScrn->scrnIndex, from, "LVDS Panel will %sbe forced.\n", ForcePanel ? "" : "not "); /* Panel Size Option */ if ((s = xf86GetOptValString(Options, OPTION_PANELSIZE))) { ViaPanelGetNativeModeFromOption(pScrn, Panel, s); if (Panel->NativeModeIndex != VIA_PANEL_INVALID) { DEBUG(xf86DrvMsg (pScrn->scrnIndex, X_CONFIG, "LVDS Panel mode index is %d\n", Panel->NativeModeIndex)); xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Selected Panel Size is %dx%d\n", Panel->NativeWidth, Panel->NativeHeight); } else xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s is not a valid panel size.\n", s); } else { xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, "Panel size is not selected from config file.\n"); } if (ForcePanel) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Enabling panel from config.\n"); output = xf86OutputCreate(pScrn, &via_lvds_funcs, "LVDS-1"); } else if (pVia->Id && (pVia->Id->Outputs & VIA_DEVICE_LCD)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Enabling panel from PCI-subsystem ID information.\n"); output = xf86OutputCreate(pScrn, &via_lvds_funcs, "LVDS-1"); } if (output) { output->driver_private = Panel; if (pVia->Chipset == VIA_VX900) output->possible_crtcs = 0x3; else output->possible_crtcs = 0x2; output->possible_clones = 0; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; if (!xf86NameCmp(pVia->Id->String, "OLPC XO 1.5")) { output->mm_height = 152; output->mm_width = 114; } } else { free(Panel); } } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_memcpy.c000066400000000000000000000440411267025031400241140ustar00rootroot00000000000000/* * Copyright (C) 2004 Thomas Hellström, 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" #include "compiler.h" #define BSIZ 2048 /* size of /proc/cpuinfo buffer */ #define BSIZW 720 /* typical copy width (YUV420) */ #define BSIZA 736 /* multiple of 32 bytes */ #define BSIZH 576 /* typical copy height */ #define SSE_PREFETCH " prefetchnta " #define FENCE __asm__ __volatile__ ("sfence":::"memory"); #define FENCEMMS __asm__ __volatile__ ("\t" \ "sfence\n\t" \ "emms\n\t" \ :::"memory"); #define FEMMS __asm__ __volatile__("femms":::"memory"); #define EMMS __asm__ __volatile__("emms":::"memory"); #define NOW_PREFETCH " prefetch " #define PREFETCH1(arch_prefetch,from) \ __asm__ __volatile__ ( \ "1: " arch_prefetch "(%0)\n" \ arch_prefetch "32(%0)\n" \ arch_prefetch "64(%0)\n" \ arch_prefetch "96(%0)\n" \ arch_prefetch "128(%0)\n" \ arch_prefetch "160(%0)\n" \ arch_prefetch "192(%0)\n" \ arch_prefetch "256(%0)\n" \ arch_prefetch "288(%0)\n" \ "2:\n" \ : : "r" (from) ); #define PREFETCH2(arch_prefetch,from) \ __asm__ __volatile__ ( \ arch_prefetch "320(%0)\n" \ : : "r" (from) ); #define PREFETCH3(arch_prefetch,from) \ __asm__ __volatile__ ( \ arch_prefetch "288(%0)\n" \ : : "r" (from) ); #define small_memcpy(to, from, n) \ { \ __asm__ __volatile__( \ "movl %2,%%ecx\n\t" \ "sarl $2,%%ecx\n\t" \ "rep ; movsl\n\t" \ "testb $2,%b2\n\t" \ "je 1f\n\t" \ "movsw\n" \ "1:\ttestb $1,%b2\n\t" \ "je 2f\n\t" \ "movsb\n" \ "2:" \ :"=&D" (to), "=&S" (from) \ :"q" (n),"0" ((long) to),"1" ((long) from) \ : "%ecx","memory"); \ } #define SSE_CPY(prefetch, from, to, dummy, lcnt) \ if ((unsigned long) from & 15) { \ __asm__ __volatile__ ( \ "1:\n" \ prefetch "320(%1)\n" \ " movups (%1), %%xmm0\n" \ " movups 16(%1), %%xmm1\n" \ " movntps %%xmm0, (%0)\n" \ " movntps %%xmm1, 16(%0)\n" \ prefetch "352(%1)\n" \ " movups 32(%1), %%xmm2\n" \ " movups 48(%1), %%xmm3\n" \ " movntps %%xmm2, 32(%0)\n" \ " movntps %%xmm3, 48(%0)\n" \ " addl $64,%0\n" \ " addl $64,%1\n" \ " decl %2\n" \ " jne 1b\n" \ :"=&D"(to), "=&S"(from), "=&r"(dummy) \ :"0" (to), "1" (from), "2" (lcnt): "memory"); \ } else { \ __asm__ __volatile__ ( \ "2:\n" \ prefetch "320(%1)\n" \ " movaps (%1), %%xmm0\n" \ " movaps 16(%1), %%xmm1\n" \ " movntps %%xmm0, (%0)\n" \ " movntps %%xmm1, 16(%0)\n" \ prefetch "352(%1)\n" \ " movaps 32(%1), %%xmm2\n" \ " movaps 48(%1), %%xmm3\n" \ " movntps %%xmm2, 32(%0)\n" \ " movntps %%xmm3, 48(%0)\n" \ " addl $64,%0\n" \ " addl $64,%1\n" \ " decl %2\n" \ " jne 2b\n" \ :"=&D"(to), "=&S"(from), "=&r"(dummy) \ :"0" (to), "1" (from), "2" (lcnt): "memory"); \ } #define MMX_CPY(prefetch, from, to, dummy, lcnt) \ __asm__ __volatile__ ( \ "1:\n" \ prefetch "320(%1)\n" \ "2: movq (%1), %%mm0\n" \ " movq 8(%1), %%mm1\n" \ " movq 16(%1), %%mm2\n" \ " movq 24(%1), %%mm3\n" \ " movq %%mm0, (%0)\n" \ " movq %%mm1, 8(%0)\n" \ " movq %%mm2, 16(%0)\n" \ " movq %%mm3, 24(%0)\n" \ prefetch "352(%1)\n" \ " movq 32(%1), %%mm0\n" \ " movq 40(%1), %%mm1\n" \ " movq 48(%1), %%mm2\n" \ " movq 56(%1), %%mm3\n" \ " movq %%mm0, 32(%0)\n" \ " movq %%mm1, 40(%0)\n" \ " movq %%mm2, 48(%0)\n" \ " movq %%mm3, 56(%0)\n" \ " addl $64,%0\n" \ " addl $64,%1\n" \ " decl %2\n" \ " jne 1b\n" \ :"=&D"(to), "=&S"(from), "=&r"(dummy) \ :"0" (to), "1" (from), "2" (lcnt) : "memory"); #define MMXEXT_CPY(prefetch, from, to, dummy, lcnt) \ __asm__ __volatile__ ( \ ".p2align 4,,7\n" \ "1:\n" \ prefetch "320(%1)\n" \ " movq (%1), %%mm0\n" \ " movq 8(%1), %%mm1\n" \ " movq 16(%1), %%mm2\n" \ " movq 24(%1), %%mm3\n" \ " movntq %%mm0, (%0)\n" \ " movntq %%mm1, 8(%0)\n" \ " movntq %%mm2, 16(%0)\n" \ " movntq %%mm3, 24(%0)\n" \ prefetch "352(%1)\n" \ " movq 32(%1), %%mm0\n" \ " movq 40(%1), %%mm1\n" \ " movq 48(%1), %%mm2\n" \ " movq 56(%1), %%mm3\n" \ " movntq %%mm0, 32(%0)\n" \ " movntq %%mm1, 40(%0)\n" \ " movntq %%mm2, 48(%0)\n" \ " movntq %%mm3, 56(%0)\n" \ " addl $64,%0\n" \ " addl $64,%1\n" \ " decl %2\n" \ " jne 1b\n" \ :"=&D"(to), "=&S"(from), "=&r"(dummy) \ :"0" (to), "1" (from), "2" (lcnt) : "memory"); #define PREFETCH_FUNC(prefix, itype, ptype, begin, fence) \ \ static void prefix##_YUV42X(unsigned char *to, \ const unsigned char *from, \ int dstPitch, \ int w, \ int h, \ int yuv422) \ { \ int dadd, rest, count, hc, lcnt; \ register int dummy; \ PREFETCH1(ptype##_PREFETCH, from); \ begin; \ count = 2; \ \ /* If destination pitch equals width, do it all in one go. */ \ \ if (yuv422) { \ w <<= 1; \ if (w == dstPitch) { \ w *= h; \ h = 1; \ dstPitch = w; \ count = 0; \ } else { \ h -= 1; \ count = 1; \ } \ } else if (w == dstPitch) { \ w = h*(w + (w >> 1)); \ count = 0; \ h = 1; \ dstPitch = w; \ } \ \ lcnt = w >> 6; \ rest = w & 63; \ while (count--) { \ hc = h; \ lcnt = w >> 6; \ rest = w & 63; \ dadd = dstPitch - w; \ while (hc--) { \ if (lcnt) { \ itype##_CPY(ptype##_PREFETCH, from, to, dummy, lcnt); \ } \ if (rest) { \ PREFETCH2(ptype##_PREFETCH, from); \ small_memcpy(to, from, rest); \ PREFETCH3(ptype##_PREFETCH, from); \ } \ to += dadd; \ } \ w >>= 1; \ dstPitch >>= 1; \ h -= 1; \ } \ if (lcnt > 5) { \ lcnt -= 5; \ itype##_CPY(ptype##_PREFETCH, from, to, dummy, lcnt); \ lcnt = 5; \ } \ if (lcnt) { \ itype##_CPY("#", from, to, dummy, lcnt); \ } \ if (rest) small_memcpy(to, from, rest); \ fence; \ } #define NOPREFETCH_FUNC(prefix, itype, begin, fence) \ static void prefix##_YUV42X(unsigned char *to, \ const unsigned char *from, \ int dstPitch, \ int w, \ int h, \ int yuv422) \ \ { \ int dadd, rest, count, hc, lcnt; \ register int dummy; \ begin; \ count = 2; \ \ /* If destination pitch equals width, do it all in one go. */ \ \ if (yuv422) { \ w <<= 1; \ count = 1; \ if (w == dstPitch) { \ w *= h; \ h = 1; \ dstPitch = w; \ } \ } else if (w == dstPitch) { \ w = h*(w + (w >> 1)); \ count = 1; \ h = 1; \ dstPitch = w; \ } \ \ lcnt = w >> 6; \ rest = w & 63; \ while (count--) { \ hc = h; \ dadd = dstPitch - w; \ lcnt = w >> 6; \ rest = w & 63; \ while (hc--) { \ if (lcnt) { \ itype##_CPY("#", from, to, dummy, lcnt); \ } \ if (rest) small_memcpy(to, from, rest); \ to += dadd; \ } \ w >>= 1; \ dstPitch >>= 1; \ } \ fence; \ } static void libc_YUV42X(unsigned char *dst, const unsigned char *src, int dstPitch, int w, int h, int yuv422) { if (yuv422) w <<= 1; if (dstPitch == w) { int size = h * ((yuv422) ? w : (w + (w >> 1))); memcpy(dst, src, size); return; } else { int count; /* Copy Y component to video memory. */ count = h; while (count--) { memcpy(dst, src, w); src += w; dst += dstPitch; } /* UV component is 1/2 of Y. */ if (!yuv422) { w >>= 1; dstPitch >>= 1; /* Copy V(Cr),U(Cb) components to video memory. */ count = h; while (count--) { memcpy(dst, src, w); src += w; dst += dstPitch; } } } } #ifdef __i386__ /* Linux kernel __memcpy. */ static __inline void * __memcpy(void *to, const void *from, size_t n) { int d1, d2, d3; __asm__ __volatile__( "rep ; movsl\n\t" "testb $2,%b4\n\t" "je 1f\n\t" "movsw\n" "1:\ttestb $1,%b4\n\t" "je 2f\n\t" "movsb\n" "2:" :"=&c"(d1), "=&D"(d2), "=&S"(d3) :"0"(n >> 2), "q"(n), "1"((long)to), "2"((long)from) :"memory"); return (to); } static void kernel_YUV42X(unsigned char *dst, const unsigned char *src, int dstPitch, int w, int h, int yuv422) { if (yuv422) w <<= 1; if (dstPitch == w) { int size = h * ((yuv422) ? w : (w + (w >> 1))); __memcpy(dst, src, size); return; } else { int count; /* Copy Y component to video memory. */ count = h; while (count--) { __memcpy(dst, src, w); src += w; dst += dstPitch; } /* UV component is 1/2 of Y. */ if (!yuv422) { w >>= 1; dstPitch >>= 1; /* Copy V(Cr),U(Cb) components to video memory. */ count = h; while (count--) { __memcpy(dst, src, w); src += w; dst += dstPitch; } } } } PREFETCH_FUNC(sse, SSE, SSE,, FENCE) PREFETCH_FUNC(mmxext, MMXEXT, SSE, EMMS, FENCEMMS) PREFETCH_FUNC(now, MMX, NOW, FEMMS, FEMMS) NOPREFETCH_FUNC(mmx, MMX, EMMS, EMMS) static void *kernel_memcpy(void *to, const void *from, size_t len) { return __memcpy(to, from, len); } static unsigned fastrdtsc(void) { unsigned eax; __asm__ volatile ("\t" "pushl %%ebx\n\t" "cpuid\n\t" ".byte 0x0f, 0x31\n\t" "popl %%ebx\n" :"=a" (eax) :"0"(0) :"ecx", "edx", "cc"); return eax; } static unsigned time_function(vidCopyFunc mf, unsigned char *buf1, unsigned char *buf2) { unsigned t, t2; t = fastrdtsc(); (*mf) (buf1, buf2, BSIZA, BSIZW, BSIZH, 0); t2 = fastrdtsc(); return ((t < t2) ? t2 - t : 0xFFFFFFFFU - (t - t2 - 1)); } enum { libc = 0, kernel, sse, mmx, now, mmxext, totNum }; typedef struct { vidCopyFunc mFunc; 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 McFuncData mcFunctions[totNum] = { {libc_YUV42X, "libc", libc_cpuflags}, {kernel_YUV42X, "kernel", kernel_cpuflags}, {sse_YUV42X, "SSE", sse_cpuflags}, {mmx_YUV42X, "MMX", mmx_cpuflags}, {now_YUV42X, "3DNow!", now_cpuflags}, {mmxext_YUV42X, "MMX2", mmx2_cpuflags} }; static int flagValid(const char *cpuinfo, char *flag) { const char *flagLoc, *nextProc; int located = 0; while ((cpuinfo = strstr(cpuinfo, "processor\t:"))) { located = 1; cpuinfo += 11; if ((flagLoc = strstr(cpuinfo, flag))) { if ((nextProc = strstr(cpuinfo, "processor\t:"))) { if (nextProc < flagLoc) return 0; } } else { return 0; } } return located; } static int cpuValid(const char *cpuinfo, char **flags) { for (; *flags != 0; flags++) { if (flagValid(cpuinfo, *flags)) return 1; } return 0; } /* * Benchmark the video copy routines and choose the fastest. */ vidCopyFunc viaVidCopyInit(char *copyType, ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); char buf[BSIZ]; unsigned char *buf1, *buf2, *buf3; char *tmpBuf, *endBuf; int count, j, bestSoFar; unsigned best, tmp, testSize, alignSize, tmp2; struct buffer_object *tmpFbBuffer; McFuncData *curData; FILE *cpuInfoFile; double cpuFreq; VIAPtr pVia = VIAPTR(pScrn); if (NULL == (cpuInfoFile = fopen("/proc/cpuinfo", "r"))) { return libc_YUV42X; } count = fread(buf, 1, BSIZ, cpuInfoFile); if (ferror(cpuInfoFile)) { fclose(cpuInfoFile); return libc_YUV42X; } fclose(cpuInfoFile); if (BSIZ == count) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "\"/proc/cpuinfo\" file too long. " "Using Linux kernel memcpy.\n"); return libc_YUV42X; } buf[count] = 0; while (count--) if ('\n' == buf[count]) buf[count] = ' '; /* Extract the CPU frequency. */ cpuFreq = 0.; if (NULL != (tmpBuf = strstr(buf, "cpu MHz"))) { if (NULL != (tmpBuf = strstr(tmpBuf, ":") + 1)) { cpuFreq = strtod(tmpBuf, &endBuf); if (endBuf == tmpBuf) tmpBuf = NULL; } } alignSize = BSIZH * (BSIZA + (BSIZA >> 1)); testSize = BSIZH * (BSIZW + (BSIZW >> 1)); /* * Allocate an area of offscreen FB memory, (buf1), a simulated video * player buffer (buf2) and a pool of uninitialized "video" data (buf3). */ tmpFbBuffer = drm_bo_alloc(pScrn, alignSize, 32, TTM_PL_FLAG_VRAM); if (!tmpFbBuffer) return libc_YUV42X; if (NULL == (buf2 = (unsigned char *)malloc(testSize))) { drm_bo_free(pScrn, tmpFbBuffer); return libc_YUV42X; } if (NULL == (buf3 = (unsigned char *)malloc(testSize))) { free(buf2); drm_bo_free(pScrn, tmpFbBuffer); return libc_YUV42X; } buf1 = drm_bo_map(pScrn, tmpFbBuffer); bestSoFar = 0; best = 0xFFFFFFFFU; /* Make probable that buf1 and buf2 are in memory by referencing them. */ libc_YUV42X(buf1, buf2, BSIZA, BSIZW, BSIZH, 0); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Benchmarking %s copy. Less time is better.\n", copyType); for (j = 0; j < totNum; ++j) { curData = mcFunctions + j; if (cpuValid(buf, curData->cpuFlag)) { /* Simulate setup of the video buffer. */ kernel_memcpy(buf2, buf3, testSize); /* Copy the video buffer to frame-buffer memory. */ tmp = time_function(curData->mFunc, buf1, buf2); /* Do it again to avoid context-switch effects. */ kernel_memcpy(buf2, buf3, testSize); tmp2 = time_function(curData->mFunc, buf1, buf2); tmp = (tmp2 < tmp) ? tmp2 : tmp; if (NULL == tmpBuf) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Timed %6s YUV420 copy... %u.\n", curData->mName, tmp); } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Timed %6s YUV420 copy... %u. " "Throughput: %.1f MiB/s.\n", curData->mName, tmp, cpuFreq * 1.e6 * (double)testSize / ((double)(tmp) * (double)(0x100000))); } if (tmp < best) { best = tmp; bestSoFar = j; } } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Ditching %6s YUV420 copy. Not supported by CPU.\n", curData->mName); } } free(buf3); free(buf2); drm_bo_unmap(pScrn, tmpFbBuffer); drm_bo_free(pScrn, tmpFbBuffer); xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Using %s YUV42X copy for %s.\n", mcFunctions[bestSoFar].mName, copyType); return mcFunctions[bestSoFar].mFunc; } #else vidCopyFunc viaVidCopyInit(char *copyType, ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using default xfree86 memcpy for video.\n"); return libc_YUV42X; } #endif /* __i386__ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_memmgr.c000066400000000000000000000212471267025031400241110ustar00rootroot00000000000000/* * Copyright 2003 Red Hat, 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 #include "xf86.h" #include "xf86_OSproc.h" #include "xf86fbman.h" #ifdef HAVE_DRI #include "xf86drm.h" #endif #include "drm_fourcc.h" #include "via_driver.h" #ifdef HAVE_DRI #include "via_drm.h" #else #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) { int depth = pScrn->bitsPerPixel >> 3; FBLinearPtr linear; linear = xf86AllocateOffscreenLinear(pScrn->pScreen, (size + depth - 1) / depth, 32, NULL, NULL, NULL); if (!linear) return BadAlloc; 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; } struct buffer_object * drm_bo_alloc(ScrnInfoPtr pScrn, unsigned int size, unsigned int 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; 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)); } } 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)); } #endif } break; case TTM_PL_FLAG_SYSTEM: default: ret = -ENXIO; break; } if (ret) { DEBUG(ErrorF("DRM memory allocation failed %d\n", ret)); free(obj); obj = NULL; }; } return obj; } void* drm_bo_map(ScrnInfoPtr pScrn, struct buffer_object *obj) { VIAPtr pVia = VIAPTR(pScrn); if (pVia->directRenderingType == DRI_2) { obj->ptr = mmap(0, obj->size, PROT_READ | PROT_WRITE, MAP_SHARED, pVia->drmmode.fd, obj->map_offset); if (obj->ptr == MAP_FAILED) { DEBUG(ErrorF("mmap failed with error %d\n", -errno)); obj->ptr = NULL; } } else { switch (obj->domain) { #ifdef HAVE_DRI case TTM_PL_FLAG_TT: obj->ptr = (pVia->agpMappedAddr + obj->offset); break; #endif case TTM_PL_FLAG_VRAM: obj->ptr = (pVia->FBBase + obj->offset); break; default: obj->ptr = NULL; break; } } return obj->ptr; } void drm_bo_unmap(ScrnInfoPtr pScrn, struct buffer_object *obj) { VIAPtr pVia = VIAPTR(pScrn); if (pVia->directRenderingType == DRI_2) munmap(obj->ptr, obj->size); obj->ptr = NULL; } void drm_bo_free(ScrnInfoPtr pScrn, struct buffer_object *obj) { VIAPtr pVia = VIAPTR(pScrn); if (obj) { DEBUG(ErrorF("Freed %lu (pool %d)\n", obj->offset, obj->domain)); switch (obj->domain) { case TTM_PL_FLAG_VRAM: case TTM_PL_FLAG_TT: if (pVia->directRenderingType == DRI_NONE) { FBLinearPtr linear = (FBLinearPtr) obj->handle; xf86FreeOffscreenLinear(linear); #ifdef HAVE_DRI } else if (pVia->directRenderingType == DRI_1) { drm_via_mem_t drm; drm.index = obj->handle; if (drmCommandWrite(pVia->drmmode.fd, DRM_VIA_FREEMEM, &drm, sizeof(drm_via_mem_t)) < 0) ErrorF("DRM failed to free for handle %lu.\n", obj->handle); } else if (pVia->directRenderingType == DRI_2) { struct drm_gem_close close; close.handle = obj->handle; if (drmIoctl(pVia->drmmode.fd, DRM_IOCTL_GEM_CLOSE, &close) < 0) ErrorF("DRM failed to free for handle %lu.\n", obj->handle); #endif } break; default: break; } free(obj); } } Bool drm_bo_manager_init(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); Bool ret = TRUE; if (pVia->directRenderingType == DRI_2) return ret; ret = ums_create(pScrn); #ifdef HAVE_DRI if (pVia->directRenderingType == DRI_1) ret = VIADRIKernelInit(pScrn); #endif return ret; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_memmgr.h000066400000000000000000000041641267025031400241150ustar00rootroot00000000000000/* * Copyright 2011 James Simmons, 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_MEMMGR_H_ #define _VIA_MEMMGR_H_ #include #include "xf86.h" #define TTM_PL_FLAG_SYSTEM 1 #define TTM_PL_FLAG_TT 2 #define TTM_PL_FLAG_VRAM 4 struct buffer_object { off_t map_offset; unsigned long handle; unsigned long offset; /* Offset into fb */ unsigned long pitch; 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); 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 *); #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_mode.h000066400000000000000000010312471267025031400235600ustar00rootroot00000000000000/* * 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 /* * simple lookuptable for PanelIndex selection */ static struct { int Index; int PanelIndex; int X; int Y; } ViaResolutionTable[] = { {VIA_RES_640X480, VIA_PANEL6X4, 640, 480}, {VIA_RES_800X600, VIA_PANEL8X6, 800, 600}, {VIA_RES_1024X768, VIA_PANEL10X7, 1024, 768}, {VIA_RES_1152X864, VIA_PANEL_INVALID, 1152, 864}, {VIA_RES_1280X1024, VIA_PANEL12X10, 1280, 1024}, {VIA_RES_1600X1200, VIA_PANEL16X12, 1600, 1200}, {VIA_RES_1440X1050, VIA_PANEL_INVALID, 1440, 1050}, {VIA_RES_1280X768, VIA_PANEL12X7, 1280, 768}, {VIA_RES_1280X800, VIA_PANEL12X8, 1280, 800}, {VIA_RES_1280X960, VIA_PANEL_INVALID, 1280, 960}, /* {VIA_RES_1920X1440, VIA_PANEL_INVALID, 1920, 1140}, */ {VIA_RES_848X480, VIA_PANEL_INVALID, 848, 480}, {VIA_RES_1400X1050, VIA_PANEL14X10, 1400, 1050}, {VIA_RES_720X480, VIA_PANEL_INVALID, 720, 480}, {VIA_RES_720X576, VIA_PANEL_INVALID, 720, 576}, {VIA_RES_1024X512, VIA_PANEL_INVALID, 1024, 512}, {VIA_RES_856X480, VIA_PANEL_INVALID, 856, 480}, {VIA_RES_1024X576, VIA_PANEL_INVALID, 1024, 576}, {VIA_RES_800X480, VIA_PANEL8X4, 800, 480}, {VIA_RES_1200X900, VIA_PANEL12X9, 1200, 900}, {VIA_RES_INVALID, VIA_PANEL_INVALID, 0, 0} }; static struct { CARD16 Width; CARD16 Height; CARD8 mode_8b; CARD8 mode_16b; CARD8 mode_32b; } ViaVesaModes[] = { { 400, 300, 0x22, 0x23, 0x24 }, { 512, 384, 0x25, 0x26, 0x27 }, { 640, 400, 0x30, 0x2E, 0x2F }, { 640, 480, 0x31, 0x33, 0x34 }, { 800, 600, 0x36, 0x38, 0x39 }, { 1024, 768, 0x3B, 0x3D, 0x3E }, { 1152, 864, 0x40, 0x42, 0x43 }, { 1280, 1024, 0x45, 0x47, 0x48 }, { 1600, 1200, 0x4A, 0x4C, 0x4D }, { 1440, 1050, 0x50, 0x52, 0x53 }, { 1280, 768, 0x54, 0x56, 0x57 }, { 1280, 960, 0x58, 0x5A, 0x5B }, { 320, 200, 0x5C, 0x5D, 0x5E }, { 1920, 1440, 0x60, 0x61, 0x62 }, { 848, 480, 0x63, 0x64, 0x65 }, { 1400, 1050, 0x66, 0x67, 0x68 }, { 720, 480, 0x70, 0x71, 0x72 }, { 720, 576, 0x73, 0x74, 0x75 }, { 1024, 512, 0x76, 0x77, 0x78 }, { 856, 480, 0x79, 0x7A, 0x7B }, { 320, 240, 0x7C, 0x7D, 0x7E }, { 0, 0, 0, 0, 0 }, }; #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_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_outputs.c000066400000000000000000001160511267025031400243460ustar00rootroot00000000000000/* * Copyright 2005-2015 The Openchrome Project * [http://www.freedesktop.org/wiki/Openchrome] * 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. */ /* * via_outputs.c * * Everything to do with setting and changing xf86Outputs. * */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "via_driver.h" #include /* * Modetable nonsense. * */ #include "via_mode.h" static void ViaPrintMode(ScrnInfoPtr pScrn, DisplayModePtr mode) { xf86PrintModeline(pScrn->scrnIndex, mode); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcHDisplay: 0x%x\n", mode->CrtcHDisplay); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcHBlankStart: 0x%x\n", mode->CrtcHBlankStart); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcHSyncStart: 0x%x\n", mode->CrtcHSyncStart); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcHSyncEnd: 0x%x\n", mode->CrtcHSyncEnd); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcHBlankEnd: 0x%x\n", mode->CrtcHBlankEnd); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcHTotal: 0x%x\n", mode->CrtcHTotal); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcHSkew: 0x%x\n", mode->CrtcHSkew); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcVDisplay: 0x%x\n", mode->CrtcVDisplay); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcVBlankStart: 0x%x\n", mode->CrtcVBlankStart); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcVSyncStart: 0x%x\n", mode->CrtcVSyncStart); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcVSyncEnd: 0x%x\n", mode->CrtcVSyncEnd); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcVBlankEnd: 0x%x\n", mode->CrtcVBlankEnd); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "CrtcVTotal: 0x%x\n", mode->CrtcVTotal); } /* * * TV specific code. * */ void ViaTVSave(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; if (pBIOSInfo->TVSave) pBIOSInfo->TVSave(pScrn); } void ViaTVRestore(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; if (pBIOSInfo->TVRestore) pBIOSInfo->TVRestore(pScrn); } static Bool ViaTVDACSense(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; if (pBIOSInfo->TVDACSense) return pBIOSInfo->TVDACSense(pScrn); return FALSE; } static void ViaTVSetMode(xf86CrtcPtr crtc, DisplayModePtr mode) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; if (pBIOSInfo->TVModeI2C) pBIOSInfo->TVModeI2C(pScrn, mode); if (pBIOSInfo->TVModeCrtc) pBIOSInfo->TVModeCrtc(crtc, mode); /* TV reset. */ xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x00); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1D, 0x80); } void ViaTVPower(ScrnInfoPtr pScrn, Bool On) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; #ifdef HAVE_DEBUG if (On) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaTVPower: On.\n"); else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaTVPower: Off.\n"); #endif if (pBIOSInfo->TVPower) pBIOSInfo->TVPower(pScrn, On); } #ifdef HAVE_DEBUG void ViaTVPrintRegs(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; if (pBIOSInfo->TVPrintRegs) pBIOSInfo->TVPrintRegs(pScrn); } #endif /* HAVE_DEBUG */ static void via_tv_create_resources(xf86OutputPtr output) { } #ifdef RANDR_12_INTERFACE static Bool via_tv_set_property(xf86OutputPtr output, Atom property, RRPropertyValuePtr value) { return TRUE; } static Bool via_tv_get_property(xf86OutputPtr output, Atom property) { return FALSE; } #endif static void via_tv_dpms(xf86OutputPtr output, int mode) { ScrnInfoPtr pScrn = output->scrn; switch (mode) { case DPMSModeOn: ViaTVPower(pScrn, TRUE); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: ViaTVPower(pScrn, FALSE); break; } } static void via_tv_save(xf86OutputPtr output) { ScrnInfoPtr pScrn = output->scrn; ViaTVSave(pScrn); } static void via_tv_restore(xf86OutputPtr output) { ScrnInfoPtr pScrn = output->scrn; ViaTVRestore(pScrn); } static int via_tv_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) { ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); int ret = MODE_OK; if (pVia->UseLegacyModeSwitch) { VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; if (pBIOSInfo->TVModeValid) { ret = pBIOSInfo->TVModeValid(pScrn, pMode); if (ret != MODE_OK) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Mode \"%s\" is not supported by TV encoder.\n", pMode->name); } } } else { if (!ViaModeDotClockTranslate(pScrn, pMode)) return MODE_NOCLOCK; } return ret; } static Bool via_tv_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { return TRUE; } static void via_tv_prepare(xf86OutputPtr output) { via_tv_dpms(output, DPMSModeOff); } static void via_tv_commit(xf86OutputPtr output) { via_tv_dpms(output, DPMSModeOn); } static void ViaDisplayEnableDVO(ScrnInfoPtr pScrn, int port) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplayEnableDVO, port: %d\n", port)); switch (port) { case VIA_DI_PORT_DVP0: ViaSeqMask(hwp, 0x1E, 0xC0, 0xC0); break; case VIA_DI_PORT_DVP1: ViaSeqMask(hwp, 0x1E, 0x30, 0x30); break; } } static void ViaDisplayDisableDVO(ScrnInfoPtr pScrn, int port) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplayDisableDVO, port: %d\n", port)); switch (port) { case VIA_DI_PORT_DVP0: ViaSeqMask(hwp, 0x1E, 0x00, 0xC0); break; case VIA_DI_PORT_DVP1: ViaSeqMask(hwp, 0x1E, 0x00, 0x30); break; } } static void ViaDisplaySetStreamOnDVO(ScrnInfoPtr pScrn, int port, int iga) { vgaHWPtr hwp = VGAHWPTR(pScrn); int regNum; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplaySetStreamOnDVO, port: %d\n", port)); switch (port) { case VIA_DI_PORT_DVP0: regNum = 0x96; break; case VIA_DI_PORT_DVP1: regNum = 0x9B; break; case VIA_DI_PORT_DFPLOW: regNum = 0x97; break; case VIA_DI_PORT_DFPHIGH: regNum = 0x99; break; } if (!iga) ViaCrtcMask(hwp, regNum, 0x00, 0x10); else ViaCrtcMask(hwp, regNum, 0x10, 0x10); } static void via_tv_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; /* TV on FirstCrtc */ if (output->crtc) { drmmode_crtc_private_ptr iga = output->crtc->driver_private; ViaDisplaySetStreamOnDVO(pScrn, pBIOSInfo->TVDIPort, iga->index); } ViaDisplayEnableDVO(pScrn, pBIOSInfo->TVDIPort); ViaTVSetMode(output->crtc, adjusted_mode); pVia->FirstInit = FALSE; } static xf86OutputStatus via_tv_detect(xf86OutputPtr output) { xf86OutputStatus status = XF86OutputStatusDisconnected; ScrnInfoPtr pScrn = output->scrn; if (ViaTVDACSense(pScrn)) status = XF86OutputStatusConnected; return status; } static DisplayModePtr via_tv_get_modes(xf86OutputPtr output) { DisplayModePtr modes = NULL, mode = NULL; ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); int i; for (i = 0; i < pVia->pBIOSInfo->TVNumModes; i++) { mode = xf86DuplicateMode(&pVia->pBIOSInfo->TVModes[i]); modes = xf86ModesAdd(modes, mode); } return modes; } static void via_tv_destroy(xf86OutputPtr output) { } static const xf86OutputFuncsRec via_tv_funcs = { .create_resources = via_tv_create_resources, #ifdef RANDR_12_INTERFACE .set_property = via_tv_set_property, #endif #ifdef RANDR_13_INTERFACE .get_property = via_tv_get_property, #endif .dpms = via_tv_dpms, .save = via_tv_save, .restore = via_tv_restore, .mode_valid = via_tv_mode_valid, .mode_fixup = via_tv_mode_fixup, .prepare = via_tv_prepare, .commit = via_tv_commit, .mode_set = via_tv_mode_set, .detect = via_tv_detect, .get_modes = via_tv_get_modes, .destroy = via_tv_destroy, }; /* * */ static Bool via_tv_init(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; 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; /* * 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) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Did not detect a TV encoder.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_tv_init.\n")); return FALSE; } switch (pBIOSInfo->TVEncoder) { case VIA_VT1621: case VIA_VT1622: case VIA_VT1623: case VIA_VT1625: ViaVT162xInit(pScrn); break; case VIA_CH7011: case VIA_CH7019A: case VIA_CH7019B: ViaCH7xxxInit(pScrn); break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Was not able to initialize a known TV encoder.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_tv_init.\n")); return FALSE; 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; xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "TV encoder was not properly initialized.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_tv_init.\n")); return FALSE; } output = xf86OutputCreate(pScrn, &via_tv_funcs, "TV-1"); pVia->FirstInit = TRUE; if (output) { /* Allow tv output on both crtcs, set bit 0 and 1. */ output->possible_crtcs = 0x3; } else { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to register TV-1.\n"); } pBIOSInfo->tv = output; /* Save now */ pBIOSInfo->TVSave(pScrn); #ifdef HAVE_DEBUG if (VIAPTR(pScrn)->PrintTVRegs) pBIOSInfo->TVPrintRegs(pScrn); #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_tv_init.\n")); return TRUE; } /* * Enables CRT using DPMS registers. */ static void ViaDisplayEnableCRT(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplayEnableCRT\n")); ViaCrtcMask(hwp, 0x36, 0x00, 0x30); } /* * Disables CRT using DPMS registers. */ static void ViaDisplayDisableCRT(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDisplayDisableCRT\n")); ViaCrtcMask(hwp, 0x36, 0x30, 0x30); } static void via_analog_create_resources(xf86OutputPtr output) { } #ifdef RANDR_12_INTERFACE static Bool via_analog_set_property(xf86OutputPtr output, Atom property, RRPropertyValuePtr value) { return TRUE; } static Bool via_analog_get_property(xf86OutputPtr output, Atom property) { return FALSE; } #endif static void via_analog_dpms(xf86OutputPtr output, int mode) { ScrnInfoPtr pScrn = output->scrn; switch (mode) { case DPMSModeOn: ViaDisplayEnableCRT(pScrn); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: ViaDisplayDisableCRT(pScrn); break; } } static void via_analog_save(xf86OutputPtr output) { } static void via_analog_restore(xf86OutputPtr output) { } static int via_analog_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) { ScrnInfoPtr pScrn = output->scrn; if (!ViaModeDotClockTranslate(pScrn, pMode)) return MODE_NOCLOCK; return MODE_OK; } static Bool via_analog_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { return TRUE; } static void via_analog_prepare(xf86OutputPtr output) { via_analog_dpms(output, DPMSModeOff); } static void via_analog_commit(xf86OutputPtr output) { via_analog_dpms(output, DPMSModeOn); } static void via_analog_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { ScrnInfoPtr pScrn = output->scrn; if (output->crtc) { drmmode_crtc_private_ptr iga = output->crtc->driver_private; CARD8 value = 0x00; /* Value for IGA 1 */ vgaHWPtr hwp = VGAHWPTR(pScrn); /* IGA 2 */ if (iga->index) value = 0x40; ViaSeqMask(hwp, 0x16, value, 0x40); } ViaDisplayEnableCRT(pScrn); } static xf86OutputStatus via_analog_detect(xf86OutputPtr output) { xf86OutputStatus status = XF86OutputStatusDisconnected; ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); xf86MonPtr mon; /* 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; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected a VGA monitor on I2C Bus 1.\n"); } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Did not detect a VGA monitor on I2C Bus 1.\n"); /* 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 { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Did not detect a VGA monitor on I2C Bus 2.\n"); /* Perform manual detection of a VGA monitor since */ /* it was not detected via I2C buses. */ 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); } } return status; } static void via_analog_destroy(xf86OutputPtr output) { } static const xf86OutputFuncsRec via_analog_funcs = { .create_resources = via_analog_create_resources, #ifdef RANDR_12_INTERFACE .set_property = via_analog_set_property, #endif #ifdef RANDR_13_INTERFACE .get_property = via_analog_get_property, #endif .dpms = via_analog_dpms, .save = via_analog_save, .restore = via_analog_restore, .mode_valid = via_analog_mode_valid, .mode_fixup = via_analog_mode_fixup, .prepare = via_analog_prepare, .commit = via_analog_commit, .mode_set = via_analog_mode_set, .detect = via_analog_detect, .get_modes = xf86OutputGetEDIDModes, .destroy = via_analog_destroy, }; void via_analog_init(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; xf86OutputPtr output = NULL; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_analog_init.\n")); if (!pVia->pI2CBus1 || !pVia->pI2CBus2) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I2C Bus 1 or I2C Bus 2 does not exist.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_analog_init.\n")); return; } output = xf86OutputCreate(pScrn, &via_analog_funcs, "VGA-1"); output->possible_crtcs = 0x3; output->possible_clones = 0; output->interlaceAllowed = TRUE; output->doubleScanAllowed = FALSE; pBIOSInfo->analog = output; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_analog_init.\n")); } static void via_dvi_create_resources(xf86OutputPtr output) { } #ifdef RANDR_12_INTERFACE static Bool via_dvi_set_property(xf86OutputPtr output, Atom property, RRPropertyValuePtr value) { return TRUE; } static Bool via_dvi_get_property(xf86OutputPtr output, Atom property) { return FALSE; } #endif static void via_dvi_dpms(xf86OutputPtr output, int mode) { ScrnInfoPtr pScrn = output->scrn; switch (mode) { case DPMSModeOn: ViaDFPPower(pScrn, TRUE); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: ViaDFPPower(pScrn, FALSE); break; } } static void via_dvi_save(xf86OutputPtr output) { via_vt1632_save(output); } static void via_dvi_restore(xf86OutputPtr output) { via_vt1632_restore(output); } static int via_dvi_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) { return via_vt1632_mode_valid(output, pMode); } static Bool via_dvi_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { return TRUE; } static void via_dvi_prepare(xf86OutputPtr output) { } static void via_dvi_commit(xf86OutputPtr output) { } static void via_dvi_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { ScrnInfoPtr pScrn = output->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); via_vt1632_power(output, FALSE); ViaModeSecondCRTC(pScrn, mode); via_vt1632_mode_set(output, mode, adjusted_mode); via_vt1632_power(output, TRUE); } static xf86OutputStatus via_dvi_detect(xf86OutputPtr output) { xf86OutputStatus status = XF86OutputStatusDisconnected; ScrnInfoPtr pScrn = output->scrn; VIAPtr pVia = VIAPTR(pScrn); xf86MonPtr mon; mon = xf86OutputGetEDID(output, pVia->pI2CBus2); if (mon && DIGITAL(mon->features.input_type)) { xf86OutputSetEDID(output, mon); status = XF86OutputStatusConnected; } else { status = via_vt1632_detect(output); } return status; } static void via_dvi_destroy(xf86OutputPtr output) { } static const xf86OutputFuncsRec via_dvi_funcs = { .create_resources = via_dvi_create_resources, #ifdef RANDR_12_INTERFACE .set_property = via_dvi_set_property, #endif #ifdef RANDR_13_INTERFACE .get_property = via_dvi_get_property, #endif .dpms = via_dvi_dpms, .save = via_dvi_save, .restore = via_dvi_restore, .mode_valid = via_dvi_mode_valid, .mode_fixup = via_dvi_mode_fixup, .prepare = via_dvi_prepare, .commit = via_dvi_commit, .mode_set = via_dvi_mode_set, .detect = via_dvi_detect, .get_modes = xf86OutputGetEDIDModes, .destroy = via_dvi_destroy, }; void via_dvi_init(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); xf86OutputPtr output = NULL; struct ViaVT1632PrivateData *private_data = NULL; I2CBusPtr pBus = NULL; I2CDevPtr pDev = NULL; I2CSlaveAddr addr = 0x10; 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; } if (xf86I2CProbeAddress(pVia->pI2CBus3, addr)) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1632A found on I2C Bus 3.\n"); pBus = pVia->pI2CBus3; } else if (xf86I2CProbeAddress(pVia->pI2CBus2, addr)) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1632A found on I2C Bus 2.\n"); pBus = pVia->pI2CBus2; } else { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1632A not found on I2C Bus 2 or I2C Bus 3.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_dvi_init.\n")); return; } pDev = xf86CreateI2CDevRec(); if (!pDev) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to create I2C bus structure.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_dvi_init.\n")); return; } pDev->DevName = "VT1632A"; pDev->SlaveAddr = addr; pDev->pI2CBus = pBus; if (!xf86I2CDevInit(pDev)) { xf86DestroyI2CDevRec(pDev, TRUE); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to initialize a device on I2C bus.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_dvi_init.\n")); return; } if (!via_vt1632_probe(pScrn, pDev)) { xf86DestroyI2CDevRec(pDev, TRUE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_dvi_init.\n")); return; } private_data = via_vt1632_init(pScrn, pDev); if (!private_data) { xf86DestroyI2CDevRec(pDev, TRUE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_dvi_init.\n")); return; } output = xf86OutputCreate(pScrn, &via_dvi_funcs, "DVI-1"); if (output) { output->driver_private = private_data; output->possible_crtcs = 0x2; output->possible_clones = 0; output->interlaceAllowed = FALSE; output->doubleScanAllowed = FALSE; } } /* * */ void ViaOutputsDetect(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaOutputsDetect\n")); pBIOSInfo->analog = NULL; /* LVDS */ via_lvds_init(pScrn); /* VGA */ via_analog_init(pScrn); /* * FIXME: xf86I2CProbeAddress(pVia->pI2CBus3, 0x40) * disables the panel on P4M900 */ /* TV encoder */ if ((pVia->Chipset != VIA_P4M900) || (pVia->ActiveDevice & VIA_DEVICE_TV)) via_tv_init(pScrn); via_dvi_init(pScrn); } #ifdef HAVE_DEBUG /* * Returns: * Bit[7] 2nd Path * Bit[6] 1/0 MHS Enable/Disable * Bit[5] 0 = Bypass Callback, 1 = Enable Callback * Bit[4] 0 = Hot-Key Sequence Control (OEM Specific) * Bit[3] LCD * Bit[2] TV * Bit[1] CRT * Bit[0] DVI */ static CARD8 VIAGetActiveDisplay(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); CARD8 tmp; tmp = (hwp->readCrtc(hwp, 0x3E) >> 4); tmp |= ((hwp->readCrtc(hwp, 0x3B) & 0x18) << 3); return tmp; } #endif /* HAVE_DEBUG */ /* * */ CARD32 ViaGetMemoryBandwidth(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaGetMemoryBandwidth. Memory type: %d\n", pVia->MemClk)); switch (pVia->MemClk) { case VIA_MEM_SDR66: case VIA_MEM_SDR100: case VIA_MEM_SDR133: return VIA_BW_MIN; case VIA_MEM_DDR200: return VIA_BW_DDR200; case VIA_MEM_DDR266: case VIA_MEM_DDR333: case VIA_MEM_DDR400: return VIA_BW_DDR400; case VIA_MEM_DDR533: case VIA_MEM_DDR667: return VIA_BW_DDR667; case VIA_MEM_DDR800: case VIA_MEM_DDR1066: return VIA_BW_DDR1066; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "ViaBandwidthAllowed: Unknown memory type: %d\n", pVia->MemClk); return VIA_BW_MIN; } } /* * * Some very common abstractions. * */ /* * Standard vga call really. * Needs to be called to reset the dotclock (after SR40:2/1 reset) */ void ViaSetUseExternalClock(vgaHWPtr hwp) { CARD8 data; DEBUG(xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "ViaSetUseExternalClock\n")); data = hwp->readMiscOut(hwp); hwp->writeMiscOut(hwp, data | 0x0C); } /* * */ static void ViaSetDotclock(ScrnInfoPtr pScrn, CARD32 clock, int base, int probase) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "ViaSetDotclock to 0x%06x\n", (unsigned)clock)); if ((pVia->Chipset == VIA_CLE266) || (pVia->Chipset == VIA_KM400)) { hwp->writeSeq(hwp, base, clock >> 8); hwp->writeSeq(hwp, base+1, clock & 0xFF); } else { /* unichrome pro */ union pllparams pll; int dtz, dr, dn, dm; pll.packed = clock; dtz = pll.params.dtz; dr = pll.params.dr; dn = pll.params.dn; dm = pll.params.dm; /* The VX855 and VX900 do not modify dm/dn, but earlier chipsets do. */ if ((pVia->Chipset != VIA_VX855) && (pVia->Chipset != VIA_VX900)) { dm -= 2; dn -= 2; } hwp->writeSeq(hwp, probase, dm & 0xff); hwp->writeSeq(hwp, probase+1, ((dm >> 8) & 0x03) | (dr << 2) | ((dtz & 1) << 7)); hwp->writeSeq(hwp, probase+2, (dn & 0x7f) | ((dtz & 2) << 6)); } } /* * */ static void ViaSetPrimaryDotclock(ScrnInfoPtr pScrn, CARD32 clock) { vgaHWPtr hwp = VGAHWPTR(pScrn); ViaSetDotclock(pScrn, clock, 0x46, 0x44); ViaSeqMask(hwp, 0x40, 0x02, 0x02); ViaSeqMask(hwp, 0x40, 0x00, 0x02); } /* * */ void ViaSetSecondaryDotclock(ScrnInfoPtr pScrn, CARD32 clock) { vgaHWPtr hwp = VGAHWPTR(pScrn); ViaSetDotclock(pScrn, clock, 0x44, 0x4A); ViaSeqMask(hwp, 0x40, 0x04, 0x04); ViaSeqMask(hwp, 0x40, 0x00, 0x04); } /* * */ static void ViaSetECKDotclock(ScrnInfoPtr pScrn, CARD32 clock) { /* Does the non-pro chip have an ECK clock ? */ ViaSetDotclock(pScrn, clock, 0, 0x47); } static CARD32 ViaComputeDotClock(unsigned clock) { double fout, fref, err, minErr; CARD32 dr, dn, dm, maxdm, maxdn; CARD32 factual, best; fref = 14.31818e6; fout = (double)clock * 1.e3; factual = ~0; maxdm = 127; maxdn = 7; minErr = 1e10; best = 0; for (dr = 0; dr < 4; ++dr) { for (dn = (dr == 0) ? 2 : 1; dn <= maxdn; ++dn) { for (dm = 1; dm <= maxdm; ++dm) { factual = fref * dm; factual /= (dn << dr); err = fabs((double)factual / fout - 1.); if (err < minErr) { minErr = err; best = (dm & 127) | ((dn & 31) << 8) | (dr << 14); } } } } return best; } static CARD32 ViaComputeProDotClock(unsigned clock) { double fvco, fout, fref, err, minErr; CARD32 dr = 0, dn, dm, maxdm, maxdn; CARD32 factual; union pllparams bestClock; fref = 14.318e6; fout = (double)clock * 1.e3; factual = ~0; maxdm = factual / 14318000U; minErr = 1.e10; bestClock.packed = 0U; do { fvco = fout * (1 << dr); } while (fvco < 300.e6 && dr++ < 8); if (dr == 8) { return 0; } if (clock < 30000) maxdn = 8; else if (clock < 45000) maxdn = 7; else if (clock < 170000) maxdn = 6; else maxdn = 5; for (dn = 2; dn < maxdn; ++dn) { for (dm = 2; dm < maxdm; ++dm) { factual = 14318000U * dm; factual /= dn << dr; if ((err = fabs((double)factual / fout - 1.)) < 0.005) { if (err < minErr) { minErr = err; bestClock.params.dtz = 1; bestClock.params.dr = dr; bestClock.params.dn = dn; bestClock.params.dm = dm; } } } } 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; } 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; } /* * */ void ViaModePrimaryLegacy(xf86CrtcPtr crtc, DisplayModePtr mode) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaModePrimaryLegacy\n")); DEBUG(ViaPrintMode(pScrn, mode)); /* Turn off Screen */ ViaCrtcMask(hwp, 0x17, 0x00, 0x80); /* Clean Second Path Status */ hwp->writeCrtc(hwp, 0x6A, 0x00); hwp->writeCrtc(hwp, 0x6B, 0x00); hwp->writeCrtc(hwp, 0x6C, 0x00); hwp->writeCrtc(hwp, 0x93, 0x00); ViaCRTCInit(pScrn); ViaFirstCRTCSetMode(pScrn, mode); pBIOSInfo->Clock = ViaModeDotClockTranslate(pScrn, mode); pBIOSInfo->ClockExternal = FALSE; /* Enable Extended Mode Memory Access. */ ViaSeqMask(hwp, 0x1A, 0x08, 0x08); if (pBIOSInfo->analog->status == XF86OutputStatusConnected) ViaCrtcMask(hwp, 0x36, 0x30, 0x30); else ViaSeqMask(hwp, 0x16, 0x00, 0x40); if ((pBIOSInfo->tv && pBIOSInfo->tv->status == XF86OutputStatusConnected)) { /* Quick 'n dirty workaround for non-primary case until TVCrtcMode * is removed -- copy from clock handling code below */ if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) ViaSetPrimaryDotclock(pScrn, 0x471C); /* CLE266Ax uses 2x XCLK */ else if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) ViaSetPrimaryDotclock(pScrn, 0x529001); else ViaSetPrimaryDotclock(pScrn, 0x871C); ViaSetUseExternalClock(hwp); ViaTVSetMode(crtc, mode); } else ViaTVPower(pScrn, FALSE); ViaSetPrimaryFIFO(pScrn, mode); if (pBIOSInfo->ClockExternal) { if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) ViaSetPrimaryDotclock(pScrn, 0x471C); /* CLE266Ax uses 2x XCLK */ else if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) ViaSetPrimaryDotclock(pScrn, 0x529001); else ViaSetPrimaryDotclock(pScrn, 0x871C); if (pVia->Chipset == VIA_CLE266 || pVia->Chipset == VIA_KM400) ViaCrtcMask(hwp, 0x6B, 0x01, 0x01); } else { ViaSetPrimaryDotclock(pScrn, pBIOSInfo->Clock); ViaSetUseExternalClock(hwp); ViaCrtcMask(hwp, 0x6B, 0x00, 0x01); } /* Enable CRT Controller (3D5.17 Hardware Reset) */ ViaCrtcMask(hwp, 0x17, 0x80, 0x80); hwp->disablePalette(hwp); } /* * */ void ViaModeSecondaryLegacy(xf86CrtcPtr crtc, DisplayModePtr mode) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaModeSecondaryLegacy\n")); DEBUG(ViaPrintMode(pScrn, mode)); /* Turn off Screen */ ViaCrtcMask(hwp, 0x17, 0x00, 0x80); ViaSecondCRTCSetMode(pScrn, mode); if (pBIOSInfo->tv && pBIOSInfo->tv->status == XF86OutputStatusConnected) ViaTVSetMode(crtc, mode); /* CLE266A2 apparently doesn't like this */ if (!(pVia->Chipset == VIA_CLE266 && pVia->ChipRev == 0x02)) ViaCrtcMask(hwp, 0x6C, 0x00, 0x1E); ViaSetSecondaryFIFO(pScrn, mode); ViaSetSecondaryDotclock(pScrn, pBIOSInfo->Clock); ViaSetUseExternalClock(hwp); ViaCrtcMask(hwp, 0x17, 0x80, 0x80); hwp->disablePalette(hwp); } void ViaDFPPower(ScrnInfoPtr pScrn, Bool On) { #ifdef HAVE_DEBUG if (On) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDFPPower: On.\n"); else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaDFPPower: Off.\n"); #endif vgaHWPtr hwp = VGAHWPTR(pScrn); /* Display Channel Select */ ViaCrtcMask(hwp, 0xD2, 0x30, 0x30); if (On) /* Power on TMDS */ ViaCrtcMask(hwp, 0xD2, 0x00, 0x08); else /* Power off TMDS */ ViaCrtcMask(hwp, 0xD2, 0x08, 0x08); } void ViaModeFirstCRTC(ScrnInfoPtr pScrn, DisplayModePtr mode) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaModeFirstCRTC\n"); vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; /* Turn off Screen */ ViaCrtcMask(hwp, 0x17, 0x00, 0x80); ViaFirstCRTCSetMode(pScrn, mode); pBIOSInfo->Clock = ViaModeDotClockTranslate(pScrn, mode); pBIOSInfo->ClockExternal = FALSE; /* Enable Extended Mode Memory Access. */ ViaSeqMask(hwp, 0x1A, 0x08, 0x08); ViaSetPrimaryFIFO(pScrn, mode); ViaSetPrimaryDotclock(pScrn, pBIOSInfo->Clock); ViaSetUseExternalClock(hwp); ViaCrtcMask(hwp, 0x6B, 0x00, 0x01); hwp->disablePalette(hwp); /* Turn on Screen */ ViaCrtcMask(hwp, 0x17, 0x80, 0x80); } void ViaModeSecondCRTC(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; vgaHWPtr hwp = VGAHWPTR(pScrn); DisplayModePtr realMode = mode; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaModeSecondCRTC\n")); ViaSecondCRTCSetMode(pScrn, realMode); ViaSetSecondaryFIFO(pScrn, realMode); pBIOSInfo->Clock = ViaModeDotClockTranslate(pScrn, realMode); /* Fix LCD scaling */ ViaSecondCRTCHorizontalQWCount(pScrn, mode->CrtcHDisplay); pBIOSInfo->ClockExternal = FALSE; ViaSetSecondaryDotclock(pScrn, pBIOSInfo->Clock); ViaSetUseExternalClock(hwp); hwp->disablePalette(hwp); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_priv.h000066400000000000000000000142201267025031400236030ustar00rootroot00000000000000/* * Copyright 2006-2015 The Openchrome Project * [http://www.freedesktop.org/wiki/Openchrome] * 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_PRIV_H_ #define _VIA_PRIV_H_ 1 #ifdef HAVE_DRI #include "via_drm.h" #endif #include "exa.h" /* * Alignment macro functions */ #define ALIGN_TO(f, alignment) (((f) + ((alignment)-1)) & ~((alignment)-1)) /* * FOURCC definitions */ #define FOURCC_XVMC (('C' << 24) + ('M' << 16) + ('V' << 8) + 'X') #define FOURCC_RV15 (('5' << 24) + ('1' << 16) + ('V' << 8) + 'R') #define FOURCC_RV16 (('6' << 24) + ('1' << 16) + ('V' << 8) + 'R') #define FOURCC_RV32 (('2' << 24) + ('3' << 16) + ('V' << 8) + 'R') /* * Structures for create surface */ typedef struct _SWDEVICE { unsigned char * lpSWOverlaySurface[2]; /* Max 2 Pointers to SW Overlay Surface*/ unsigned long dwSWPhysicalAddr[2]; /*Max 2 Physical address to SW Overlay Surface */ unsigned long dwSWCbPhysicalAddr[2]; /* Physical address to SW Cb Overlay Surface, for YV12 format use */ unsigned long dwSWCrPhysicalAddr[2]; /* Physical address to SW Cr Overlay Surface, for YV12 format use */ unsigned long dwHQVAddr[3]; /* Physical address to HQV surface -- CLE_C0 */ /*unsigned long dwHQVAddr[2];*/ /*Max 2 Physical address to SW HQV Overlay Surface*/ unsigned long dwWidth; /*SW Source Width, not changed*/ unsigned long dwHeight; /*SW Source Height, not changed*/ unsigned long dwPitch; /*SW frame buffer pitch*/ unsigned long gdwSWSrcWidth; /*SW Source Width, changed if window is out of screen*/ unsigned long gdwSWSrcHeight; /*SW Source Height, changed if window is out of screen*/ unsigned long gdwSWDstWidth; /*SW Destination Width*/ unsigned long gdwSWDstHeight; /*SW Destination Height*/ unsigned long gdwSWDstLeft; /*SW Position : Left*/ unsigned long gdwSWDstTop; /*SW Position : Top*/ unsigned long dwDeinterlaceMode; /*BOB / WEAVE*/ }SWDEVICE; typedef SWDEVICE * LPSWDEVICE; typedef struct _DDUPDATEOVERLAY { CARD32 SrcLeft; CARD32 SrcTop; CARD32 SrcRight; CARD32 SrcBottom; CARD32 DstLeft; CARD32 DstTop; CARD32 DstRight; CARD32 DstBottom; unsigned long dwFlags; /* flags */ unsigned long dwColorSpaceLowValue; } DDUPDATEOVERLAY; typedef DDUPDATEOVERLAY * LPDDUPDATEOVERLAY; /* Definition for dwFlags */ #define DDOVER_KEYDEST 1 #define DDOVER_INTERLEAVED 2 #define DDOVER_BOB 4 #define FOURCC_HQVSW 0x34565148 /*HQV4*/ typedef struct { CARD32 dwWidth; CARD32 dwHeight; CARD32 dwOffset; CARD32 dwUVoffset; CARD32 dwFlipTime; CARD32 dwFlipTag; CARD32 dwStartAddr; CARD32 dwV1OriWidth; CARD32 dwV1OriHeight; CARD32 dwV1OriPitch; CARD32 dwV1SrcWidth; CARD32 dwV1SrcHeight; CARD32 dwV1SrcLeft; CARD32 dwV1SrcRight; CARD32 dwV1SrcTop; CARD32 dwV1SrcBot; CARD32 dwSPWidth; CARD32 dwSPHeight; CARD32 dwSPLeft; CARD32 dwSPRight; CARD32 dwSPTop; CARD32 dwSPBot; CARD32 dwSPOffset; CARD32 dwSPstartAddr; CARD32 dwDisplayPictStruct; CARD32 dwDisplayBuffIndex; /* Display buffer Index. 0 to ( dwBufferNumber -1) */ CARD32 dwFetchAlignment; CARD32 dwSPPitch; unsigned long dwHQVAddr[3]; /* CLE_C0 */ /*unsigned long dwHQVAddr[2];*/ CARD32 dwMPEGDeinterlaceMode; /* default value : VIA_DEINTERLACE_WEAVE */ CARD32 dwMPEGProgressiveMode; /* default value : VIA_PROGRESSIVE */ CARD32 dwHQVheapInfo; /* video memory heap of the HQV buffer */ CARD32 dwVideoControl; /* video control flag */ CARD32 dwminifyH; /* Horizontal minify factor */ CARD32 dwminifyV; /* Vertical minify factor */ CARD32 dwMpegDecoded; } OVERLAYRECORD; #define MEM_BLOCKS 4 typedef struct { unsigned long gdwVideoFlagSW; unsigned long gdwVideoFlagMPEG; unsigned long gdwAlphaEnabled; /* For Alpha blending use*/ struct buffer_object *HQVMem; struct buffer_object *SWfbMem; CARD32 SrcFourCC; DDUPDATEOVERLAY UpdateOverlayBackup; /* For HQVcontrol func use // To save MPEG updateoverlay info.*/ /* device struct */ SWDEVICE SWDevice; OVERLAYRECORD overlayRecordV1; OVERLAYRECORD overlayRecordV3; Bool MPEG_ON; Bool SWVideo_ON; /*To solve the bandwidth issue */ unsigned long gdwUseExtendedFIFO; /* For panning mode use */ int panning_x; int panning_y; int oldPanningX; int oldPanningY; /* Maximum resolution with interpolation */ unsigned long maxWInterp; unsigned long maxHInterp; } swovRec, *swovPtr; #endif /* _VIA_PRIV_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_regs.h000066400000000000000000000335511267025031400235730ustar00rootroot00000000000000/* * 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 */ VIA_K8M890, /* VT3336 */ VIA_P4M890, /* VT3327 */ VIA_P4M900, /* VT3364 */ VIA_VX800, /* VT3353 */ VIA_VX855, /* VT3409*/ VIA_VX900, /* VT3410*/ #ifdef VIA_VT3293_SUPPORT VIA_CN750, /* VT3293 */ #endif 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 */ #define PCI_CHIP_VT3336 0x3230 /* K8M890 */ #define PCI_CHIP_VT3327 0x3343 /* P4M890 */ #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 */ #ifdef VIA_VT3293_SUPPORT #define PCI_CHIP_VT3293 0x3225 /* CN750 */ #endif /* 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) struct ViaCardIdStruct { char* String; /* full identification string */ CARD8 Chip; /* which family of unichrome */ CARD16 Vendor; /* PCI subsystem Vendor ID */ CARD16 Device; /* PCI subsystem Device ID */ CARD8 Outputs; /* whether it supports CRT, LCD, and TV */ }; void ViaCheckCardId(ScrnInfoPtr pScrn); #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_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_rop.h000066400000000000000000000215611267025031400234310ustar00rootroot00000000000000/* * Copyright 2008 Maarten Maathuis * * 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 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 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. */ /* Ternary Raster Operations as defined by GDI * 0 = black * 1 = white * D = destination * S = source * P = pattern * o = bitwise OR * a = bitwise AND * n = bitwise inverse * x = bitwise XOR * * The notation is reverse polish. * Example: * ROP_PDSonon: !(P | !(D | S)) */ #define ROP_0 0x00 #define ROP_DPSoon 0x01 #define ROP_DPSona 0x02 #define ROP_PSon 0x03 #define ROP_SDPona 0x04 #define ROP_DPon 0x05 #define ROP_PDSxnon 0x06 #define ROP_PDSaon 0x07 #define ROP_SDPnaa 0x08 #define ROP_PDSxon 0x09 #define ROP_DPna 0x0A #define ROP_PSDnaon 0x0B #define ROP_SPna 0x0C #define ROP_PDSnaon 0x0D #define ROP_PDSonon 0x0E #define ROP_Pn 0x0F #define ROP_PDSona 0x10 #define ROP_DSon 0x11 #define ROP_SDPxnon 0x12 #define ROP_SDPaon 0x13 #define ROP_DPSxnon 0x14 #define ROP_DPSaon 0x15 #define ROP_PSDPSanaxx 0x16 #define ROP_SSPxDSxaxn 0x17 #define ROP_SPxPDxa 0x18 #define ROP_SDPSanaxn 0x19 #define ROP_PDSPaox 0x1A #define ROP_SDPSxaxn 0x1B #define ROP_PSDPaox 0x1C #define ROP_DSPDxaxn 0x1D #define ROP_PDSox 0x1E #define ROP_PDSoan 0x1F #define ROP_DPSnaa 0x20 #define ROP_SDPxon 0x21 #define ROP_DSna 0x22 #define ROP_SPDnaon 0x23 #define ROP_SPxDSxa 0x24 #define ROP_PDSPanaxn 0x25 #define ROP_SDPSaox 0x26 #define ROP_SDPSxnox 0x27 #define ROP_DPSxa 0x28 #define ROP_PSDPSaoxxn 0x29 #define ROP_DPSana 0x2A #define ROP_SSPxPDxaxn 0x2B #define ROP_SPDSoax 0x2C #define ROP_PSDnox 0x2D #define ROP_PSDPxox 0x2E #define ROP_PSDnoan 0x2F #define ROP_PSna 0x30 #define ROP_SDPnaon 0x31 #define ROP_SDPSoox 0x32 #define ROP_Sn 0x33 #define ROP_SPDSaox 0x34 #define ROP_SPDSxnox 0x35 #define ROP_SDPox 0x36 #define ROP_SDPoan 0x37 #define ROP_PSDPoax 0x38 #define ROP_SPDnox 0x39 #define ROP_SPDSxox 0x3A #define ROP_SPDnoan 0x3B #define ROP_PSx 0x3C #define ROP_SPDSonox 0x3D #define ROP_SPDSnaox 0x3E #define ROP_PSan 0x3F #define ROP_PSDnaa 0x40 #define ROP_DPSxon 0x41 #define ROP_SDxPDxa 0x42 #define ROP_SPDSanaxn 0x43 #define ROP_SDna 0x44 #define ROP_DPSnaon 0x45 #define ROP_DSPDaox 0x46 #define ROP_PSDPxaxn 0x47 #define ROP_SDPxa 0x48 #define ROP_PDSPDaoxxn 0x49 #define ROP_DPSDoax 0x4A #define ROP_PDSnox 0x4B #define ROP_SDPana 0x4C #define ROP_SSPxDSxoxn 0x4D #define ROP_PDSPxox 0x4E #define ROP_PDSnoan 0x4F #define ROP_PDna 0x50 #define ROP_DSPnaon 0x51 #define ROP_DPSDaox 0x52 #define ROP_SPDSxaxn 0x53 #define ROP_DPSonon 0x54 #define ROP_Dn 0x55 #define ROP_DPSox 0x56 #define ROP_DPSoan 0x57 #define ROP_PDSPoax 0x58 #define ROP_DPSnox 0x59 #define ROP_DPx 0x5A #define ROP_DPSDonox 0x5B #define ROP_DPSDxox 0x5C #define ROP_DPSnoan 0x5D #define ROP_DPSDnaox 0x5E #define ROP_DPan 0x5F #define ROP_PDSxa 0x60 #define ROP_DSPDSaoxxn 0x61 #define ROP_DSPDoax 0x62 #define ROP_SDPnox 0x63 #define ROP_SDPSoax 0x64 #define ROP_DSPnox 0x65 #define ROP_DSx 0x66 #define ROP_SDPSonox 0x67 #define ROP_DSPDSonoxxn 0x68 #define ROP_PDSxxn 0x69 #define ROP_DPSax 0x6A #define ROP_PSDPSoaxxn 0x6B #define ROP_SDPax 0x6C #define ROP_PDSPDoaxxn 0x6D #define ROP_SDPSnoax 0x6E #define ROP_PDSxnan 0x6F #define ROP_PDSana 0x70 #define ROP_SSDxPDxaxn 0x71 #define ROP_SDPSxox 0x72 #define ROP_SDPnoan 0x73 #define ROP_DSPDxox 0x74 #define ROP_DSPnoan 0x75 #define ROP_SDPSnaox 0x76 #define ROP_DSan 0x77 #define ROP_PDSax 0x78 #define ROP_DSPDSoaxxn 0x79 #define ROP_DPSDnoax 0x7A #define ROP_SDPxnan 0x7B #define ROP_SPDSnoax 0x7C #define ROP_DPSxnan 0x7D #define ROP_SPxDSxo 0x7E #define ROP_DPSaan 0x7F #define ROP_DPSaa 0x80 #define ROP_SPxDSxon 0x81 #define ROP_DPSxna 0x82 #define ROP_SPDSnoaxn 0x83 #define ROP_SDPxna 0x84 #define ROP_PDSPnoaxn 0x85 #define ROP_DSPDSoaxx 0x86 #define ROP_PDSaxn 0x87 #define ROP_DSa 0x88 #define ROP_SDPSnaoxn 0x89 #define ROP_DSPnoa 0x8A #define ROP_DSPDxoxn 0x8B #define ROP_SDPnoa 0x8C #define ROP_SDPSxoxn 0x8D #define ROP_SSDxPDxax 0x8E #define ROP_PDSanan 0x8F #define ROP_PDSxna 0x90 #define ROP_SDPSnoaxn 0x91 #define ROP_DPSDPoaxx 0x92 #define ROP_SPDaxn 0x93 #define ROP_PSDPSoaxx 0x94 #define ROP_DPSaxn 0x95 #define ROP_DPSxx 0x96 #define ROP_PSDPSonoxx 0x97 #define ROP_SDPSonoxn 0x98 #define ROP_DSxn 0x99 #define ROP_DPSnax 0x9A #define ROP_SDPSoaxn 0x9B #define ROP_SPDnax 0x9C #define ROP_DSPDoaxn 0x9D #define ROP_DSPDSaoxx 0x9E #define ROP_PDSxan 0x9F #define ROP_DPa 0xA0 #define ROP_PDSPnaoxn 0xA1 #define ROP_DPSnoa 0xA2 #define ROP_DPSDxoxn 0xA3 #define ROP_PDSPonoxn 0xA4 #define ROP_PDxn 0xA5 #define ROP_DSPnax 0xA6 #define ROP_PDSPoaxn 0xA7 #define ROP_DPSoa 0xA8 #define ROP_DPSoxn 0xA9 #define ROP_D 0xAA #define ROP_DPSono 0xAB #define ROP_SPDSxax 0xAC #define ROP_DPSDaoxn 0xAD #define ROP_DSPnao 0xAE #define ROP_DPno 0xAF #define ROP_PDSnoa 0xB0 #define ROP_PDSPxoxn 0xB1 #define ROP_SSPxDSxox 0xB2 #define ROP_SDPanan 0xB3 #define ROP_PSDnax 0xB4 #define ROP_DPSDoaxn 0xB5 #define ROP_DPSDPaoxx 0xB6 #define ROP_SDPxan 0xB7 #define ROP_PSDPxax 0xB8 #define ROP_DSPDaoxn 0xB9 #define ROP_DPSnao 0xBA #define ROP_DSno 0xBB #define ROP_SPDSanax 0xBC #define ROP_SDxPDxan 0xBD #define ROP_DPSxo 0xBE #define ROP_DPSano 0xBF #define ROP_Psa 0xC0 #define ROP_SPDSnaoxn 0xC1 #define ROP_SPDSonoxn 0xC2 #define ROP_PSxn 0xC3 #define ROP_SPDnoa 0xC4 #define ROP_SPDSxoxn 0xC5 #define ROP_SDPnax 0xC6 #define ROP_PSDPoaxn 0xC7 #define ROP_SDPoa 0xC8 #define ROP_SPDoxn 0xC9 #define ROP_DPSDxax 0xCA #define ROP_SPDSaoxn 0xCB #define ROP_S 0xCC #define ROP_SDPono 0xCD #define ROP_SDPnao 0xCE #define ROP_SPno 0xCF #define ROP_PSDnoa 0xD0 #define ROP_PSDPxoxn 0xD1 #define ROP_PDSnax 0xD2 #define ROP_SPDSoaxn 0xD3 #define ROP_SSPxPDxax 0xD4 #define ROP_DPSanan 0xD5 #define ROP_PSDPSaoxx 0xD6 #define ROP_DPSxan 0xD7 #define ROP_PDSPxax 0xD8 #define ROP_SDPSaoxn 0xD9 #define ROP_DPSDanax 0xDA #define ROP_SPxDSxan 0xDB #define ROP_SPDnao 0xDC #define ROP_SDno 0xDD #define ROP_SDPxo 0xDE #define ROP_SDPano 0xDF #define ROP_PDSoa 0xE0 #define ROP_PDSoxn 0xE1 #define ROP_DSPDxax 0xE2 #define ROP_PSDPaoxn 0xE3 #define ROP_SDPSxax 0xE4 #define ROP_PDSPaoxn 0xE5 #define ROP_SDPSanax 0xE6 #define ROP_SPxPDxan 0xE7 #define ROP_SSPxDSxax 0xE8 #define ROP_DSPDSanaxxn 0xE9 #define ROP_DPSao 0xEA #define ROP_DPSxno 0xEB #define ROP_SDPao 0xEC #define ROP_SDPxno 0xED #define ROP_DSo 0xEE #define ROP_SDPnoo 0xEF #define ROP_P 0xF0 #define ROP_PDSono 0xF1 #define ROP_PDSnao 0xF2 #define ROP_PSno 0xF3 #define ROP_PSDnao 0xF4 #define ROP_PDno 0xF5 #define ROP_PDSxo 0xF6 #define ROP_PDSano 0xF7 #define ROP_PDSao 0xF8 #define ROP_PDSxno 0xF9 #define ROP_DPo 0xFA #define ROP_DPSnoo 0xFB #define ROP_PSo 0xFC #define ROP_PSDnoo 0xFD #define ROP_DPSoo 0xFE #define ROP_1 0xFF /* derived from XAA */ static struct { int copy; int copy_planemask; int pattern; int pattern_planemask; } VIAROP[] = { { ROP_0, ROP_0, ROP_0, ROP_DPna }, /* GXclear */ { ROP_DSa, ROP_DSPnoa, ROP_DPa, ROP_DPSnoa }, /* GXand */ { ROP_SDna, ROP_DPSnaon, ROP_PDna, ROP_DSPnaon }, /* GXandReverse */ { ROP_S, ROP_DPSDxax, ROP_P, ROP_DSPDxax }, /* GXcopy */ { ROP_DSna, ROP_DPSana, ROP_DPna, ROP_DPSana }, /* GXandInverted */ { ROP_D, ROP_D, ROP_D, ROP_D }, /* GXnoop */ { ROP_DSx, ROP_DPSax, ROP_DPx, ROP_DPSax }, /* GXxor */ { ROP_DSo, ROP_DPSao, ROP_DPo, ROP_DPSao }, /* GXor */ { ROP_DSon, ROP_DPSaon, ROP_DPon, ROP_DPSaon }, /* GXnor */ { ROP_DSxn, ROP_DPSaxn, ROP_PDxn, ROP_DPSaxn }, /* GXequiv */ { ROP_Dn, ROP_Dn, ROP_Dn, ROP_DPx }, /* GXinvert */ { ROP_SDno, ROP_DPSanan, ROP_PDno, ROP_DPSanan }, /* GXorReverse */ { ROP_Sn, ROP_PSDPxox, ROP_Pn, ROP_SPDSxox }, /* GXcopyInverted */ { ROP_DSno, ROP_DPSnao, ROP_DPno, ROP_DSPnao }, /* GXorInverted */ { ROP_DSan, ROP_DSPnoan, ROP_DPan, ROP_DPSnoan }, /* GXnand */ { ROP_1, ROP_1, ROP_1, ROP_DPo } /* GXset */ }; #define VIAACCELCOPYROP(vRop) (VIAROP[vRop].copy << 24) #define VIAACCELPATTERNROP(vRop) (VIAROP[vRop].pattern << 24) xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_ums.c000066400000000000000000000615001267025031400234250ustar00rootroot00000000000000/* * Copyright 2011-2015 The Openchrome Project * [http://www.freedesktop.org/wiki/Openchrome] * * 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 "globals.h" #include "via_driver.h" static void ViaMMIODisable(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); switch (pVia->Chipset) { case VIA_CX700: case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: ViaSeqMask(hwp, 0x1A, 0x00, 0x08); break; default: ViaSeqMask(hwp, 0x1A, 0x00, 0x60); break; } } void VIAUnmapMem(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAUnmapMem\n")); ViaMMIODisable(pScrn); #ifdef HAVE_PCIACCESS if (pVia->MapBase) pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->MapBase, VIA_MMIO_REGSIZE); if (pVia->BltBase) pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->BltBase, VIA_MMIO_BLTSIZE); if (pVia->FBBase) pci_device_unmap_range(pVia->PciInfo, (pointer) pVia->FBBase, pVia->videoRambytes); #else if (pVia->MapBase) xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->MapBase, VIA_MMIO_REGSIZE); if (pVia->BltBase) xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->BltBase, VIA_MMIO_BLTSIZE); if (pVia->FBBase) xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pVia->FBBase, pVia->videoRambytes); #endif } static void ViaMMIOEnable(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); switch (pVia->Chipset) { case VIA_CX700: case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: ViaSeqMask(hwp, 0x1A, 0x08, 0x08); break; default: if (pVia->IsSecondary) ViaSeqMask(hwp, 0x1A, 0x38, 0x38); else ViaSeqMask(hwp, 0x1A, 0x68, 0x68); break; } } static Bool VIAMapMMIO(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); #ifdef HAVE_PCIACCESS pVia->MmioBase = pVia->PciInfo->regions[1].base_addr; int err; #else pVia->MmioBase = pVia->PciInfo->memBase[1]; #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAMapMMIO\n")); xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "mapping MMIO @ 0x%lx with size 0x%x\n", pVia->MmioBase, VIA_MMIO_REGSIZE); #ifdef HAVE_PCIACCESS err = pci_device_map_range(pVia->PciInfo, pVia->MmioBase, VIA_MMIO_REGSIZE, PCI_DEV_MAP_FLAG_WRITABLE, (void **)&pVia->MapBase); if (err) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to map mmio BAR. %s (%d)\n", strerror(err), err); return FALSE; } #else pVia->MapBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, pVia->MmioBase, VIA_MMIO_REGSIZE); if (!pVia->MapBase) return FALSE; #endif xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "mapping BitBlt MMIO @ 0x%lx with size 0x%x\n", pVia->MmioBase + VIA_MMIO_BLTBASE, VIA_MMIO_BLTSIZE); #ifdef HAVE_PCIACCESS err = pci_device_map_range(pVia->PciInfo, pVia->MmioBase + VIA_MMIO_BLTBASE, VIA_MMIO_BLTSIZE, PCI_DEV_MAP_FLAG_WRITABLE, (void **)&pVia->BltBase); if (err) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to map blt BAR. %s (%d)\n", strerror(err), err); return FALSE; } #else pVia->BltBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_MMIO, pVia->PciTag, pVia->MmioBase + VIA_MMIO_BLTBASE, VIA_MMIO_BLTSIZE); if (!pVia->BltBase) return FALSE; #endif if (!pVia->MapBase || !pVia->BltBase) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "BitBlit could not be mapped.\n"); return FALSE; } /* Memory mapped IO for mpeg engine. */ pVia->MpegMapBase = pVia->MapBase + 0xc00; /* Set up MMIO vgaHW. */ { vgaHWPtr hwp = VGAHWPTR(pScrn); CARD8 val; vgaHWSetMmioFuncs(hwp, pVia->MapBase, 0x8000); val = hwp->readEnable(hwp); hwp->writeEnable(hwp, val | 0x01); val = hwp->readMiscOut(hwp); hwp->writeMiscOut(hwp, val | 0x01); /* Unlock extended IO space. */ ViaSeqMask(hwp, 0x10, 0x01, 0x01); ViaMMIOEnable(pScrn); vgaHWSetMmioFuncs(hwp, pVia->MapBase, 0x8000); /* Unlock CRTC. */ ViaCrtcMask(hwp, 0x47, 0x00, 0x01); vgaHWGetIOBase(hwp); } return TRUE; } static Bool VIAMapFB(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); #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; } int err; #else if (pVia->Chipset == VIA_VX900) { pVia->FrameBufferBase = pVia->PciInfo->memBase[2]; } else { pVia->FrameBufferBase = pVia->PciInfo->memBase[0]; } #endif DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAMapFB\n")); xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "mapping framebuffer @ 0x%lx with size 0x%lx\n", pVia->FrameBufferBase, pVia->videoRambytes); if (pVia->videoRambytes) { #ifndef HAVE_PCIACCESS /* * 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. */ unsigned char *tmp; 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. */ #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 mmio BAR. %s (%d)\n", strerror(err), err); return FALSE; } #else pVia->FBBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, pVia->PciTag, pVia->FrameBufferBase, pVia->videoRambytes); if (!pVia->FBBase) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Internal error: could not map framebuffer\n"); return FALSE; } #endif pVia->FBFreeStart = 0; pVia->FBFreeEnd = pVia->videoRambytes; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Frame buffer start: %p, free start: 0x%x end: 0x%x\n", pVia->FBBase, pVia->FBFreeStart, pVia->FBFreeEnd); } #ifdef HAVE_PCIACCESS pScrn->memPhysBase = pVia->PciInfo->regions[0].base_addr; #else pScrn->memPhysBase = pVia->PciInfo->memBase[0]; #endif pScrn->fbOffset = 0; if (pVia->IsSecondary) pScrn->fbOffset = pScrn->videoRam << 10; return TRUE; } /* * Leftover from VIA's code. */ static void viaInitPCIe(VIAPtr pVia) { VIASETREG(0x41c, 0x00100000); VIASETREG(0x420, 0x680A0000); VIASETREG(0x420, 0x02000000); } static void viaInitAgp(VIAPtr pVia) { VIASETREG(VIA_REG_TRANSET, 0x00100000); VIASETREG(VIA_REG_TRANSPACE, 0x00000000); VIASETREG(VIA_REG_TRANSPACE, 0x00333004); VIASETREG(VIA_REG_TRANSPACE, 0x60000000); VIASETREG(VIA_REG_TRANSPACE, 0x61000000); VIASETREG(VIA_REG_TRANSPACE, 0x62000000); VIASETREG(VIA_REG_TRANSPACE, 0x63000000); VIASETREG(VIA_REG_TRANSPACE, 0x64000000); VIASETREG(VIA_REG_TRANSPACE, 0x7D000000); VIASETREG(VIA_REG_TRANSET, 0xfe020000); VIASETREG(VIA_REG_TRANSPACE, 0x00000000); } /* * Initialize the virtual command queue. Header-2 commands can be put * in this queue for buffering. AFAIK it doesn't handle Header-1 * commands, which is really a pity, since it has to be idled before * issuing a Header-1 command. */ static void viaEnableAgpVQ(VIAPtr pVia) { CARD32 vqStartAddr = pVia->VQStart, vqEndAddr = pVia->VQEnd, vqStartL = 0x50000000 | (vqStartAddr & 0xFFFFFF), vqEndL = 0x51000000 | (vqEndAddr & 0xFFFFFF), vqStartEndH = 0x52000000 | ((vqStartAddr & 0xFF000000) >> 24) | ((vqEndAddr & 0xFF000000) >> 16), vqLen = 0x53000000 | (VIA_VQ_SIZE >> 3); VIASETREG(VIA_REG_TRANSET, 0x00fe0000); VIASETREG(VIA_REG_TRANSPACE, 0x080003fe); VIASETREG(VIA_REG_TRANSPACE, 0x0a00027c); VIASETREG(VIA_REG_TRANSPACE, 0x0b000260); VIASETREG(VIA_REG_TRANSPACE, 0x0c000274); VIASETREG(VIA_REG_TRANSPACE, 0x0d000264); VIASETREG(VIA_REG_TRANSPACE, 0x0e000000); VIASETREG(VIA_REG_TRANSPACE, 0x0f000020); VIASETREG(VIA_REG_TRANSPACE, 0x1000027e); VIASETREG(VIA_REG_TRANSPACE, 0x110002fe); VIASETREG(VIA_REG_TRANSPACE, 0x200f0060); VIASETREG(VIA_REG_TRANSPACE, 0x00000006); VIASETREG(VIA_REG_TRANSPACE, 0x40008c0f); VIASETREG(VIA_REG_TRANSPACE, 0x44000000); VIASETREG(VIA_REG_TRANSPACE, 0x45080c04); VIASETREG(VIA_REG_TRANSPACE, 0x46800408); VIASETREG(VIA_REG_TRANSPACE, vqStartEndH); VIASETREG(VIA_REG_TRANSPACE, vqStartL); VIASETREG(VIA_REG_TRANSPACE, vqEndL); VIASETREG(VIA_REG_TRANSPACE, vqLen); } static void viaEnablePCIeVQ(VIAPtr pVia) { CARD32 vqStartAddr = pVia->VQStart, vqEndAddr = pVia->VQEnd, vqStartL = 0x70000000 | (vqStartAddr & 0xFFFFFF), vqEndL = 0x71000000 | (vqEndAddr & 0xFFFFFF), vqStartEndH = 0x72000000 | ((vqStartAddr & 0xFF000000) >> 24) | ((vqEndAddr & 0xFF000000) >> 16), vqLen = 0x73000000 | (VIA_VQ_SIZE >> 3); VIASETREG(0x41c, 0x00100000); VIASETREG(0x420, vqStartEndH); VIASETREG(0x420, vqStartL); VIASETREG(0x420, vqEndL); VIASETREG(0x420, vqLen); VIASETREG(0x420, 0x74301001); VIASETREG(0x420, 0x00000000); } /* * Disable the virtual command queue. */ void viaDisableVQ(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); switch (pVia->Chipset) { case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: VIASETREG(0x41c, 0x00100000); VIASETREG(0x420, 0x74301000); break; default: VIASETREG(VIA_REG_TRANSET, 0x00fe0000); VIASETREG(VIA_REG_TRANSPACE, 0x00000004); VIASETREG(VIA_REG_TRANSPACE, 0x40008c0f); VIASETREG(VIA_REG_TRANSPACE, 0x44000000); VIASETREG(VIA_REG_TRANSPACE, 0x45080c04); VIASETREG(VIA_REG_TRANSPACE, 0x46800408); break; } } /* * Initialize the 2D engine and set the 2D context mode to the * current screen depth. Also enable the virtual queue. */ static void VIAInitialize2DEngine(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); ViaTwodContext *tdc = &pVia->td; int i; /* Initialize the 2D engine registers to reset the 2D engine. */ for (i = 0x04; i <= 0x40; i += 4) { VIASETREG(i, 0x0); } if (pVia->Chipset == VIA_VX800 || pVia->Chipset == VIA_VX855 || pVia->Chipset == VIA_VX900) { for (i = 0x44; i <= 0x5c; i += 4) { VIASETREG(i, 0x0); } } if (pVia->Chipset == VIA_VX900) { /*410 redefine 0x30 34 38*/ VIASETREG(0x60, 0x0); /*already useable here*/ } switch (pVia->Chipset) { case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: viaInitPCIe(pVia); break; default: viaInitAgp(pVia); break; } if (pVia->VQStart != 0) { switch (pVia->Chipset) { case VIA_K8M890: case VIA_P4M900: case VIA_VX800: case VIA_VX855: case VIA_VX900: viaEnablePCIeVQ(pVia); break; default: viaEnableAgpVQ(pVia); break; } } else { viaDisableVQ(pScrn); } viaAccelSetMode(pScrn->bitsPerPixel, tdc); } static void VIAInitialize3DEngine(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); int i; VIASETREG(VIA_REG_TRANSET, 0x00010000); for (i = 0; i <= 0x7D; i++) VIASETREG(VIA_REG_TRANSPACE, (CARD32) i << 24); VIASETREG(VIA_REG_TRANSET, 0x00020000); for (i = 0; i <= 0x94; i++) VIASETREG(VIA_REG_TRANSPACE, (CARD32) i << 24); VIASETREG(VIA_REG_TRANSPACE, 0x82400000); VIASETREG(VIA_REG_TRANSET, 0x01020000); for (i = 0; i <= 0x94; i++) VIASETREG(VIA_REG_TRANSPACE, (CARD32) i << 24); VIASETREG(VIA_REG_TRANSPACE, 0x82400000); VIASETREG(VIA_REG_TRANSET, 0xfe020000); for (i = 0; i <= 0x03; i++) VIASETREG(VIA_REG_TRANSPACE, (CARD32) i << 24); VIASETREG(VIA_REG_TRANSET, 0x00030000); for (i = 0; i <= 0xff; i++) VIASETREG(VIA_REG_TRANSPACE, 0); VIASETREG(VIA_REG_TRANSET, 0x00100000); VIASETREG(VIA_REG_TRANSPACE, 0x00333004); VIASETREG(VIA_REG_TRANSPACE, 0x10000002); VIASETREG(VIA_REG_TRANSPACE, 0x60000000); VIASETREG(VIA_REG_TRANSPACE, 0x61000000); VIASETREG(VIA_REG_TRANSPACE, 0x62000000); VIASETREG(VIA_REG_TRANSPACE, 0x63000000); VIASETREG(VIA_REG_TRANSPACE, 0x64000000); VIASETREG(VIA_REG_TRANSET, 0x00fe0000); if (pVia->Chipset == VIA_CLE266 && pVia->ChipRev >= 3) VIASETREG(VIA_REG_TRANSPACE, 0x40008c0f); else VIASETREG(VIA_REG_TRANSPACE, 0x4000800f); VIASETREG(VIA_REG_TRANSPACE, 0x44000000); VIASETREG(VIA_REG_TRANSPACE, 0x45080C04); VIASETREG(VIA_REG_TRANSPACE, 0x46800408); VIASETREG(VIA_REG_TRANSPACE, 0x50000000); VIASETREG(VIA_REG_TRANSPACE, 0x51000000); VIASETREG(VIA_REG_TRANSPACE, 0x52000000); VIASETREG(VIA_REG_TRANSPACE, 0x53000000); VIASETREG(VIA_REG_TRANSET, 0x00fe0000); VIASETREG(VIA_REG_TRANSPACE, 0x08000001); VIASETREG(VIA_REG_TRANSPACE, 0x0A000183); VIASETREG(VIA_REG_TRANSPACE, 0x0B00019F); VIASETREG(VIA_REG_TRANSPACE, 0x0C00018B); VIASETREG(VIA_REG_TRANSPACE, 0x0D00019B); VIASETREG(VIA_REG_TRANSPACE, 0x0E000000); VIASETREG(VIA_REG_TRANSPACE, 0x0F000000); VIASETREG(VIA_REG_TRANSPACE, 0x10000000); VIASETREG(VIA_REG_TRANSPACE, 0x11000000); VIASETREG(VIA_REG_TRANSPACE, 0x20000000); } /* * Acceleration initialization function. Sets up offscreen memory disposition, * and initializes engines and acceleration method. */ Bool UMSAccelInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); Bool ret = FALSE; pVia->VQStart = 0; pVia->vq_bo = drm_bo_alloc(pScrn, VIA_VQ_SIZE, 16, TTM_PL_FLAG_VRAM); if (!pVia->vq_bo) goto err; pVia->VQStart = pVia->vq_bo->offset; pVia->VQEnd = pVia->vq_bo->offset + pVia->vq_bo->size; VIAInitialize2DEngine(pScrn); 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) goto err; pVia->markerOffset = pVia->exa_sync_bo->offset; pVia->markerBuf = drm_bo_map(pScrn, pVia->exa_sync_bo); if (!pVia->markerBuf) goto err; pVia->curMarker = 0; pVia->lastMarkerRead = 0; #ifdef HAVE_DRI pVia->dBounce = NULL; pVia->scratchAddr = NULL; #endif /* HAVE_DRI */ ret = TRUE; err: if (!ret) { if (pVia->markerBuf) { drm_bo_unmap(pScrn, pVia->exa_sync_bo); pVia->markerBuf = NULL; } if (pVia->exa_sync_bo) drm_bo_free(pScrn, pVia->exa_sync_bo); if (pVia->vq_bo) drm_bo_free(pScrn, pVia->vq_bo); } return ret; } Bool ums_create(ScrnInfoPtr pScrn) { ScreenPtr pScreen = pScrn->pScreen; VIAPtr pVia = VIAPTR(pScrn); unsigned long offset; BoxRec AvailFBArea; Bool ret = TRUE; long size; int maxY; #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; /* FBManager can't handle more than 32767 scan lines */ if (maxY > 32767) maxY = 32767; AvailFBArea.x1 = 0; AvailFBArea.y1 = 0; AvailFBArea.x2 = pScrn->displayWidth; AvailFBArea.y2 = maxY; 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 */ ret = xf86InitFBManager(pScreen, &AvailFBArea); if (ret != TRUE) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "xf86InitFBManager init failed\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Frame Buffer From (%d,%d) To (%d,%d)\n", AvailFBArea.x1, AvailFBArea.y1, AvailFBArea.x2, AvailFBArea.y2)); 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 offscreen memory.\n", AvailFBArea.y2 - pScrn->virtualY)); return TRUE; } Bool UMSPreInit(ScrnInfoPtr pScrn) { MessageType from = X_PROBED; VIAPtr pVia = VIAPTR(pScrn); CARD8 videoRam; vgaHWPtr hwp; #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); #endif int bMemSize = 0; 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 hwp = VGAHWPTR(pScrn); switch (pVia->Chipset) { case VIA_CLE266: #ifdef HAVE_PCIACCESS pci_device_cfg_read_u8(bridge, &videoRam, 0xE1); #else videoRam = pciReadByte(pciTag(0, 0, 0), 0xE1) & 0x70; #endif pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10; break; case VIA_KM400: #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); } #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; } #endif pScrn->videoRam = (1 << ((videoRam & 0x70) >> 4)) << 10; break; case VIA_PM800: case VIA_P4M800PRO: case VIA_K8M800: #ifdef HAVE_PCIACCESS pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1); #else videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70; #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: #ifdef HAVE_PCIACCESS pci_device_cfg_read_u8(vgaDevice, &videoRam, 0xA1); #else videoRam = pciReadByte(pciTag(0, 0, 3), 0xA1) & 0x70; #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"); } } /* * 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); } if (from == X_PROBED) { xf86DrvMsg(pScrn->scrnIndex, from, "Probed amount of VideoRAM = %d kB\n", pScrn->videoRam); } /* Split the FB for SAMM. */ /* FIXME: For now, split the FB into two equal sections. * This should be user-adjustable via a config option. */ if (pVia->IsSecondary) { DevUnion *pPriv; VIAEntPtr pVIAEnt; VIAPtr pVia1; pPriv = xf86GetEntityPrivate(pScrn->entityList[0], gVIAEntityIndex); pVIAEnt = pPriv->ptr; pScrn->videoRam = pScrn->videoRam >> 1; pVIAEnt->pPrimaryScrn->videoRam = pScrn->videoRam; pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn); pVia1->videoRambytes = pScrn->videoRam << 10; pVia->FrameBufferBase += (pScrn->videoRam << 10); } pVia->videoRambytes = pScrn->videoRam << 10; /* maybe throw in some more sanity checks here */ #ifndef HAVE_PCIACCESS pVia->PciTag = pciTag(pVia->PciInfo->bus, pVia->PciInfo->device, pVia->PciInfo->func); #endif /* Detect the amount of installed RAM */ if (!VIAMapMMIO(pScrn)) return FALSE; if (!VIAMapFB(pScrn)) return FALSE; return TRUE; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_ums.h000066400000000000000000000221061267025031400234310ustar00rootroot00000000000000/* * 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_BIOS_H_ #define _VIA_BIOS_H_ 1 #include "via_vgahw.h" #define VIA_PANEL6X4 0 #define VIA_PANEL8X6 1 #define VIA_PANEL10X7 2 #define VIA_PANEL12X7 3 #define VIA_PANEL12X10 4 #define VIA_PANEL14X10 5 #define VIA_PANEL16X12 6 #define VIA_PANEL12X8 7 #define VIA_PANEL8X4 8 #define VIA_PANEL1366X7 9 #define VIA_PANEL1360X7 10 #define VIA_PANEL1920x1080 11 #define VIA_PANEL1920x1200 12 #define VIA_PANEL10X6 13 #define VIA_PANEL14X9 14 #define VIA_PANEL1280X720 15 #define VIA_PANEL12X9 16 #define VIA_PANEL_INVALID 255 #define TVTYPE_NONE 0x00 #define TVTYPE_NTSC 0x01 #define TVTYPE_PAL 0x02 #define TVTYPE_480P 0X03 #define TVTYPE_576P 0X04 #define TVTYPE_720P 0X05 #define TVTYPE_1080I 0X06 #define TVOUTPUT_NONE 0x00 #define TVOUTPUT_COMPOSITE 0x01 #define TVOUTPUT_SVIDEO 0x02 #define TVOUTPUT_RGB 0x04 #define TVOUTPUT_YCBCR 0x08 #define TVOUTPUT_SC 0x16 #define VIA_NONETV 0 #define VIA_VT1621 1 /* TV2PLUS */ #define VIA_VT1622 2 /* TV3 */ #define VIA_VT1623 3 /* also VT1622A */ #define VIA_VT1625 4 #define VIA_CH7011 5 #define VIA_CH7019A 6 #define VIA_CH7019B 7 #define VIA_CH7017 8 #define VIA_CH7304 9 #define VIA_CH7305 10 #define VIA_TVNORMAL 0 #define VIA_TVOVER 1 #define VIA_DEVICE_NONE 0x00 #define VIA_DEVICE_CRT 0x01 #define VIA_DEVICE_LCD 0x02 #define VIA_DEVICE_TV 0x04 #define VIA_DEVICE_DFP 0x08 #define VIA_I2C_NONE 0x00 #define VIA_I2C_BUS1 0x01 #define VIA_I2C_BUS2 0x02 #define VIA_I2C_BUS3 0x04 /* System Memory CLK */ #define VIA_MEM_SDR66 0x00 #define VIA_MEM_SDR100 0x01 #define VIA_MEM_SDR133 0x02 #define VIA_MEM_DDR200 0x03 #define VIA_MEM_DDR266 0x04 #define VIA_MEM_DDR333 0x05 #define VIA_MEM_DDR400 0x06 #define VIA_MEM_DDR533 0x07 #define VIA_MEM_DDR667 0x08 #define VIA_MEM_DDR800 0x09 #define VIA_MEM_DDR1066 0x0A #define VIA_MEM_END 0x0B #define VIA_MEM_NONE 0xFF /* 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_DFPHIGH 0x8 typedef struct ViaPanelMode { int Width ; int Height ; } ViaPanelModeRec, *ViaPanelModePtr ; typedef struct ViaPanelInfo { Bool IsActive ; /* Native physical resolution */ int NativeHeight; int NativeWidth; /* 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; Bool ForcePanel; int PanelIndex; Bool Center; CARD8 BusWidth; /* Digital Output Bus Width */ Bool SetDVI; /* LCD Simultaneous Expand Mode HWCursor Y Scale */ Bool scaleY; int resY; } ViaPanelInfoRec, *ViaPanelInfoPtr ; typedef struct _VIABIOSINFO { xf86OutputPtr analog; xf86OutputPtr tv; CARD32 Clock; /* register value for the dotclock */ Bool ClockExternal; CARD32 Bandwidth; /* available memory bandwidth */ /* Simultaneous */ Bool SimultaneousEnabled; /* TV entries */ int TVEncoder; int TVOutput; I2CDevPtr TVI2CDev; int TVType; Bool TVDotCrawl; int TVDeflicker; CARD8 TVRegs[0xFF]; int TVNumRegs; int TVDIPort; /* TV Callbacks */ void (*TVSave) (ScrnInfoPtr pScrn); void (*TVRestore) (ScrnInfoPtr pScrn); Bool (*TVDACSense) (ScrnInfoPtr pScrn); ModeStatus (*TVModeValid) (ScrnInfoPtr pScrn, DisplayModePtr mode); void (*TVModeI2C) (ScrnInfoPtr pScrn, DisplayModePtr mode); void (*TVModeCrtc) (xf86CrtcPtr crtc, DisplayModePtr mode); void (*TVPower) (ScrnInfoPtr pScrn, Bool On); void (*LCDPower) (ScrnInfoPtr pScrn, Bool On); DisplayModePtr TVModes; int TVNumModes; void (*TVPrintRegs) (ScrnInfoPtr pScrn); } VIABIOSInfoRec, *VIABIOSInfoPtr; /* Function prototypes */ /* via_vbe.c */ void ViaVbeAdjustFrame(ScrnInfoPtr pScrn, int x, int y); Bool ViaVbeSetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode); Bool ViaVbeSaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function); Bool ViaVbeModePreInit(ScrnInfoPtr pScrn); void ViaVbeDPMS(ScrnInfoPtr pScrn, int mode); void ViaVbeDoDPMS(ScrnInfoPtr pScrn, int mode); int ViaVbePanelPower(vbeInfoPtr pVbe, int mode); Bool ViaVbeSetPanelMode(ScrnInfoPtr pScrn, Bool expand); /* via_ums.c */ Bool VIAMapMem(ScrnInfoPtr pScrn); void VIAUnmapMem(ScrnInfoPtr pScrn); Bool ums_create(ScrnInfoPtr pScrn); Bool UMSPreInit(ScrnInfoPtr pScrn); Bool UMSAccelInit(ScreenPtr pScreen); void viaDisableVQ(ScrnInfoPtr pScrn); /* via_output.c */ void ViaOutputsDetect(ScrnInfoPtr pScrn); CARD32 ViaGetMemoryBandwidth(ScrnInfoPtr pScrn); CARD32 ViaModeDotClockTranslate(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaModePrimaryLegacy(xf86CrtcPtr crtc, DisplayModePtr mode); void ViaModeSecondaryLegacy(xf86CrtcPtr crtc, DisplayModePtr mode); void ViaDFPPower(ScrnInfoPtr pScrn, Bool On); void ViaTVPower(ScrnInfoPtr pScrn, Bool On); void ViaTVSave(ScrnInfoPtr pScrn); void ViaTVRestore(ScrnInfoPtr pScrn); #ifdef HAVE_DEBUG void ViaTVPrintRegs(ScrnInfoPtr pScrn); #endif void ViaModeSecondCRTC(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaModeFirstCRTC(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaSetSecondaryDotclock(ScrnInfoPtr pScrn, CARD32 clock); void ViaSetUseExternalClock(vgaHWPtr hwp); /* via_display.c */ Bool UMSCrtcInit(ScrnInfoPtr pScrn); void ViaCRTCInit(ScrnInfoPtr pScrn); void ViaFirstCRTCSetStartingAddress(xf86CrtcPtr crtc, int x, int y); void ViaFirstCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaSecondCRTCSetStartingAddress(xf86CrtcPtr crtc, int x, int y); void ViaSecondCRTCHorizontalOffset(ScrnInfoPtr pScrn); void ViaSecondCRTCHorizontalQWCount(ScrnInfoPtr pScrn, int width); void ViaSecondCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaShadowCRTCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaGammaDisable(ScrnInfoPtr pScrn); /* via_lvds.c */ void via_lvds_init(ScrnInfoPtr pScrn); /* in via_bandwidth.c */ void ViaSetPrimaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaSetSecondaryFIFO(ScrnInfoPtr pScrn, DisplayModePtr mode); void ViaDisablePrimaryFIFO(ScrnInfoPtr pScrn); /* via_vt162x.c */ I2CDevPtr ViaVT162xDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address); void ViaVT162xInit(ScrnInfoPtr pScrn); /* via_ch7xxx.c */ I2CDevPtr ViaCH7xxxDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address); void ViaCH7xxxInit(ScrnInfoPtr pScrn); /* via_display.c */ void ViaSecondDisplayChannelEnable(ScrnInfoPtr pScrn); void ViaSecondDisplayChannelDisable(ScrnInfoPtr pScrn); void ViaDisplayInit(ScrnInfoPtr pScrn); void ViaDisplayEnableSimultaneous(ScrnInfoPtr pScrn); void ViaDisplayDisableSimultaneous(ScrnInfoPtr pScrn); #endif /* _VIA_BIOS_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_vbe.c000066400000000000000000000272551267025031400234060ustar00rootroot00000000000000/* * Copyright 2004 The Unichrome Project [unichrome.sf.net] * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com) * * 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. */ /* * VBE Mode setting. * * The functions were more or less taken from the vesa driver. * They were added to support BIOS modes directly. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "via_driver.h" #include "vbe.h" #include "vbeModes.h" #define R16(v) ((v) & 0xffff) #define VBE_DEFAULT_REFRESH 6000 void ViaVbeAdjustFrame(ScrnInfoPtr pScrn, int x, int y) { VIAPtr pVia = VIAPTR(pScrn); VBESetDisplayStart(pVia->pVbe, x, y, TRUE); } /* * Default values for pInt10. */ static void ViaVbeInitInt10(vbeInfoPtr pVbe) { pVbe->pInt10->ax = 0x4F14; pVbe->pInt10->cx = 0; pVbe->pInt10->dx = 0; pVbe->pInt10->di = 0; pVbe->pInt10->num = 0x10; } static int ViaVbeGetRefreshRateIndex(int maxRefresh) { int rri = 0; if (maxRefresh >= 120) { rri = 10; } else if (maxRefresh >= 100) { rri = 9; } else if (maxRefresh >= 85) { rri = 7; } else if (maxRefresh >= 75) { rri = 5; } else { rri = 0; } return rri; } static int ViaVbeGetActiveDevices(ScrnInfoPtr pScrn) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); int activeDevices = 0, i; /* TODO: Add others devices. */ for (i = 0; i < xf86_config->num_output; i++) { xf86OutputPtr output = xf86_config->output[i]; if (output->status == XF86OutputStatusConnected) { if (!strncmp(output->name, "VGA", 3)) activeDevices = 0x01; else if (!strncmp(output->name, "LVDS", 4)) activeDevices |= 0x02; else if (!strncmp(output->name, "TV", 2)) activeDevices |= 0x04; } } return activeDevices; } /* * Sets the requested mode, refresh rate and active devices. */ static Bool ViaVbeSetActiveDevices(ScrnInfoPtr pScrn, int mode, int refresh) { VIAPtr pVia = VIAPTR(pScrn); vbeInfoPtr pVbe = pVia->pVbe; ViaVbeInitInt10(pVbe); pVbe->pInt10->bx = 0x8003; pVbe->pInt10->cx = ViaVbeGetActiveDevices(pScrn); pVbe->pInt10->dx = mode & 0x1FF; pVbe->pInt10->di = ViaVbeGetRefreshRateIndex(refresh); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVbeSetActiveDevices " "mode: %x, refresh: %d active devices: 0x%2x\n", mode, refresh, pVbe->pInt10->cx)); xf86ExecX86int10(pVbe->pInt10); if (pVbe->pInt10->ax != 0x4F) return FALSE; return TRUE; } /* * Sets the panel mode (expand or center). */ Bool ViaVbeSetPanelMode(ScrnInfoPtr pScrn, Bool expand) { VIAPtr pVia = VIAPTR(pScrn); vbeInfoPtr pVbe = pVia->pVbe; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVbeSetPanelMode\n")); ViaVbeInitInt10(pVbe); pVbe->pInt10->ax = 0x4F14; pVbe->pInt10->bx = 0x0306; pVbe->pInt10->cx = 0x80 | expand; xf86ExecX86int10(pVbe->pInt10); if (pVbe->pInt10->ax != 0x4F) return FALSE; return TRUE; } static Bool ViaVbeSetRefresh(ScrnInfoPtr pScrn, int maxRefresh) { VIAPtr pVia = VIAPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVbeSetRefresh\n")); vbeInfoPtr pVbe = pVia->pVbe; ViaVbeInitInt10(pVbe); pVbe->pInt10->bx = 0x0001; pVbe->pInt10->cx = ViaVbeGetActiveDevices(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Active Device: %d\n", pVbe->pInt10->cx)); pVbe->pInt10->di = ViaVbeGetRefreshRateIndex(maxRefresh); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Refresh Rate Index: %d\n", pVbe->pInt10->di)); /* Real execution */ xf86ExecX86int10(pVbe->pInt10); if (pVbe->pInt10->ax != 0x4F) return FALSE; return TRUE; } Bool ViaVbeSetMode(ScrnInfoPtr pScrn, DisplayModePtr pMode) { VIAPtr pVia; VbeModeInfoData *data; pVia = VIAPTR(pScrn); int mode; int refreshRate; data = (VbeModeInfoData *) pMode->Private; mode = data->mode | (1 << 15); /* Enable linear addressing. */ mode |= 1 << 14; if (data->block) { refreshRate = data->block->RefreshRate; } else { refreshRate = VBE_DEFAULT_REFRESH; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unable to determine the refresh rate, using %.2f. " "Please check your configuration.\n", refreshRate / 100.); } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Trying VBE Mode %dx%d (0x%x) Refresh %.2f:\n", (int)data->data->XResolution, (int)data->data->YResolution, mode & ~(1 << 11), (float)refreshRate / 100.); if (pVia->useLegacyVBE) { ViaVbeSetRefresh(pScrn, refreshRate / 100); if (VBESetVBEMode(pVia->pVbe, mode, data->block) == FALSE) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VBESetVBEMode failed"); if ((data->block || (data->mode & (1 << 11))) && VBESetVBEMode(pVia->pVbe, (mode & ~(1 << 11)), NULL) == TRUE) { /* Some cards do not like setting the clock. */ xf86ErrorF("...but worked OK without customized " "refresh and dotclock.\n"); free(data->block); data->block = NULL; data->mode &= ~(1 << 11); } else { ErrorF("\n"); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Set VBE Mode failed!\n"); return (FALSE); } } } else { data->mode &= ~(1 << 11); if (VBESetVBEMode(pVia->pVbe, data->mode, NULL) == FALSE) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Set VBE Mode failed.\n"); return (FALSE); } if (!ViaVbeSetActiveDevices(pScrn, data->mode, refreshRate / 100)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to set the active devices.\n"); return (FALSE); } } if (data->data->XResolution != pScrn->displayWidth) VBESetLogicalScanline(pVia->pVbe, pScrn->displayWidth); return (TRUE); } Bool ViaVbeSaveRestore(ScrnInfoPtr pScrn, vbeSaveRestoreFunction function) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVbeSaveRestore\n")); if ((MODE_QUERY < 0) || (function > MODE_RESTORE)) return (FALSE); if (function == MODE_SAVE) pVia->SavedReg.SR1A = hwp->readSeq(hwp, 0x1A); /* Query amount of memory to save state. */ if ((function == MODE_QUERY) || ((function == MODE_SAVE) && (pVia->vbeMode.state == NULL))) { /* Make sure we save at least this information in case of failure. */ (void)VBEGetVBEMode(pVia->pVbe, &(pVia->vbeMode.stateMode)); if (pVia->vbeMode.major > 1) { if (!VBESaveRestore(pVia->pVbe, function, (pointer) & (pVia->vbeMode.state), &(pVia->vbeMode.stateSize), &(pVia->vbeMode.statePage))) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VBESaveRestore failed\n"); return FALSE; } } } /* Save/Restore Super VGA state. */ if (function != MODE_QUERY) { Bool retval = TRUE; if (pVia->vbeMode.major > 1) { if (function == MODE_RESTORE) memcpy(pVia->vbeMode.state, pVia->vbeMode.pstate, pVia->vbeMode.stateSize); if ((retval = VBESaveRestore(pVia->pVbe, function, (pointer) & (pVia->vbeMode.state), &(pVia->vbeMode.stateSize), &(pVia->vbeMode.statePage))) && (function == MODE_SAVE)) { /* Do not rely on the memory not being touched. */ if (pVia->vbeMode.pstate == NULL) pVia->vbeMode.pstate = malloc(pVia->vbeMode.stateSize); memcpy(pVia->vbeMode.pstate, pVia->vbeMode.state, pVia->vbeMode.stateSize); } } if (function == MODE_RESTORE) { if (!VBESetVBEMode(pVia->pVbe, pVia->vbeMode.stateMode, NULL)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VBESetVBEMode failed\n"); } } if (!retval) return (FALSE); } return (TRUE); } Bool ViaVbeModePreInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VbeInfoBlock *vbe; int i; memset(&(pVia->vbeMode), 0, sizeof(ViaVbeModeInfo)); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Searching for matching VESA mode(s):\n"); if ((vbe = VBEGetVBEInfo(pVia->pVbe)) == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VBEGetVBEInfo failed\n"); return FALSE; } pVia->vbeMode.major = (unsigned)(vbe->VESAVersion >> 8); pVia->vbeMode.minor = vbe->VESAVersion & 0xff; pScrn->modePool = VBEGetModePool(pScrn, pVia->pVbe, vbe, V_MODETYPE_VBE); if (pScrn->modePool == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No matching modes\n"); return FALSE; } VBESetModeNames(pScrn->modePool); i = VBEValidateModes(pScrn, NULL, pScrn->display->modes, NULL, NULL, 0, 2048, 1, 0, 2048, pScrn->display->virtualX, pScrn->display->virtualY, pScrn->videoRam, LOOKUP_BEST_REFRESH); if (i <= 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes.\n"); return (FALSE); } VBESetModeParameters(pScrn, pVia->pVbe); xf86PruneDriverModes(pScrn); #if 0 pMode = pScrn->modes; do { vbeMode = ((VbeModeInfoData *) pMode->Private)->data; pMode = pMode->next; } while (pMode != NULL && pMode != pScrn->modes); #endif return TRUE; } int ViaVbePanelPower(vbeInfoPtr pVbe, int mode) { pVbe->pInt10->num = 0x10; pVbe->pInt10->ax = 0x5F54; pVbe->pInt10->bx = (mode) ? 0x00 : 0x01; xf86ExecX86int10(pVbe->pInt10); return (R16(pVbe->pInt10->ax) == 0x015f); } #if 0 /* * FIXME: This might be useful in the future. Otherwise feel free to remove. * If mode=1, it sets the panel in a low-power, low-performance state; * if mode=0, then high performance. */ static int ViaVbePanelLowPower(vbeInfoPtr pVbe, int mode) { pVbe->pInt10->num = 0x10; pVbe->pInt10->ax = 0x5F60; pVbe->pInt10->bx = (mode) ? 0x01 : 0x00; xf86ExecX86int10(pVbe->pInt10); return (R16(pVbe->pInt10->ax) == 0x015f); } #endif void ViaVbeDPMS(ScrnInfoPtr pScrn, int mode) { VIAPtr pVia = VIAPTR(pScrn); if (!pScrn->vtSema) return; VBEDPMSSet(pVia->pVbe, mode); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_vgahw.c000066400000000000000000000373051267025031400237430ustar00rootroot00000000000000/* * 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 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. */ /* * Wrappers around xf86 vgaHW functions. * And some generic IO calls lacking in the current vgaHW implementation. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "compiler.h" #include "xf86.h" #include "via_driver.h" /* for HAVE_DEBUG */ #if ABI_VIDEODRV_VERSION < 12 #define PIOOFFSET hwp->PIOOffset #else #define PIOOFFSET 0 #endif CARD8 ViaVgahwIn(vgaHWPtr hwp, int address) { if (hwp->MMIOBase) return MMIO_IN8(hwp->MMIOBase, hwp->MMIOOffset + address); else return inb(PIOOFFSET + address); } static void ViaVgahwOut(vgaHWPtr hwp, int address, CARD8 value) { if (hwp->MMIOBase) MMIO_OUT8(hwp->MMIOBase, hwp->MMIOOffset + address, value); else outb(PIOOFFSET + address, value); } /* * An indexed read. */ static CARD8 ViaVgahwRead(vgaHWPtr hwp, int indexaddress, CARD8 index, int valueaddress) { ViaVgahwOut(hwp, indexaddress, index); return ViaVgahwIn(hwp, valueaddress); } /* * An indexed write. */ void ViaVgahwWrite(vgaHWPtr hwp, int indexaddress, CARD8 index, int valueaddress, CARD8 value) { ViaVgahwOut(hwp, indexaddress, index); ViaVgahwOut(hwp, valueaddress, value); } void ViaVgahwMask(vgaHWPtr hwp, int indexaddress, CARD8 index, int valueaddress, CARD8 value, CARD8 mask) { CARD8 tmp; tmp = ViaVgahwRead(hwp, indexaddress, index, valueaddress); tmp &= ~mask; tmp |= (value & mask); ViaVgahwWrite(hwp, indexaddress, index, valueaddress, tmp); } void ViaCrtcMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask) { CARD8 tmp; tmp = hwp->readCrtc(hwp, index); tmp &= ~mask; tmp |= (value & mask); hwp->writeCrtc(hwp, index, tmp); } void ViaSeqMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask) { CARD8 tmp; tmp = hwp->readSeq(hwp, index); tmp &= ~mask; tmp |= (value & mask); hwp->writeSeq(hwp, index, tmp); } void ViaGrMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask) { CARD8 tmp; tmp = hwp->readGr(hwp, index); tmp &= ~mask; tmp |= (value & mask); hwp->writeGr(hwp, index, tmp); } void VIASave(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; VIARegPtr Regs = &pVia->SavedReg; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIASave\n")); if (pVia->IsSecondary) { DevUnion *pPriv; VIAEntPtr pVIAEnt; VIAPtr pVia1; vgaHWPtr hwp1; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Secondary\n")); pPriv = xf86GetEntityPrivate(pScrn->entityList[0], gVIAEntityIndex); pVIAEnt = pPriv->ptr; hwp1 = VGAHWPTR(pVIAEnt->pPrimaryScrn); pVia1 = VIAPTR(pVIAEnt->pPrimaryScrn); hwp->SavedReg = hwp1->SavedReg; pVia->SavedReg = pVia1->SavedReg; } else { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Primary\n")); vgaHWProtect(pScrn, TRUE); if (xf86IsPrimaryPci(pVia->PciInfo)) { vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_ALL); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Primary Adapter! saving VGA_SR_ALL !!\n")); } else { vgaHWSave(pScrn, &hwp->SavedReg, VGA_SR_MODE); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Non-Primary Adapter! saving VGA_SR_MODE only !!\n")); } /* Unlock and save extended registers. */ hwp->writeSeq(hwp, 0x10, 0x01); Regs->SR14 = hwp->readSeq(hwp, 0x14); Regs->SR15 = hwp->readSeq(hwp, 0x15); Regs->SR16 = hwp->readSeq(hwp, 0x16); Regs->SR17 = hwp->readSeq(hwp, 0x17); Regs->SR18 = hwp->readSeq(hwp, 0x18); Regs->SR19 = hwp->readSeq(hwp, 0x19); /* PCI Bus Control */ Regs->SR1A = hwp->readSeq(hwp, 0x1A); Regs->SR1B = hwp->readSeq(hwp, 0x1B); Regs->SR1C = hwp->readSeq(hwp, 0x1C); Regs->SR1D = hwp->readSeq(hwp, 0x1D); Regs->SR1E = hwp->readSeq(hwp, 0x1E); Regs->SR1F = hwp->readSeq(hwp, 0x1F); Regs->SR22 = hwp->readSeq(hwp, 0x22); Regs->SR23 = hwp->readSeq(hwp, 0x23); Regs->SR24 = hwp->readSeq(hwp, 0x24); Regs->SR25 = hwp->readSeq(hwp, 0x25); Regs->SR26 = hwp->readSeq(hwp, 0x26); Regs->SR27 = hwp->readSeq(hwp, 0x27); Regs->SR28 = hwp->readSeq(hwp, 0x28); Regs->SR29 = hwp->readSeq(hwp, 0x29); Regs->SR2A = hwp->readSeq(hwp, 0x2A); Regs->SR2B = hwp->readSeq(hwp, 0x2B); Regs->SR2E = hwp->readSeq(hwp, 0x2E); /*=* Save VCK, LCDCK and ECK *=*/ /* Primary Display (VCK) (description for Chipset >= K8M800): */ Regs->SR44 = hwp->readSeq(hwp, 0x44); Regs->SR45 = hwp->readSeq(hwp, 0x45); Regs->SR46 = hwp->readSeq(hwp, 0x46); /* ECK Clock Synthesizer (description for Chipset >= K8M800): */ Regs->SR47 = hwp->readSeq(hwp, 0x47); Regs->SR48 = hwp->readSeq(hwp, 0x48); Regs->SR49 = hwp->readSeq(hwp, 0x49); switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: break; default: /* Secondary Display (LCDCK): */ Regs->SR4A = hwp->readSeq(hwp, 0x4A); Regs->SR4B = hwp->readSeq(hwp, 0x4B); Regs->SR4C = hwp->readSeq(hwp, 0x4C); break; } /* Save Preemptive Arbiter Control Register */ Regs->SR4D = hwp->readSeq(hwp, 0x4D); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Crtc...\n")); Regs->CR13 = hwp->readCrtc(hwp, 0x13); Regs->CR32 = hwp->readCrtc(hwp, 0x32); Regs->CR33 = hwp->readCrtc(hwp, 0x33); Regs->CR35 = hwp->readCrtc(hwp, 0x35); Regs->CR36 = hwp->readCrtc(hwp, 0x36); /* Starting Address */ /* Start Address High */ Regs->CR0C = hwp->readCrtc(hwp, 0x0C); /* Start Address Low */ Regs->CR0D = hwp->readCrtc(hwp, 0x0D); /* Starting Address Overflow Bits[28:24] */ Regs->CR48 = hwp->readCrtc(hwp, 0x48); /* CR34 are fire bits. Must be written after CR0C CR0D CR48. */ /* Starting Address Overflow Bits[23:16] */ Regs->CR34 = hwp->readCrtc(hwp, 0x34); Regs->CR49 = hwp->readCrtc(hwp, 0x49); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TVSave...\n")); if (pBIOSInfo->TVI2CDev) ViaTVSave(pScrn); /* Save LCD control registers (from CR 0x50 to 0x93). */ for (i = 0; i < 68; i++) Regs->CRTCRegs[i] = hwp->readCrtc(hwp, i + 0x50); if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) { /* LVDS Channel 2 Function Select 0 / DVI Function Select */ Regs->CR97 = hwp->readCrtc(hwp, 0x97); /* LVDS Channel 1 Function Select 0 */ Regs->CR99 = hwp->readCrtc(hwp, 0x99); /* Digital Video Port 1 Function Select 0 */ Regs->CR9B = hwp->readCrtc(hwp, 0x9B); /* Power Now Control 4 */ Regs->CR9F = hwp->readCrtc(hwp, 0x9F); /* Horizontal Scaling Initial Value */ Regs->CRA0 = hwp->readCrtc(hwp, 0xA0); /* Vertical Scaling Initial Value */ Regs->CRA1 = hwp->readCrtc(hwp, 0xA1); /* Scaling Enable Bit */ Regs->CRA2 = hwp->readCrtc(hwp, 0xA2); } /* Save TMDS status */ switch (pVia->Chipset) { case VIA_CX700: case VIA_VX800: case VIA_VX855: case VIA_VX900: Regs->CRD2 = hwp->readCrtc(hwp, 0xD2); break; } vgaHWProtect(pScrn, FALSE); } } void VIARestore(ScrnInfoPtr pScrn) { vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; VIARegPtr Regs = &pVia->SavedReg; int i; CARD8 tmp; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIARestore\n")); /* Secondary? */ vgaHWProtect(pScrn, TRUE); /* Unlock extended registers. */ hwp->writeSeq(hwp, 0x10, 0x01); /*=* CR6A, CR6B, CR6C must be reset before restoring standard vga regs, or system will hang. *=*/ /*=* TODO Check is reset IGA2 channel before disable IGA2 channel is necessary or it may cause some line garbage. *=*/ ViaDisplayInit(pScrn); /* Gamma must be disabled before restoring palette */ ViaGammaDisable(pScrn); if (pBIOSInfo->TVI2CDev) ViaTVRestore(pScrn); /* Restore the standard VGA registers. */ if (xf86IsPrimaryPci(pVia->PciInfo)) vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_ALL); else vgaHWRestore(pScrn, &hwp->SavedReg, VGA_SR_MODE); /* Restore extended registers. */ hwp->writeSeq(hwp, 0x14, Regs->SR14); hwp->writeSeq(hwp, 0x15, Regs->SR15); hwp->writeSeq(hwp, 0x16, Regs->SR16); hwp->writeSeq(hwp, 0x17, Regs->SR17); hwp->writeSeq(hwp, 0x18, Regs->SR18); hwp->writeSeq(hwp, 0x19, Regs->SR19); hwp->writeSeq(hwp, 0x1A, Regs->SR1A); hwp->writeSeq(hwp, 0x1B, Regs->SR1B); hwp->writeSeq(hwp, 0x1C, Regs->SR1C); hwp->writeSeq(hwp, 0x1D, Regs->SR1D); hwp->writeSeq(hwp, 0x1E, Regs->SR1E); hwp->writeSeq(hwp, 0x1F, Regs->SR1F); hwp->writeSeq(hwp, 0x22, Regs->SR22); hwp->writeSeq(hwp, 0x23, Regs->SR23); hwp->writeSeq(hwp, 0x24, Regs->SR24); hwp->writeSeq(hwp, 0x25, Regs->SR25); hwp->writeSeq(hwp, 0x26, Regs->SR26); hwp->writeSeq(hwp, 0x27, Regs->SR27); hwp->writeSeq(hwp, 0x28, Regs->SR28); hwp->writeSeq(hwp, 0x29, Regs->SR29); hwp->writeSeq(hwp, 0x2A, Regs->SR2A); hwp->writeSeq(hwp, 0x2B, Regs->SR2B); hwp->writeSeq(hwp, 0x2E, Regs->SR2E); /*=* restore VCK, LCDCK and ECK *=*/ /* Primary Display (VCK): */ hwp->writeSeq(hwp, 0x44, Regs->SR44); hwp->writeSeq(hwp, 0x45, Regs->SR45); hwp->writeSeq(hwp, 0x46, Regs->SR46); /* Reset VCK PLL */ hwp->writeSeq(hwp, 0x40, hwp->readSeq(hwp, 0x40) | 0x02); /* Set SR40[1] to 1 */ hwp->writeSeq(hwp, 0x40, hwp->readSeq(hwp, 0x40) & 0xFD); /* Set SR40[1] to 0 */ /* ECK Clock Synthesizer: */ hwp->writeSeq(hwp, 0x47, Regs->SR47); hwp->writeSeq(hwp, 0x48, Regs->SR48); hwp->writeSeq(hwp, 0x49, Regs->SR49); /* Reset ECK PLL */ hwp->writeSeq(hwp, 0x40, hwp->readSeq(hwp, 0x40) | 0x01); /* Set SR40[0] to 1 */ hwp->writeSeq(hwp, 0x40, hwp->readSeq(hwp, 0x40) & 0xFE); /* Set SR40[0] to 0 */ switch (pVia->Chipset) { case VIA_CLE266: case VIA_KM400: break; default: /* Secondary Display (LCDCK): */ hwp->writeSeq(hwp, 0x4A, Regs->SR4A); hwp->writeSeq(hwp, 0x4B, Regs->SR4B); hwp->writeSeq(hwp, 0x4C, Regs->SR4C); /* Reset LCK PLL */ hwp->writeSeq(hwp, 0x40, hwp->readSeq(hwp, 0x40) | 0x04); /* Set SR40[2] to 1 */ hwp->writeSeq(hwp, 0x40, hwp->readSeq(hwp, 0x40) & 0xFB); /* Set SR40[2] to 0 */ break; } /* Restore Preemptive Arbiter Control Register * VX800 and VX855 should restore this register too, * but I don't do that for I don't want to affect any * chips now. */ if (pVia->Chipset == VIA_VX900) { hwp->writeSeq(hwp, 0x4D, Regs->SR4D); } /* Reset dotclocks. */ ViaSeqMask(hwp, 0x40, 0x06, 0x06); ViaSeqMask(hwp, 0x40, 0x00, 0x06); /* Integrated LVDS Mode Select */ hwp->writeCrtc(hwp, 0x13, Regs->CR13); /*=* Restore CRTC controller extended regs: *=*/ /* Mode Control */ hwp->writeCrtc(hwp, 0x32, Regs->CR32); /* HSYNCH Adjuster */ hwp->writeCrtc(hwp, 0x33, Regs->CR33); /* Extended Overflow */ hwp->writeCrtc(hwp, 0x35, Regs->CR35); /*Power Management 3 (Monitor Control) */ hwp->writeCrtc(hwp, 0x36, Regs->CR36); /* Starting Address */ /* Start Address High */ hwp->writeCrtc(hwp, 0x0C, Regs->CR0C); /* Start Address Low */ hwp->writeCrtc(hwp, 0x0D, Regs->CR0D); /* Starting Address Overflow Bits[28:24] */ hwp->writeCrtc(hwp, 0x48, Regs->CR48); /* CR34 are fire bits. Must be written after CR0C CR0D CR48. */ /* Starting Address Overflow Bits[23:16] */ hwp->writeCrtc(hwp, 0x34, Regs->CR34); hwp->writeCrtc(hwp, 0x49, Regs->CR49); /* Restore LCD control registers. */ for (i = 0; i < 68; i++) hwp->writeCrtc(hwp, i + 0x50, Regs->CRTCRegs[i]); if (pVia->Chipset != VIA_CLE266 && pVia->Chipset != VIA_KM400) { /* Scaling Initial values */ hwp->writeCrtc(hwp, 0xA0, Regs->CRA0); hwp->writeCrtc(hwp, 0xA1, Regs->CRA1); hwp->writeCrtc(hwp, 0xA2, Regs->CRA2); /* LVDS Channels Functions Selection */ hwp->writeCrtc(hwp, 0x97, Regs->CR97); hwp->writeCrtc(hwp, 0x99, Regs->CR99); hwp->writeCrtc(hwp, 0x9B, Regs->CR9B); hwp->writeCrtc(hwp, 0x9F, Regs->CR9F); } /* Restore TMDS status */ switch (pVia->Chipset) { case VIA_CX700: case VIA_VX800: case VIA_VX855: case VIA_VX900: /* LVDS Control Register */ hwp->writeCrtc(hwp, 0xD2, Regs->CRD2); break; } ViaDisablePrimaryFIFO(pScrn); /* Reset clock. */ tmp = hwp->readMiscOut(hwp); hwp->writeMiscOut(hwp, tmp); vgaHWProtect(pScrn, FALSE); } #ifdef HAVE_DEBUG void ViaVgahwPrint(vgaHWPtr hwp) { int i; if (!hwp) return; xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "VGA Sequence registers:\n"); for (i = 0x00; i < 0x80; i++) xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "SR%02X: 0x%02X\n", i, hwp->readSeq(hwp, i)); xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "VGA CRTM/C registers:\n"); for (i = 0x00; i < 0x19; i++) xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "CR%02X: 0x%02X\n", i, hwp->readCrtc(hwp, i)); for (i = 0x33; i < 0xA3; i++) xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "CR%02X: 0x%02X\n", i, hwp->readCrtc(hwp, i)); xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "VGA Graphics registers:\n"); for (i = 0x00; i < 0x08; i++) xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "GR%02X: 0x%02X\n", i, hwp->readGr(hwp, i)); xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "VGA Attribute registers:\n"); for (i = 0x00; i < 0x14; i++) xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "AR%02X: 0x%02X\n", i, hwp->readAttr(hwp, i)); xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "VGA Miscellaneous register:\n"); xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "Misc: 0x%02X\n", hwp->readMiscOut(hwp)); xf86DrvMsg(hwp->pScrn->scrnIndex, X_INFO, "End of VGA registers.\n"); } #endif /* HAVE_DEBUG */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_vgahw.h000066400000000000000000000035371267025031400237500ustar00rootroot00000000000000/* * 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 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_VGAHW_H_ #define _VIA_VGAHW_H_ #include "vgaHW.h" CARD8 ViaVgahwIn(vgaHWPtr hwp, int address); void ViaVgahwWrite(vgaHWPtr hwp, int indexaddress, CARD8 index, int valueaddress, CARD8 value); void ViaVgahwMask(vgaHWPtr hwp, int indexaddress, CARD8 index, int valueaddress, CARD8 value, CARD8 mask); void ViaCrtcMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask); void ViaSeqMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask); void ViaGrMask(vgaHWPtr hwp, CARD8 index, CARD8 value, CARD8 mask); void VIASave(ScrnInfoPtr pScrn); void VIARestore(ScrnInfoPtr pScrn); #ifdef HAVE_DEBUG void ViaVgahwPrint(vgaHWPtr hwp); #endif /* HAVE_DEBUG */ #endif /* _VIA_VGAHW_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_vt162x.c000066400000000000000000000772061267025031400237050ustar00rootroot00000000000000/* * 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" #include "via_vt162x.h" static void ViaSetTVClockSource(xf86CrtcPtr crtc) { drmmode_crtc_private_ptr iga = crtc->driver_private; ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; vgaHWPtr hwp = VGAHWPTR(pScrn); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaSetTVClockSource\n")); switch(pBIOSInfo->TVEncoder) { case VIA_VT1625: /* External TV: */ switch(pVia->Chipset) { case VIA_CX700: case VIA_VX800: case VIA_VX855: /* IGA1 */ if (!iga->index) { if(pBIOSInfo->TVDIPort == VIA_DI_PORT_DVP1) ViaCrtcMask(hwp, 0x6C, 0xB0, 0xF0); else if(pBIOSInfo->TVDIPort == VIA_DI_PORT_DVP0) ViaCrtcMask(hwp, 0x6C, 0x90, 0xF0); } else { /* IGA2 */ if(pBIOSInfo->TVDIPort == VIA_DI_PORT_DVP1) ViaCrtcMask(hwp, 0x6C, 0x0B, 0x0F); else if(pBIOSInfo->TVDIPort == VIA_DI_PORT_DVP0) ViaCrtcMask(hwp, 0x6C, 0x09, 0x0F); } break; default: if (!iga->index) ViaCrtcMask(hwp, 0x6C, 0x21, 0x21); else ViaCrtcMask(hwp, 0x6C, 0xA1, 0xA1); break; } break; default: if (!iga->index) ViaCrtcMask(hwp, 0x6C, 0x50, 0xF0); else ViaCrtcMask(hwp, 0x6C, 0x05, 0x0F); break; } } static void VT162xPrintRegs(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; CARD8 i, buf; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Printing registers for %s\n", pBIOSInfo->TVI2CDev->DevName); for (i = 0; i < pBIOSInfo->TVNumRegs; i++) { xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &buf); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV%02X: 0x%02X\n", i, buf); } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "End of TV registers.\n"); } I2CDevPtr ViaVT162xDetect(ScrnInfoPtr pScrn, I2CBusPtr pBus, CARD8 Address) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; I2CDevPtr pDev = xf86CreateI2CDevRec(); CARD8 buf; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVT162xDetect\n")); pDev->DevName = "VT162x"; pDev->SlaveAddr = Address; pDev->pI2CBus = pBus; if (!xf86I2CDevInit(pDev)) { xf86DestroyI2CDevRec(pDev, TRUE); return NULL; } if (!xf86I2CReadByte(pDev, 0x1B, &buf)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to read from %s Slave %d.\n", pBus->BusName, Address); xf86DestroyI2CDevRec(pDev, TRUE); return NULL; } switch (buf) { case 0x02: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1621 TV Encoder\n"); pBIOSInfo->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; pDev->DevName = "VT1622"; break; case 0x10: xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected VIA Technologies VT1622A/VT1623 TV Encoder\n"); pBIOSInfo->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; pDev->DevName = "VT1625"; break; default: pBIOSInfo->TVEncoder = VIA_NONETV; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown TV Encoder found at %s %X.\n", pBus->BusName, Address); xf86DestroyI2CDevRec(pDev, TRUE); pDev = NULL; break; } return pDev; } static void VT162xSave(ScrnInfoPtr pScrn) { int i; VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT162xSave\n")); for (i = 0; i < pBIOSInfo->TVNumRegs; i++) xf86I2CReadByte(pBIOSInfo->TVI2CDev, i, &(pBIOSInfo->TVRegs[i])); } static void VT162xRestore(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; 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 VT1621 the same as for VT1622/VT1622A/VT1623, but result is different. * Still needs testing on VT1621, of course. */ static CARD8 VT162xDACSenseI2C(I2CDevPtr pDev) { CARD8 save, sense; xf86I2CReadByte(pDev, 0x0E, &save); xf86I2CWriteByte(pDev, 0x0E, 0x00); xf86I2CWriteByte(pDev, 0x0E, 0x80); xf86I2CWriteByte(pDev, 0x0E, 0x00); xf86I2CReadByte(pDev, 0x0F, &sense); xf86I2CWriteByte(pDev, 0x0E, save); return (sense & 0x0F); } /* * VT1625/VT1625S sense connected TV outputs. * * The lower six bits of the return byte stand for each of the six DACs: * - bit 0: DACf (Cb) * - bit 1: DACe (Cr) * - bit 2: DACd (Y) * - bit 3: DACc (Composite) * - bit 4: DACb (S-Video C) * - bit 5: DACa (S-Video Y) * * If a bit is 0 it means a cable is connected. Note the VT1625S only has * four DACs, corresponding to bit 0-3 above. */ static CARD8 VT1625DACSenseI2C(I2CDevPtr pDev) { CARD8 power, status, overflow, dacPresent; xf86I2CReadByte(pDev, 0x0E, &power); // save power state // VT1625S will always report 0 for bits 4 and 5 of the status register as // it only has four DACs instead of six. This will result in a false // positive for the S-Video cable. It will also do this on the power // register, which is abused to check which DACs are actually present. xf86I2CWriteByte(pDev, 0x0E, 0xFF); xf86I2CReadByte(pDev, 0x0E, &dacPresent); xf86I2CWriteByte(pDev, 0x0E, 0x00); // power on DACs/circuits xf86I2CReadByte(pDev, 0x1C, &overflow); // save overflow reg // (DAC sense bit should be off) xf86I2CWriteByte(pDev, 0x1C, 0x80); // enable DAC sense bit xf86I2CWriteByte(pDev, 0x1C, overflow); // disable DAC sense bit xf86I2CReadByte(pDev, 0x0F, &status); // read connection status xf86I2CWriteByte(pDev, 0x0E, power); // restore power state status |= ~dacPresent; return (status & 0x3F); } /* * VT1621 only knows composite and s-video. */ static Bool VT1621DACSense(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621DACSense\n")); sense = VT162xDACSenseI2C(pBIOSInfo->TVI2CDev); switch (sense) { case 0x00: pBIOSInfo->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: S-Video & Composite connected.\n"); return TRUE; case 0x01: pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: Composite connected.\n"); return TRUE; case 0x02: pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: S-Video connected.\n"); return TRUE; case 0x03: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1621: Nothing connected.\n"); return FALSE; default: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1621: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; } } /* * VT1622, VT1622A and VT1623 know composite, s-video, RGB and YCBCR. */ static Bool VT1622DACSense(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622DACSense\n")); sense = VT162xDACSenseI2C(pBIOSInfo->TVI2CDev); switch (sense) { case 0x00: /* DAC A,B,C,D */ pBIOSInfo->TVOutput = TVOUTPUT_RGB; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: RGB connected.\n"); return TRUE; case 0x01: /* DAC A,B,C */ pBIOSInfo->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video & Composite connected.\n"); return TRUE; case 0x07: /* DAC A */ pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Composite connected.\n"); return TRUE; case 0x08: /* DAC B,C,D */ pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: YcBcR connected.\n"); return TRUE; case 0x09: /* DAC B,C */ pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: S-Video connected.\n"); return TRUE; case 0x0F: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT162x: Nothing connected.\n"); return FALSE; default: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT162x: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; } } /* * VT1625 knows composite, s-video, RGB and YCBCR. */ static Bool VT1625DACSense(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; CARD8 sense; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625DACSense\n")); sense = VT1625DACSenseI2C(pBIOSInfo->TVI2CDev); switch (sense) { case 0x00: /* DAC A,B,C,D,E,F */ pBIOSInfo->TVOutput = TVOUTPUT_RGB; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: RGB connected.\n"); return TRUE; case 0x07: /* DAC A,B,C */ pBIOSInfo->TVOutput = TVOUTPUT_SC; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: S-Video & Composite connected.\n"); return TRUE; case 0x37: /* DAC C */ pBIOSInfo->TVOutput = TVOUTPUT_COMPOSITE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: Composite connected.\n"); return TRUE; case 0x38: /* DAC D,E,F */ pBIOSInfo->TVOutput = TVOUTPUT_YCBCR; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: YCbCr connected.\n"); return TRUE; case 0x0F: /* DAC A,B */ pBIOSInfo->TVOutput = TVOUTPUT_SVIDEO; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: S-Video connected.\n"); return TRUE; case 0x3F: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1625: Nothing connected.\n"); return FALSE; default: pBIOSInfo->TVOutput = TVOUTPUT_NONE; xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1625: Unknown cable combination: 0x0%2X.\n", sense); return FALSE; } } static CARD8 VT1621ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeIndex\n")); for (i = 0; VT1621Table[i].Width; i++) { if ((VT1621Table[i].Width == mode->CrtcHDisplay) && (VT1621Table[i].Height == mode->CrtcVDisplay) && (VT1621Table[i].Standard == pBIOSInfo->TVType) && !(strcmp(VT1621Table[i].name, mode->name))) return i; } xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1621ModeIndex:" " Mode \"%s\" not found in Table\n", mode->name); return 0xFF; } static ModeStatus VT1621ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeValid\n")); if ((mode->PrivSize != sizeof(struct VT162xModePrivate)) || ((mode->Private != (void *)&VT162xModePrivateNTSC) && (mode->Private != (void *)&VT162xModePrivatePAL))) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); return MODE_BAD; } if ((pBIOSInfo->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) && (mode->Private != (void *)&VT162xModePrivatePAL)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); return MODE_BAD; } if (VT1621ModeIndex(pScrn, mode) != 0xFF) return MODE_OK; return MODE_BAD; } static CARD8 VT1622ModeIndex(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; struct VT162XTableRec *Table; int i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeIndex\n")); if (pBIOSInfo->TVEncoder == VIA_VT1622) Table = VT1622Table; else if (pBIOSInfo->TVEncoder == VIA_VT1625) Table = VT1625Table; else Table = VT1623Table; for (i = 0; Table[i].Width; i++) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "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].name, mode->name); if ((Table[i].Width == mode->CrtcHDisplay) && (Table[i].Height == mode->CrtcVDisplay) && (Table[i].Standard == pBIOSInfo->TVType) && !strcmp(Table[i].name, mode->name)) return i; } xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "VT1622ModeIndex:" " Mode \"%s\" not found in Table\n", mode->name); return 0xFF; } static ModeStatus VT1622ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeValid\n")); if ((mode->PrivSize != sizeof(struct VT162xModePrivate)) || ((mode->Private != (void *)&VT162xModePrivateNTSC) && (mode->Private != (void *)&VT162xModePrivatePAL))) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); return MODE_BAD; } if ((pBIOSInfo->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) && (mode->Private != (void *)&VT162xModePrivatePAL)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is PAL. This is a NTSC mode.\n"); return MODE_BAD; } if (VT1622ModeIndex(pScrn, mode) != 0xFF) return MODE_OK; return MODE_BAD; } static ModeStatus VT1625ModeValid(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625ModeValid\n")); if ((mode->PrivSize != sizeof(struct VT162xModePrivate)) || ((mode->Private != (void *)&VT162xModePrivateNTSC) && (mode->Private != (void *)&VT162xModePrivatePAL) && (mode->Private != (void *)&VT162xModePrivate480P) && (mode->Private != (void *)&VT162xModePrivate576P) && (mode->Private != (void *)&VT162xModePrivate720P) && (mode->Private != (void *)&VT162xModePrivate1080I))) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Not a mode defined by the TV Encoder.\n"); return MODE_BAD; } if ((pBIOSInfo->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) && (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) && (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) && (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) && (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) && (mode->Private != (void *)&VT162xModePrivate1080I)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standard is 1080I. This is an incompatible mode.\n"); return MODE_BAD; } if (VT1622ModeIndex(pScrn, mode) != 0xFF) return MODE_OK; return MODE_BAD; } static void VT162xSetSubCarrier(I2CDevPtr pDev, CARD32 SubCarrier) { xf86I2CWriteByte(pDev, 0x16, SubCarrier & 0xFF); xf86I2CWriteByte(pDev, 0x17, (SubCarrier >> 8) & 0xFF); xf86I2CWriteByte(pDev, 0x18, (SubCarrier >> 16) & 0xFF); xf86I2CWriteByte(pDev, 0x19, (SubCarrier >> 24) & 0xFF); } static void VT1621ModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; 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]); VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.SubCarrier); /* Skip reserved (1A) and version ID (1B). */ xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1C, Table.TV[0x1C]); /* Skip software reset (1D). */ for (i = 0x1E; i < 0x24; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV[i]); /* Write some zeroes? */ xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x24, 0x00); for (i = 0; i < 0x08; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A + i, 0x00); if (pBIOSInfo->TVOutput == TVOUTPUT_COMPOSITE) for (i = 0; i < 0x10; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x52 + i, Table.TVC[i]); else for (i = 0; i < 0x10; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x52 + i, Table.TVS[i]); /* Turn on all Composite and S-Video output. */ xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); if (pBIOSInfo->TVDotCrawl) { if (Table.DotCrawlSubCarrier) { xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x11, &i); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x11, i | 0x08); VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.DotCrawlSubCarrier); } else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "This mode does not currently " "support DotCrawl suppression.\n"); } } static void VT1621ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; struct VT1621TableRec Table = VT1621Table[VT1621ModeIndex(pScrn, mode)]; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621ModeCrtc\n")); if (pVia->IsSecondary) { hwp->writeCrtc(hwp, 0x6A, 0x80); hwp->writeCrtc(hwp, 0x6B, 0x20); hwp->writeCrtc(hwp, 0x6C, 0x80); /* Disable LCD Scaling */ if (!pVia->SAMM || pVia->FirstInit) hwp->writeCrtc(hwp, 0x79, 0x00); } else { hwp->writeCrtc(hwp, 0x6A, 0x00); hwp->writeCrtc(hwp, 0x6B, 0x80); hwp->writeCrtc(hwp, 0x6C, Table.PrimaryCR6C); } pBIOSInfo->ClockExternal = TRUE; ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); ViaCrtcMask(hwp, 0x6C, 0x01, 0x01); } /* * Also suited for VT1622A, VT1623, VT1625. */ static void VT1622ModeI2C(ScrnInfoPtr pScrn, DisplayModePtr mode) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; struct VT162XTableRec Table; CARD8 save, i; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeI2C\n")); if (pBIOSInfo->TVEncoder == VIA_VT1622) Table = VT1622Table[VT1622ModeIndex(pScrn, mode)]; else if (pBIOSInfo->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); for (i = 0; i < 0x16; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV1[i]); VT162xSetSubCarrier(pBIOSInfo->TVI2CDev, Table.SubCarrier); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1A, Table.TV1[0x1A]); /* Skip version ID. */ xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x1C, Table.TV1[0x1C]); /* Skip software reset. */ for (i = 0x1E; i < 0x30; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, i, Table.TV1[i]); for (i = 0; i < 0x1B; i++) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A + i, Table.TV2[i]); /* Turn on all Composite and S-Video output. */ xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); if (pBIOSInfo->TVDotCrawl) { if (Table.DotCrawlSubCarrier) { xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x11, &save); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x11, save | 0x08); VT162xSetSubCarrier(pBIOSInfo->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 (Table.RGB[3]) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x27, Table.RGB[3]); if (Table.RGB[4]) xf86I2CWriteByte(pBIOSInfo->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); } else { xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x02, 0x12); xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x4A, 0x85); xf86I2CWriteByte(pBIOSInfo->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); } } } /* Configure flicker filter. */ xf86I2CReadByte(pBIOSInfo->TVI2CDev, 0x03, &save); save &= 0xFC; if (pBIOSInfo->TVDeflicker == 1) save |= 0x01; else if (pBIOSInfo->TVDeflicker == 2) save |= 0x02; xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x03, save); } /* * Also suited for VT1622A, VT1623, VT1625. */ static void VT1622ModeCrtc(xf86CrtcPtr crtc, DisplayModePtr mode) { ScrnInfoPtr pScrn = crtc->scrn; vgaHWPtr hwp = VGAHWPTR(pScrn); VIAPtr pVia = VIAPTR(pScrn); VIABIOSInfoPtr pBIOSInfo = pVia->pBIOSInfo; struct VT162XTableRec Table; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622ModeCrtc\n")); if (pBIOSInfo->TVEncoder == VIA_VT1622) Table = VT1622Table[VT1622ModeIndex(pScrn, mode)]; else if (pBIOSInfo->TVEncoder == VIA_VT1625) Table = VT1625Table[VT1622ModeIndex(pScrn, mode)]; else /* VT1622A/VT1623 */ Table = VT1623Table[VT1622ModeIndex(pScrn, mode)]; hwp->writeCrtc(hwp, 0x6A, 0x00); hwp->writeCrtc(hwp, 0x6B, 0x00); hwp->writeCrtc(hwp, 0x6C, 0x00); if (pVia->IsSecondary) { hwp->writeCrtc(hwp, 0x6C, Table.SecondaryCR6C); ViaCrtcMask(hwp, 0x6A, 0x80, 0x80); ViaCrtcMask(hwp, 0x6C, 0x80, 0x80); /* CLE266Ax use 2x XCLK. */ if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) { ViaCrtcMask(hwp, 0x6B, 0x20, 0x20); /* Fix TV clock polarity for CLE266A2. */ if (pVia->ChipRev == 0x02) ViaCrtcMask(hwp, 0x6C, 0x1C, 0x1C); } /* Disable LCD scaling. */ if (!pVia->SAMM || pVia->FirstInit) hwp->writeCrtc(hwp, 0x79, 0x00); } else { if ((pVia->Chipset == VIA_CLE266) && CLE266_REV_IS_AX(pVia->ChipRev)) { ViaCrtcMask(hwp, 0x6B, 0x80, 0x80); /* Fix TV clock polarity for CLE266A2. */ if (pVia->ChipRev == 0x02) hwp->writeCrtc(hwp, 0x6C, Table.PrimaryCR6C); } } pBIOSInfo->ClockExternal = TRUE; ViaCrtcMask(hwp, 0x6A, 0x40, 0x40); ViaSetTVClockSource(crtc); } static void VT1621Power(ScrnInfoPtr pScrn, Bool On) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1621Power\n")); if (On) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); else xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x03); } static void VT1622Power(ScrnInfoPtr pScrn, Bool On) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1622Power\n")); if (On) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); else xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x0F); } static void VT1625Power(ScrnInfoPtr pScrn, Bool On) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1625Power\n")); if (On) xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x00); else xf86I2CWriteByte(pBIOSInfo->TVI2CDev, 0x0E, 0x3F); } void ViaVT162xInit(ScrnInfoPtr pScrn) { VIABIOSInfoPtr pBIOSInfo = VIAPTR(pScrn)->pBIOSInfo; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ViaVT162xInit\n")); switch (pBIOSInfo->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; 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; 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; 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; break; default: break; } } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_vt162x.h000066400000000000000000001733071267025031400237110ustar00rootroot00000000000000/* * 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. */ #ifndef _VIA_VT162X_H_ #define _VIA_VT162X_H_ 1 struct VT162xModePrivate { char id[12]; /* "VT162x" */ CARD8 Standard; }; /* Hmm this seemed like a reasonable approach initially. perhaps not. */ static struct VT162xModePrivate VT162xModePrivateNTSC = { { 'V', 'T', '1', '6', '2', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_NTSC,}; static struct VT162xModePrivate VT162xModePrivatePAL = { { 'V', 'T', '1', '6', '2', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_PAL,}; static struct VT162xModePrivate VT162xModePrivate480P = { { 'V', 'T', '1', '6', '2', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_480P,}; static struct VT162xModePrivate VT162xModePrivate576P = { { 'V', 'T', '1', '6', '2', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_576P,}; static struct VT162xModePrivate VT162xModePrivate720P = { { 'V', 'T', '1', '6', '2', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_720P,}; static struct VT162xModePrivate VT162xModePrivate1080I = {{ 'V', 'T', '1', '6', '2', 'x', 0, 0, 0, 0, 0, 0 }, TVTYPE_1080I,}; #define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DEFAULT #define MODESUFFIXNTSC 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct VT162xModePrivate),(void *)&VT162xModePrivateNTSC,0,0.0,0.0 #define MODESUFFIXPAL 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct VT162xModePrivate),(void *)&VT162xModePrivatePAL,0,0.0,0.0 #define MODESUFFIX480P 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct VT162xModePrivate),(void *)&VT162xModePrivate480P,0,0.0,0.0 #define MODESUFFIX576P 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct VT162xModePrivate),(void *)&VT162xModePrivate576P,0,0.0,0.0 #define MODESUFFIX720P 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct VT162xModePrivate),(void *)&VT162xModePrivate720P,0,0.0,0.0 #define MODESUFFIX1080I 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,\ sizeof(struct VT162xModePrivate),(void *)&VT162xModePrivate1080I,0,0.0,0.0 /* * * VT1621 modetables * */ /* for dotclock i just took HTotal*VTotal*50 -- is not actually used - just to satisfy modevalidation */ static DisplayModeRec VT1621Modes[] = { { MODEPREFIX("640x480"), 23520, 640, 656, 752, 784, 0, 480, 520, 523, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480"), 26250, 640, 664, 792, 840, 0, 480, 529, 539, 625, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600"), 39900, 800, 840, 976, 1064, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600"), 36000, 800, 824, 904, 960, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("640x480Over"), 20580, 640, 656, 752, 784, 0, 480, 494, 507, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480Over"), 24000, 640, 672, 888, 960, 0, 480, 485, 491, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600Over"), 36400, 800, 840, 960, 1040, 0, 600, 602, 604, 700, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600Over"), 29500, 800, 824, 896, 944, 0, 600, 599, 604, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, }; struct VT1621TableRec { char * name; CARD16 Width; CARD16 Height; int Standard; CARD8 PrimaryCR6C; CARD8 TV[0x25]; CARD8 TVC[0x18]; CARD8 TVS[0x18]; CARD32 SubCarrier; CARD32 DotCrawlSubCarrier; }; static struct VT1621TableRec VT1621Table[] = { { "640x480", 640, 480, TVTYPE_NTSC, 0, { 0x64, 0x03, 0x22, 0x33, 0x43, 0, 0x10, 0x7D, 0xAC, 0x05, 0x99, 0x17, 0x93, 0xA5, 0x03, 0xBA, 0, 0, 0x0A, 0xCD, 0x80, 0x28, 0, 0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0x75, 0x0C, 0x04, 0x6D }, { 0x48, 0x01, 0x02, 0, 0xFC, 0xF9, 0xFF, 0x10, 0x23, 0x2C, 0x09, 0x08, 0x0A, 0x0C, 0x0D, 0x0D }, { 0x48, 0x02, 0x02, 0xFD, 0x06, 0xF8, 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 0x11, 0x6E }, 0x207FFFBE, 0x207FF6BE, }, { "640x480", 640, 480, TVTYPE_PAL, 0x04, { 0x64, 0x01, 0x02, 0x33, 0x40, 0, 0x10, 0xAD, 0xD3, 0x37, 0xA3, 0, 0x94, 0xFF, 0x03, 0xBA, 0, 0, 0x07, 0x26, 0x2C, 0x20, 0, 0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0x75, 0x0C, 0x04, 0x76 }, { 0x48, 0, 0, 0xFE, 0xFC, 0xFD, 0x05, 0x12, 0x1F, 0x25, 0x0B, 0x08, 0x0A, 0x0C, 0x0D, 0x0D }, { 0x48, 0xFE, 0x03, 0xFB, 0x06, 0xF8, 0x0A, 0xF5, 0x0C, 0x73, 0x06, 0xF8, 0x0B, 0xF2, 0x10, 0x6F }, 0x25D56350, 0, }, { "800x600", 800, 600, TVTYPE_NTSC, 0x1E, { 0x84, 0x03, 0x2A, 0x33, 0x43, 0, 0x10, 0xDD, 0xB9, 0x15, 0x99, 0x17, 0x93, 0xA5, 0x03, 0xBA, 0, 0, 0x0A, 0xED, 0x98, 0x1C, 0, 0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0x75, 0x0C, 0x04, 0x6D }, { 0x48, 0, 0xFF, 0xFD, 0xFC, 0xFF, 0x07, 0x13, 0x1E, 0x22, 0x0D, 0x08, 0x09, 0x0A, 0x0B, 0x0C }, { 0x48, 0x02, 0x02, 0xFD, 0x06, 0xF8, 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 0x11, 0x6E }, 0x1B5E5096, 0x1B5E5796, }, { "800x600", 800, 600, TVTYPE_PAL, 0x04, { 0x84, 0x03, 0x1A, 0x33, 0x40, 0, 0x10, 0x85, 0xF1, 0x4B, 0xA3, 0, 0x94, 0xFF, 0x03, 0xBA, 0, 0, 0x07, 0x25, 0x2C, 0x1C, 0, 0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0x75, 0x0C, 0x04, 0x76 }, { 0x48, 0xFF, 0xFE, 0xFD, 0xFE, 0x02, 0x0A, 0x13, 0x1A, 0x1D, 0x0F, 0x08, 0x09, 0x0A, 0x0B, 0x0B }, { 0x48, 0xFB, 0x04, 0xFB, 0x07, 0xF8, 0x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2, 0x10, 0x6F }, 0x1F872818, 0, }, { "640x480Over", 640, 480, TVTYPE_NTSC, 0, { 0x64, 0x03, 0x02, 0x33, 0x43, 0, 0x10, 0x7D, 0x72, 0x05, 0x99, 0x17, 0x93, 0xA5, 0x03, 0xBA, 0, 0, 0x0D, 0x45, 0x38, 0x34, 0, 0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0x75, 0x0C, 0x04, 0x6D }, { 0x48, 0, 0x01, 0x02, 0xFF, 0xF9, 0xFA, 0x0C, 0x26, 0x32, 0x07, 0x08, 0x0A, 0x0D, 0x0E, 0x0F }, { 0x48, 0x02, 0x02, 0xFD, 0x06, 0xF8, 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 0x11, 0x6E }, 0x252491F1, 0x252499F1, }, { "640x480Over", 640, 480, TVTYPE_PAL, 0, { 0x64, 0x01, 0x12, 0x33, 0x40, 0, 0x10, 0x1D, 0x68, 0x26, 0xA3, 0, 0x94, 0xFF, 0x03, 0xBA, 0, 0, 0x0F, 0x67, 0x58, 0x3C, 0, 0, 0, 0, 0, 0, 0x0A, 0, 0, 0, 0x75, 0x0C, 0x04, 0x76 }, { 0x48, 0, 0x01, 0x01, 0xFE, 0xFA, 0xFD, 0x0E, 0x24, 0x2E, 0x07, 0x07, 0x0A, 0x0D, 0x0F, 0x0F }, { 0x48, 0xFD, 0x03, 0xFB, 0x07, 0xF8, 0x0A, 0xF5, 0x0B, 0x74, 0x06, 0xF8, 0x0B, 0xF2, 0x10, 0x6F }, 0x2F4ABC24, 0, }, { "800x600Over", 800, 600, TVTYPE_NTSC, 0, { 0x84, 0x03, 0x0A, 0x33, 0x43, 0, 0x10, 0xC5, 0xAD, 0x10, 0x99, 0x17, 0x93, 0xA5, 0x03, 0xBA, 0, 0, 0x04, 0x07, 0x20, 0x0C, 0, 0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0x75, 0x0C, 0x04, 0x6D }, { 0x48, 0, 0xFF, 0xFD, 0xFC, 0xFE, 0x06, 0x13, 0x1E, 0x23, 0x0D, 0x08, 0x0A, 0x0B, 0x0C, 0x0C }, { 0x48, 0x02, 0x02, 0xFD, 0x06, 0xF8, 0x0B, 0xF3, 0x0F, 0x70, 0x05, 0xF9, 0x0B, 0xF1, 0x11, 0x6E }, 0x1C000008, 0x1C000808, }, { "800x600Over", 800, 600, TVTYPE_PAL, 0, { 0x84, 0x03, 0x02, 0x33, 0x40, 0, 0x10, 0x75, 0x7B, 0x34, 0xA3, 0, 0x94, 0xFF, 0x03, 0xBA, 0, 0, 0x08, 0xFD, 0xEF, 0x20, 0, 0, 0, 0, 0, 0, 0x02, 0, 0, 0, 0x75, 0x0C, 0x04, 0x76 }, { 0x48, 0xFF, 0xFE, 0xFD, 0xFE, 0x02, 0x0A, 0x13, 0x1A, 0x1D, 0x0F, 0x08, 0x09, 0x0A, 0x0B, 0x0B }, { 0x48, 0xFB, 0x04, 0xFB, 0x07, 0xF8, 0x09, 0xF6, 0x0A, 0x74, 0x06, 0xF8, 0x0B, 0xF2, 0x10, 0x6F }, 0x26798C0C, 0, }, { NULL, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 0, } }; /* * * VT1622 modetables * */ static DisplayModeRec VT1622Modes[] = { { MODEPREFIX("640x480"), 23520, 640, 656, 744, 784, 0, 480, 487, 491, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480"), 30000, 640, 680, 808, 1000, 0, 480, 520, 523, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600"), 39900, 800, 840, 976, 1064, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600"), 34500, 800, 816, 880, 920, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768"), 54810, 1024, 1032, 1088, 1160, 0, 768, 780, 792, 945, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768"), 57000, 1024, 1040, 1112, 1200, 0, 768, 829, 840, 950, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("848x480"), 34860, 848, 872, 1032, 1200, 0, 480, 495, 509, 581, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("848x480"), 36000, 848, 872, 1032, 1200, 0, 480, 498, 509, 600, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480"), 25200, 720, 728, 776, 840, 0, 480, 511, 515, 600, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x576"), 28500, 720, 728, 744, 760, 0, 576, 635, 643, 750, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("640x480Over"), 20160, 640, 648, 704, 720, 0, 480, 487, 491, 560, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480Over"), 21000, 640, 664, 792, 840, 0, 480, 485, 491, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600Over"), 35910, 800, 840, 984, 1080, 0, 600, 601, 604, 665, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600Over"), 32500, 800, 832, 928, 1000, 0, 600, 600, 604, 650, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768Over"), 50400, 1024, 1040, 1112, 1200, 0, 768, 772, 776, 840, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768Over"), 49500, 1024, 1032, 1112, 1200, 0, 768, 771, 776, 825, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("848x480Over"), 27720, 848, 856, 928, 1008, 0, 480, 490, 493, 550, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("848x480Over"), 33000, 848, 872, 1032, 1200, 0, 480, 490, 493, 550, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480Over"), 21000, 720, 728, 760, 800, 0, 480, 480, 483, 525, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x576Over"), 30000, 720, 728, 864, 1000, 0, 576, 576, 579, 600, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480Noscale"), 27972, 720, 736, 768, 888, 0, 480, 480, 483, 525, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x576Noscale"), 28000, 720, 728, 864, 896, 0, 576, 576, 579, 625, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, }; struct VT162XTableRec { char * name; CARD16 Width; CARD16 Height; int Standard; CARD8 PrimaryCR6C; CARD8 SecondaryCR6C; CARD8 TV1[0x30]; CARD8 TV2[0x1B]; CARD8 RGB[6]; CARD8 YCbCr[3]; CARD32 SubCarrier; CARD32 DotCrawlSubCarrier; }; static struct VT162XTableRec VT1622Table[] = { { "640x480", 640, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0x02, 0x03, 0, 0x10, 0x7E, 0x9D, 0x0D, 0x60, 0x17, 0x52, 0x45, 0x0F, 0, 0, 0, 0xD0, 0x33, 0xBF, 0x3A, 0, 0, 0, 0, 0xE9, 0, 0, 0, 0, 0x05, 0x12, 0x0C, 0x04, 0x74, 0, 0x5A, 0x2F, 0x97, 0x50, 0, 0, 0xAA, 0x2B, 0x7A, 0xD8, 0 }, { 0xDC, 0x50, 0x04, 0, 0, 0x40, 0x0F, 0x81, 0x23, 0x57, 0x02, 0x0F, 0x29, 0x73, 0x23, 0x86, 0xC4, 0xEA, 0xDF, 0x05, 0x92, 0xA1, 0x04, 0, 0, 0x7F, 0x03 }, { 0xAF, 0xAA, 0xAA, 0x91, 0x9C, 0x27 }, { 0x50, 0x4B, 0x4D }, 0x252491F1, 0x252487BE, }, { "640x480", 640, 480, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0x82, 0, 0, 0x10, 0x3E, 0xA4, 0x37, 0x67, 0, 0x49, 0x49, 0x0F, 0, 0, 0, 0xEC, 0x2A, 0xB8, 0x29, 0, 0, 0, 0, 0xED, 0, 0x0A, 0, 0, 0x04, 0x12, 0x0C, 0x04, 0x7B, 0, 0x64, 0x30, 0x93, 0x49, 0x5F, 0x15, 0xA5, 0x23, 0x7A, 0xCC, 0 }, { 0xF9, 0x50, 0x04, 0, 0, 0x45, 0xE7, 0x81, 0x23, 0x57, 0x02, 0x1F, 0x31, 0x75, 0x23, 0x8A, 0xC8, 0xF0, 0xFF, 0x05, 0xD7, 0x8E, 0x03, 0x7F, 0xCF, 0xBF, 0x03 }, { 0x8A, 0x86, 0x86, 0x8D, 0x96, 0x20 }, { 0x42, 0x49, 0x49 }, 0x2D66772D, 0, }, { "800x600", 800, 600, TVTYPE_NTSC, 0x1E, 0, { 0x84, 0, 0, 0x24, 0x03, 0, 0x10, 0xDE, 0xD4, 0x0E, 0x59, 0x17, 0x46, 0x40, 0x0F, 0, 0, 0, 0xEA, 0x0D, 0x98, 0x1C, 0, 0, 0, 0, 0x3D, 0, 0x01, 0, 0, 0x85, 0x0D, 0x0A, 0x04, 0x74, 0, 0x5A, 0x41, 0x96, 0x6B, 0, 0, 0xAA, 0x2B, 0xA6, 0x1E, 0x10 }, { 0xE4, 0x69, 0x04, 0, 0, 0x3F, 0x27, 0x21, 0x34, 0xED, 0x02, 0x27, 0xF5, 0x9D, 0x24, 0xB7, 0x0D, 0x40, 0, 0x58, 0xB6, 0x3B, 0x05, 0, 0x01, 0xEF, 0x05 }, { 0x93, 0x90, 0x90, 0x91, 0x9C, 0 }, { 0x43, 0x4A, 0x49 }, 0x1B5E5096, 0x1B5E4912, }, { "800x600", 800, 600, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0xA4, 0, 0, 0x19, 0x66, 0xBF, 0x12, 0x60, 0, 0x56, 0x45, 0x0F, 0, 0, 0, 0xEC, 0x15, 0xFD, 0x28, 0, 0, 0, 0, 0x16, 0, 0x01, 0, 0, 0x85, 0x10, 0x0C, 0x04, 0x7B, 0, 0x64, 0x37, 0x93, 0x54, 0x5F, 0x15, 0xA5, 0x23, 0x8F, 0xF4, 0 }, { 0xE7, 0x45, 0x04, 0, 0, 0x44, 0x97, 0x21, 0x33, 0xED, 0x02, 0x97, 0x87, 0x87, 0x23, 0x9F, 0xE7, 0x16, 0xE7, 0x16, 0xCC, 0xF3, 0x04, 0, 0x01, 0x4F, 0x04 }, { 0xB8, 0xB4, 0xB4, 0, 0, 0 }, { 0x58, 0x5E, 0x5E }, 0x277A7DE4, 0, }, { "1024x768", 1024, 768, TVTYPE_NTSC, 0x12, 0x1C, { 0x84, 0, 0, 0x44, 0x03, 0, 0x10, 0x80, 0x15, 0x0A, 0x58, 0x17, 0x5B, 0x40, 0x0F, 0, 0, 0, 0xE9, 0x1E, 0x9D, 0x19, 0, 0, 0, 0, 0x9C, 0, 0x05, 0, 0, 0x85, 0x0A, 0x05, 0x04, 0x74, 0, 0x5A, 0x56, 0x96, 0x8B, 0, 0, 0xAA, 0x2B, 0xDA, 0x79, 0x10 }, { 0xDA, 0x50, 0x04, 0, 0, 0x3F, 0x87, 0xFF, 0x34, 0xB0, 0x03, 0x6F, 0xDB, 0xCD, 0x35, 0xF1, 0x5E, 0xA5, 0x7E, 0x5A, 0x33, 0x26, 0x07, 0, 0x01, 0x27, 0x08 }, { 0xC2, 0xBE, 0xBE, 0x91, 0x9C, 0 }, { 0x58, 0x4B, 0x4A }, 0x14EB66D6, 0x14EB6118, }, { "1024x768", 1024, 768, TVTYPE_PAL, 0x1E, 0, { 0x84, 0, 0, 0xC0, 0, 0, 0x10, 0xA0, 0x2A, 0x38, 0x70, 0, 0x4E, 0x50, 0x0F, 0, 0, 0, 0xE4, 0x23, 0xD1, 0x0C, 0, 0, 0, 0, 0x96, 0, 0x07, 0, 0, 0x85, 0x0C, 0x0C, 0x04, 0x7B, 0, 0x64, 0x53, 0x90, 0x7B, 0x5B, 0x15, 0xA0, 0x22, 0xD1, 0x71, 0x10 }, { 0xDD, 0x60, 0x04, 0, 0, 0x45, 0xAF, 0xFF, 0x34, 0xB5, 0x03, 0x57, 0xA8, 0xC8, 0x35, 0xEC, 0x4C, 0xCC, 0x67, 0x5A, 0x14, 0x5C, 0x06, 0, 0x01, 0x1F, 0x07 }, { 0xA9, 0xA6, 0xA6, 0x90, 0x99, 0 }, { 0x51, 0x49, 0x49 }, 0x1A8CC372, 0, }, { "848x480", 848, 480, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x24, 0x03, 0, 0x10, 0x46, 0xCC, 0x0E, 0x56, 0x17, 0x43, 0x3E, 0x0F, 0, 0, 0, 0xE8, 0x29, 0x67, 0x19, 0, 0, 0, 0, 0x29, 0, 0x0B, 0, 0, 0x85, 0x0E, 0x08, 0x04, 0x74, 0, 0x5A, 0x3D, 0x96, 0x64, 0, 0, 0xAA, 0x2B, 0x9C, 0x17, 0x10 }, { 0xDC, 0x50, 0, 0, 0, 0x40, 0xAF, 0x51, 0x34, 0x44, 0x02, 0xE3, 0xC1, 0x93, 0x23, 0xAD, 0xFD, 0x2B, 0x7C, 0x17, 0x6D, 0xCA, 0x04, 0, 0x01, 0x2F, 0x05 }, { 0x94, 0x90, 0x91, 0x91, 0x9C, 0 }, { 0x44, 0x45, 0x45 }, 0x1D3CA863, 0x1D3CA05B, }, { "848x480", 848, 480, TVTYPE_PAL, 0x08, 0, { 0x04, 0, 0, 0xC2, 0, 0, 0x10, 0x47, 0xE4, 0x09, 0x64, 0, 0x4F, 0x48, 0x0F, 0, 0, 0, 0xE7, 0x05, 0x2C, 0x1C, 0, 0, 0, 0, 0x5E, 0, 0x09, 0, 0, 0x84, 0x0A, 0x0C, 0x04, 0x7B, 0, 0x64, 0x46, 0x93, 0x68, 0x5F, 0x15, 0xA5, 0x23, 0xB4, 0x2A, 0x10 }, { 0xE7, 0x45, 0x04, 0, 0, 0x43, 0xAF, 0x51, 0x34, 0x57, 0x02, 0x7F, 0x4F, 0xA9, 0x34, 0xD1, 0x2B, 0x5D, 0xAA, 0x58, 0xD7, 0x01, 0x03, 0, 0x01, 0x7F, 0x04 }, { 0xA4, 0xA0, 0xA1, 0, 0, 0 }, { 0x50, 0x49, 0x49 }, 0x1F872818, 0, }, { "720x480", 720, 480, TVTYPE_NTSC, 0x04, 0, { 0x04, 0, 0, 0x26, 0x03, 0, 0x10, 0x6D, 0xC3, 0x08, 0x56, 0x17, 0x43, 0x3E, 0x0F, 0, 0, 0, 0x0D, 0x07, 0x60, 0x34, 0, 0, 0, 0, 0x1E, 0, 0x03, 0, 0, 0x85, 0x0F, 0x08, 0x04, 0x74, 0, 0x5A, 0x39, 0x95, 0x5E, 0, 0, 0xAA, 0x2B, 0x92, 0xFF, 0 }, { 0xE4, 0x69, 0x04, 0, 0, 0x40, 0x47, 0xD1, 0x23, 0x57, 0x02, 0xBF, 0xAF, 0x8D, 0x23, 0xA4, 0xF3, 0x20, 0x36, 0x17, 0x92, 0x33, 0x04, 0, 0, 0xBF, 0x03 }, { 0x94, 0x90, 0x90, 0x91, 0x9C, 0 }, { 0x42, 0x49, 0x48 }, 0x1E555518, 0x1E554CC3, }, { "720x576", 720, 576, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0xA2, 0, 0, 0x10, 0x1E, 0xAC, 0x38, 0x67, 0, 0x57, 0x49, 0x0F, 0, 0, 0, 0xF0, 0x0F, 0xD1, 0x38, 0, 0, 0, 0, 0xF2, 0, 0x02, 0, 0, 0x84, 0x13, 0x0C, 0x04, 0x7B, 0x48, 0x64, 0x30, 0x93, 0x49, 0x5F, 0x15, 0xA5, 0x23, 0x8B, 0xBD, 0 }, { 0xE7, 0x45, 0x04, 0, 0, 0x45, 0xF7, 0xD1, 0x22, 0xED, 0x02, 0x1D, 0x29, 0x75, 0x23, 0x88, 0xC6, 0xF0, 0xFA, 0x0F, 0xCC, 0x30, 0x14, 0, 0, 0x8F, 0x03 }, { 0xB5, 0xB1, 0xB1, 0, 0, 0 }, { 0x59, 0x4D, 0x4A }, 0x2D839832, 0, }, { "640x480Over", 640, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0x02, 0x03, 0, 0x10, 0x48, 0x72, 0x0A, 0x60, 0x17, 0x52, 0x45, 0x0F, 0, 0, 0, 0xED, 0x23, 0x80, 0x35, 0, 0, 0, 0, 0xE9, 0, 0x02, 0, 0, 0x05, 0x12, 0x0C, 0x04, 0x75, 0, 0x5A, 0x2F, 0x97, 0x50, 0, 0, 0xAA, 0x2B, 0x7A, 0xD8, 0 }, { 0xC4, 0x50, 0x04, 0, 0, 0x41, 0xCF, 0x7F, 0x22, 0x2F, 0x02, 0xFF, 0x7F, 0x71, 0x22, 0x83, 0xC0, 0xE5, 0xC0, 0x05, 0x44, 0, 0x04, 0, 0, 0xFF, 0x02 }, { 0xAD, 0xA9, 0xA9, 0, 0, 0 }, { 0x4F, 0x49, 0x49 }, 0x25EAAA5E, 0x25EA9FF4, }, { "640x480Over", 640, 480, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0x82, 0, 0, 0x10, 0xB0, 0x39, 0x39, 0x67, 0, 0x48, 0x4A, 0x0F, 0, 0, 0, 0x2C, 0x05, 0x2C, 0x30, 0, 0, 0, 0, 0xC8, 0, 0x02, 0, 0, 0x05, 0x15, 0x0C, 0x04, 0x7B, 0, 0x64, 0x28, 0x93, 0x3E, 0x5F, 0x15, 0xA5, 0x23, 0x65, 0xCC, 0 }, { 0xF9, 0x50, 0x04, 0, 0, 0x45, 0x47, 0x7F, 0x23, 0xF3, 0x01, 0x9F, 0x7F, 0x62, 0x22, 0x72, 0xA7, 0xCB, 0x05, 0x05, 0x33, 0, 0x03, 0, 0, 0x9F, 0x02 }, { 0x8A, 0x86, 0x86, 0x90, 0x99, 0 }, { 0x42, 0x49, 0x49 }, 0x360C44BC, 0, }, { "800x600Over", 800, 600, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x24, 0x03, 0, 0x10, 0xEF, 0xB0, 0x0A, 0x5A, 0x17, 0x46, 0x40, 0x0F, 0, 0, 0, 0xE8, 0x32, 0xC3, 0x19, 0, 0, 0, 0, 0x33, 0, 0x01, 0, 0, 0x85, 0x0D, 0x0A, 0x04, 0x75, 0, 0x5A, 0x41, 0x96, 0x68, 0, 0, 0xAA, 0x2B, 0x9E, 0x1E, 0x10 }, { 0xE4, 0x69, 0x04, 0, 0, 0x40, 0x37, 0x21, 0x34, 0x98, 0x02, 0x01, 0x21, 0x97, 0x34, 0xB1, 0xFF, 0x34, 0xB6, 0x17, 0x11, 0, 0x05, 0, 0x01, 0x57, 0x05 }, { 0x93, 0x90, 0x90, 0, 0, 0 }, { 0x42, 0x45, 0x45 }, 0x1C61CEE0, 0x1C61C714, }, { "800x600Over", 800, 600, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0xA0, 0, 0, 0x19, 0xA6, 0x9F, 0x38, 0x60, 0, 0x57, 0x45, 0x0F, 0, 0, 0, 0xC8, 0x12, 0x8F, 0x1C, 0, 0, 0, 0, 0x0E, 0, 0x03, 0, 0, 0x85, 0x10, 0x0C, 0x04, 0x7B, 0, 0x64, 0x37, 0x93, 0x54, 0x5F, 0x15, 0xA5, 0x23, 0x8B, 0xF4, 0 }, { 0xE9, 0x50, 0x04, 0, 0, 0x44, 0xE7, 0x1F, 0x33, 0x89, 0x02, 0x8D, 0xBC, 0x85, 0x23, 0x9C, 0xE4, 0x13, 0xD4, 0x16, 0x28, 0x90, 0x04, 0, 0x01, 0x0F, 0x04 }, { 0xB8, 0xB4, 0xB4, 0x90, 0x99, 0 }, { 0x58, 0x48, 0x48 }, 0x27E98D57, 0, }, { "1024x768Over", 1024, 768, TVTYPE_NTSC, 0x16, 0x1C, { 0x84, 0, 0, 0x44, 0x03, 0, 0x10, 0xA0, 0xAA, 0x05, 0x57, 0x17, 0x5C, 0x3F, 0x0F, 0, 0, 0, 0xE8, 0x33, 0x1A, 0x16, 0, 0, 0, 0, 0x66, 0, 0x01, 0, 0, 0x85, 0x0A, 0x05, 0x04, 0x74, 0, 0x5A, 0x4B, 0x96, 0x79, 0, 0, 0xAA, 0x2B, 0xB9, 0x4B, 0x10 }, { 0xE4, 0x50, 0x04, 0, 0, 0x40, 0xAF, 0xFF, 0x34, 0x47, 0x03, 0xAF, 0xFF, 0xB1, 0x34, 0xD1, 0x30, 0x68, 0x0B, 0x59, 0x66, 0, 0x06, 0, 0x01, 0x7F, 0x07 }, { 0xC2, 0xBE, 0xBE, 0, 0, 0 }, { 0x57, 0x45, 0x45 }, 0x1844440E, 0x18443D63, }, { "1024x768Over", 1024, 768, TVTYPE_PAL, 0x1E, 0, { 0x84, 0, 0, 0xC0, 0, 0, 0x10, 0xA8, 0xC5, 0x36, 0x5D, 0, 0x4E, 0x43, 0x0F, 0, 0, 0, 0xC9, 0x0A, 0x79, 0x1C, 0, 0, 0, 0, 0x6E, 0, 0x03, 0, 0, 0x85, 0x0C, 0x0C, 0x04, 0x7B, 0, 0x64, 0x4B, 0x93, 0x6F, 0x5F, 0x15, 0xA5, 0x23, 0xBE, 0x5A, 0x10 }, { 0xDD, 0x60, 0x04, 0, 0, 0x43, 0xAF, 0xFF, 0x34, 0x38, 0x03, 0xCF, 0xDF, 0xB4, 0x34, 0xD6, 0x35, 0x75, 0x47, 0x59, 0x47, 0x20, 0x05, 0, 0x01, 0x2F, 0x06 }, { 0xA9, 0xA6, 0xA6, 0x90, 0x99, 0 }, { 0x51, 0x49, 0x49 }, 0x1D7B0E38, 0, }, { "848x480Over", 848, 480, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x44, 0x03, 0, 0x10, 0x96, 0xA7, 0x08, 0x5B, 0x17, 0x46, 0x40, 0x0F, 0, 0, 0, 0xE8, 0x3C, 0x2D, 0x22, 0, 0, 0, 0, 0x3D, 0, 0x01, 0, 0, 0x85, 0x0D, 0x08, 0x04, 0x75, 0, 0x5A, 0x41, 0x96, 0x69, 0, 0, 0xAA, 0x2B, 0xA2, 0x24, 0x10 }, { 0xDC, 0x50, 0, 0, 0, 0x40, 0xEF, 0x51, 0x33, 0x25, 0x02, 0x1F, 0x4D, 0x9C, 0x34, 0xB5, 0x0C, 0x3D, 0xF1, 0x57, 0x30, 0x01, 0x04, 0, 0x01, 0x1F, 0x04 }, { 0xC0, 0xBC, 0xBC, 0, 0, 0 }, { 0x58, 0x45, 0x45 }, 0x1B9364A1, 0x1B933067, }, { "848x480Over", 848, 480, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0xC0, 0, 0, 0x10, 0x47, 0xA8, 0x39, 0x64, 0, 0x4E, 0x46, 0x0F, 0, 0, 0, 0xEA, 0x15, 0xF2, 0x28, 0, 0, 0, 0, 0x39, 0, 0x0B, 0, 0, 0x84, 0x0F, 0x0C, 0x04, 0x7B, 0, 0x64, 0x40, 0x93, 0x5F, 0x5F, 0x15, 0xA5, 0x23, 0xA3, 0x2A, 0x10 }, { 0xE7, 0x45, 0x04, 0, 0, 0x43, 0xAF, 0x4F, 0x34, 0x25, 0x02, 0x1F, 0x4F, 0x9B, 0x34, 0xB7, 0x0A, 0x3F, 0xF0, 0x57, 0x85, 0, 0x03, 0, 0x01, 0x1F, 0x04 }, { 0xA4, 0xA1, 0xA1, 0x90, 0x99, 0 }, { 0x4E, 0x49, 0x49 }, 0x2264E5EC, 0, }, { "720x480Over", 720, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0x02, 0x03, 0, 0x10, 0x18, 0x28, 0x09, 0x5B, 0x17, 0x46, 0x41, 0x0F, 0, 0, 0, 0xEE, 0x0D, 0xA0, 0x38, 0, 0, 0, 0, 0xEE, 0, 0x02, 0, 0, 0x85, 0x11, 0x08, 0x04, 0x75, 0, 0x5A, 0x31, 0x95, 0x51, 0, 0, 0xAA, 0x2B, 0x7A, 0xDB, 0 }, { 0xE4, 0x69, 0x04, 0, 0, 0x40, 0x1F, 0xCF, 0x23, 0x0C, 0x02, 0x1F, 0xCF, 0x76, 0x23, 0x88, 0xC9, 0xEF, 0xFF, 0x05, 0, 0, 0, 0, 0, 0x1F, 0x03 }, { 0xAB, 0xA7, 0xA7, 0, 0, 0 }, { 0x4D, 0x49, 0x49 }, 0x2466661D, 0x24665C1E, }, { "720x576Over", 720, 576, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0xA6, 0, 0, 0x10, 0x10, 0x7D, 0x32, 0x60, 0, 0x57, 0x46, 0x0F, 0, 0, 0, 0xEC, 0x15, 0xDC, 0x28, 0, 0, 0, 0, 0xEE, 0, 0x0A, 0, 0, 0x84, 0x13, 0x0C, 0x04, 0x7B, 0x48, 0x64, 0x30, 0x93, 0x49, 0x5F, 0x15, 0xA5, 0x23, 0x77, 0xFF, 0 }, { 0xE7, 0x45, 0x04, 0, 0, 0x45, 0xE7, 0xCF, 0x23, 0x57, 0x02, 0x1F, 0x80, 0x75, 0x23, 0x89, 0xC7, 0xF1, 0xFF, 0x05, 0xD7, 0x80, 0x03, 0, 0, 0xBF, 0x03 }, { 0xBA, 0xB8, 0xB8, 0x90, 0x99, 0 }, { 0x58, 0x48, 0x49 }, 0x2D66772D, 0, }, { "720x480Noscale", 720, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0, 0x03, 0, 0x10, 0x98, 0x98, 0x08, 0x5A, 0x17, 0x49, 0x41, 0, 0x89, 0, 0, 0xA9, 0x19, 0xDC, 0x24, 0, 0, 0, 0, 0xEE, 0x03, 0x02, 0x80, 0, 0x04, 0x11, 0x08, 0x04, 0x75, 0, 0x5A, 0x31, 0x95, 0x51, 0, 0, 0xAA, 0x2B, 0x7A, 0xDB, 0 }, { 0xE4, 0x69, 0x04, 0, 0, 0x40, 0x77, 0xD0, 0x23, 0x0C, 0x02, 0x77, 0xD0, 0x80, 0x23, 0x88, 0xC9, 0x30, 0xD0, 0x16, 0, 0, 0, 0, 0, 0x77, 0x03 }, { 0xBA, 0xB8, 0xB8, 0x90, 0x99, 0 }, /* added later - untested */ { 0x58, 0x48, 0x49 }, /* added later - untested */ 0x20BA2E8B, 0, }, { "720x576Noscale", 720, 576, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0xA4, 0, 0, 0x10, 0x75, 0xA5, 0x3A, 0x5A, 0, 0x49, 0x46, 0, 0x89, 0, 0, 0xE9, 0x19, 0xDC, 0x24, 0, 0, 0, 0, 0xEE, 0, 0x0A, 0, 0, 0x04, 0x13, 0x0C, 0x04, 0x7B, 0x48, 0x64, 0x30, 0x93, 0x49, 0x5F, 0x15, 0xA5, 0x23, 0x77, 0xFF, 0 }, { 0xE7, 0x45, 0x04, 0, 0, 0x45, 0x7F, 0xD0, 0x23, 0x70, 0x02, 0x7F, 0xD0, 0x93, 0x23, 0x89, 0xC7, 0xF1, 0xBD, 0x06, 0, 0, 0, 0, 0, 0x7F, 0x03 }, { 0xBA, 0xB8, 0xB8, 0x90, 0x99, 0 }, /* added later - untested */ { 0x58, 0x48, 0x49 }, /* added later - untested */ 0x288933E3, 0, }, { NULL, 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0}, { 0, 0, 0 }, 0, 0, } }; /* * * VT1622A/VT1623 modetables * */ static DisplayModeRec VT1623Modes[] = { { MODEPREFIX("640x480"), 23520, 640, 656, 744, 784, 0, 480, 487, 491, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480"), 30000, 640, 680, 808, 1000, 0, 480, 520, 523, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600"), 39900, 800, 840, 976, 1064, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600"), 34500, 800, 816, 880, 920, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768"), 54810, 1024, 1032, 1088, 1160, 0, 768, 780, 792, 945, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768"), 57000, 1024, 1040, 1112, 1200, 0, 768, 829, 840, 950, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("848x480"), 34860, 848, 872, 1032, 1200, 0, 480, 495, 509, 581, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("848x480"), 36000, 848, 872, 1032, 1200, 0, 480, 498, 509, 600, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480"), 25200, 720, 728, 776, 840, 0, 480, 511, 515, 600, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x576"), 28500, 720, 728, 744, 760, 0, 576, 635, 643, 750, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("640x480Over"), 20160, 640, 648, 704, 720, 0, 480, 490, 491, 560, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("640x480Over"), 21000, 640, 664, 792, 840, 0, 480, 485, 491, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600Over"), 35910, 800, 840, 984, 1080, 0, 600, 601, 604, 665, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("800x600Over"), 32500, 800, 832, 928, 1000, 0, 600, 600, 604, 650, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768Over"), 50400, 1024, 1040, 1112, 1200, 0, 768, 772, 776, 840, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("1024x768Over"), 49500, 1024, 1032, 1112, 1200, 0, 768, 771, 776, 825, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("848x480Over"), 27720, 848, 856, 928, 1008, 0, 480, 490, 493, 550, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("848x480Over"), 33000, 848, 872, 1032, 1200, 0, 480, 490, 493, 550, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480Over"), 21000, 720, 728, 760, 800, 0, 480, 480, 483, 525, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x576Over"), 27000, 720, 768, 800, 864, 0, 576, 577, 579, 625, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x576Noscale"), 28000, 720, 736, 768, 896, 0, 576, 576, 579, 625, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x480Noscale"), 27972, 720, 736, 768, 888, 0, 480, 480, 483, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x480pal"), 27972, 720, 736, 768, 888, 0, 480, 480, 483, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, }; static struct VT162XTableRec VT1623Table[] = { { "640x480", 640, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0x06, 0x03, 0, 0x20, 0x28, 0x9A, 0x0C, 0x55, 0, 0x52, 0x3B, 0x0F, 0, 0, 0, 0xF8, 0x3E, 0x81, 0x56, 0, 0, 0, 0, 0xEA, 0, 0, 0, 0, 0x11, 0x15, 0x0C, 0x5F, 0x75, 0x08, 0x56, 0x2F, 0x90, 0x50, 0, 0, 0xA3, 0x29, 0x5B, 0xBF, 0 }, { 0, 0, 0, 0, 0, 0x3B, 0x0F, 0x7F, 0x23, 0x57, 0x02, 0x0F, 0x26, 0x73, 0x63, 0x86, 0xC4, 0xEA, 0xDF, 0x05, 0x92, 0xA1, 0x84, 0, 0, 0x7F, 0x03 }, { 0x6A, 0x62, 0x65, 0x91, 0x9C, 0x27 }, { 0x50, 0x4B, 0x4D }, 0x252491F1, 0x252487BE, }, { "640x480", 640, 480, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0x06, 0, 0, 0x20, 0xBF, 0x9F, 0x37, 0x5D, 0, 0x4F, 0x42, 0x0F, 0, 0, 0, 0xAC, 0x15, 0x6E, 0x28, 0, 0, 0, 0, 0xED, 0, 0x02, 0, 0, 0x99, 0x17, 0x0C, 0x31, 0x7A, 0x04, 0x62, 0x30, 0x8E, 0x4A, 0x5B, 0x15, 0xA0, 0x22, 0x5C, 0xCC, 0 }, { 0, 0, 0, 0, 0, 0x43, 0xE7, 0x7F, 0x23, 0x57, 0x02, 0x1F, 0x2F, 0x75, 0x63, 0x8A, 0xC8, 0xF0, 0xFF, 0x05, 0xD7, 0x8E, 0x83, 0x7F, 0xCF, 0xBF, 0x03 }, { 0x6A, 0x62, 0x65, 0x8D, 0x96, 0x20 }, { 0x42, 0x49, 0x49 }, 0x2D66772D, 0, }, { "800x600", 800, 600, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x04, 0x03, 0, 0x20, 0x58, 0xD4, 0x09, 0x52, 0, 0x51, 0x3B, 0x0F, 0, 0, 0, 0x6A, 0x0D, 0x4C, 0x1C, 0, 0, 0, 0, 0x3E, 0, 0x01, 0, 0, 0x44, 0x10, 0x0A, 0x9C, 0x75, 0x04, 0x56, 0x41, 0x90, 0x6B, 0, 0, 0xA3, 0x29, 0x86, 0x10, 0x10 }, { 0, 0, 0, 0, 0, 0x3A, 0x27, 0x1F, 0x34, 0xED, 0x02, 0x27, 0xF5, 0x9D, 0x64, 0xB7, 0x0D, 0x40, 0, 0x58, 0xB6, 0x3B, 0x85, 0, 0x01, 0xEF, 0x05 }, { 0x6A, 0x62, 0x65, 0x91, 0x9C, 0 }, { 0x43, 0x4A, 0x49 }, 0x1B5E5096, 0x1B5E4912, }, { "800x600", 800, 600, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0x04, 0, 0, 0x20, 0x27, 0xB8, 0x0D, 0x5C, 0, 0x4E, 0x40, 0x0F, 0, 0, 0, 0xEC, 0x2A, 0xFD, 0x28, 0, 0, 0, 0, 0x11, 0, 0x01, 0, 0, 0xAA, 0x13, 0x0C, 0x9F, 0x79, 0x0C, 0x62, 0x37, 0x8E, 0x54, 0x5B, 0x15, 0xA0, 0x22, 0x70, 0xF4, 0 }, { 0, 0, 0, 0, 0, 0x41, 0x97, 0x1F, 0x33, 0xED, 0x02, 0x97, 0x87, 0x87, 0x63, 0x9F, 0xE7, 0x16, 0xE7, 0x16, 0xCC, 0xF3, 0x84, 0, 0x01, 0x4F, 0x04 }, { 0x6A, 0x62, 0x65, 0, 0, 0}, { 0x58, 0x5E, 0x5E }, 0x277A7DE4, 0, }, { "1024x768", 1024, 768, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x04, 0x03, 0, 0x20, 0x47, 0x12, 0x08, 0x50, 0, 0x50, 0x3A, 0x0F, 0, 0, 0, 0xEF, 0x37, 0x77, 0x2A, 0, 0, 0, 0, 0xA1, 0, 0x05, 0, 0, 0x77, 0x0D, 0x05, 0xEF, 0x73, 0x0C, 0x56, 0x56, 0x90, 0x8B, 0, 0, 0xA3, 0x29, 0xB9, 0x6A, 0x10 }, { 0, 0, 0, 0, 0, 0x39, 0x87, 0xFF, 0x34, 0xB0, 0x03, 0x6F, 0xDC, 0xCD, 0x35, 0xF1, 0x5E, 0xA5, 0x7E, 0x5A, 0x33, 0x26, 0x87, 0, 0x01, 0x27, 0x08 }, { 0x6A, 0x62, 0x65, 0x91, 0x9C, 0 }, { 0x58, 0x4B, 0x4A }, 0x14EB66D6, 0x14EB6118, }, { "1024x768", 1024, 768, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0x04, 0, 0, 0x20, 0x57, 0x25, 0x35, 0x5A, 0, 0x4D, 0x40, 0x0F, 0, 0, 0, 0xE8, 0x23, 0xD1, 0x18, 0, 0, 0, 0, 0x96, 0, 0x07, 0, 0, 0xFF, 0x0F, 0x0C, 0x87, 0x79, 0, 0x62, 0x53, 0x8E, 0x7B, 0x5B, 0x15, 0xA0, 0x22, 0xB6, 0x5A, 0x10 }, { 0, 0, 0, 0, 0, 0x40, 0xAF, 0xFF, 0x34, 0xB5, 0x03, 0x57, 0xA8, 0xC8, 0x35, 0xEC, 0x4C, 0xCC, 0x67, 0x5A, 0x14, 0x5C, 0x06, 0, 0x01, 0x1F, 0x07 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x50, 0x69, 0x69 }, 0x1A8CC372, 0, }, { "848x480", 848, 480, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x04, 0x03, 0, 0x20, 0xA7, 0xC1, 0x07, 0x50, 0, 0x50, 0x39, 0x0F, 0, 0, 0, 0xF0, 0x29, 0x67, 0x31, 0, 0, 0, 0, 0x2A, 0, 0x03, 0, 0, 0x33, 0x11, 0x08, 0x47, 0x73, 0x0C, 0x56, 0x3C, 0x90, 0x65, 0, 0, 0xA3, 0x29, 0x7C, 0, 0x10 }, { 0, 0, 0, 0, 0, 0x39, 0xAF, 0x4F, 0x34, 0x44, 0x02, 0xE3, 0xC2, 0x93, 0x63, 0xAD, 0xFD, 0x2B, 0x7C, 0x17, 0x6D, 0xCA, 0x84, 0, 0x01, 0x2F, 0x05 }, { 0x6A, 0x62, 0x65, 0x91, 0x9C, 0 }, { 0x44, 0x45, 0x45 }, 0x1D3CA863, 0x1D3CA05B, }, { "848x480", 848, 480, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0x06, 0, 0, 0x20, 0xA7, 0xE6, 0x06, 0x5C, 0, 0x4E, 0x41, 0x0F, 0, 0, 0, 0xE6, 0x23, 0x84, 0x18, 0, 0, 0, 0, 0x56, 0, 0x01, 0, 0, 0xCC, 0x0F, 0x0C, 0x60, 0x79, 0, 0x62, 0x46, 0x8E, 0x68, 0x5B, 0x15, 0xA0, 0x22, 0x94, 0x2A, 0x10 }, { 0, 0, 0, 0, 0, 0x40, 0xAF, 0x4F, 0x34, 0x57, 0x02, 0x7F, 0x31, 0xA9, 0x74, 0xD1, 0x2B, 0x5D, 0xAA, 0x58, 0xD7, 0x26, 0x83, 0, 0x01, 0x7F, 0x04 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x50, 0x49, 0x49 }, 0x1F872818, 0, }, { "720x480", 720, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0x06, 0x03, 0, 0x20, 0x3F, 0xB6, 0x07, 0x52, 0, 0x51, 0x3A, 0x0F, 0, 0, 0, 0xED, 0x31, 0x50, 0x35, 0, 0, 0, 0, 0x1E, 0, 0x03, 0, 0, 0x33, 0x12, 0x08, 0x57, 0x75, 0, 0x56, 0x3A, 0x90, 0x61, 0, 0, 0xA3, 0x29, 0x76, 0xF1, 0 }, { 0, 0, 0, 0, 0, 0x3A, 0x47, 0xCF, 0x23, 0x57, 0x02, 0xBF, 0xAD, 0x8D, 0x63, 0xA4, 0xF3, 0x20, 0x36, 0x17, 0x92, 0x33, 0x84, 0, 0, 0xBF, 0x03 }, { 0x6A, 0x62, 0x65, 0x91, 0x9C, 0 }, { 0x42, 0x49, 0x48 }, 0x1E555518, 0x1E554CC3, }, { "720x576", 720, 576, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0x06, 0, 0, 0x20, 0x0F, 0xAF, 0x35, 0x5D, 0, 0x4F, 0x41, 0x0F, 0, 0, 0, 0xF8, 0x3C, 0x73, 0x56, 0, 0, 0, 0, 0xED, 0, 0x02, 0, 0, 0x99, 0x18, 0x0C, 0x76, 0x7A, 0x44, 0x62, 0x30, 0x8E, 0x49, 0x5B, 0x15, 0xA0, 0x22, 0x5C, 0xBD, 0 }, { 0, 0, 0, 0, 0, 0x43, 0xF7, 0xCF, 0x22, 0xED, 0x02, 0x1D, 0x29, 0x75, 0x63, 0x88, 0xC6, 0xF0, 0xFA, 0x0F, 0xCC, 0x30, 0x94, 0, 0, 0x8F, 0x03 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x59, 0x4D, 0x4A }, 0x2D839832, 0, }, { "640x480Over", 640, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0x06, 0x03, 0, 0x20, 0x10, 0x76, 0x0A, 0x56, 0x05, 0x50, 0x3B, 0x0F, 0, 0, 0, 0xED, 0x23, 0xC0, 0x34, 0, 0, 0, 0, 0xE5, 0, 0x02, 0, 0, 0x11, 0x17, 0x0C, 0x46, 0x73, 0x0C, 0x56, 0x2E, 0x90, 0x4E, 0, 0, 0xA3, 0x29, 0x59, 0xBA, 0 }, { 0, 0, 0, 0, 0, 0x3A, 0xCF, 0x7F, 0x22, 0x2F, 0x02, 0xFF, 0x59, 0x71, 0x62, 0x83, 0xC0, 0xE5, 0xC0, 0x05, 0x44, 0x44, 0x84, 0, 0, 0xFF, 0x02 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x4F, 0x49, 0x49 }, 0x25EAAA5E, 0x25EA9FF4, }, { "640x480Over", 640, 480, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0x06, 0, 0, 0x20, 0x23, 0x4E, 0x2A, 0x61, 0, 0x4D, 0x47, 0x0F, 0, 0, 0, 0x4A, 0x0F, 0x37, 0x28, 0, 0, 0, 0, 0xC7, 0, 0x02, 0, 0, 0x88, 0x1B, 0x0C, 0xFF, 0x79, 0, 0x62, 0x28, 0x8E, 0x3E, 0x5B, 0x15, 0xA0, 0x22, 0x49, 0xCC, 0 }, { 0, 0, 0, 0, 0, 0x44, 0x47, 0x7F, 0x23, 0xF3, 0x01, 0x9F, 0x3F, 0x62, 0x62, 0x72, 0xA7, 0xCB, 0x05, 0x05, 0x33, 0x70, 0x83, 0, 0, 0x9F, 0x02 }, { 0x6A, 0x62, 0x65, 0x90, 0x99, 0 }, { 0x42, 0x49, 0x49 }, 0x360C44BC, 0, }, { "800x600Over", 800, 600, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x04, 0x03, 0, 0x20, 0x5F, 0xA4, 0x08, 0x51, 0, 0x50, 0x39, 0x0F, 0, 0, 0, 0xE8, 0x33, 0xE6, 0x18, 0, 0, 0, 0, 0x32, 0, 0x03, 0, 0, 0x33, 0x11, 0x0A, 0x9B, 0x73, 0x08, 0x56, 0x3F, 0x90, 0x68, 0, 0, 0xA3, 0x29, 0x82, 0x02, 0x10 }, { 0, 0, 0, 0, 0, 0x39, 0x37, 0x21, 0x34, 0x98, 0x02, 0x01, 0x21, 0x97, 0x74, 0xB1, 0xFF, 0x34, 0xB6, 0x17, 0x11, 0, 0x85, 0, 0x01, 0x57, 0x05 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x42, 0x45, 0x45 }, 0x1C61CEE0, 0x1C61C714, }, { "800x600Over", 800, 600, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0x04, 0, 0, 0x20, 0x47, 0x90, 0x3B, 0x5A, 0, 0x4D, 0x3F, 0x0F, 0, 0, 0, 0xE8, 0x24, 0x8F, 0x1C, 0, 0, 0, 0, 0x0E, 0, 0x03, 0, 0, 0xAA, 0x14, 0x0C, 0x2F, 0x79, 0, 0x62, 0x37, 0x8E, 0x54, 0x5B, 0x15, 0xA0, 0x22, 0x6E, 0xF4, 0 }, { 0, 0, 0, 0, 0, 0x41, 0xE7, 0x1F, 0x33, 0x89, 0x02, 0x8D, 0xCD, 0x85, 0x63, 0x9C, 0xE4, 0x13, 0xD4, 0x16, 0x28, 0x60, 0x84, 0, 0x01, 0x0F, 0x04 }, { 0x6A, 0x62, 0x65, 0x90, 0x99, 0 }, { 0x58, 0x48, 0x48 }, 0x27E98D57, 0, }, { "1024x768Over", 1024, 768, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x04, 0x03, 0, 0x20, 0x52, 0xAE, 0x09, 0x50, 0, 0x50, 0x39, 0x0F, 0, 0, 0, 0xE8, 0x33, 0x0D, 0x15, 0, 0, 0, 0, 0x66, 0, 0x03, 0, 0, 0x55, 0x0F, 0x05, 0xF1, 0x73, 0x08, 0x56, 0x4A, 0x90, 0x79, 0, 0, 0xA3, 0x29, 0x9B, 0x33, 0x10 }, { 0, 0, 0, 0, 0, 0x39, 0xAF, 0xFF, 0x34, 0x47, 0x03, 0xAF, 0xC3, 0xB1, 0x34, 0xD1, 0x30, 0x68, 0x0B, 0x59, 0x66, 0x40, 0x86, 0, 0x01, 0x7F, 0x07 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x57, 0x45, 0x45 }, 0x1844440E, 0x18443D63, }, { "1024x768Over", 1024, 768, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0x04, 0, 0, 0x20, 0x56, 0xC0, 0x32, 0x5A, 0, 0x4D, 0x40, 0x0F, 0, 0, 0, 0xC9, 0x14, 0x79, 0x1C, 0, 0, 0, 0, 0x6D, 0, 0x03, 0, 0, 0xDD, 0x0F, 0x0C, 0xCA, 0x79, 0x08, 0x62, 0x4B, 0x8E, 0x6F, 0x5B, 0x15, 0xA0, 0x22, 0xA1, 0x5A, 0x10 }, { 0, 0, 0, 0, 0, 0x40, 0xAF, 0xFF, 0x34, 0x38, 0x03, 0xCF, 0xDF, 0xB4, 0x34, 0xD6, 0x35, 0x75, 0x47, 0x59, 0x47, 0x20, 0x05, 0, 0x01, 0x2F, 0x06 }, { 0x6A, 0x62, 0x65, 0x90, 0x99, 0 }, { 0x51, 0x49, 0x49 }, 0x1D7B0E38, 0, }, { "848x480Over", 848, 480, TVTYPE_NTSC, 0, 0, { 0x84, 0, 0, 0x04, 0x03, 0, 0x20, 0x4E, 0x9E, 0x07, 0x51, 0, 0x50, 0x3A, 0x0F, 0, 0, 0, 0xED, 0x23, 0x08, 0x35, 0, 0, 0, 0, 0x3C, 0, 0x03, 0, 0, 0x44, 0x11, 0x0A, 0xF0, 0x73, 0x04, 0x56, 0x41, 0x90, 0x6A, 0, 0, 0xA3, 0x29, 0x87, 0x0A, 0x10 }, { 0, 0, 0, 0, 0, 0x39, 0xEF, 0x51, 0x33, 0x25, 0x02, 0x1F, 0x47, 0x9C, 0x74, 0xB5, 0x0C, 0x3D, 0xF1, 0x57, 0x30, 0x0C, 0x84, 0, 0x01, 0x1F, 0x04 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x58, 0x45, 0x45 }, 0x1B9364A1, 0x1B933067, }, { "848x480Over", 848, 480, TVTYPE_PAL, 0, 0, { 0x84, 0, 0, 0x04, 0, 0, 0x20, 0xA5, 0xA1, 0x38, 0x5E, 0, 0x4D, 0x41, 0x0F, 0, 0, 0, 0xC7, 0x1E, 0x79, 0x1C, 0, 0, 0, 0, 0x39, 0, 0x03, 0, 0, 0xBB, 0x12, 0x0C, 0x5A, 0x79, 0x0C, 0x62, 0x40, 0x8E, 0x5F, 0x5B, 0x15, 0xA0, 0x22, 0x88, 0x2A, 0x10 }, { 0, 0, 0, 0, 0, 0x3A, 0xAF, 0x4F, 0x34, 0x25, 0x02, 0x1F, 0x4F, 0x9B, 0x74, 0xB7, 0x0A, 0x3F, 0xF0, 0x58, 0x85, 0, 0x83, 0, 0x01, 0x1F, 0x04 }, { 0x6A, 0x62, 0x65, 0x90, 0x99, 0 }, { 0x4E, 0x49, 0x49 }, 0x2264E5EC, 0, }, { "720x480Over", 720, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0, 0, 0, 0x03, 0, 0x20, 0x28, 0x52, 0x08, 0x50, 0, 0x4E, 0x2F, 0x0F, 0, 0, 0, 0x2D, 0x07, 0x28, 0x34, 0, 0, 0, 0, 0xEE, 0, 0x02, 0, 0, 0x11, 0x16, 0x08, 0xDF, 0x76, 0x04, 0x56, 0x31, 0x90, 0x51, 0, 0, 0xA3, 0x29, 0x5D, 0xC3, 0 }, { 0, 0, 0, 0, 0x08, 0x3A, 0x1F, 0xCF, 0x23, 0x0C, 0x02, 0x1F, 0xCE, 0x76, 0x23, 0x88, 0xC9, 0xEF, 0xFF, 0x05, 0, 0, 0, 0, 0, 0x1F, 0x03 }, { 0x6A, 0x62, 0x65, 0, 0, 0 }, { 0x4D, 0x49, 0x49 }, 0x2466661D, 0x24665C1E, }, { "720x576Over", 720, 576, TVTYPE_PAL, 0, 0, { 0x04, 0, 0, 0, 0, 0, 0x20, 0x3F, 0x89, 0x35, 0x50, 0, 0x43, 0x2E, 0x0F, 0, 0, 0, 0xE8, 0x23, 0x84, 0x20, 0, 0, 0, 0, 0xFF, 0, 0x02, 0, 0, 0x99, 0x17, 0x0C, 0x6F, 0x79, 0x48, 0x62, 0x34, 0x8E, 0x4F, 0x5B, 0x15, 0xA0, 0x22, 0x67, 0xFF, 0 }, { 0, 0, 0, 0, 0, 0x3A, 0x5F, 0xCF, 0x23, 0x70, 0x02, 0x5F, 0xBF, 0x7E, 0x23, 0x94, 0xD0, 0x27, 0x8F, 0x16, 0, 0, 0x04, 0, 0, 0x5F, 0x03 }, { 0x6A, 0x62, 0x65, 0x90, 0x99, 0 }, { 0x58, 0x48, 0x49 }, 0x2A098ACB, 0, }, { "720x576Noscale", 720, 576, TVTYPE_PAL, 0, 0, { 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x78, 0x78, 0x38, 0x5a, 0x00, 0x49, 0x2e, 0x00, 0x80, 0x00, 0x00, 0x03, 0x0f, 0x16, 0x0c, 0x8d, 0x33, 0x89, 0x28, 0xee, 0x10, 0x02, 0x80, 0x00, 0x00, 0x13, 0x0c, 0x04, 0x7b, 0x48, 0x64, 0x30, 0x93, 0x49, 0x5f, 0x15, 0xa5, 0x23, 0x77, 0xff, 0x00, }, { 0x00, 0x00, 0x04, 0x00, 0x00, 0x45, 0x7f, 0xd0, 0x23, 0x70, 0x02, 0x7f, 0xd0, 0x83, 0x23, 0x9c, 0xdb, 0x08, 0xb7, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x03, }, { 0xBA, 0xB8, 0xB8, 0x90, 0x99, 0 }, { 0x58, 0x48, 0x49 }, 0x2889338d, 0, }, { "720x480Noscale", 720, 480, TVTYPE_NTSC, 0, 0, { 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x20, 0x78, 0x78, 0x06, 0x5a, 0x00, 0x49, 0x2f, 0x00, 0x80, 0x00, 0x00, 0xed, 0x23, 0xde, 0x34, 0x97, 0xab, 0xca, 0x20, 0xee, 0x10, 0x02, 0x80, 0x00, 0x11, 0x11, 0x08, 0x04, 0x76, 0x08, 0x5a, 0x31, 0x95, 0x51, 0x00, 0x00, 0xaa, 0x2b, 0x7a, 0xdb, 0x00, }, { 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x77, 0xd0, 0x23, 0x0c, 0x02, 0x77, 0xd0, 0x83, 0x23, 0x98, 0xde, 0xe8, 0xc4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x03, }, { 0xBA, 0xB8, 0xB8, 0x90, 0x99, 0 }, { 0x58, 0x48, 0x49 }, 0x20caab97, 0, }, { "720x480pal", 720, 480, TVTYPE_PAL, 0, 0, { 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x74, 0x8c, 0x06, 0x50, 0x00, 0x4e, 0x2f, 0x00, 0x07, 0x00, 0x00, 0xa9, 0x19, 0x6e, 0x24, 0xe3, 0x33, 0x89, 0x28, 0xee, 0x10, 0x02, 0x80, 0x00, 0x11, 0x11, 0x08, 0x04, 0x76, 0x08, 0x5a, 0x31, 0x95, 0x51, 0x00, 0x00, 0xaa, 0x2b, 0x7a, 0xdb, 0x00, }, { 0x00, 0x00, 0x04, 0x00, 0x00, 0x40, 0x77, 0xd0, 0x23, 0x0c, 0x02, 0x77, 0xd0, 0xb0, 0x23, 0x88, 0xc9, 0x30, 0xd0, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x03 }, { 0xBA, 0xB8, 0xB8, 0x90, 0x99, 0 }, { 0x58, 0x48, 0x49 }, 0x288933e3, 0, }, { NULL, 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0 }, 0, 0, } }; /* * * VT1625 modetables * */ static DisplayModeRec VT1625Modes[] = { /* all available modes are: */ /* { MODEPREFIX("640x480"), ... , MODESUFFIXNTSC }, { MODEPREFIX("800x600"), ... , MODESUFFIXNTSC }, { MODEPREFIX("1024x768"), ... , MODESUFFIXNTSC }, { MODEPREFIX("720x480"), ... , MODESUFFIX480P }, { MODEPREFIX("640x480"), ... , MODESUFFIX720P }, { MODEPREFIX("800x600"), ... , MODESUFFIX720P }, { MODEPREFIX("1024x768"), ... , MODESUFFIX720P }, { MODEPREFIX("720x480"), ... , MODESUFFIX720P }, { MODEPREFIX("720x576"), ... , MODESUFFIX720P }, { MODEPREFIX("640x480"), ... , MODESUFFIX1080I }, { MODEPREFIX("800x600"), ... , MODESUFFIX1080I }, { MODEPREFIX("1024x768"), ... , MODESUFFIX1080I }, { MODEPREFIX("720x480"), ... , MODESUFFIX1080I }, { MODEPREFIX("720x576"), ... , MODESUFFIX1080I }, { MODEPREFIX("640x480Over"), ... , MODESUFFIXNTSC }, { MODEPREFIX("800x600Over"), ... , MODESUFFIXNTSC }, { MODEPREFIX("1024x768Over"), ... , MODESUFFIXNTSC }, { MODEPREFIX("720x480Over"), ... , MODESUFFIXNTSC }, { MODEPREFIX("640x480Over"), ... , MODESUFFIXPAL }, { MODEPREFIX("800x600Over"), ... , MODESUFFIXPAL }, { MODEPREFIX("1024x768Over"), ... , MODESUFFIXPAL }, { MODEPREFIX("720x576Over"), ... , MODESUFFIXPAL },*/ /* clock HR SH1 SH2 HFL VR SV1 SV2 VFL*/ { MODEPREFIX("640x480"), 30000, 640, 688, 744, 784, 0, 480, 488, 495, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("800x600"), 34500, 800, 816, 880, 920, 0, 600, 604, 620, 750, 0, V_PHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1024x768"), 57000, 1024, 1040, 1112, 1200, 0, 768, 829, 840, 950, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x576"), 34500, 720, 760, 800, 1000, 0, 576, 577, 580, 690, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("720x576Over"), 27000, 720, 768, 800, 864, 0, 576, 577, 579, 625, 0, V_NHSYNC | V_PVSYNC, MODESUFFIXPAL }, { MODEPREFIX("1280x720"), 74250, 1280, 1320, 1376, 1650, 0, 720, 722, 728, 750, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX720P }, { MODEPREFIX("1920x1080"), 74250, 1920, 1960, 2064, 2200, 0, 1080, 1083, 1087, 1125, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX1080I }, { MODEPREFIX("640x480"), 24696, 640, 656, 744, 784, 0, 480, 482, 483, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x480Under"), 34000, 720, 728, 744, 784, 0, 480, 490, 496, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x480Fit"), 28980, 720, 728, 776, 840, 0, 480, 484, 499, 575, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x480Over"), 27025, 720, 752, 792, 800, 0, 480, 482, 485, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIXNTSC }, { MODEPREFIX("720x480Under"), 28224, 720, 728, 744, 784, 0, 480, 490, 496, 600, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX480P }, { MODEPREFIX("720x480Fit"), 28980, 720, 728, 776, 840, 0, 480, 484, 499, 575, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX480P }, { MODEPREFIX("720x480Over"), 27027, 720, 784, 808, 858, 0, 480, 483, 486, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX480P }, }; static struct VT162XTableRec VT1625Table[] = { { "640x480", 640, 480, TVTYPE_NTSC, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x40, 0x10, 0, 0, 0x28, 0x47, 0x15, 0x7B, 0, 0x50, 0x57, 0, 0x9E, 0, 0x80, 0xFA, 0x21, 0xE0, 0x68, 0xD6, 0x7B, 0xF0, 0x21, 0x02, 0x50, 0x41, 0x80, 0, 0x10, 0x1C, 0x2A, 0xCB, 0x77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0, 0, 0x01, 0x10, 0x4A, 0x0F, 0x83, 0x23, 0x57, 0x22, 0x59, 0x83, 0x7F, 0x23, 0x91, /* 5A 5F 60 64 */ 0xD2, 0x13, 0x7C, 0x16, 0x49, 0, 0x92, 0x20, 0, 0x7F, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x37, 0x5C, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x56, 0x55 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x21F07BD6, 0x21F087BE, }, { "720x480Under", 720, 480, TVTYPE_NTSC, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x1F, 0x00, 0, 0, 0x2A, 0x41, 0x0A, 0x7B, 0x15, 0x50, 0x57, 0, 0xB7, 0, 0x80, 0xAB, 0x27, 0x70, 0x2C, 0xD6, 0x7B, 0xF0, 0x21, 0x02, 0x50, 0x41, 0x80, 0, 0x10, 0x1C, 0x08, 0xCB, 0x77, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0x00, 0x01, 0x10, 0x4A, 0x0F, 0xCF, 0x23, 0x57, 0x22, 0x59, 0x83, 0x7F, 0x23, 0x91, /* 5A 5F 60 64 */ 0xD2, 0x13, 0x7A, 0x16, 0x49, 0xF1, 0x92, 0xA8, 0xFF, 0x7F, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x37, 0x5C, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x54, 0x56 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x21F07BD6, 0x21F04CC3, }, { "720x480Fit", 720, 480, TVTYPE_NTSC, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x1F, 0x00, 0, 0, 0x41, 0x3B, 0x0B, 0x7B, 0x15, 0x50, 0x57, 0, 0xB7, 0, 0x80, 0xCD, 0x21, 0x73, 0x34, 0xD6, 0x7B, 0xF0, 0x21, 0x02, 0x50, 0x43, 0x80, 0, 0x10, 0x1C, 0x08, 0xCA, 0x77, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0x10, 0x4A, 0x47, 0xCF, 0x23, 0x3E, 0x22, 0x59, 0x8B, 0x7F, 0x23, 0x91, /* 5A 5F 60 64 */ 0xD2, 0x13, 0x7A, 0x16, 0x30, 0xD4, 0x8C, 0x28, 0xFF, 0x97, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x37, 0x5C, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x54, 0x56 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x21F07BD6, 0x21F0EBE8, }, { "720x480Over", 720, 480, TVTYPE_NTSC, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x1F, 0x00, 0, 0, 0x02, 0x10, 0x00, 0x7B, 0x15, 0x50, 0x57, 0, 0xB7, 0, 0x80, 0xAD, 0x21, 0x64, 0x34, 0xD6, 0x7B, 0xF0, 0x21, 0x00, 0x50, 0x00, 0x80, 0, 0x10, 0x1C, 0x08, 0xE5, 0x77, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0x10, 0x4A, 0x1F, 0xD2, 0x23, 0x0C, 0x22, 0x59, 0xC0, 0x7E, 0x23, 0x8C, /* 5A 5F 60 64 */ 0xD0, 0xF6, 0x7C, 0x06, 0, 0x34, 0x80, 0x28, 0xFF, 0x1F, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x37, 0x5C, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x54, 0x56 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x21F07BD6, 0x21F05C1E, }, { "720x480Under", 720, 480, TVTYPE_480P, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x40, 0x10, 0, 0, 0x2A, 0x41, 0x14, 0x7B, 0, 0x50, 0x57, 0, 0xB7, 0, 0x80, 0xAB, 0x27, 0x70, 0x2C, 0xD6, 0x7B, 0xF0, 0x21, 0x02, 0x50, 0x41, 0x80, 0, 0x01, 0x2F, 0x08, 0xCB, 0x7E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0, 0x4A, 0x0F, 0xCF, 0x23, 0x57, 0x22, 0x59, 0x83, 0x7F, 0x23, 0x91, /* 5A 5F 60 64 */ 0xD2, 0x13, 0x7A, 0x16, 0x49, 0xF1, 0x92, 0xA8, 0, 0x7F, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x37, 0x5C, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x54, 0x56 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x21F07BD6, 0x21F087BE, }, { "720x480Fit", 720, 480, TVTYPE_480P, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x40, 0x10, 0, 0, 0x41, 0x43, 0xFF, 0x7B, 0, 0x50, 0x57, 0, 0xB7, 0, 0x80, 0xCD, 0x21, 0x73, 0x34, 0xD6, 0x7B, 0xF0, 0x21, 0x02, 0x50, 0x43, 0x80, 0, 0x01, 0x2F, 0x08, 0xCA, 0x7E, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0, 0x4A, 0x47, 0xCF, 0x23, 0x3E, 0x22, 0x59, 0x8B, 0x7F, 0x23, 0x91, /* 5A 5F 60 64 */ 0xD2, 0x13, 0x7A, 0x16, 0x30, 0xD4, 0x8C, 0x28, 0, 0x97, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x37, 0x5C, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x54, 0x56 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x21F07BD6, 0x21F087BE, }, { "720x480Over", 720, 480, TVTYPE_480P, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x40, 0x10, 0, 0, 0x01, 0x20, 0, 0x7B, 0, 0x50, 0x57, 0, 0x9E, 0, 0x80, 0x04, 0x08, 0x08, 0x10, 0xD6, 0x7B, 0xF0, 0x21, 0x02, 0x50, 0x00, 0x80, 0, 0x01, 0x2F, 0x08, 0xDC, 0x7E, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0, 0x4A, 0x59, 0xCF, 0x23, 0x0C, 0x22, 0x59, 0xCF, 0x7F, 0x23, 0x91, /* 5A 5F 60 64 */ 0xD2, 0xE1, 0x7D, 0x06, 0, 0, 0x80, 0x28, 0, 0x59, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x37, 0x5C, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x54, 0x56 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x21F07BD6, 0x21F087BE, }, { "1280x720", 1280, 720, TVTYPE_720P, 0, 0, /* 00 0F */ { 0x83, 0, 0x10, 0x40, 0x94, 0x00, 0, 0xFF, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x80, 0x89, 0x10, 0x63, 0x24, 0x00, 0x00, 0x00, 0x00, 0, 0x50, 0x40, 0x80, 0x00, 0x03, 0x25, 0x00, 0x00, 0x7E, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* hdtv - 4A 0x85, 4B 0x0A */ /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0, 0x00, 0x71, 0xFF, 0x46, 0xED, 0x12, 0x71, 0xFF, 0x50, 0x46, 0x30, /* 5A 5F 60 64 */ 0x30, 0x1C, 0x47, 0x96, 0x00, 0x00, 0x80, 0x28, 0x00, 0x71, 0x36 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x39, 0x66, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x56, 0x55 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x0, 0x0, }, { "1920x1080", 1920, 1080, TVTYPE_1080I, 0, 0, /* 00 0F */ { 0x83, 0, 0x10, 0x4A, 0x86, 0x32, 0, 0x8B, 0x3D, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x80, 0x4A, 0x08, 0x37, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x04, 0x80, 0x00, 0x03, 0x25, 0x00, 0x00, 0x7E, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0, 0x00, 0x97, 0x7F, 0x78, 0x64, 0x14, 0x97, 0x7f, 0x59, 0x78, 0xb0, /* 5A 5F 60 64 */ 0x1a, 0xdc, 0x5d, 0x08, 0x00, 0x00, 0x80, 0x28, 0xFF, 0x97, 0x28 }, /* RBG 65,66,67,27,2b,2c */ { 0x55, 0x39, 0x66, 0, 0, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x55, 0x56, 0x55 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x0, 0x0, }, { "640x480", 640, 480, TVTYPE_PAL, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x1F, 0x03, 0, 0, 0xF2, 0x42, 0x0A, 0x88, 0x00, 0x55, 0x5E, 0, 0xB0, 0, 0x80, 0x0A, 0x09, 0x19, 0x28, 0xCB, 0x8A, 0x09, 0x2A, 0, 0x50, 0x41, 0x80, 0, 0x10, 0x17, 0x1C, 0x35, 0x7D, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0x10, 0x51, 0xE7, 0x81, 0x23, 0x57, 0x22, 0x5F, 0x6F, 0x7F, 0x23, 0x94, /* 5A 5F 60 64 */ 0xD0, 0x1C, 0x8F, 0x16, 0xE1, 0x38, 0x7A, 0x28, 0xFF, 0xBF, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x6A, 0x62, 0x65, 0x8D, 0x96, 0x20 }, /* Y-Cb-Cr 65,66,67 */ { 0x42, 0x49, 0x49 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x2D66772D, 0, }, { "720x576", 720, 576, TVTYPE_PAL, 0, 0, /* 00 0F */ { 0x03, 0x00, 0x10, 0x1f, 0x03, 0x00, 0x00, 0xc9, 0x4c, 0x10, 0x7c, 0x00, 0x56, 0x57, 0x07, 0xbf, 0x00, 0x80, 0x09, 0x08, 0x17, 0x24, 0xcb, 0x8a, 0x09, 0x2a, 0x06, 0x50, 0x00, 0x80, 0x00, 0x10, 0x14, 0x0c, 0x32, 0x7e, 0x00, 0x5f, 0x34, 0x8c, 0x4f, 0x5e, 0x15, 0xa2, 0x22, 0x80, 0xd3, 0x10 }, /* 4A 4F 50 59 */ { 0xc5, 0x0f, 0x00, 0x01, 0x00, 0x4b, 0xe7, 0xd2, 0x23, 0xb1, 0x22, 0x5f, 0x61, 0x7f, 0x23, 0x90, /* 5A 5F 60 64 */ 0xcd, 0x35, 0x83, 0x16, 0x4F, 0x76, 0x8d, 0xa9, 0xff, 0x4f, 0x04 }, /* RBG 65,66,67,27,2b,2c */ { 0x6A, 0x62, 0x65, 0x90, 0x99, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x58, 0x48, 0x49 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x2A098ACB, 0, }, { "720x576Over", 720, 576, TVTYPE_PAL, 0, 0, /* 00 0F */ { 0x03, 0, 0x10, 0x1F, 0x03, 0, 0, 0x39, 0x19, 0x01, 0x88, 0x00, 0x55, 0x5E, 0x00, 0x9E, 0, 0x80, 0x04, 0x08, 0x08, 0x10, 0xCB, 0x8A, 0x09, 0x2A, 0x00, 0x50, 0x41, 0x80, 0, 0x10, 0x17, 0x0C, 0x32, 0x7D, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 4A 4F 50 59 */ { 0xC5, 0x0F, 0, 0x01, 0x10, 0x51, 0x5F, 0xCF, 0x23, 0x70, 0x22, 0x5F, 0xD0, 0x7F, 0x23, 0x92, /* 5A 5F 60 64 */ 0xCE, 0x0C, 0x8E, 0x16, 0, 0, 0x80, 0x20, 0xFF, 0x5F, 0x03 }, /* RBG 65,66,67,27,2b,2c */ { 0x6A, 0x62, 0x65, 0x90, 0x99, 0 }, /* Y-Cb-Cr 65,66,67 */ { 0x58, 0x48, 0x49 }, /* Subcarrier 19,18,17,16, DotCrawl Subcarrier (set bit 3 of reg 11 then subcarrier) */ 0x2A098ACB, 0, }, /* { "1920x1080", 1920, 540, TVTYPE_NTSC, 0, 0, { 0x83, 0, 0x10, 0x4A, 0x86, 0x39, 0, 0x8B, 0x3D, 0x32, 0, 0, 0, 0, 0, 0x9E, 0, 0x80, 0x4A, 0x08, 0x37, 0x14, 0, 0, 0, 0, 0, 0x50, 0x44, 0x80, 0, 0x03, 0x25, 0, 0, 0x7E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0xC5, 0x0F, 0, 0x01, 0, 0, 0x97, 0x7F, 0x78, 0x64, 0x14, 0x97, 0x7F, 0x59, 0x78, 0xB0, 0x1A, 0xEC, 0xFA, 0x08, 0, 0, 0x80, 0x20, 0xFF, 0x97, 0x28 }, { 0x55, 0x56, 0x55, 0x91, 0x9C, 0 }, { 0x42, 0x49, 0x48 }, 0x1E555518, 0x1E554CC3, }, { "960x540", 960, 540, TVTYPE_NTSC, 0, 0, { 0x83, 0, 0x10, 0x4A, 0x86, 0x39, 0, 0x8B, 0x3D, 0x32, 0, 0, 0, 0, 0, 0x9E, 0, 0x80, 0x4A, 0x08, 0x37, 0x14, 0, 0, 0, 0, 0, 0x50, 0x44, 0x80, 0, 0x03, 0x25, 0, 0, 0x7E, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0xC5, 0x0F, 0, 0x01, 0, 0, 0x97, 0x7F, 0x78, 0x64, 0x14, 0x97, 0x7F, 0x59, 0x78, 0xB0, 0x1A, 0xEC, 0xFA, 0x08, 0, 0, 0x80, 0x20, 0xFF, 0x97, 0x28 }, { 0x55, 0x56, 0x55, 0x91, 0x9C, 0 }, { 0x42, 0x49, 0x48 }, 0x1E555518, 0x1E554CC3, }, */ { NULL, 0, 0, 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0 }, 0, 0, } }; #endif /* _VIA_VT162X_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_vt1632.c000066400000000000000000000217521267025031400235730ustar00rootroot00000000000000/* * Copyright 2014 SHS SERVICES GmbH * * 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" #include "via_vt1632.h" static Bool xf86I2CMaskByte(I2CDevPtr d, I2CByte subaddr, I2CByte value, I2CByte mask) { I2CByte tmp; Bool ret; ret = xf86I2CReadByte(d, subaddr, &tmp); if (!ret) return FALSE; tmp &= ~mask; tmp |= (value & mask); return xf86I2CWriteByte(d, subaddr, tmp); } static void via_vt1632_dump_registers(ScrnInfoPtr pScrn, I2CDevPtr pDev) { int i; CARD8 tmp; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_dump_registers.\n")); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A: dumping registers:\n")); for (i = 0; i <= 0x0f; i++) { xf86I2CReadByte(pDev, i, &tmp); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A: 0x%02x: 0x%02x\n", i, tmp)); } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_dump_registers.\n")); } void via_vt1632_power(xf86OutputPtr output, BOOL on) { struct ViaVT1632PrivateData * Private = output->driver_private; ScrnInfoPtr pScrn = output->scrn; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_power.\n")); if (on == TRUE) { xf86I2CMaskByte(Private->VT1632I2CDev, 0x08, 0x01, 0x01); } else { xf86I2CMaskByte(Private->VT1632I2CDev, 0x08, 0x00, 0x01); } xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A: Power %s.\n", on ? "On" : "Off"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_power.\n")); } void via_vt1632_save(xf86OutputPtr output) { struct ViaVT1632PrivateData * Private = output->driver_private; ScrnInfoPtr pScrn = output->scrn; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_save.\n")); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A: Saving the content of registers " "0x08, 0x09, 0x0A, and 0x0C.\n")); xf86I2CReadByte(Private->VT1632I2CDev, 0x08, &Private->Register08); xf86I2CReadByte(Private->VT1632I2CDev, 0x09, &Private->Register09); xf86I2CReadByte(Private->VT1632I2CDev, 0x0A, &Private->Register0A); xf86I2CReadByte(Private->VT1632I2CDev, 0x0C, &Private->Register0C); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_save.\n")); } void via_vt1632_restore(xf86OutputPtr output) { struct ViaVT1632PrivateData * Private = output->driver_private; ScrnInfoPtr pScrn = output->scrn; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_restore.\n")); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A: Restoring registers 0x08, 0x09, " "0x0A, and 0x0C.\n")); xf86I2CWriteByte(Private->VT1632I2CDev, 0x08, Private->Register08); xf86I2CWriteByte(Private->VT1632I2CDev, 0x09, Private->Register09); xf86I2CWriteByte(Private->VT1632I2CDev, 0x0A, Private->Register0A); xf86I2CWriteByte(Private->VT1632I2CDev, 0x0C, Private->Register0C); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_restore.\n")); } int via_vt1632_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) { struct ViaVT1632PrivateData * Private = output->driver_private; ScrnInfoPtr pScrn = output->scrn; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_mode_valid.\n")); if (pMode->Clock < Private->DotclockMin) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_mode_valid.\n")); return MODE_CLOCK_LOW; } if (pMode->Clock > Private->DotclockMax) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_mode_valid.\n")); return MODE_CLOCK_HIGH; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_mode_valid.\n")); return MODE_OK; } void via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { struct ViaVT1632PrivateData * Private = output->driver_private; ScrnInfoPtr pScrn = output->scrn; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_mode_set.\n")); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A: Enabling DVI.\n"); xf86I2CWriteByte(Private->VT1632I2CDev, 0x0C, 0x89); xf86I2CWriteByte(Private->VT1632I2CDev, 0x08, VIA_VT1632_VEN | VIA_VT1632_HEN | VIA_VT1632_EDGE | VIA_VT1632_PDB); via_vt1632_dump_registers(pScrn, Private->VT1632I2CDev); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_mode_set.\n")); } xf86OutputStatus via_vt1632_detect(xf86OutputPtr output) { struct ViaVT1632PrivateData * Private = output->driver_private; xf86OutputStatus status = XF86OutputStatusDisconnected; ScrnInfoPtr pScrn = output->scrn; CARD8 tmp; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_detect.\n")); xf86I2CReadByte(Private->VT1632I2CDev, 0x09, &tmp); if (tmp && 0x02) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A: DVI device is detected.\n"); status = XF86OutputStatusConnected; } DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_detect.\n")); return status; } BOOL via_vt1632_probe(ScrnInfoPtr pScrn, I2CDevPtr pDev) { CARD8 buf = 0; CARD16 VendorID = 0; CARD16 DeviceID = 0; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_probe.\n")); xf86I2CReadByte(pDev, 0, &buf); VendorID = buf; xf86I2CReadByte(pDev, 1, &buf); VendorID |= buf << 8; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Vendor ID: 0x%04x\n", VendorID)); xf86I2CReadByte(pDev, 2, &buf); DeviceID = buf; xf86I2CReadByte(pDev, 3, &buf); DeviceID |= buf << 8; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Device ID: %04x\n", DeviceID)); if ((VendorID != 0x1106) || (DeviceID != 0x3192)) { xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1632A DVI transmitter not detected.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_probe.\n")); return FALSE; } xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VT1632A DVI transmitter detected.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_probe.\n")); return TRUE; } struct ViaVT1632PrivateData * via_vt1632_init(ScrnInfoPtr pScrn, I2CDevPtr pDev) { VIAPtr pVia = VIAPTR(pScrn); struct ViaVT1632PrivateData * Private = NULL; CARD8 buf = 0; DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Entered via_vt1632_init.\n")); Private = xnfcalloc(1, sizeof(struct ViaVT1632PrivateData)); if (!Private) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to allocate memory for DVI initialization.\n"); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_init.\n")); return NULL; } Private->VT1632I2CDev = pDev; xf86I2CReadByte(pDev, 0x06, &buf); Private->DotclockMin = buf * 1000; xf86I2CReadByte(pDev, 0x07, &buf); Private->DotclockMax = (buf + 65) * 1000; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VT1632A Dot Clock Range: " "%d to %d MHz\n", Private->DotclockMin / 1000, Private->DotclockMax / 1000); via_vt1632_dump_registers(pScrn, pDev); DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Exiting via_vt1632_init.\n")); return Private; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_vt1632.h000066400000000000000000000040551267025031400235750ustar00rootroot00000000000000/* * Copyright 2014 SHS SERVICES GmbH * * 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. */ #ifndef _VIA_VT1632_H_ #define _VIA_VT1632_H_ 1 #define VIA_VT1632_VEN 0x20 #define VIA_VT1632_HEN 0x10 #define VIA_VT1632_DSEL 0x08 #define VIA_VT1632_BSEL 0x04 #define VIA_VT1632_EDGE 0x02 #define VIA_VT1632_PDB 0x01 struct ViaVT1632PrivateData { I2CDevPtr VT1632I2CDev; int DotclockMin; int DotclockMax; CARD8 Register08; CARD8 Register09; CARD8 Register0A; CARD8 Register0C; }; void via_vt1632_power(xf86OutputPtr output, BOOL on); void via_vt1632_save(xf86OutputPtr output); void via_vt1632_restore(xf86OutputPtr output); int via_vt1632_mode_valid(xf86OutputPtr output, DisplayModePtr pMode); void via_vt1632_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode); xf86OutputStatus via_vt1632_detect(xf86OutputPtr output); BOOL via_vt1632_probe(ScrnInfoPtr pScrn, I2CDevPtr pDev); struct ViaVT1632PrivateData * via_vt1632_init(ScrnInfoPtr pScrn, I2CDevPtr pDev); #endif /* _VIA_VT1632_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_xv.c000066400000000000000000001475361267025031400232740ustar00rootroot00000000000000/* * 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. */ /* * I N C L U D E S */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "xf86.h" #include "xf86_OSproc.h" #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 #include "xf86Resources.h" #endif #include "compiler.h" #include "xf86Pci.h" #include "regionstr.h" #include "via_driver.h" #include "xf86xv.h" #include #include "dixstruct.h" #include "via_xvpriv.h" #include "fourcc.h" /* * D E F I N E */ #define OFF_DELAY 200 /* milliseconds */ #define FREE_DELAY 60000 #define PARAMSIZE 1024 #define SLICESIZE 65536 #define OFF_TIMER 0x01 #define FREE_TIMER 0x02 #define TIMER_MASK (OFF_TIMER | FREE_TIMER) #define VIA_MAX_XVIMAGE_X 1920 #define VIA_MAX_XVIMAGE_Y 1200 #define LOW_BAND 0x0CB0 #define MID_BAND 0x1f10 #define XV_IMAGE 0 #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) #ifndef XvExtension void viaInitVideo(ScreenPtr pScreen) { } void viaExitVideo(ScrnInfoPtr pScrn) { } void viaSaveVideo(ScrnInfoPtr pScrn) { } void viaRestoreVideo(ScrnInfoPtr pScrn) { } void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y) { } #else static vidCopyFunc viaFastVidCpy = NULL; /* * F U N C T I O N D E C L A R A T I O N */ static unsigned viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors); static void viaStopVideo(ScrnInfoPtr, pointer, Bool); static void viaQueryBestSize(ScrnInfoPtr, Bool, short, short, short, short, unsigned int *, unsigned int *, pointer); static int viaQueryImageAttributes(ScrnInfoPtr, int, unsigned short *, unsigned short *, int *, int *); static int viaGetPortAttribute(ScrnInfoPtr, Atom, INT32 *, pointer); 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, unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines); static Atom xvBrightness, xvContrast, xvColorKey, xvHue, xvSaturation, xvAutoPaint; /* * S T R U C T S */ /* client libraries expect an encoding */ static XF86VideoEncodingRec DummyEncoding[1] = { {XV_IMAGE, "XV_IMAGE", VIA_MAX_XVIMAGE_X, VIA_MAX_XVIMAGE_Y, {1, 1}}, }; #define NUM_FORMATS_G 9 static XF86VideoFormatRec FormatsG[NUM_FORMATS_G] = { {8, TrueColor}, /* Dithered */ {8, PseudoColor}, /* Using .. */ {8, StaticColor}, {8, GrayScale}, {8, StaticGray}, /* .. TexelLUT */ {16, TrueColor}, {24, TrueColor}, {16, DirectColor}, {24, DirectColor} }; #define NUM_ATTRIBUTES_G 6 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"} }; #define NUM_IMAGES_G 7 static XF86ImageRec ImagesG[NUM_IMAGES_G] = { XVIMAGE_YUY2, XVIMAGE_YV12, XVIMAGE_I420, { /* * Below, a dummy picture type that is used in XvPutImage only to do * an overlay update. Introduced for the XvMC client lib. * Defined to have a zero data size. */ FOURCC_XVMC, XvYUV, LSBFirst, { 'V', 'I', 'A', 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71}, 12, XvPlanar, 1, 0, 0, 0, 0, 8, 8, 8, 1, 2, 2, 1, 2, 2, { 'Y', 'V', 'U', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, XvTopToBottom}, { /* RGB 555 */ FOURCC_RV15, XvRGB, LSBFirst, { 'R', 'V', '1', '5', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 16, XvPacked, 1, 15, 0x7C00, 0x03E0, 0x001F, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 'R', 'V', 'B', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, XvTopToBottom}, { /* RGB 565 */ FOURCC_RV16, XvRGB, LSBFirst, { 'R', 'V', '1', '6', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 16, XvPacked, 1, 16, 0xF800, 0x07E0, 0x001F, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 'R', 'V', 'B', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, XvTopToBottom}, { /* RGB 888 */ FOURCC_RV32, XvRGB, LSBFirst, { 'R', 'V', '3', '2', 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 32, XvPacked, 1, 24, 0xff0000, 0x00ff00, 0x0000ff, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 'R', 'V', 'B', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, XvTopToBottom} }; static char *XvAdaptorName[XV_ADAPT_NUM] = { "XV_SWOV" }; static XF86VideoAdaptorPtr viaAdaptPtr[XV_ADAPT_NUM]; static XF86VideoAdaptorPtr *allAdaptors; static unsigned numAdaptPort[XV_ADAPT_NUM] = { 1 }; /* * F U N C T I O N */ /* * Decide if the mode support video overlay. This depends on the bandwidth * of the mode and the type of RAM available. */ static Bool DecideOverlaySupport(xf86CrtcPtr crtc) { DisplayModePtr mode = &crtc->desiredMode; ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); #ifdef HAVE_DEBUG if (pVia->disableXvBWCheck) return TRUE; #endif /* Small trick here. We keep the height in 16's of lines and width in 32's * to avoid numeric overflow */ if (pVia->ChipId != PCI_CHIP_VT3205 && pVia->ChipId != PCI_CHIP_VT3204 && pVia->ChipId != PCI_CHIP_VT3259 && pVia->ChipId != PCI_CHIP_VT3314 && pVia->ChipId != PCI_CHIP_VT3327 && pVia->ChipId != PCI_CHIP_VT3336 && pVia->ChipId != PCI_CHIP_VT3409 && pVia->ChipId != PCI_CHIP_VT3410 && pVia->ChipId != PCI_CHIP_VT3364 && pVia->ChipId != PCI_CHIP_VT3324 && pVia->ChipId != PCI_CHIP_VT3353) { CARD32 bandwidth = (mode->HDisplay >> 4) * (mode->VDisplay >> 5) * pScrn->bitsPerPixel * mode->VRefresh; switch (pVia->MemClk) { case VIA_MEM_SDR100: /* No overlay without DDR */ case VIA_MEM_SDR133: return FALSE; case VIA_MEM_DDR200: /* Basic limit for DDR200 is about this */ if (bandwidth > 1800000) return FALSE; /* But we have constraints at higher than 800x600 */ if (mode->HDisplay > 800) { if (pScrn->bitsPerPixel != 8) return FALSE; if (mode->VDisplay > 768) return FALSE; if (mode->VRefresh > 60) return FALSE; } return TRUE; case 0: /* FIXME: Why does my CLE266 report 0? */ case VIA_MEM_DDR266: if (bandwidth > 7901250) return FALSE; return TRUE; } return FALSE; } else { unsigned width, height, refresh, dClock; float mClock, memEfficiency, needBandWidth, totalBandWidth; switch (pVia->MemClk) { case VIA_MEM_SDR100: mClock = 50; /*HW base on 128 bit */ memEfficiency = (float)SINGLE_3205_100; break; case VIA_MEM_SDR133: mClock = 66.5; memEfficiency = (float)SINGLE_3205_100; break; case VIA_MEM_DDR200: mClock = 100; memEfficiency = (float)SINGLE_3205_100; break; case VIA_MEM_DDR266: mClock = 133; memEfficiency = (float)SINGLE_3205_133; break; case VIA_MEM_DDR333: mClock = 166; memEfficiency = (float)SINGLE_3205_133; break; case VIA_MEM_DDR400: mClock = 200; memEfficiency = (float)SINGLE_3205_133; break; case VIA_MEM_DDR533: mClock = 266; memEfficiency = (float)SINGLE_3205_133; break; case VIA_MEM_DDR667: mClock = 333; memEfficiency = (float)SINGLE_3205_133; break; case VIA_MEM_DDR800: mClock = 400; memEfficiency = (float)SINGLE_3205_133; break; case VIA_MEM_DDR1066: mClock = 533; memEfficiency = (float)SINGLE_3205_133; break; default: ErrorF("Unknow DRAM Type!\n"); mClock = 166; memEfficiency = (float)SINGLE_3205_133; break; } width = mode->HDisplay; height = mode->VDisplay; refresh = mode->VRefresh; if (refresh==0) { refresh=60; ErrorF("Unable to fetch vertical refresh value, needed for bandwidth calculation.\n"); } /* * Approximative, VERY conservative formula in some cases. * This formula and the one below are derived analyzing the * tables present in VIA's own drivers. They may reject the over- * lay in some cases where VIA's driver don't. */ dClock = (width * height * refresh) / 680000; if (dClock) { needBandWidth = (float)(((pScrn->bitsPerPixel >> 3) + VIDEO_BPP) * dClock); totalBandWidth = (float)(mClock * 16. * memEfficiency); DBG_DD(ErrorF(" via_xv.c : cBitsPerPel= %d : \n", pScrn->bitsPerPixel)); DBG_DD(ErrorF(" via_xv.c : Video_Bpp= %d : \n", VIDEO_BPP)); DBG_DD(ErrorF(" via_xv.c : refresh = %d : \n", refresh)); DBG_DD(ErrorF(" via_xv.c : dClock= %d : \n", dClock)); DBG_DD(ErrorF(" via_xv.c : mClk= %f : \n", mClock)); DBG_DD(ErrorF(" via_xv.c : memEfficiency= %f : \n", memEfficiency)); if (needBandWidth < totalBandWidth) return TRUE; ErrorF(" via_xv.c : needBandwidth= %f : \n", needBandWidth); ErrorF(" via_xv.c : totalBandwidth= %f : \n", totalBandWidth); } return FALSE; } return FALSE; } static const char *viaXvErrMsg[xve_numerr] = { "No Error.", "Bandwidth is insufficient. Check bios memory settings.", "PCI DMA blit failed. You probably encountered a bug.", "Not enough resources to complete the request. Probably out of memory.", "General Error. I wish I could be more specific.", "Wrong adaptor used. Try another port number." }; static void viaXvError(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, XvError error) { if (error == xve_none) { pPriv->xvErr = xve_none; return; } if (error == pPriv->xvErr) { return; } pPriv->xvErr = error; xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[Xv] Port %d: %s\n", pPriv->xv_portnum, viaXvErrMsg[error]); } static void viaResetVideo(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vmmtr viaVidEng = (vmmtr) (pVia->MapBase + 0x200); DBG_DD(ErrorF(" via_xv.c : viaResetVideo: \n")); viaVidEng->video1_ctl = 0; viaVidEng->video3_ctl = 0; viaVidEng->compose = V1_COMMAND_FIRE; viaVidEng->compose = V3_COMMAND_FIRE; viaVidEng->color_key = 0x821; viaVidEng->snd_color_key = 0x821; } void viaSaveVideo(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vmmtr viaVidEng = (vmmtr) (pVia->MapBase + 0x200); DBG_DD(ErrorF(" via_xv.c : viaSaveVideo : \n")); /* Save video registers */ memcpy(pVia->VideoRegs, (void*)viaVidEng, sizeof(video_via_regs)); pVia->dwV1 = ((vmmtr) viaVidEng)->video1_ctl; pVia->dwV3 = ((vmmtr) viaVidEng)->video3_ctl; viaVidEng->video1_ctl = 0; viaVidEng->video3_ctl = 0; viaVidEng->compose = V1_COMMAND_FIRE; viaVidEng->compose = V3_COMMAND_FIRE; } void viaRestoreVideo(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vmmtr viaVidEng = (vmmtr) (pVia->MapBase + 0x200); video_via_regs *localVidEng = pVia->VideoRegs; DBG_DD(ErrorF(" via_xv.c : viaRestoreVideo : \n")); /* Restore video registers */ /* flush restored video engines' setting to MapBase */ viaVidEng->alphawin_hvstart = localVidEng->alphawin_hvstart; viaVidEng->alphawin_size = localVidEng->alphawin_size; viaVidEng->alphawin_ctl = localVidEng->alphawin_ctl; viaVidEng->alphafb_stride = localVidEng->alphafb_stride; viaVidEng->color_key = localVidEng->color_key; viaVidEng->alphafb_addr = localVidEng->alphafb_addr; viaVidEng->chroma_low = localVidEng->chroma_low; viaVidEng->chroma_up = localVidEng->chroma_up; viaVidEng->interruptflag = localVidEng->interruptflag; if (pVia->ChipId != PCI_CHIP_VT3314) { /*VT3314 only has V3*/ viaVidEng->video1_ctl = localVidEng->video1_ctl; viaVidEng->video1_fetch = localVidEng->video1_fetch; viaVidEng->video1y_addr1 = localVidEng->video1y_addr1; viaVidEng->video1_stride = localVidEng->video1_stride; viaVidEng->video1_hvstart = localVidEng->video1_hvstart; viaVidEng->video1_size = localVidEng->video1_size; viaVidEng->video1y_addr2 = localVidEng->video1y_addr2; viaVidEng->video1_zoom = localVidEng->video1_zoom; viaVidEng->video1_mictl = localVidEng->video1_mictl; viaVidEng->video1y_addr0 = localVidEng->video1y_addr0; viaVidEng->video1_fifo = localVidEng->video1_fifo; viaVidEng->video1y_addr3 = localVidEng->video1y_addr3; viaVidEng->v1_source_w_h = localVidEng->v1_source_w_h; viaVidEng->video1_CSC1 = localVidEng->video1_CSC1; viaVidEng->video1_CSC2 = localVidEng->video1_CSC2; /* Fix cursor garbage after suspend for VX855 and VX900 (#405) */ /* 0x2E4 T Signature Data Result 1 */ viaVidEng->video1u_addr1 = localVidEng->video1u_addr1; /* 0x2E8 HI for Primary Display FIFO Control Signal */ viaVidEng->video1u_addr2 = localVidEng->video1u_addr2; /* 0x2EC HI for Primary Display FIFO Transparent color */ viaVidEng->video1u_addr3 = localVidEng->video1u_addr3; /* 0x2F0 HI for Primary Display Control Signal */ viaVidEng->video1v_addr0 = localVidEng->video1v_addr0; /* 0x2F4 HI for Primary Display Frame Buffer Starting Address */ viaVidEng->video1v_addr1 = localVidEng->video1v_addr1; /* 0x2F8 HI for Primary Display Horizontal and Vertical Start */ viaVidEng->video1v_addr2 = localVidEng->video1v_addr2; /* 0x2FC HI for Primary Display Center Offset */ viaVidEng->video1v_addr3 = localVidEng->video1v_addr3; } viaVidEng->snd_color_key = localVidEng->snd_color_key; viaVidEng->v3alpha_prefifo = localVidEng->v3alpha_prefifo; viaVidEng->v3alpha_fifo = localVidEng->v3alpha_fifo; viaVidEng->video3_CSC2 = localVidEng->video3_CSC2; viaVidEng->video3_CSC2 = localVidEng->video3_CSC2; viaVidEng->v3_source_width = localVidEng->v3_source_width; viaVidEng->video3_ctl = localVidEng->video3_ctl; viaVidEng->video3_addr0 = localVidEng->video3_addr0; viaVidEng->video3_addr1 = localVidEng->video3_addr1; viaVidEng->video3_stride = localVidEng->video3_stride; viaVidEng->video3_hvstart = localVidEng->video3_hvstart; viaVidEng->video3_size = localVidEng->video3_size; viaVidEng->v3alpha_fetch = localVidEng->v3alpha_fetch; viaVidEng->video3_zoom = localVidEng->video3_zoom; viaVidEng->video3_mictl = localVidEng->video3_mictl; viaVidEng->video3_CSC1 = localVidEng->video3_CSC1; viaVidEng->video3_CSC2 = localVidEng->video3_CSC2; viaVidEng->compose = localVidEng->compose; viaVidEng->video3_ctl = pVia->dwV3; if (pVia->ChipId != PCI_CHIP_VT3314) { viaVidEng->video1_ctl = pVia->dwV1; viaVidEng->compose = V1_COMMAND_FIRE; } viaVidEng->compose = V3_COMMAND_FIRE; } void viaExitVideo(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vmmtr viaVidEng = (vmmtr) (pVia->MapBase + 0x200); XF86VideoAdaptorPtr curAdapt; int i, j, numPorts; DBG_DD(ErrorF(" via_xv.c : viaExitVideo : \n")); #ifdef HAVE_DRI ViaCleanupXVMC(pScrn, viaAdaptPtr, XV_ADAPT_NUM); #endif viaVidEng->video1_ctl = 0; viaVidEng->video3_ctl = 0; viaVidEng->compose = V1_COMMAND_FIRE; viaVidEng->compose = V3_COMMAND_FIRE; /* * Free all adaptor info allocated in viaInitVideo. */ for (i = 0; i < XV_ADAPT_NUM; ++i) { curAdapt = viaAdaptPtr[i]; if (curAdapt) { if (curAdapt->pPortPrivates) { if (curAdapt->pPortPrivates->ptr) { numPorts = numAdaptPort[i]; for (j = 0; j < numPorts; ++j) { viaStopVideo(pScrn, (viaPortPrivPtr) curAdapt->pPortPrivates->ptr + j, TRUE); } free(curAdapt->pPortPrivates->ptr); } free(curAdapt->pPortPrivates); } free(curAdapt); } } if (allAdaptors) free(allAdaptors); } void viaInitVideo(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); XF86VideoAdaptorPtr *adaptors, *newAdaptors; VIAPtr pVia = VIAPTR(pScrn); int num_adaptors, num_new; DBG_DD(ErrorF(" via_xv.c : viaInitVideo, Screen[%d]\n", pScrn->scrnIndex)); allAdaptors = NULL; newAdaptors = NULL; num_new = 0; pVia->useDmaBlit = FALSE; #ifdef HAVE_DRI pVia->useDmaBlit = (pVia->directRenderingType == DRI_1) && ((pVia->Chipset == VIA_CLE266) || (pVia->Chipset == VIA_KM400) || (pVia->Chipset == VIA_K8M800) || (pVia->Chipset == VIA_PM800) || (pVia->Chipset == VIA_P4M800PRO) || (pVia->Chipset == VIA_K8M890) || (pVia->Chipset == VIA_P4M900) || (pVia->Chipset == VIA_CX700) || (pVia->Chipset == VIA_VX800) || (pVia->Chipset == VIA_VX855) || (pVia->Chipset == VIA_VX900) || (pVia->Chipset == VIA_P4M890)); if ((pVia->drmVerMajor < 2) || ((pVia->drmVerMajor == 2) && (pVia->drmVerMinor < 9))) pVia->useDmaBlit = FALSE; #endif pVia->useDmaBlit = pVia->useDmaBlit && pVia->dmaXV; if (pVia->useDmaBlit) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[Xv] Using PCI DMA for Xv image transfer.\n"); if (!viaFastVidCpy) viaFastVidCpy = viaVidCopyInit("video", pScreen); if ((pVia->Chipset == VIA_CLE266) || (pVia->Chipset == VIA_KM400) || (pVia->Chipset == VIA_K8M800) || (pVia->Chipset == VIA_PM800) || (pVia->Chipset == VIA_P4M800PRO) || (pVia->Chipset == VIA_K8M890) || (pVia->Chipset == VIA_P4M900) || (pVia->Chipset == VIA_CX700) || (pVia->Chipset == VIA_P4M890) || (pVia->Chipset == VIA_VX800) || (pVia->Chipset == VIA_VX855 || (pVia->Chipset == VIA_VX900))) { num_new = viaSetupAdaptors(pScreen, &newAdaptors); num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); } else { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[Xv] Unsupported Chipset. X video functionality disabled.\n"); num_adaptors = 0; memset(viaAdaptPtr, 0, sizeof(viaAdaptPtr)); } DBG_DD(ErrorF(" via_xv.c : num_adaptors : %d\n", num_adaptors)); if (newAdaptors) { allAdaptors = malloc((num_adaptors + num_new) * sizeof(XF86VideoAdaptorPtr *)); if (allAdaptors) { if (num_adaptors) memcpy(allAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr)); memcpy(allAdaptors + num_adaptors, newAdaptors, num_new * sizeof(XF86VideoAdaptorPtr)); num_adaptors += num_new; } } if (num_adaptors) { xf86XVScreenInit(pScreen, allAdaptors, num_adaptors); #ifdef HAVE_DRI ViaInitXVMC(pScreen); #endif viaSetColorSpace(pVia, 0, 0, 0, 0, TRUE); pVia->swov.panning_x = 0; pVia->swov.panning_y = 0; pVia->swov.oldPanningX = 0; pVia->swov.oldPanningY = 0; } } static unsigned viaSetupAdaptors(ScreenPtr pScreen, XF86VideoAdaptorPtr ** adaptors) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); int i, j, usedPorts, numPorts; viaPortPrivRec *viaPortPriv; DevUnion *pdevUnion; DBG_DD(ErrorF(" via_xv.c : viaSetupAdaptors (viaSetupImageVideo): \n")); xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); xvContrast = MAKE_ATOM("XV_CONTRAST"); xvColorKey = MAKE_ATOM("XV_COLORKEY"); xvHue = MAKE_ATOM("XV_HUE"); xvSaturation = MAKE_ATOM("XV_SATURATION"); xvAutoPaint = MAKE_ATOM("XV_AUTOPAINT_COLORKEY"); *adaptors = NULL; usedPorts = 0; for (i = 0; i < XV_ADAPT_NUM; i++) { if (!(viaAdaptPtr[i] = xf86XVAllocateVideoAdaptorRec(pScrn))) return 0; numPorts = numAdaptPort[i]; viaPortPriv = (viaPortPrivPtr) xnfcalloc(numPorts, sizeof(viaPortPrivRec)); pdevUnion = (DevUnion *) xnfcalloc(numPorts, sizeof(DevUnion)); if (i == XV_ADAPT_SWOV) { /* Overlay engine */ viaAdaptPtr[i]->type = XvInputMask | XvWindowMask | XvImageMask | XvVideoMask | XvStillMask; viaAdaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; } else { viaAdaptPtr[i]->type = XvInputMask | XvWindowMask | XvVideoMask; viaAdaptPtr[i]->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; } viaAdaptPtr[i]->name = XvAdaptorName[i]; viaAdaptPtr[i]->nEncodings = 1; viaAdaptPtr[i]->pEncodings = DummyEncoding; viaAdaptPtr[i]->nFormats = sizeof(FormatsG) / sizeof(FormatsG[0]); viaAdaptPtr[i]->pFormats = FormatsG; /* The adapter can handle 1 port simultaneously */ viaAdaptPtr[i]->nPorts = numPorts; viaAdaptPtr[i]->pPortPrivates = pdevUnion; viaAdaptPtr[i]->pPortPrivates->ptr = (pointer) viaPortPriv; viaAdaptPtr[i]->nAttributes = NUM_ATTRIBUTES_G; viaAdaptPtr[i]->pAttributes = AttributesG; viaAdaptPtr[i]->nImages = NUM_IMAGES_G; viaAdaptPtr[i]->pImages = ImagesG; viaAdaptPtr[i]->PutVideo = NULL; viaAdaptPtr[i]->StopVideo = viaStopVideo; viaAdaptPtr[i]->QueryBestSize = viaQueryBestSize; viaAdaptPtr[i]->GetPortAttribute = viaGetPortAttribute; viaAdaptPtr[i]->SetPortAttribute = viaSetPortAttribute; viaAdaptPtr[i]->PutImage = viaPutImage; 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; #ifdef X_USE_REGION_NULL REGION_NULL(pScreen, &viaPortPriv[j].clip); #else REGION_INIT(pScreen, &viaPortPriv[j].clip, NullBox, 1); #endif } usedPorts += j; #ifdef HAVE_DRI viaXvMCInitXv(pScrn, viaAdaptPtr[i]); #endif } /* End of for */ viaResetVideo(pScrn); *adaptors = viaAdaptPtr; return XV_ADAPT_NUM; } static void viaStopVideo(ScrnInfoPtr pScrn, pointer data, Bool exit) { VIAPtr pVia = VIAPTR(pScrn); viaPortPrivPtr pPriv = (viaPortPrivPtr) data; DBG_DD(ErrorF(" via_xv.c : viaStopVideo: exit=%d\n", exit)); REGION_EMPTY(pScrn->pScreen, &pPriv->clip); ViaOverlayHide(pScrn); if (exit) { ViaSwovSurfaceDestroy(pScrn, pPriv); if (pPriv->dmaBounceBuffer) free(pPriv->dmaBounceBuffer); pPriv->dmaBounceBuffer = 0; pPriv->dmaBounceStride = 0; pPriv->dmaBounceLines = 0; pVia->dwFrameNum = 0; pPriv->old_drw_x = 0; pPriv->old_drw_y = 0; pPriv->old_drw_w = 0; pPriv->old_drw_h = 0; } } static int viaSetPortAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 value, pointer data) { VIAPtr pVia = VIAPTR(pScrn); vmmtr viaVidEng = (vmmtr) (pVia->MapBase + 0x200); viaPortPrivPtr pPriv = (viaPortPrivPtr) data; int attr, avalue; DBG_DD(ErrorF(" via_xv.c : viaSetPortAttribute : \n")); /* Color Key */ if (attribute == xvColorKey) { DBG_DD(ErrorF(" V4L Disable xvColorKey = %08lx\n", value)); pPriv->colorKey = value; /* All assume color depth is 16 */ value &= 0x00FFFFFF; viaVidEng->color_key = value; viaVidEng->snd_color_key = value; REGION_EMPTY(pScrn->pScreen, &pPriv->clip); DBG_DD(ErrorF(" V4L Disable done xvColorKey = %08lx\n", value)); } else if (attribute == xvAutoPaint) { pPriv->autoPaint = value; DBG_DD(ErrorF(" xvAutoPaint = %08lx\n", value)); /* Color Control */ } else if (attribute == xvBrightness || attribute == xvContrast || attribute == xvSaturation || attribute == xvHue) { if (attribute == xvBrightness) { DBG_DD(ErrorF(" xvBrightness = %08ld\n", value)); pPriv->brightness = value; } if (attribute == xvContrast) { DBG_DD(ErrorF(" xvContrast = %08ld\n", value)); pPriv->contrast = value; } if (attribute == xvSaturation) { DBG_DD(ErrorF(" xvSaturation = %08ld\n", value)); pPriv->saturation = value; } if (attribute == xvHue) { DBG_DD(ErrorF(" xvHue = %08ld\n", value)); pPriv->hue = value; } viaSetColorSpace(pVia, pPriv->hue, pPriv->saturation, pPriv->brightness, pPriv->contrast, FALSE); } else { DBG_DD(ErrorF (" via_xv.c : viaSetPortAttribute : is not supported the attribute")); return BadMatch; } /* attr,avalue hardware processing goes here */ (void)attr; (void)avalue; return Success; } static int viaGetPortAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 * value, pointer data) { viaPortPrivPtr pPriv = (viaPortPrivPtr) data; DBG_DD(ErrorF(" via_xv.c : viaGetPortAttribute : port %d %ld\n", pPriv->xv_portnum, attribute)); *value = 0; if (attribute == xvColorKey) { *value = (INT32) pPriv->colorKey; DBG_DD(ErrorF(" via_xv.c : ColorKey 0x%lx\n", pPriv->colorKey)); } else if (attribute == xvAutoPaint) { *value = (INT32) pPriv->autoPaint; DBG_DD(ErrorF(" AutoPaint = %08ld\n", *value)); /* Color Control */ } else if (attribute == xvBrightness || attribute == xvContrast || attribute == xvSaturation || attribute == xvHue) { if (attribute == xvBrightness) { *value = pPriv->brightness; DBG_DD(ErrorF(" xvBrightness = %08ld\n", *value)); } if (attribute == xvContrast) { *value = pPriv->contrast; DBG_DD(ErrorF(" xvContrast = %08ld\n", *value)); } if (attribute == xvSaturation) { *value = pPriv->saturation; DBG_DD(ErrorF(" xvSaturation = %08ld\n", *value)); } if (attribute == xvHue) { *value = pPriv->hue; DBG_DD(ErrorF(" xvHue = %08ld\n", *value)); } } else { DBG_DD(ErrorF(" via_xv.c : viaGetPortAttribute : is not supported the attribute\n")); /*return BadMatch */; } return Success; } static void viaQueryBestSize(ScrnInfoPtr pScrn, Bool motion, short vid_w, short vid_h, short drw_w, short drw_h, unsigned int *p_w, unsigned int *p_h, pointer data) { DBG_DD(ErrorF(" via_xv.c : viaQueryBestSize :\n")); *p_w = drw_w; *p_h = drw_h; if (*p_w > 2048) *p_w = 2048; } /* * To do SW Flip */ static void Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, unsigned long DisplayBufferIndex) { unsigned long proReg = 0; unsigned count = 50000; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; switch (fourcc) { case FOURCC_UYVY: case FOURCC_YUY2: case FOURCC_RV15: case FOURCC_RV16: case FOURCC_RV32: while ((VIAGETREG(HQV_CONTROL + proReg) & HQV_SW_FLIP) && --count); VIASETREG(HQV_SRC_STARTADDR_Y + proReg, pVia->swov.SWDevice.dwSWPhysicalAddr[DisplayBufferIndex]); VIASETREG(HQV_CONTROL + proReg, (VIAGETREG(HQV_CONTROL + proReg) & ~HQV_FLIP_ODD) | HQV_SW_FLIP | HQV_FLIP_STATUS); break; case FOURCC_YV12: case FOURCC_I420: default: while ((VIAGETREG(HQV_CONTROL + proReg) & HQV_SW_FLIP) && --count); VIASETREG(HQV_SRC_STARTADDR_Y + proReg, pVia->swov.SWDevice.dwSWPhysicalAddr[DisplayBufferIndex]); if (pVia->VideoEngine == VIDEO_ENGINE_CME) { VIASETREG(HQV_SRC_STARTADDR_U + proReg, pVia->swov.SWDevice.dwSWCrPhysicalAddr[DisplayBufferIndex]); } else { VIASETREG(HQV_SRC_STARTADDR_U, pVia->swov.SWDevice.dwSWCbPhysicalAddr[DisplayBufferIndex]); VIASETREG(HQV_SRC_STARTADDR_V, pVia->swov.SWDevice.dwSWCrPhysicalAddr[DisplayBufferIndex]); } VIASETREG(HQV_CONTROL + proReg, (VIAGETREG(HQV_CONTROL + proReg) & ~HQV_FLIP_ODD) | HQV_SW_FLIP | HQV_FLIP_STATUS); break; } } 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. */ static void nv12cp(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, TRUE); nv12Blit(dst + dstPitch * h, src + srcUOffset, src + srcVOffset, w >> 1, w >>1, dstPitch, h >> 1); } #ifdef HAVE_DRI static int viaDmaBlitImage(VIAPtr pVia, viaPortPrivPtr pPort, unsigned char *src, CARD32 dst, unsigned width, unsigned height, unsigned lumaStride, int id) { 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; unsigned bounceLines; unsigned size; int err = 0; Bool nv12Conversion; bounceBuffer = ((unsigned long)src & 15); nv12Conversion = (pVia->VideoEngine == VIDEO_ENGINE_CME && (id == FOURCC_YV12 || id == FOURCC_I420)); switch (id) { case FOURCC_YUY2: case FOURCC_RV15: case FOURCC_RV16: bounceStride = ALIGN_TO(2 * width, 16); bounceLines = height; break; case FOURCC_RV32: bounceStride = ALIGN_TO(4 * width, 16); bounceLines = height; break; case FOURCC_YV12: case FOURCC_I420: default: bounceStride = ALIGN_TO(width, 16); bounceLines = height; break; } if (bounceBuffer || nv12Conversion) { if (!pPort->dmaBounceBuffer || pPort->dmaBounceStride != bounceStride || pPort->dmaBounceLines != bounceLines) { if (pPort->dmaBounceBuffer) { free(pPort->dmaBounceBuffer); pPort->dmaBounceBuffer = 0; } size = bounceStride * bounceLines + 16; if (id == FOURCC_YV12 || id == FOURCC_I420) size += ALIGN_TO(bounceStride >> 1, 16) * bounceLines; pPort->dmaBounceBuffer = (unsigned char *)malloc(size); pPort->dmaBounceLines = bounceLines; pPort->dmaBounceStride = bounceStride; } } bounceBase = (unsigned char *)ALIGN_TO((unsigned long)(pPort->dmaBounceBuffer), 16); base = (bounceBuffer) ? bounceBase : src; if (bounceBuffer) { (*viaFastVidCpy) (base, src, bounceStride, bounceStride >> 1, height, 1); } blit.num_lines = height; blit.line_length = bounceStride; blit.fb_addr = dst; blit.fb_stride = lumaStride; blit.mem_addr = base; blit.mem_stride = bounceStride; blit.to_fb = 1; #ifdef XV_DEBUG ErrorF ("Addr: 0x%lx, Offset 0x%lx\n Fb_stride: %u, Mem_stride: %u\n width: %u num_lines: %u\n", (unsigned long)blit.mem_addr, (unsigned long)blit.fb_addr, (unsigned)blit.fb_stride, (unsigned)blit.mem_stride, (unsigned)blit.line_length, (unsigned)blit.num_lines); #endif while (-EAGAIN == (err = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_DMA_BLIT, &blit, sizeof(blit)))) ; if (err < 0) return -1; lumaSync = blit.sync; if (id == FOURCC_YV12 || id == FOURCC_I420) { unsigned tmp = ALIGN_TO(width >> 1, 16); if (nv12Conversion) { nv12Blit(bounceBase + bounceStride * height, src + bounceStride * height + tmp * (height >> 1), src + bounceStride * height, width >> 1, tmp, bounceStride, height >> 1); } else if (bounceBuffer) { (*viaFastVidCpy) (base + bounceStride * height, src + bounceStride * height, tmp, tmp >> 1, height, 1); } if (nv12Conversion) { blit.num_lines = height >> 1; blit.line_length = bounceStride; blit.mem_addr = bounceBase + bounceStride * height; blit.fb_stride = lumaStride; blit.mem_stride = bounceStride; } else { blit.num_lines = height; blit.line_length = tmp; blit.mem_addr = base + bounceStride * height; blit.fb_stride = lumaStride >> 1; blit.mem_stride = tmp; } blit.fb_addr = dst + lumaStride * height; blit.to_fb = 1; while (-EAGAIN == (err = drmCommandWriteRead(pVia->drmmode.fd, DRM_VIA_DMA_BLIT, &blit, sizeof(blit)))); if (err < 0) return -1; } while (-EAGAIN == (err = drmCommandWrite(pVia->drmmode.fd, DRM_VIA_BLIT_SYNC, chromaSync, sizeof(*chromaSync)))) ; if (err < 0) return -1; return Success; } #endif /* * The source rectangle of the video is defined by (src_x, src_y, src_w, src_h). * The dest rectangle of the video is defined by (drw_x, drw_y, drw_w, drw_h). * id is a fourcc code for the format of the video. * buf is the pointer to the source data in system memory. * width and height are the w/h of the source data. * If "sync" is TRUE, then we must be finished with *buf at the point of return * (which we always are). * clipBoxes is the clipping region in screen space. * data is a pointer to our port private. * pDraw is a Drawable, which might not be the screen in the case of * compositing. It's a new argument to the function in the 1.1 server. */ static int viaPutImage(ScrnInfoPtr pScrn, short src_x, short src_y, short drw_x, short drw_y, short src_w, short src_h, short drw_w, short drw_h, int id, unsigned char *buf, short width, short height, Bool sync, RegionPtr clipBoxes, pointer data, DrawablePtr pDraw) { VIAPtr pVia = VIAPTR(pScrn); viaPortPrivPtr pPriv = (viaPortPrivPtr) data; xf86CrtcPtr crtc = NULL; unsigned long retCode; # ifdef XV_DEBUG ErrorF(" via_xv.c : viaPutImage : called, Screen[%d]\n", pScrn->scrnIndex); ErrorF(" via_xv.c : FourCC=0x%x width=%d height=%d sync=%d\n", id, width, height, sync); ErrorF (" via_xv.c : src_x=%d src_y=%d src_w=%d src_h=%d colorkey=0x%lx\n", src_x, src_y, src_w, src_h, pPriv->colorKey); ErrorF(" via_xv.c : drw_x=%d drw_y=%d drw_w=%d drw_h=%d\n", drw_x, drw_y, drw_w, drw_h); # endif /* Find out which CRTC the surface will belong to */ crtc = window_belongs_to_crtc(pScrn, drw_x, drw_y, drw_w, drw_h); if (!crtc) { DBG_DD(ErrorF(" via_xv.c : No usable CRTC\n")); viaXvError(pScrn, pPriv, xve_adaptor); return BadAlloc; } switch (pPriv->xv_adaptor) { case XV_ADAPT_SWOV: { DDUPDATEOVERLAY UpdateOverlay_Video; LPDDUPDATEOVERLAY lpUpdateOverlay = &UpdateOverlay_Video; int dstPitch; unsigned long dwUseExtendedFIFO = 0; DBG_DD(ErrorF(" via_xv.c : : S/W Overlay! \n")); /* Allocate video memory(CreateSurface), * add codes to judge if need to re-create surface */ if ((pPriv->old_src_w != src_w) || (pPriv->old_src_h != src_h)) { ViaSwovSurfaceDestroy(pScrn, pPriv); } if (Success != (retCode = ViaSwovSurfaceCreate(pScrn, pPriv, id, width, height))) { DBG_DD(ErrorF (" : Fail to Create SW Video Surface\n")); viaXvError(pScrn, pPriv, xve_mem); return retCode; } /* Copy image data from system memory to video memory * TODO: use DRM's DMA feature to accelerate data copy */ if (id != FOURCC_XVMC) { dstPitch = pVia->swov.SWDevice.dwPitch; if (pVia->useDmaBlit) { #ifdef HAVE_DRI if (viaDmaBlitImage(pVia, pPriv, buf, (CARD32) pVia->swov.SWDevice.dwSWPhysicalAddr[pVia->dwFrameNum & 1], width, height, dstPitch, id)) { viaXvError(pScrn, pPriv, xve_dmablit); return BadAccess; } #endif } else { switch (id) { case FOURCC_I420: if (pVia->VideoEngine == VIDEO_ENGINE_CME) { nv12cp(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 1); } else { (*viaFastVidCpy)(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 0); } break; case FOURCC_YV12: if (pVia->VideoEngine == VIDEO_ENGINE_CME) { nv12cp(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 0); } else { (*viaFastVidCpy)(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 0); } break; case FOURCC_RV32: (*viaFastVidCpy) (pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width << 1, height, 1); break; case FOURCC_UYVY: case FOURCC_YUY2: case FOURCC_RV15: case FOURCC_RV16: default: (*viaFastVidCpy) (pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 1); break; } } } /* If there is bandwidth issue, block the H/W overlay */ if (!(DecideOverlaySupport(crtc))) { DBG_DD(ErrorF (" via_xv.c : Xv Overlay rejected due to insufficient " "memory bandwidth.\n")); viaXvError(pScrn, pPriv, xve_bandwidth); return BadAlloc; } /* * fill video overlay parameter */ lpUpdateOverlay->SrcLeft = src_x; lpUpdateOverlay->SrcTop = src_y; lpUpdateOverlay->SrcRight = src_x + src_w; lpUpdateOverlay->SrcBottom = src_y + src_h; lpUpdateOverlay->DstLeft = drw_x; lpUpdateOverlay->DstTop = drw_y; lpUpdateOverlay->DstRight = drw_x + drw_w; lpUpdateOverlay->DstBottom = drw_y + drw_h; lpUpdateOverlay->dwFlags = DDOVER_KEYDEST; if (pScrn->bitsPerPixel == 8) { lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey & 0xff; } else { lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey; } /* If use extend FIFO mode */ if (pScrn->currentMode->HDisplay > 1024) { dwUseExtendedFIFO = 1; } if (FOURCC_XVMC != id) { /* * XvMC flipping is done in the client lib. */ DBG_DD(ErrorF(" : Flip\n")); Flip(pVia, pPriv, id, pVia->dwFrameNum & 1); } pVia->dwFrameNum++; /* If the dest rec. & extendFIFO doesn't change, don't do UpdateOverlay * unless the surface clipping has changed */ if ((pPriv->old_drw_x == drw_x) && (pPriv->old_drw_y == drw_y) && (pPriv->old_drw_w == drw_w) && (pPriv->old_drw_h == drw_h) && (pPriv->old_src_x == src_x) && (pPriv->old_src_y == src_y) && (pPriv->old_src_w == src_w) && (pPriv->old_src_h == src_h) && (pVia->old_dwUseExtendedFIFO == dwUseExtendedFIFO) && (pVia->VideoStatus & VIDEO_SWOV_ON) && REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) { DBG_DD(ErrorF(" via_xv.c : don't do UpdateOverlay! \n")); viaXvError(pScrn, pPriv, xve_none); return Success; } pPriv->old_src_x = src_x; pPriv->old_src_y = src_y; pPriv->old_src_w = src_w; pPriv->old_src_h = src_h; pPriv->old_drw_x = drw_x; pPriv->old_drw_y = drw_y; pPriv->old_drw_w = drw_w; pPriv->old_drw_h = drw_h; pVia->old_dwUseExtendedFIFO = dwUseExtendedFIFO; pVia->VideoStatus |= VIDEO_SWOV_ON; /* BitBlt: Draw the colorkey rectangle */ if (!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) { REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes); if (pPriv->autoPaint) { if (pDraw->type == DRAWABLE_WINDOW) { xf86XVFillKeyHelperDrawable(pDraw, pPriv->colorKey, clipBoxes); DamageDamageRegion(pDraw, clipBoxes); } else { xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes); } } } else { DBG_DD(ErrorF(" via_xv.c : // No need to draw Colorkey!! \n")); } /* * Update video overlay */ if (!VIAVidUpdateOverlay(crtc, lpUpdateOverlay)) { DBG_DD(ErrorF (" via_xv.c : call v4l updateoverlay fail. \n")); } else { DBG_DD(ErrorF(" via_xv.c : PutImage done OK\n")); viaXvError(pScrn, pPriv, xve_none); return Success; } break; } default: DBG_DD(ErrorF(" via_xv.c : XVPort not supported\n")); viaXvError(pScrn, pPriv, xve_adaptor); break; } DBG_DD(ErrorF(" via_xv.c : PutImage done OK\n")); viaXvError(pScrn, pPriv, xve_none); return Success; } static int viaQueryImageAttributes(ScrnInfoPtr pScrn, int id, unsigned short *w, unsigned short *h, int *pitches, int *offsets) { int size, tmp; VIAPtr pVia = VIAPTR(pScrn); DBG_DD(ErrorF(" via_xv.c : viaQueryImageAttributes : FourCC=0x%x, ", id)); DBG_DD(ErrorF(" via_xv.c : Screen[%d], w=%d, h=%d\n", pScrn->scrnIndex, *w, *h)); if ((!w) || (!h)) return 0; if (*w > VIA_MAX_XVIMAGE_X) *w = VIA_MAX_XVIMAGE_X; if (*h > VIA_MAX_XVIMAGE_Y) *h = VIA_MAX_XVIMAGE_Y; *w = (*w + 1) & ~1; if (offsets) offsets[0] = 0; switch (id) { case FOURCC_I420: case FOURCC_YV12: /*Planar format : YV12 -4:2:0 */ *h = (*h + 1) & ~1; size = *w; if (pVia->useDmaBlit) size = (size + 15) & ~15; if (pitches) pitches[0] = size; size *= *h; if (offsets) offsets[1] = size; tmp = (*w >> 1); if (pVia->useDmaBlit) tmp = (tmp + 15) & ~15; if (pitches) pitches[1] = pitches[2] = tmp; tmp *= (*h >> 1); size += tmp; if (offsets) offsets[2] = size; size += tmp; break; case FOURCC_XVMC: *h = (*h + 1) & ~1; #ifdef HAVE_DRI size = viaXvMCPutImageSize(pScrn); #else size = 0; #endif if (pitches) pitches[0] = size; break; case FOURCC_AI44: case FOURCC_IA44: size = *w * *h; if (pitches) pitches[0] = *w; if (offsets) offsets[0] = 0; break; case FOURCC_RV32: size = *w << 2; if (pVia->useDmaBlit) size = (size + 15) & ~15; if (pitches) pitches[0] = size; size *= *h; break; case FOURCC_UYVY: /*Packed format : UYVY -4:2:2 */ case FOURCC_YUY2: /*Packed format : YUY2 -4:2:2 */ case FOURCC_RV15: case FOURCC_RV16: default: size = *w << 1; if (pVia->useDmaBlit) size = (size + 15) & ~15; if (pitches) pitches[0] = size; size *= *h; break; } if (pitches) DBG_DD(ErrorF(" pitches[0]=%d, pitches[1]=%d, pitches[2]=%d, ", pitches[0], pitches[1], pitches[2])); if (offsets) DBG_DD(ErrorF(" offsets[0]=%d, offsets[1]=%d, offsets[2]=%d, ", offsets[0], offsets[1], offsets[2])); DBG_DD(ErrorF(" width=%d, height=%d \n", *w, *h)); return size; } /* * */ void VIAVidAdjustFrame(ScrnInfoPtr pScrn, int x, int y) { VIAPtr pVia = VIAPTR(pScrn); pVia->swov.panning_x = x; 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. */ static void nv12Blit(unsigned char *nv12Chroma, const unsigned char *uBuffer, const unsigned char *vBuffer, unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines) { int x; int dstAdd; int srcAdd; dstAdd = dstPitch - (width << 1); srcAdd = srcPitch - width; while (lines--) { x = width; while (x > 3) { register CARD32 dst32, src32 = *((CARD32 *) vBuffer), src32_2 = *((CARD32 *) uBuffer); dst32 = (src32_2 & 0xff) | ((src32 & 0xff) << 8) | ((src32_2 & 0x0000ff00) << 8) | ((src32 & 0x0000ff00) << 16); *((CARD32 *) nv12Chroma) = dst32; nv12Chroma += 4; dst32 = ((src32_2 & 0x00ff0000) >> 16) | ((src32 & 0x00ff0000) >> 8) | ((src32_2 & 0xff000000) >> 8) | (src32 & 0xff000000); *((CARD32 *) nv12Chroma) = dst32; nv12Chroma += 4; x -= 4; vBuffer += 4; uBuffer += 4; } while (x--) { *nv12Chroma++ = *uBuffer++; *nv12Chroma++ = *vBuffer++; } nv12Chroma += dstAdd; vBuffer += srcAdd; uBuffer += srcAdd; } } #endif /* !XvExtension */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_xv.h000066400000000000000000000107241267025031400232650ustar00rootroot00000000000000/* * 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_VIDEO_H_ #define _VIA_VIDEO_H_ 1 /* * I N C L U D E S */ /*#define XV_DEBUG 1 write log msg to /var/log/XFree86.0.log */ #define COLOR_KEY 1 /* set color key value from driver layer */ #define HW_3123 /* Definition for VideoStatus */ #define VIDEO_NULL 0x00000000 #define VIDEO_SWOV_SURFACE_CREATED 0x00000001 #define VIDEO_SWOV_ON 0x00000002 #define SINGLE_3205_100 0.41 #define SINGLE_3205_133 0.70 #define VIDEO_BPP 2 #define V1_COMMAND_FIRE 0x80000000 /* V1 commands fire */ #define V3_COMMAND_FIRE 0x40000000 /* V3 commands fire */ typedef struct { CARD32 interruptflag; /* 200 */ CARD32 ramtab; /* 204 */ CARD32 alphawin_hvstart; /* 208 */ CARD32 alphawin_size; /* 20c */ CARD32 alphawin_ctl; /* 210 */ CARD32 crt_startaddr; /* 214 */ CARD32 crt_startaddr_2; /* 218 */ CARD32 alphafb_stride; /* 21c */ CARD32 color_key; /* 220 */ CARD32 alphafb_addr; /* 224 */ CARD32 chroma_low; /* 228 */ CARD32 chroma_up; /* 22c */ CARD32 video1_ctl; /* 230 */ CARD32 video1_fetch; /* 234 */ CARD32 video1y_addr1; /* 238 */ CARD32 video1_stride; /* 23c */ CARD32 video1_hvstart; /* 240 */ CARD32 video1_size; /* 244 */ CARD32 video1y_addr2; /* 248 */ CARD32 video1_zoom; /* 24c */ CARD32 video1_mictl; /* 250 */ CARD32 video1y_addr0; /* 254 */ CARD32 video1_fifo; /* 258 */ CARD32 video1y_addr3; /* 25c */ CARD32 hi_control; /* 260 */ CARD32 snd_color_key; /* 264 */ CARD32 v3alpha_prefifo; /* 268 */ CARD32 v1_source_w_h; /* 26c */ CARD32 hi_transparent_color; /* 270 */ CARD32 v_display_temp; /* 274 :No use */ CARD32 v3alpha_fifo; /* 278 */ CARD32 v3_source_width; /* 27c */ CARD32 dummy1; /* 280 */ CARD32 video1_CSC1; /* 284 */ CARD32 video1_CSC2; /* 288 */ CARD32 video1u_addr0; /* 28c */ CARD32 video1_opqctl; /* 290 */ CARD32 video3_opqctl; /* 294 */ CARD32 compose; /* 298 */ CARD32 dummy2; /* 29c */ CARD32 video3_ctl; /* 2a0 */ CARD32 video3_addr0; /* 2a4 */ CARD32 video3_addr1; /* 2a8 */ CARD32 video3_stride; /* 2ac */ CARD32 video3_hvstart; /* 2b0 */ CARD32 video3_size; /* 2b4 */ CARD32 v3alpha_fetch; /* 2b8 */ CARD32 video3_zoom; /* 2bc */ CARD32 video3_mictl; /* 2c0 */ CARD32 video3_CSC1; /* 2c4 */ CARD32 video3_CSC2; /* 2c8 */ CARD32 v3_display_temp; /* 2cc */ CARD32 reserved[5]; /* 2d0 */ CARD32 video1u_addr1; /* 2e4 */ CARD32 video1u_addr2; /* 2e8 */ CARD32 video1u_addr3; /* 2ec */ CARD32 video1v_addr0; /* 2f0 */ CARD32 video1v_addr1; /* 2f4 */ CARD32 video1v_addr2; /* 2f8 */ CARD32 video1v_addr3; /* 2fc */ } video_via_regs; #define vmmtr volatile video_via_regs * #endif /* _VIA_VIDEO_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_xv_overlay.c000066400000000000000000002500351267025031400250220ustar00rootroot00000000000000/* * 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 "xf86.h" #include "xf86_OSproc.h" #ifdef HAVE_DRI #include "xf86drm.h" #include "via_drmclient.h" #include "via_drm.h" #endif #include "via_driver.h" #include #include /* * Warning: this file contains revision checks which are CLE266-specific. * There seems to be no checking present for KM400 or more recent devices. * * TODO: * - pVia->Chipset checking, of course * - move content of pVia->HWDiff into pVia->swov * - merge with CLEXF40040 */ /* * Old via_regrec code. */ #define VIDREG_BUFFER_SIZE 100 /* Number of entries in the VidRegBuffer. */ #define IN_VIDEO_DISPLAY (*((unsigned long volatile *)(pVia->MapBase + V_FLAGS)) & VBI_STATUS) #define VIA_FIRETIMEOUT 40000 enum HQV_CME_Regs { HQV_SDO_CTRL1, HQV_SDO_CTRL2, HQV_SDO_CTRL3, HQV_SDO_CTRL4 }; /* register offsets for VT3553/VX800 */ static const unsigned hqv_cme_regs[] = { [HQV_SDO_CTRL1] = HQV_SRC_DATA_OFFSET_CONTROL1, [HQV_SDO_CTRL2] = HQV_SRC_DATA_OFFSET_CONTROL2, [HQV_SDO_CTRL3] = HQV_SRC_DATA_OFFSET_CONTROL3, [HQV_SDO_CTRL4] = HQV_SRC_DATA_OFFSET_CONTROL4 }; /* register hqv offsets for new VT3409/VX855 */ static const unsigned hqv_cme_regs_409[] = { [HQV_SDO_CTRL1] = HQV_SRC_DATA_OFFSET_CTRL1_409, [HQV_SDO_CTRL2] = HQV_SRC_DATA_OFFSET_CTRL2_409, [HQV_SDO_CTRL3] = HQV_SRC_DATA_OFFSET_CTRL3_409, [HQV_SDO_CTRL4] = HQV_SRC_DATA_OFFSET_CTRL4_409 }; #define HQV_CME_REG(HWDiff, name) (HWDiff)->HQVCmeRegs[name] static void viaWaitVideoCommandFire(VIAPtr pVia) { /* * Uncached PCI reading throughput is about 9 MB/s; so 8 bytes/loop means about * 1M loops/second. We want to time out after 50 ms, which means 50000 loops. */ unsigned count = 50000; CARD32 volatile *pdwState = (CARD32 volatile *)(pVia->MapBase + V_COMPOSE_MODE); while (--count && ((*pdwState & V1_COMMAND_FIRE) || (*pdwState & V3_COMMAND_FIRE))) ; if (!count) { ErrorF("viaWaitVideoCommandFire: Timeout.\n"); } } static void viaWaitHQVFlip(VIAPtr pVia) { unsigned long proReg = 0; CARD32 volatile *pdwState; unsigned count = 50000; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; pdwState = (CARD32 volatile *)(pVia->MapBase + (HQV_CONTROL + proReg)); if (pVia->VideoEngine == VIDEO_ENGINE_CME) { while (--count && (*pdwState & HQV_SUBPIC_FLIP)); } else { while (--count && !(*pdwState & HQV_FLIP_STATUS)) ; } } static void viaWaitHQVFlipClear(VIAPtr pVia, unsigned long dwData) { 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); } } static void viaWaitVBI(VIAPtr pVia) { while (IN_VIDEO_DISPLAY) ; } static void viaWaitHQVDone(VIAPtr pVia) { CARD32 volatile *pdwState; unsigned long proReg = 0; unsigned count = 50000; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; pdwState = (CARD32 volatile *)(pVia->MapBase + (HQV_CONTROL + proReg)); if (pVia->swov.MPEG_ON) { while (--count && (*pdwState & HQV_SW_FLIP)) ; } } /* * Send all data in VidRegBuffer to the hardware. */ static void FlushVidRegBuffer(VIAPtr pVia) { unsigned int i; viaWaitVideoCommandFire(pVia); for (i = 0; i < pVia->VidRegCursor; i += 2) { VIASETREG(pVia->VidRegBuffer[i], pVia->VidRegBuffer[i + 1]); DBG_DD(ErrorF("FlushVideoRegs: [%i] %08lx %08lx\n", i >> 1, pVia->VidRegBuffer[i] + 0x200, pVia->VidRegBuffer[i + 1])); } /* BUG: (?) VIA never resets the cursor. * My fix is commented out for now, in case they had a reason for that. /A */ /* pVia->VidRegCursor = 0; */ } /* * Initialize and clear VidRegBuffer. */ static void ResetVidRegBuffer(VIAPtr pVia) { /* BUG: (Memory leak) This allocation may need have a corresponding free somewhere... /A */ if (!pVia->VidRegBuffer) pVia->VidRegBuffer = xnfcalloc(VIDREG_BUFFER_SIZE, sizeof(CARD32) * 2); pVia->VidRegCursor = 0; } /* * Save a video register and data in VidRegBuffer. */ static void SaveVideoRegister(VIAPtr pVia, CARD32 index, CARD32 data) { if (pVia->VidRegCursor >= VIDREG_BUFFER_SIZE) { DBG_DD(ErrorF("SaveVideoRegister: Out of video register space flushing")); FlushVidRegBuffer(pVia); ResetVidRegBuffer(pVia); } pVia->VidRegBuffer[pVia->VidRegCursor++] = index; pVia->VidRegBuffer[pVia->VidRegCursor++] = data; } /* * HW Difference Flag (moved here from via_hwdiff.c) * * These are the entries of HWDiff used in our code (currently): * CLE266Ax CLE266Cx KM400 K8M800 PM800 * ThreeHQVBuffer FALSE TRUE TRUE TRUE TRUE * HQVFetchByteUnit FALSE TRUE TRUE TRUE TRUE * SupportTwoColorKey FALSE TRUE FALSE FALSE TRUE * HQVInitPatch TRUE FALSE FALSE FALSE FALSE * HQVDisablePatch FALSE TRUE TRUE TRUE FALSE * * This is now up to date with CLEXF40040. All unused entries were removed. * The functions depending on this struct are untouched. */ void VIAVidHWDiffInit(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIAHWDiff *HWDiff = &pVia->HWDiff; switch (pVia->Chipset) { case VIA_CLE266: if (CLE266_REV_IS_AX(pVia->ChipRev)) { HWDiff->dwThreeHQVBuffer = VID_HWDIFF_FALSE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_FALSE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE; HWDiff->dwHQVInitPatch = VID_HWDIFF_TRUE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; } else { HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; } HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; break; case VIA_KM400: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; break; case VIA_K8M800: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; break; case VIA_PM800: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; HWDiff->HQVCmeRegs = hqv_cme_regs; break; case VIA_P4M800PRO: case VIA_P4M900: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; HWDiff->HQVCmeRegs = hqv_cme_regs; break; case VIA_K8M890: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_TRUE; HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; HWDiff->HQVCmeRegs = hqv_cme_regs; break; case VIA_P4M890: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_FALSE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_TRUE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; HWDiff->HQVCmeRegs = hqv_cme_regs; break; case VIA_CX700: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_FALSE; HWDiff->HQVCmeRegs = hqv_cme_regs; break; case VIA_VX800: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_TRUE; HWDiff->HQVCmeRegs = hqv_cme_regs; break; case VIA_VX855: case VIA_VX900: HWDiff->dwThreeHQVBuffer = VID_HWDIFF_TRUE; HWDiff->dwHQVFetchByteUnit = VID_HWDIFF_TRUE; HWDiff->dwSupportTwoColorKey = VID_HWDIFF_TRUE; HWDiff->dwHQVInitPatch = VID_HWDIFF_FALSE; HWDiff->dwHQVDisablePatch = VID_HWDIFF_FALSE; HWDiff->dwNeedV1Prefetch = VID_HWDIFF_FALSE; HWDiff->dwNewScaleCtl = VID_HWDIFF_TRUE; HWDiff->HQVCmeRegs = hqv_cme_regs_409; break; default: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "VIAVidHWDiffInit: Unhandled ChipSet.\n"); } } /* * Old via_overlay code. */ typedef struct _YCBCRREC { CARD32 dwY; CARD32 dwCB; CARD32 dwCR; } YCBCRREC; /* * Verify that using V1 bit definitions on V3 * is not broken in OverlayGetV1V3Format(). */ #if V1_COLORSPACE_SIGN != V3_COLORSPACE_SIGN #error "V1_COLORSPACE_SIGN != V3_COLORSPACE_SIGN" #endif #if V1_YUV422 != V3_YUV422 #error "V1_YUV422 != V3_YUV422" #endif #if V1_SWAP_HW_HQV != V3_SWAP_HW_HQV #error "V1_SWAP_HW_HQV != V3_SWAP_HW_HQV" #endif #if V1_RGB15 != V3_RGB15 #error "V1_RGB15 != V3_RGB15" #endif #if V1_RGB16 != V3_RGB16 #error "V1_RGB16 != V3_RGB16" #endif #if V1_RGB32 != V3_RGB32 #error "V1_RGB32 != V3_RGB32" #endif static BOOL viaOverlayGetV1V3Format(VIAPtr pVia, int vport, /* 1 or 3, as in V1 or V3 */ unsigned long videoFlag, unsigned long *pVidCtl, unsigned long *pHQVCtl) { if (videoFlag & VIDEO_HQV_INUSE) { switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: case FOURCC_I420: case FOURCC_XVMC: *pHQVCtl |= HQV_YUV420; break; case FOURCC_YUY2: *pHQVCtl |= HQV_YUV422; break; case FOURCC_RV32: *pVidCtl |= V1_RGB32; *pHQVCtl |= HQV_RGB32; break; case FOURCC_RV15: *pVidCtl |= V1_RGB15; *pHQVCtl |= HQV_RGB15; break; case FOURCC_RV16: *pVidCtl |= V1_RGB16; *pHQVCtl |= HQV_RGB16; break; default: DBG_DD(ErrorF("viaOverlayGetV1V3Format: " "Invalid FOURCC format (0x%lx).\n", pVia->swov.SrcFourCC)); return FALSE; } *pVidCtl |= V1_SWAP_HW_HQV; *pHQVCtl |= HQV_SRC_SW | HQV_ENABLE | HQV_SW_FLIP; } else { switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: case FOURCC_I420: case FOURCC_XVMC: if (vport == 1) { *pVidCtl |= V1_YCbCr420; } else { DBG_DD(ErrorF("viaOverlayGetV1V3Format: " "V3 does not support planar YUV.\n")); return FALSE; } break; case FOURCC_YUY2: *pVidCtl |= V1_YUV422; break; case FOURCC_RV32: case FOURCC_RV15: case FOURCC_RV16: ErrorF("viaOverlayGetV1V3Format: " "Can't display RGB video in this configuration.\n"); return FALSE; default: DBG_DD(ErrorF("viaOverlayGetV1V3Format: " "Invalid FOURCC format (0x%lx).\n", pVia->swov.SrcFourCC)); return FALSE; } } *pVidCtl |= V1_COLORSPACE_SIGN; return TRUE; } static unsigned long viaOverlayGetSrcStartAddress(VIAPtr pVia, unsigned long videoFlag, LPDDUPDATEOVERLAY pUpdate, unsigned long srcPitch, unsigned long *pHQVoffset) { unsigned long srcWidth = (unsigned long)(pUpdate->SrcRight - pUpdate->SrcLeft); unsigned long dstWidth = (unsigned long)(pUpdate->DstRight - pUpdate->DstLeft); unsigned long srcHeight = (unsigned long)(pUpdate->SrcBottom - pUpdate->SrcTop); unsigned long dstHeight = (unsigned long)(pUpdate->DstBottom - pUpdate->DstTop); unsigned long offset = 0; unsigned long srcTopOffset = 0; unsigned long srcLeftOffset = 0; int n = 1; if ((pUpdate->SrcLeft != 0) || (pUpdate->SrcTop != 0)) { switch (pVia->swov.SrcFourCC) { case FOURCC_RV32: n = 2; case FOURCC_YUY2: case FOURCC_UYVY: case FOURCC_RV15: case FOURCC_RV16: if (videoFlag & VIDEO_HQV_INUSE) { offset = (((pUpdate->SrcTop & ~3) * srcPitch) + ((pUpdate->SrcLeft << n) & ~31)); if (srcHeight > dstHeight) srcTopOffset = ((pUpdate->SrcTop & ~3) * dstHeight / srcHeight) * srcPitch; else srcTopOffset = (pUpdate->SrcTop & ~3) * srcPitch; if (srcWidth > dstWidth) srcLeftOffset = (((pUpdate->SrcLeft << n) & ~31) * dstWidth / srcWidth); else srcLeftOffset = (pUpdate->SrcLeft << n) & ~31; *pHQVoffset = srcTopOffset + srcLeftOffset; } else offset = ((pUpdate->SrcTop * srcPitch) + ((pUpdate->SrcLeft << n) & ~15)); break; case FOURCC_YV12: case FOURCC_I420: case FOURCC_XVMC: if (videoFlag & VIDEO_HQV_INUSE) offset = (((pUpdate->SrcTop & ~3) * (srcPitch << 1)) + ((pUpdate->SrcLeft << 1) & ~31)); else { offset = ((((pUpdate->SrcTop & ~3) * srcPitch) + pUpdate->SrcLeft) & ~31); if (pUpdate->SrcTop > 0) pVia->swov.overlayRecordV1.dwUVoffset = (((((pUpdate->SrcTop & ~3) >> 1) * srcPitch) + pUpdate->SrcLeft) & ~31) >> 1; else pVia->swov.overlayRecordV1.dwUVoffset = offset >> 1; } break; default: DBG_DD(ErrorF("viaGetSrcStartAddress: " "Invalid FOURCC format (0x%lx).\n", pVia->swov.SrcFourCC)); break; } } else { pVia->swov.overlayRecordV1.dwUVoffset = offset = 0; } return offset; } static YCBCRREC viaOverlayGetYCbCrStartAddress(unsigned long videoFlag, unsigned long startAddr, unsigned long offset, unsigned long UVoffset, unsigned long srcPitch, unsigned long srcHeight) { YCBCRREC YCbCr; if (videoFlag & VIDEO_HQV_INUSE) { YCbCr.dwY = startAddr; YCbCr.dwCB = startAddr + srcPitch * srcHeight; YCbCr.dwCR = (startAddr + srcPitch * srcHeight + srcPitch * (srcHeight >> 2)); } else { YCbCr.dwY = startAddr + offset; YCbCr.dwCB = startAddr + srcPitch * srcHeight + UVoffset; YCbCr.dwCR = (startAddr + srcPitch * srcHeight + UVoffset + srcPitch * (srcHeight >> 2)); } return YCbCr; } static unsigned long viaOverlayHQVCalcZoomWidth(VIAPtr pVia, unsigned long videoFlag, unsigned long srcWidth, unsigned long dstWidth, unsigned long *pZoomCtl, unsigned long *pMiniCtl, unsigned long *pHQVfilterCtl, unsigned long *pHQVminiCtl, unsigned long *pHQVscaleCtlH, unsigned long *pHQVzoomflag) { unsigned long tmp, sw1, d, falign, mdiv; Bool zoom_ok = TRUE; VIAHWDiff *hwDiff = &pVia->HWDiff; CARD32 HQVfilter[5] = { HQV_H_FILTER_DEFAULT, HQV_H_TAP4_121, HQV_H_TAP4_121, HQV_H_TAP8_12221, HQV_H_TAP8_12221 }; /* CARD HQVmini[5] = { 0, 0xc00, 0xa00, 0x900, 0x8800 }; */ falign = 0; mdiv = 1; if (srcWidth == dstWidth) { /* No zoom */ *pHQVfilterCtl |= HQV_H_FILTER_DEFAULT; } else if (srcWidth < dstWidth) { /* Zoom in */ *pZoomCtl &= 0x0000FFFF; tmp = srcWidth * 0x800 / dstWidth; *pZoomCtl |= ((tmp & 0x7ff) << 16) | V1_X_ZOOM_ENABLE; *pMiniCtl |= V1_X_INTERPOLY; zoom_ok = !(tmp > 0x7ff); *pHQVzoomflag = 1; *pHQVfilterCtl |= HQV_H_FILTER_DEFAULT; } else { /* srcWidth > dstWidth - Zoom out */ if (hwDiff->dwNewScaleCtl) { if (srcWidth > (dstWidth << 3)) { /*<1/8*/ /*FIXME!*/ if (dstWidth <= 32) { dstWidth = 33; } if (srcWidth > (dstWidth << 5)) { tmp = 1 * 0x1000 / 31; } else { tmp = (dstWidth * 0x1000) / srcWidth; } *pHQVscaleCtlH = HQV_H_SCALE_DOWN_UNDER_EIGHTH; } else if (srcWidth == (dstWidth << 3)) { /*1/8*/ tmp = ((dstWidth - 1) * 0x1000) / srcWidth; *pHQVscaleCtlH = HQV_H_SCALE_DOWN_UNDER_EIGHTH; } else if (srcWidth > (dstWidth << 2)) { /*1/4 -1/8 zoom-out*/ tmp = (srcWidth * 0x1000) / dstWidth; *pHQVscaleCtlH = HQV_H_SCALE_DOWN_FOURTH_TO_EIGHTH; } else { /*1-1/4 zoom-out*/ /*setting :src/(destination+0.5)*/ tmp = (srcWidth * 0x2000) / ((dstWidth << 1) + 1); *pHQVscaleCtlH = HQV_H_SCALE_DOWN_FOURTH_TO_1; } /*rounding to nearest interger*/ tmp += (((tmp * 0x1000) & 0xfff) > 1) ? 1 : 0; *pHQVscaleCtlH |= (tmp & 0x7fff) | HQV_H_SCALE_ENABLE; } else { /* HQV rounding patch, instead of: * //tmp = dstWidth*0x0800 / srcWidth; */ tmp = dstWidth * 0x800 * 0x400 / srcWidth; tmp = tmp / 0x400 + ((tmp & 0x3ff) ? 1 : 0); *pHQVminiCtl = (tmp & 0x7ff) | HQV_H_MINIFY_ENABLE | HQV_H_MINIFY_DOWN; *pHQVminiCtl |= HQV_HDEBLOCK_FILTER; } /* Scale down the picture by a factor mdiv = (1 << d) = {2, 4, 8 or 16} */ sw1 = srcWidth; for (d = 1; d < 5; d++) { sw1 >>= 1; if (sw1 <= dstWidth) break; } if (d == 5) { /* Too small. */ d = 4; zoom_ok = FALSE; } mdiv = 1 << d; /* <= {2,4,8,16} */ falign = ((mdiv << 1) - 1) & 0xf; /* <= {3,7,15,15} */ *pMiniCtl |= V1_X_INTERPOLY; *pMiniCtl |= ((d << 1) - 1) << 24; /* <= {1,3,5,7} << 24 */ *pHQVfilterCtl |= HQVfilter[d]; /* Scale to arbitrary size, on top of previous scaling by (1 << d). */ if (sw1 < dstWidth) { /* CLE bug *pZoomCtl = sw1 * 0x0800 / dstWidth;*/ *pZoomCtl = (sw1 - 2) * 0x0800 / dstWidth; *pZoomCtl = ((*pZoomCtl & 0x7ff) << 16) | V1_X_ZOOM_ENABLE; } if (videoFlag & VIDEO_1_INUSE) { pVia->swov.overlayRecordV1.dwFetchAlignment = falign; pVia->swov.overlayRecordV1.dwminifyH = mdiv; } else { pVia->swov.overlayRecordV3.dwFetchAlignment = falign; pVia->swov.overlayRecordV3.dwminifyH = mdiv; } } return zoom_ok; } static unsigned long viaOverlayHQVCalcZoomHeight(VIAPtr pVia, unsigned long srcHeight, unsigned long dstHeight, unsigned long *pZoomCtl, unsigned long *pMiniCtl, unsigned long *pHQVfilterCtl, unsigned long *pHQVminiCtl, unsigned long *pHQVscaleCtlV, unsigned long *pHQVzoomflag) { unsigned long tmp, sh1, d; Bool zoom_ok = TRUE; VIAHWDiff *hwDiff = &pVia->HWDiff; CARD32 HQVfilter[5] = { HQV_V_TAP4_121, HQV_V_TAP4_121, HQV_V_TAP4_121, HQV_V_TAP8_12221, HQV_V_TAP8_12221 }; /* CARD32 HQVmini[5] = { 0, 0x0c000000, 0x0a000000, 0x09000000, 0x08800000 }; */ /*if (pVia->pBIOSInfo->scaleY) * { * dstHeight = dstHeight + 1; * } */ if (srcHeight == dstHeight) { /* No zoom */ *pHQVfilterCtl |= HQV_V_TAP4_121; } else if (srcHeight < dstHeight) { /* Zoom in */ *pZoomCtl &= 0xFFFF0000; tmp = srcHeight * 0x400 / dstHeight - 1; *pZoomCtl |= ((tmp & 0x3ff) | V1_Y_ZOOM_ENABLE); *pMiniCtl |= (V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY); *pHQVzoomflag = 1; *pHQVfilterCtl |= HQV_V_TAP4_121; } else { /* srcHeight > dstHeight - Zoom out */ if (hwDiff->dwNewScaleCtl) { /*setting :src/(destination+0.5)*/ tmp = srcHeight * 0x2000 / ((dstHeight << 1) + 1); tmp += (((tmp * 0x1000) & 0xfff) > 1) ? 1 : 0; if ((tmp & 0x1ffff) == 0) { tmp = 0x1ffff; } *pHQVscaleCtlV = (tmp & 0x1ffff) | HQV_V_SCALE_ENABLE| HQV_V_SCALE_DOWN; } else { /* HQV rounding patch, instead of: * //tmp = dstHeight*0x0800 / srcHeight; */ tmp = dstHeight * 0x0800 * 0x400 / srcHeight; tmp = tmp / 0x400 + ((tmp & 0x3ff) ? 1 : 0); *pHQVminiCtl |= (((tmp & 0x7ff) << 16) | HQV_V_MINIFY_ENABLE | HQV_V_MINIFY_DOWN); /* Scale down the picture by a factor (1 << d) = {2, 4, 8 or 16} */ sh1 = srcHeight; for (d = 1; d < 5; d++) { sh1 >>= 1; if (sh1 <= dstHeight) break; } if (d == 5) { /* Too small. */ d = 4; zoom_ok = FALSE; } *pMiniCtl |= ((d << 1) - 1) << 16; /* <= {1,3,5,7} << 16 */ *pHQVfilterCtl |= HQVfilter[d]; /* *pHQVminiCtl |= HQVmini[d]; */ *pHQVminiCtl |= HQV_VDEBLOCK_FILTER; /* Scale to arbitrary size, on top of previous scaling by (1 << d). */ if (sh1 < dstHeight) { tmp = sh1 * 0x0400 / dstHeight; *pZoomCtl |= ((tmp & 0x3ff) | V1_Y_ZOOM_ENABLE); *pMiniCtl |= V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY; } } } return zoom_ok; } static unsigned long viaOverlayGetFetch(VIAPtr pVia, unsigned long videoFlag, unsigned long srcWidth, unsigned long dstWidth, unsigned long oriSrcWidth, unsigned long *pHQVsrcFetch) { unsigned long fetch = 0; int n = 2; /* 2^n bytes per pixel. */ switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: case FOURCC_I420: case FOURCC_XVMC: n = 0; /* 2^n = 1 byte per pixel (Y channel in planar YUV) */ break; case FOURCC_UYVY: case FOURCC_YUY2: case FOURCC_RV15: case FOURCC_RV16: n = 1; /* 2^n = 2 bytes per pixel (packed YUV) */ break; case FOURCC_RV32: n = 2; break; default: DBG_DD(ErrorF("viaOverlayGetFetch: " "Invalid FOURCC format (0x%lx).\n", pVia->swov.SrcFourCC)); break; } if (videoFlag & VIDEO_HQV_INUSE) { *pHQVsrcFetch = oriSrcWidth << n; if (n == 0) { /* Assume n == 0 <=> Planar YUV. * The V1/V3 pixelformat is always packed YUV when we use HQV, * so we switch from 8-bit to 16-bit pixels here. */ n = 1; } if (dstWidth >= srcWidth) fetch = (ALIGN_TO(srcWidth << n, 16) >> 4) + 1; else fetch = (ALIGN_TO(dstWidth << n, 16) >> 4) + 1; } else { if (n == 0) fetch = (ALIGN_TO(srcWidth, 32) >> 4); else fetch = (ALIGN_TO(srcWidth << n, 16) >> 4) + 1; } /* Fix planar mode problem. */ if (fetch < 4) fetch = 4; return fetch; } /* * This function uses quadratic mapping to adjust the midpoint of the scaling. */ static float rangeEqualize(float inLow, float inHigh, float outLow, float outHigh, float outMid, float inValue) { float inRange = inHigh - inLow, outRange = outHigh - outLow, normIn = ((inValue - inLow) / inRange) * 2. - 1., delta = outMid - outRange * 0.5 - outLow; return ((inValue - inLow) * outRange / inRange + outLow + (1. - normIn * normIn) * delta); } static unsigned vPackFloat(float val, float hiLimit, float loLimit, float mult, int shift, Bool doSign) { unsigned packed, mask, sign; val = (val > hiLimit) ? hiLimit : val; val = (val < loLimit) ? loLimit : val; sign = (val < 0) ? 1 : 0; val = (sign) ? -val : val; packed = ((unsigned)(val * mult + 1.)) >> 1; mask = (1 << shift) - 1; return (((packed >= mask) ? mask : packed) | ((doSign) ? (sign << shift) : 0)); } typedef float colorCoeff[5]; static colorCoeff colorCTable[] = { {1.1875, 1.625, 0.875, 0.375, 2.0}, {1.164, 1.596, 0.54, 0.45, 2.2} }; /* * This function is a partial rewrite of the overlay.c file of the original VIA * drivers, which was extremely nasty and difficult to follow. Coefficients for * new chipset models should be added in the table above and, if needed, * implemented in the model switch below. */ static void viaCalculateVideoColor(VIAPtr pVia, int hue, int saturation, int brightness, int contrast, Bool reset, CARD32 * col1, CARD32 * col2) { float fA, fB1, fC1, fD, fB2, fC2, fB3, fC3; float fPI, fContrast, fSaturation, fHue, fBrightness; const float *mCoeff; unsigned long dwA, dwB1, dwC1, dwD, dwB2, dwC2, dwB3, dwC3, dwS; unsigned long dwD_Int, dwD_Dec; int intD; int model; fPI = (float)(M_PI / 180.); if (reset) { saturation = 10000; brightness = 5000; contrast = 10000; } switch (pVia->ChipId) { case PCI_CHIP_VT3205: case PCI_CHIP_VT3204: case PCI_CHIP_VT3259: case PCI_CHIP_VT3314: case PCI_CHIP_VT3336: case PCI_CHIP_VT3364: case PCI_CHIP_VT3324: case PCI_CHIP_VT3327: case PCI_CHIP_VT3353: case PCI_CHIP_VT3409: case PCI_CHIP_VT3410: model = 0; break; case PCI_CHIP_CLE3122: model = (CLE266_REV_IS_CX(pVia->ChipRev) ? 0 : 1); break; default: ErrorF("Unknown Chip ID\n"); model = 0; } switch (model) { case 0: fBrightness = rangeEqualize(0., 10000., -128., 128., -16., (float)brightness); fContrast = rangeEqualize(0., 20000., 0., 1.6645, 1.0, (float)contrast); fSaturation = rangeEqualize(0., 20000, 0., 2., 1., (float)saturation); break; default: fBrightness = rangeEqualize(0., 10000., -128., 128., -12., (float)brightness); fContrast = rangeEqualize(0., 20000., 0., 1.6645, 1.1, (float)contrast); fSaturation = rangeEqualize(0., 20000, 0., 2., 1.15, (float)saturation); break; } fHue = (float)hue; mCoeff = colorCTable[model]; fA = (float)(mCoeff[0] * fContrast); fB1 = (float)(-mCoeff[1] * fContrast * fSaturation * sin(fHue * fPI)); fC1 = (float)(mCoeff[1] * fContrast * fSaturation * cos(fHue * fPI)); fD = (float)(mCoeff[0] * (fBrightness)); fB2 = (float)((mCoeff[2] * sin(fHue * fPI) - mCoeff[3] * cos(fHue * fPI)) * fContrast * fSaturation); fC2 = (float)(-(mCoeff[2] * cos(fHue * fPI) + mCoeff[3] * sin(fHue * fPI)) * fContrast * fSaturation); fB3 = (float)(mCoeff[4] * fContrast * fSaturation * cos(fHue * fPI)); fC3 = (float)(mCoeff[4] * fContrast * fSaturation * sin(fHue * fPI)); switch (model) { case 0: dwA = vPackFloat(fA, 1.9375, 0., 32., 5, 0); dwB1 = vPackFloat(fB1, 2.125, -2.125, 16., 5, 1); dwC1 = vPackFloat(fC1, 2.125, -2.125, 16., 5, 1); if (fD >= 0) { intD = (int)fD; if (intD > 127) intD = 127; dwD_Int = ((unsigned long)intD) & 0xff; dwD = ((unsigned long)(fD * 16 + 1)) >> 1; dwD_Dec = dwD & 0x7; } else { intD = (int)fD; if (intD < -128) intD = -128; intD = intD + 256; dwD_Int = ((unsigned long)intD) & 0xff; fD = -fD; dwD = ((unsigned long)(fD * 16 + 1)) >> 1; dwD_Dec = dwD & 0x7; } dwB2 = vPackFloat(fB2, 1.875, -1.875, 16, 4, 1); dwC2 = vPackFloat(fC2, 1.875, -1.875, 16, 4, 1); dwB3 = vPackFloat(fB3, 3.875, -3.875, 16, 5, 1); dwC3 = vPackFloat(fC3, 3.875, -3.875, 16, 5, 1); *col1 = (dwA << 24) | (dwB1 << 16) | (dwC1 << 8) | dwD_Int; *col2 = (dwD_Dec << 29 | dwB2 << 24) | (dwC2 << 16) | (dwB3 << 8) | (dwC3); break; default: dwA = vPackFloat(fA, 1.9375, -0., 32, 5, 0); dwB1 = vPackFloat(fB1, 0.75, -0.75, 8., 2, 1); dwC1 = vPackFloat(fC1, 2.875, 1., 16., 5, 0); if (fD >= 127) fD = 127; if (fD <= -128) fD = -128; if (fD >= 0) { dwS = 0; } else { dwS = 1; fD = fD + 128; } dwD = ((unsigned long)(fD * 2 + 1)) >> 1; if (dwD >= 0x7f) { dwD = 0x7f | (dwS << 7); } else { dwD = (dwD & 0x7f) | (dwS << 7); } dwB2 = vPackFloat(fB2, 0., -0.875, 16., 3, 0); dwC2 = vPackFloat(fC2, 0., -1.875, 16., 4, 0); dwB3 = vPackFloat(fB3, 3.75, 0., 8., 4, 0); dwC3 = vPackFloat(fC3, 1.25, -1.25, 8., 3, 1); *col1 = (dwA << 24) | (dwB1 << 18) | (dwC1 << 9) | dwD; *col2 = (dwB2 << 25) | (dwC2 << 17) | (dwB3 << 10) | (dwC3 << 2); break; } } /* * * */ void viaSetColorSpace(VIAPtr pVia, int hue, int saturation, int brightness, int contrast, Bool reset) { CARD32 col1, col2; viaCalculateVideoColor(pVia, hue, saturation, brightness, contrast, reset, &col1, &col2); switch (pVia->ChipId) { case PCI_CHIP_VT3205: case PCI_CHIP_VT3204: case PCI_CHIP_VT3314: VIASETREG(V3_ColorSpaceReg_1, col1); VIASETREG(V3_ColorSpaceReg_2, col2); DBG_DD(ErrorF("000002C4 %08lx\n", col1)); DBG_DD(ErrorF("000002C8 %08lx\n", col2)); case PCI_CHIP_VT3259: case PCI_CHIP_VT3327: case PCI_CHIP_VT3336: case PCI_CHIP_VT3324: case PCI_CHIP_VT3364: case PCI_CHIP_VT3353: case PCI_CHIP_VT3409: case PCI_CHIP_VT3410: case PCI_CHIP_CLE3122: VIASETREG(V1_ColorSpaceReg_1, col1); VIASETREG(V1_ColorSpaceReg_2, col2); DBG_DD(ErrorF("00000288 %08lx\n", col2)); DBG_DD(ErrorF("00000284 %08lx\n", col1)); break; default: DBG_DD(ErrorF("Unknown DeviceID\n")); break; } } static unsigned long ViaInitVideoStatusFlag(VIAPtr pVia) { switch (pVia->ChipId) { case PCI_CHIP_VT3205: case PCI_CHIP_VT3204: case PCI_CHIP_VT3314: return VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_3_INUSE; case PCI_CHIP_VT3259: case PCI_CHIP_VT3327: case PCI_CHIP_VT3336: case PCI_CHIP_VT3324: case PCI_CHIP_VT3364: case PCI_CHIP_VT3353: case PCI_CHIP_VT3409: case PCI_CHIP_VT3410: return (VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_1_INUSE | VIDEO_ACTIVE | VIDEO_SHOW); case PCI_CHIP_CLE3122: return VIDEO_HQV_INUSE | SW_USE_HQV | VIDEO_1_INUSE; default: DBG_DD(ErrorF("Unknown DeviceID\n")); break; } return 0; } static unsigned long ViaSetVidCtl(VIAPtr pVia, unsigned int videoFlag) { if (videoFlag & VIDEO_1_INUSE) { /*=* Modify for C1 FIFO *=*/ /* WARNING: not checking Chipset! */ if (CLE266_REV_IS_CX(pVia->ChipRev)) return V1_ENABLE | V1_EXPIRE_NUM_F; else { /* Overlay source format for V1 */ if (pVia->swov.gdwUseExtendedFIFO) return V1_ENABLE | V1_EXPIRE_NUM_A | V1_FIFO_EXTENDED; else return V1_ENABLE | V1_EXPIRE_NUM; } } else { switch (pVia->ChipId) { case PCI_CHIP_VT3205: case PCI_CHIP_VT3204: case PCI_CHIP_VT3259: case PCI_CHIP_VT3314: return V3_ENABLE | V3_EXPIRE_NUM_3205; case PCI_CHIP_VT3327: case PCI_CHIP_VT3336: case PCI_CHIP_VT3324: case PCI_CHIP_VT3364: case PCI_CHIP_VT3353: return V3_ENABLE | VIDEO_EXPIRE_NUM_VT3336; case PCI_CHIP_VT3409: case PCI_CHIP_VT3410: return V3_ENABLE | VIDEO_EXPIRE_NUM_VT3409; case PCI_CHIP_CLE3122: if (CLE266_REV_IS_CX(pVia->ChipRev)) return V3_ENABLE | V3_EXPIRE_NUM_F; else return V3_ENABLE | V3_EXPIRE_NUM; default: DBG_DD(ErrorF("Unknown DeviceID\n")); break; } } return 0; } /* * Fill the buffer with 0x8000 (YUV2 black). */ static void ViaYUVFillBlack(VIAPtr pVia, void *buf, int num) { CARD16 *ptr = (CARD16 *) buf; while (num-- > 0) #if X_BYTE_ORDER == X_LITTLE_ENDIAN *ptr++ = 0x0080; #else *ptr++ = 0x8000; #endif } /* * Add an HQV surface to an existing FOURCC surface. * numbuf: number of buffers, 1, 2 or 3 * fourcc: FOURCC code of the current (already existing) surface */ static long AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc) { unsigned int i, width, height, pitch, fbsize, addr; BOOL isplanar; void *buf; VIAPtr pVia = VIAPTR(pScrn); CARD32 AddrReg[3] = { HQV_DST_STARTADDR0, HQV_DST_STARTADDR1, HQV_DST_STARTADDR2 }; unsigned long proReg = 0; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; 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); pVia->swov.HQVMem = drm_bo_alloc(pScrn, fbsize * numbuf, 1, TTM_PL_FLAG_VRAM); if (!pVia->swov.HQVMem) return BadAlloc; addr = pVia->swov.HQVMem->offset; buf = drm_bo_map(pScrn, pVia->swov.HQVMem); ViaYUVFillBlack(pVia, buf, fbsize); for (i = 0; i < numbuf; i++) { pVia->swov.overlayRecordV1.dwHQVAddr[i] = addr; VIASETREG(AddrReg[i] + proReg, addr); addr += fbsize; } drm_bo_unmap(pScrn, pVia->swov.HQVMem); return Success; } /* * Create a FOURCC surface. * doalloc: set true to actually allocate memory for the framebuffers */ static long CreateSurface(ScrnInfoPtr pScrn, CARD32 FourCC, CARD16 Width, CARD16 Height, BOOL doalloc) { VIAPtr pVia = VIAPTR(pScrn); unsigned long pitch, fbsize, addr; BOOL isplanar; void *buf; pVia->swov.SrcFourCC = FourCC; pVia->swov.gdwVideoFlagSW = ViaInitVideoStatusFlag(pVia); isplanar = FALSE; switch (FourCC) { case FOURCC_YV12: case FOURCC_I420: case FOURCC_XVMC: isplanar = TRUE; pitch = ALIGN_TO(Width, 32); fbsize = pitch * Height * 1.5; break; case FOURCC_RV32: pitch = ALIGN_TO(Width << 2, 32); fbsize = pitch * Height; break; default: pitch = ALIGN_TO(Width << 1, 32); fbsize = pitch * Height; break; } if (doalloc) { pVia->swov.SWfbMem = drm_bo_alloc(pScrn, fbsize * 2, 1, TTM_PL_FLAG_VRAM); if (!pVia->swov.SWfbMem) return BadAlloc; addr = pVia->swov.SWfbMem->offset; buf = drm_bo_map(pScrn, pVia->swov.SWfbMem); ViaYUVFillBlack(pVia, buf, fbsize); 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; if (isplanar) { pVia->swov.SWDevice.dwSWCrPhysicalAddr[0] = pVia->swov.SWDevice.dwSWPhysicalAddr[0] + (pitch * Height); pVia->swov.SWDevice.dwSWCrPhysicalAddr[1] = pVia->swov.SWDevice.dwSWPhysicalAddr[1] + (pitch * Height); pVia->swov.SWDevice.dwSWCbPhysicalAddr[0] = pVia->swov.SWDevice.dwSWCrPhysicalAddr[0] + ((pitch >> 1) * (Height >> 1)); pVia->swov.SWDevice.dwSWCbPhysicalAddr[1] = pVia->swov.SWDevice.dwSWCrPhysicalAddr[1] + ((pitch >> 1) * (Height >> 1)); } } pVia->swov.SWDevice.gdwSWSrcWidth = Width; pVia->swov.SWDevice.gdwSWSrcHeight = Height; pVia->swov.SWDevice.dwPitch = pitch; pVia->swov.overlayRecordV1.dwV1OriWidth = Width; pVia->swov.overlayRecordV1.dwV1OriHeight = Height; pVia->swov.overlayRecordV1.dwV1OriPitch = pitch; return Success; } /* * */ int ViaSwovSurfaceCreate(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, CARD32 FourCC, CARD16 Width, CARD16 Height) { VIAPtr pVia = VIAPTR(pScrn); unsigned long retCode = Success; int numbuf = pVia->HWDiff.dwThreeHQVBuffer ? 3 : 2; DBG_DD(ErrorF("ViaSwovSurfaceCreate: FourCC =0x%08lx\n", FourCC)); if ((pVia->VideoStatus & VIDEO_SWOV_SURFACE_CREATED) && (FourCC == pPriv->FourCC)) return Success; pPriv->FourCC = FourCC; switch (FourCC) { case FOURCC_YUY2: case FOURCC_RV15: case FOURCC_RV16: case FOURCC_RV32: retCode = CreateSurface(pScrn, FourCC, Width, Height, TRUE); if (retCode != Success) break; if ((pVia->swov.gdwVideoFlagSW & SW_USE_HQV)) retCode = AddHQVSurface(pScrn, numbuf, FourCC); break; case FOURCC_HQVSW: retCode = AddHQVSurface(pScrn, numbuf, FOURCC_YUY2); break; case FOURCC_YV12: case FOURCC_I420: retCode = CreateSurface(pScrn, FourCC, Width, Height, TRUE); if (retCode == Success) retCode = AddHQVSurface(pScrn, numbuf, FourCC); break; case FOURCC_XVMC: retCode = CreateSurface(pScrn, FourCC, Width, Height, FALSE); if (retCode == Success) retCode = AddHQVSurface(pScrn, numbuf, FOURCC_XVMC); break; default: break; } if (retCode == Success) { DBG_DD(ErrorF(" lpSWOverlaySurface[0]: %p\n", pVia->swov.SWDevice.lpSWOverlaySurface[0])); DBG_DD(ErrorF(" lpSWOverlaySurface[1]: %p\n", pVia->swov.SWDevice.lpSWOverlaySurface[1])); pVia->VideoStatus |= VIDEO_SWOV_SURFACE_CREATED | VIDEO_SWOV_ON; } return retCode; } /* * Destroy Surface */ void ViaSwovSurfaceDestroy(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv) { VIAPtr pVia = VIAPTR(pScrn); DBG_DD(ErrorF("ViaSwovSurfaceDestroy: FourCC =0x%08lx\n", pPriv->FourCC)); if (pVia->VideoStatus & VIDEO_SWOV_SURFACE_CREATED) { DBG_DD(ErrorF("ViaSwovSurfaceDestroy: VideoStatus =0x%08lx\n", pVia->VideoStatus)); switch (pPriv->FourCC) { case FOURCC_YUY2: case FOURCC_RV16: case FOURCC_RV32: case FOURCC_RV15: pVia->swov.SrcFourCC = 0; drm_bo_unmap(pScrn, pVia->swov.SWfbMem); drm_bo_free(pScrn, pVia->swov.SWfbMem); if ((pVia->swov.gdwVideoFlagSW & SW_USE_HQV)) { drm_bo_unmap(pScrn, pVia->swov.HQVMem); drm_bo_free(pScrn, pVia->swov.HQVMem); } pVia->swov.gdwVideoFlagSW = 0; break; case FOURCC_HQVSW: drm_bo_free(pScrn, pVia->swov.HQVMem); pVia->swov.gdwVideoFlagSW = 0; break; case FOURCC_YV12: case FOURCC_I420: drm_bo_unmap(pScrn, pVia->swov.SWfbMem); drm_bo_free(pScrn, pVia->swov.SWfbMem); case FOURCC_XVMC: pVia->swov.SrcFourCC = 0; drm_bo_free(pScrn, pVia->swov.HQVMem); pVia->swov.gdwVideoFlagSW = 0; break; } pPriv->FourCC = 0; pVia->VideoStatus &= ~VIDEO_SWOV_SURFACE_CREATED; } else DBG_DD(ErrorF("ViaSwovSurfaceDestroy: No SW Surface Destroyed, " "VideoStatus =0x%08lx\n", pVia->VideoStatus)); } static void SetFIFO_V1(VIAPtr pVia, CARD8 depth, CARD8 prethreshold, CARD8 threshold) { SaveVideoRegister(pVia, V_FIFO_CONTROL, ((depth - 1) & 0x7f) | ((prethreshold & 0x7f) << 24) | ((threshold & 0x7f) << 8)); } static void SetFIFO_V3(VIAPtr pVia, CARD8 depth, CARD8 prethreshold, CARD8 threshold) { switch (pVia->ChipId) { case PCI_CHIP_VT3314: case PCI_CHIP_VT3324: case PCI_CHIP_VT3327: case PCI_CHIP_VT3353: case PCI_CHIP_VT3409: case PCI_CHIP_VT3410: SaveVideoRegister(pVia, ALPHA_V3_FIFO_CONTROL, (VIAGETREG(ALPHA_V3_FIFO_CONTROL) & ALPHA_FIFO_MASK) | ((depth - 1) & 0xff) | ((threshold & 0xff) << 8)); SaveVideoRegister(pVia, ALPHA_V3_PREFIFO_CONTROL, (VIAGETREG(ALPHA_V3_PREFIFO_CONTROL) & ~V3_FIFO_MASK_3314) | (prethreshold & 0xff)); break; default : SaveVideoRegister(pVia, ALPHA_V3_FIFO_CONTROL, (VIAGETREG(ALPHA_V3_FIFO_CONTROL) & ALPHA_FIFO_MASK) | ((depth - 1) & 0xff) | ((threshold & 0xff) << 8)); SaveVideoRegister(pVia, ALPHA_V3_PREFIFO_CONTROL, (VIAGETREG(ALPHA_V3_PREFIFO_CONTROL) & ~V3_FIFO_MASK) | (prethreshold & 0x7f)); break; } } static void SetFIFO_64or32(VIAPtr pVia) { /*=* Modify for C1 FIFO *=*/ /* WARNING: not checking Chipset! */ if (CLE266_REV_IS_CX(pVia->ChipRev)) SetFIFO_V1(pVia, 64, 56, 56); else SetFIFO_V1(pVia, 32, 29, 16); } static void SetFIFO_64or16(VIAPtr pVia) { /*=* Modify for C1 FIFO *=*/ /* WARNING: not checking Chipset! */ if (CLE266_REV_IS_CX(pVia->ChipRev)) SetFIFO_V1(pVia, 64, 56, 56); else SetFIFO_V1(pVia, 16, 12, 8); } static void SetFIFO_64or48or32(VIAPtr pVia) { /*=* Modify for C1 FIFO *=*/ /* WARNING: not checking Chipset! */ if (CLE266_REV_IS_CX(pVia->ChipRev)) SetFIFO_V1(pVia, 64, 56, 56); else { if (pVia->swov.gdwUseExtendedFIFO) SetFIFO_V1(pVia, 48, 40, 40); else SetFIFO_V1(pVia, 32, 29, 16); } } static void SetFIFO_V3_64or32or32(VIAPtr pVia) { switch (pVia->ChipId) { case PCI_CHIP_VT3327: case PCI_CHIP_VT3336: case PCI_CHIP_VT3324: case PCI_CHIP_VT3364: case PCI_CHIP_VT3353: case PCI_CHIP_VT3409: case PCI_CHIP_VT3410: SetFIFO_V3(pVia, 225, 200, 250); break; case PCI_CHIP_VT3204: SetFIFO_V3(pVia, 100, 89, 89); break; case PCI_CHIP_VT3314: SetFIFO_V3(pVia, 64, 61, 61); break; case PCI_CHIP_VT3205: case PCI_CHIP_VT3259: SetFIFO_V3(pVia, 32, 29, 29); break; case PCI_CHIP_CLE3122: if (CLE266_REV_IS_CX(pVia->ChipRev)) SetFIFO_V3(pVia, 64, 56, 56); else SetFIFO_V3(pVia, 32, 16, 16); break; default: break; } } static void SetFIFO_V3_64or32or16(VIAPtr pVia) { switch (pVia->ChipId) { case PCI_CHIP_VT3327: case PCI_CHIP_VT3336: case PCI_CHIP_VT3324: case PCI_CHIP_VT3364: case PCI_CHIP_VT3353: case PCI_CHIP_VT3409: case PCI_CHIP_VT3410: SetFIFO_V3(pVia, 225, 200, 250); break; case PCI_CHIP_VT3204: SetFIFO_V3(pVia, 100, 89, 89); break; case PCI_CHIP_VT3314: SetFIFO_V3(pVia, 64, 61, 61); break; case PCI_CHIP_VT3205: case PCI_CHIP_VT3259: SetFIFO_V3(pVia, 32, 29, 29); break; case PCI_CHIP_CLE3122: if (CLE266_REV_IS_CX(pVia->ChipRev)) SetFIFO_V3(pVia, 64, 56, 56); else SetFIFO_V3(pVia, 16, 16, 8); break; default: break; } } static void SetupFIFOs(VIAPtr pVia, unsigned long videoFlag, unsigned long miniCtl, unsigned long srcWidth) { if (miniCtl & V1_Y_INTERPOLY) { if (pVia->swov.SrcFourCC == FOURCC_YV12 || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_HQV_INUSE) { if (videoFlag & VIDEO_1_INUSE) SetFIFO_64or32(pVia); else SetFIFO_V3_64or32or16(pVia); } else { /* Minified video will be skewed without this workaround. */ if (srcWidth <= 80) { /* Fetch count <= 5 */ if (videoFlag & VIDEO_1_INUSE) SetFIFO_V1(pVia, 16, 0, 0); else SetFIFO_V3(pVia, 16, 16, 0); } else { if (videoFlag & VIDEO_1_INUSE) SetFIFO_64or16(pVia); else SetFIFO_V3_64or32or16(pVia); } } } else { if (videoFlag & VIDEO_1_INUSE) SetFIFO_64or48or32(pVia); else { /* Fix V3 bug. */ if (srcWidth <= 8) SetFIFO_V3(pVia, 1, 0, 0); else SetFIFO_V3_64or32or32(pVia); } } } else { if (pVia->swov.SrcFourCC == FOURCC_YV12 || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_HQV_INUSE) { if (videoFlag & VIDEO_1_INUSE) SetFIFO_64or32(pVia); else SetFIFO_V3_64or32or16(pVia); } else { /* Minified video will be skewed without this workaround. */ if (srcWidth <= 80) { /* Fetch count <= 5 */ if (videoFlag & VIDEO_1_INUSE) SetFIFO_V1(pVia, 16, 0, 0); else SetFIFO_V3(pVia, 16, 16, 0); } else { if (videoFlag & VIDEO_1_INUSE) SetFIFO_64or16(pVia); else SetFIFO_V3_64or32or16(pVia); } } } else { if (videoFlag & VIDEO_1_INUSE) SetFIFO_64or48or32(pVia); else { /* Fix V3 bug. */ if (srcWidth <= 8) SetFIFO_V3(pVia, 1, 0, 0); else SetFIFO_V3_64or32or32(pVia); } } } } static CARD32 SetColorKey(VIAPtr pVia, unsigned long videoFlag, CARD32 keyLow, CARD32 keyHigh, CARD32 compose) { keyLow &= 0x00FFFFFF; if (pVia->VideoEngine == VIDEO_ENGINE_CME) keyLow |= 0x40000000; if (videoFlag & VIDEO_1_INUSE) { SaveVideoRegister(pVia, V_COLOR_KEY, keyLow); SaveVideoRegister(pVia, SND_COLOR_KEY, keyLow); } else { if (pVia->HWDiff.dwSupportTwoColorKey) /*CLE_C0 */ SaveVideoRegister(pVia, V3_COLOR_KEY, keyLow); } /*CLE_C0 */ compose = ((compose & ~0x0f) | SELECT_VIDEO_IF_COLOR_KEY | SELECT_VIDEO3_IF_COLOR_KEY); return compose; } static CARD32 SetChromaKey(VIAPtr pVia, unsigned long videoFlag, CARD32 chromaLow, CARD32 chromaHigh, CARD32 miniCtl, CARD32 compose) { chromaLow &= CHROMA_KEY_LOW; chromaHigh &= CHROMA_KEY_HIGH; chromaLow |= (VIAGETREG(V_CHROMAKEY_LOW) & ~CHROMA_KEY_LOW); chromaHigh |= (VIAGETREG(V_CHROMAKEY_HIGH) & ~CHROMA_KEY_HIGH); if (pVia->VideoEngine == VIDEO_ENGINE_CME) chromaLow |= 0x40000000; SaveVideoRegister(pVia, V_CHROMAKEY_HIGH, chromaHigh); if (videoFlag & VIDEO_1_INUSE) { SaveVideoRegister(pVia, V_CHROMAKEY_LOW, chromaLow & ~V_CHROMAKEY_V3); /* Temporarily solve the HW interpolation error when using Chroma key */ SaveVideoRegister(pVia, V1_MINI_CONTROL, miniCtl & 0xFFFFFFF8); } else { SaveVideoRegister(pVia, V_CHROMAKEY_LOW, chromaLow | V_CHROMAKEY_V3); SaveVideoRegister(pVia, V3_MINI_CONTROL, miniCtl & 0xFFFFFFF8); } /* Modified by Scottie[2001.12.5] for select video if (Color key & Chroma key) */ if (compose == SELECT_VIDEO_IF_COLOR_KEY) compose = SELECT_VIDEO_IF_COLOR_KEY | SELECT_VIDEO_IF_CHROMA_KEY; else compose = (compose & ~0x0f) | SELECT_VIDEO_IF_CHROMA_KEY; return compose; } static void SetVideoStart(VIAPtr pVia, unsigned long videoFlag, unsigned int numbufs, CARD32 a1, CARD32 a2, CARD32 a3) { CARD32 V1Addr[3] = { V1_STARTADDR_0, V1_STARTADDR_1, V1_STARTADDR_2 }; CARD32 V3Addr[3] = { V3_STARTADDR_0, V3_STARTADDR_1, V3_STARTADDR_2 }; CARD32 *VideoAddr = (videoFlag & VIDEO_1_INUSE) ? V1Addr : V3Addr; SaveVideoRegister(pVia, VideoAddr[0], a1); if (numbufs > 1) SaveVideoRegister(pVia, VideoAddr[1], a2); if (numbufs > 2) SaveVideoRegister(pVia, VideoAddr[2], a3); } static void SetHQVFetch(VIAPtr pVia, CARD32 srcFetch, unsigned long srcHeight) { unsigned long proReg = 0; if (pVia->ChipId == PCI_CHIP_VT3259 && !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; if (!pVia->HWDiff.dwHQVFetchByteUnit) { /* CLE_C0 */ srcFetch >>= 3; /* fetch unit is 8 bytes */ } if ((pVia->ChipId != PCI_CHIP_VT3409) && (pVia->ChipId != PCI_CHIP_VT3410)) SaveVideoRegister(pVia, HQV_SRC_FETCH_LINE + proReg, ((srcFetch - 1) << 16) | (srcHeight - 1)); } static void SetFetch(VIAPtr pVia, unsigned long videoFlag, CARD32 fetch) { fetch <<= 20; if (videoFlag & VIDEO_1_INUSE) { SaveVideoRegister(pVia, V12_QWORD_PER_LINE, fetch); } else { fetch |= VIAGETREG(V3_ALPHA_QWORD_PER_LINE) & ~V3_FETCH_COUNT; SaveVideoRegister(pVia, V3_ALPHA_QWORD_PER_LINE, fetch); } } static void SetDisplayCount(VIAPtr pVia, unsigned long videoFlag, unsigned long srcWidth, unsigned long srcHeight) { unsigned long DisplayCount; /* Removed VIA's large pixelformat switch/case. * All formats (YV12, UYVY, YUY2, VIA, RGB16 and RGB32) * seem to use the same count. /A */ if (videoFlag & VIDEO_HQV_INUSE) DisplayCount = srcWidth - 1; else DisplayCount = srcWidth - pVia->swov.overlayRecordV1.dwminifyH; if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_SOURCE_HEIGHT, (srcHeight << 16) | DisplayCount); else SaveVideoRegister(pVia, V3_SOURCE_WIDTH, DisplayCount); } static void SetMiniAndZoom(VIAPtr pVia, unsigned long videoFlag, CARD32 miniCtl, CARD32 zoomCtl) { if (videoFlag & VIDEO_1_INUSE) { SaveVideoRegister(pVia, V1_MINI_CONTROL, miniCtl); SaveVideoRegister(pVia, V1_ZOOM_CONTROL, zoomCtl); } else { SaveVideoRegister(pVia, V3_MINI_CONTROL, miniCtl); SaveVideoRegister(pVia, V3_ZOOM_CONTROL, zoomCtl); } } static void SetVideoControl(VIAPtr pVia, unsigned long videoFlag, CARD32 vidCtl) { if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_CONTROL, vidCtl); else SaveVideoRegister(pVia, V3_CONTROL, vidCtl); } static void FireVideoCommand(VIAPtr pVia, unsigned long videoFlag, CARD32 compose) { if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V_COMPOSE_MODE, compose | V1_COMMAND_FIRE); else SaveVideoRegister(pVia, V_COMPOSE_MODE, compose | V3_COMMAND_FIRE); } static void SetVideoWindow(ScrnInfoPtr pScrn, unsigned long videoFlag, LPDDUPDATEOVERLAY pUpdate) { VIAPtr pVia = VIAPTR(pScrn); CARD32 left = pUpdate->DstLeft; CARD32 top = pUpdate->DstTop; CARD32 right = pUpdate->DstRight - 1; CARD32 bottom = pUpdate->DstBottom - 1; DBG_DD(ErrorF("SetVideoWindow: X (%ld,%ld) Y (%ld,%ld)\n", left, right, top, bottom)); /* Modify for HW DVI limitation. * When we enable both the CRT and DVI, then change resolution. * If the resolution is smaller than the panel's physical size, * the video display in Y direction will be cut. * 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 / pScrn->currentMode->VDisplay); bottom = (pUpdate->DstBottom * pBIOSInfo->Panel->NativeMode->Height / pScrn->currentMode->VDisplay); } }*/ if (top > 2047) top = 2047; if (bottom > 2047) bottom = 2047; if (left > 2047) left = 2047; if (right > 2047) right = 2047; if (videoFlag & VIDEO_1_INUSE) { SaveVideoRegister(pVia, V1_WIN_END_Y, (right << 16) | bottom); SaveVideoRegister(pVia, V1_WIN_START_Y, (left << 16) | top); } else { SaveVideoRegister(pVia, V3_WIN_END_Y, (right << 16) | bottom); SaveVideoRegister(pVia, V3_WIN_START_Y, (left << 16) | top); } } /* * Upd_Video() */ static Bool Upd_Video(xf86CrtcPtr crtc, unsigned long videoFlag, unsigned long startAddr, LPDDUPDATEOVERLAY pUpdate, unsigned long srcPitch, unsigned long oriSrcWidth, unsigned long oriSrcHeight, unsigned long deinterlaceMode, unsigned long haveColorKey, unsigned long haveChromaKey, unsigned long colorKeyLow, unsigned long colorKeyHigh, unsigned long chromaKeyLow, unsigned long chromaKeyHigh) { drmmode_crtc_private_ptr iga = crtc->driver_private; ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); VIAHWDiff *hwDiff = &pVia->HWDiff; unsigned long vidCtl = 0, compose; unsigned long srcWidth, srcHeight, dstWidth, dstHeight; unsigned long zoomCtl = 0, miniCtl = 0; unsigned long hqvCtl = 0; unsigned long hqvFilterCtl = 0, hqvMiniCtl = 0; unsigned long hqvScaleCtlH = 0, hqvScaleCtlV = 0; unsigned long haveHQVzoomH = 0, haveHQVzoomV = 0; unsigned long hqvSrcWidth = 0, hqvDstWidth = 0; unsigned long hqvSrcFetch = 0, hqvOffset = 0; unsigned long dwOffset = 0, fetch = 0, tmp = 0; unsigned long proReg = 0; int i; DBG_DD(ErrorF("videoflag=%ld\n", videoFlag)); if (pVia->ChipId == PCI_CHIP_VT3259 && !(videoFlag & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; compose = ((VIAGETREG(V_COMPOSE_MODE) & ~(SELECT_VIDEO_IF_COLOR_KEY | V1_COMMAND_FIRE | V3_COMMAND_FIRE)) | V_COMMAND_LOAD_VBI); DBG_DD(ErrorF("// Upd_Video:\n")); DBG_DD(ErrorF("Modified rSrc X (%ld,%ld) Y (%ld,%ld)\n", pUpdate->SrcLeft, pUpdate->SrcRight, pUpdate->SrcTop, pUpdate->SrcBottom)); DBG_DD(ErrorF("Modified rDest X (%ld,%ld) Y (%ld,%ld)\n", pUpdate->DstLeft, pUpdate->DstRight, pUpdate->DstTop, pUpdate->DstBottom)); dstWidth = pUpdate->DstRight - pUpdate->DstLeft; /*if (pBIOSInfo->lvds && pBIOSInfo->lvds->status == XF86OutputStatusConnected && pBIOSInfo->Panel->Scale) { * FIXME: We need to determine if the panel is using V1 or V3 * float hfactor = (float)pBIOSInfo->Panel->NativeMode->Width / pScrn->currentMode->HDisplay; dstWidth *= hfactor; }*/ pVia->swov.overlayRecordV1.dwWidth = dstWidth; pVia->swov.overlayRecordV1.dwHeight = dstHeight = pUpdate->DstBottom - pUpdate->DstTop; srcWidth = (unsigned long)pUpdate->SrcRight - pUpdate->SrcLeft; srcHeight = (unsigned long)pUpdate->SrcBottom - pUpdate->SrcTop; DBG_DD(ErrorF("===srcWidth= %ld \n", srcWidth)); DBG_DD(ErrorF("===srcHeight= %ld \n", srcHeight)); vidCtl = ViaSetVidCtl(pVia, videoFlag); if (hwDiff->dwNeedV1Prefetch) { DBG_DD(ErrorF("NEEDV1PREFETCH\n")); vidCtl |= V1_PREFETCH_ON_3336; } /* * Enable video on secondary */ if ((pVia->VideoEngine == VIDEO_ENGINE_CME || pVia->Chipset == VIA_P4M800PRO) && iga->index) { /* V1_ON_SND_DISPLAY */ vidCtl |= V1_ON_SND_DISPLAY; /* SECOND_DISPLAY_COLOR_KEY_ENABLE */ compose |= SECOND_DISPLAY_COLOR_KEY_ENABLE | 0x1; } viaOverlayGetV1V3Format(pVia, (videoFlag & VIDEO_1_INUSE) ? 1 : 3, videoFlag, &vidCtl, &hqvCtl); if (hwDiff->dwThreeHQVBuffer) { /* CLE_C0: HQV supports triple-buffering */ hqvCtl &= ~HQV_SW_FLIP; hqvCtl |= HQV_TRIPLE_BUFF | HQV_FLIP_STATUS; } /* Starting address of source and Source offset */ dwOffset = viaOverlayGetSrcStartAddress(pVia, videoFlag, pUpdate, srcPitch, &hqvOffset); DBG_DD(ErrorF("===dwOffset= 0x%lx \n", dwOffset)); pVia->swov.overlayRecordV1.dwOffset = dwOffset; if (pVia->swov.SrcFourCC == FOURCC_YV12 || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { YCBCRREC YCbCr; if (videoFlag & VIDEO_HQV_INUSE) { SetVideoStart(pVia, videoFlag, hwDiff->dwThreeHQVBuffer ? 3 : 2, pVia->swov.overlayRecordV1.dwHQVAddr[0] + dwOffset, pVia->swov.overlayRecordV1.dwHQVAddr[1] + dwOffset, pVia->swov.overlayRecordV1.dwHQVAddr[2] + dwOffset); if (pVia->swov.SrcFourCC != FOURCC_XVMC) { YCbCr = viaOverlayGetYCbCrStartAddress(videoFlag, startAddr, pVia->swov.overlayRecordV1.dwOffset, pVia->swov.overlayRecordV1.dwUVoffset, srcPitch, oriSrcHeight); if (pVia->VideoEngine == VIDEO_ENGINE_CME) { SaveVideoRegister(pVia, HQV_SRC_STARTADDR_Y + proReg, YCbCr.dwY); SaveVideoRegister(pVia, HQV_SRC_STARTADDR_U + proReg, YCbCr.dwCB); } else { SaveVideoRegister(pVia, HQV_SRC_STARTADDR_Y, YCbCr.dwY); SaveVideoRegister(pVia, HQV_SRC_STARTADDR_U, YCbCr.dwCR); SaveVideoRegister(pVia, HQV_SRC_STARTADDR_V, YCbCr.dwCB); } } } else { YCbCr = viaOverlayGetYCbCrStartAddress(videoFlag, startAddr, pVia->swov.overlayRecordV1.dwOffset, pVia->swov.overlayRecordV1.dwUVoffset, srcPitch, oriSrcHeight); if (videoFlag & VIDEO_1_INUSE) { SaveVideoRegister(pVia, V1_STARTADDR_0, YCbCr.dwY); SaveVideoRegister(pVia, V1_STARTADDR_CB0, YCbCr.dwCR); SaveVideoRegister(pVia, V1_STARTADDR_CR0, YCbCr.dwCB); } else DBG_DD(ErrorF("Upd_Video(): " "We do not support YV12 with V3!\n")); } } else { if (videoFlag & VIDEO_HQV_INUSE) { hqvSrcWidth = (unsigned long)pUpdate->SrcRight - pUpdate->SrcLeft; hqvDstWidth = (unsigned long)pUpdate->DstRight - pUpdate->DstLeft; if (hqvSrcWidth > hqvDstWidth) dwOffset = dwOffset * hqvDstWidth / hqvSrcWidth; SetVideoStart(pVia, videoFlag, hwDiff->dwThreeHQVBuffer ? 3 : 2, pVia->swov.overlayRecordV1.dwHQVAddr[0] + hqvOffset, pVia->swov.overlayRecordV1.dwHQVAddr[1] + hqvOffset, pVia->swov.overlayRecordV1.dwHQVAddr[2] + hqvOffset); if (pVia->VideoEngine == VIDEO_ENGINE_CME) SaveVideoRegister(pVia, 0x1cc + proReg, dwOffset); SaveVideoRegister(pVia, HQV_SRC_STARTADDR_Y + proReg, startAddr); } else { startAddr += dwOffset; SetVideoStart(pVia, videoFlag, 1, startAddr, 0, 0); } } fetch = viaOverlayGetFetch(pVia, videoFlag, srcWidth, dstWidth, oriSrcWidth, &hqvSrcFetch); DBG_DD(ErrorF("===fetch= 0x%lx\n", fetch)); #if 0 /* For DCT450 test-BOB INTERLEAVE */ if ((deinterlaceMode & DDOVER_INTERLEAVED) && (deinterlaceMode & DDOVER_BOB)) { if (videoFlag & VIDEO_HQV_INUSE) hqvCtl |= HQV_FIELD_2_FRAME | HQV_FRAME_2_FIELD | HQV_DEINTERLACE; else vidCtl |= V1_BOB_ENABLE | V1_FRAME_BASE; } else if (deinterlaceMode & DDOVER_BOB) { if (videoFlag & VIDEO_HQV_INUSE) /* The HQV source data line count should be two times of the original line count */ hqvCtl |= HQV_FIELD_2_FRAME | HQV_DEINTERLACE; else vidCtl |= V1_BOB_ENABLE; } #endif if (videoFlag & VIDEO_HQV_INUSE) { if (!(deinterlaceMode & DDOVER_INTERLEAVED) && (deinterlaceMode & DDOVER_BOB)) SetHQVFetch(pVia, hqvSrcFetch, oriSrcHeight << 1); else SetHQVFetch(pVia, hqvSrcFetch, oriSrcHeight); if (pVia->swov.SrcFourCC == FOURCC_YV12 || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_STRIDE, srcPitch << 1); else SaveVideoRegister(pVia, V3_STRIDE, srcPitch << 1); if (pVia->HWDiff.dwHQVFetchByteUnit) SaveVideoRegister(pVia, HQV_SRC_STRIDE + proReg, ((srcPitch >> 1) << 16) | srcPitch | HQV_FIFO_DEPTH_1); else SaveVideoRegister(pVia, HQV_SRC_STRIDE + proReg, ((srcPitch >> 1) << 16) | srcPitch); SaveVideoRegister(pVia, HQV_DST_STRIDE + proReg, (srcPitch << 1)); } else { if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_STRIDE, srcPitch); else SaveVideoRegister(pVia, V3_STRIDE, srcPitch); SaveVideoRegister(pVia, HQV_SRC_STRIDE + proReg, srcPitch); SaveVideoRegister(pVia, HQV_DST_STRIDE + proReg, srcPitch); } } else { if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_STRIDE, srcPitch | (srcPitch << 15)); else SaveVideoRegister(pVia, V3_STRIDE, srcPitch | (srcPitch << 15)); } /* Set destination window */ SetVideoWindow(pScrn, videoFlag, pUpdate); compose |= ALWAYS_SELECT_VIDEO; /* Set up X zoom factor */ pVia->swov.overlayRecordV1.dwFetchAlignment = 0; if (!viaOverlayHQVCalcZoomWidth(pVia, videoFlag, srcWidth, dstWidth, &zoomCtl, &miniCtl, &hqvFilterCtl, &hqvMiniCtl, &hqvScaleCtlH, &haveHQVzoomH)) { /* Need to scale (minify) too much - can't handle it. */ SetFetch(pVia, videoFlag, fetch); FireVideoCommand(pVia, videoFlag, compose); FlushVidRegBuffer(pVia); return FALSE; } SetFetch(pVia, videoFlag, fetch); /* Set up Y zoom factor */ /* For DCT450 test-BOB INTERLEAVE */ if ((deinterlaceMode & DDOVER_INTERLEAVED) && (deinterlaceMode & DDOVER_BOB)) { if (!(videoFlag & VIDEO_HQV_INUSE)) { srcHeight /= 2; if (videoFlag & VIDEO_1_INUSE) vidCtl |= V1_BOB_ENABLE | V1_FRAME_BASE; else vidCtl |= V3_BOB_ENABLE | V3_FRAME_BASE; } else hqvCtl |= HQV_FIELD_2_FRAME | HQV_FRAME_2_FIELD | HQV_DEINTERLACE; } else if (deinterlaceMode & DDOVER_BOB) { if (videoFlag & VIDEO_HQV_INUSE) { srcHeight <<= 1; hqvCtl |= HQV_FIELD_2_FRAME | HQV_DEINTERLACE; } else { if (videoFlag & VIDEO_1_INUSE) vidCtl |= V1_BOB_ENABLE; else vidCtl |= V3_BOB_ENABLE; } } SetDisplayCount(pVia, videoFlag, srcWidth, srcHeight); if (!viaOverlayHQVCalcZoomHeight(pVia, srcHeight, dstHeight, &zoomCtl, &miniCtl, &hqvFilterCtl, &hqvMiniCtl, &hqvScaleCtlV, &haveHQVzoomV)) { /* Need to scale (minify) too much - can't handle it. */ FireVideoCommand(pVia, videoFlag, compose); FlushVidRegBuffer(pVia); return FALSE; } SetupFIFOs(pVia, videoFlag, miniCtl, srcWidth); if (videoFlag & VIDEO_HQV_INUSE) { miniCtl = 0; if (haveHQVzoomH || haveHQVzoomV) { tmp = 0; if (haveHQVzoomH) { miniCtl = V1_X_INTERPOLY; /* Disable X interpolation if the height exceeds * the maximum supported by the hardware */ if (srcHeight >= pVia->swov.maxHInterp) miniCtl &= ~V1_X_INTERPOLY; tmp = zoomCtl & 0xffff0000; } if (haveHQVzoomV) { miniCtl |= V1_Y_INTERPOLY | V1_YCBCR_INTERPOLY; /* Disable Y interpolation if the width exceeds * the maximum supported by the hardware */ if (srcWidth >= pVia->swov.maxWInterp) miniCtl &= ~V1_Y_INTERPOLY; tmp |= zoomCtl & 0x0000ffff; hqvFilterCtl &= 0xfffdffff; } /* Temporary fix for 2D bandwidth problem. 2002/08/01 */ if (pVia->swov.gdwUseExtendedFIFO) miniCtl &= ~V1_Y_INTERPOLY; SetMiniAndZoom(pVia, videoFlag, miniCtl, tmp); } else { if (srcHeight == dstHeight) hqvFilterCtl &= 0xfffdffff; SetMiniAndZoom(pVia, videoFlag, 0, 0); } if (hwDiff->dwNewScaleCtl) { SaveVideoRegister(pVia, HQV_H_SCALE_CONTROL + proReg, hqvScaleCtlH); SaveVideoRegister(pVia, HQV_V_SCALE_CONTROL + proReg, hqvScaleCtlV); } else { SaveVideoRegister(pVia, HQV_MINIFY_CONTROL + proReg, hqvMiniCtl); } SaveVideoRegister(pVia, HQV_FILTER_CONTROL + proReg, hqvFilterCtl); } else SetMiniAndZoom(pVia, videoFlag, miniCtl, zoomCtl); if (haveColorKey) compose = SetColorKey(pVia, videoFlag, colorKeyLow, colorKeyHigh, compose); if (haveChromaKey) compose = SetChromaKey(pVia, videoFlag, chromaKeyLow, chromaKeyHigh, miniCtl, compose); if (pVia->VideoEngine == VIDEO_ENGINE_CME) { SaveVideoRegister(pVia, HQV_CME_REG(hwDiff, HQV_SDO_CTRL1),0); SaveVideoRegister(pVia, HQV_CME_REG(hwDiff, HQV_SDO_CTRL3),((pUpdate->SrcRight - 1 ) << 16) | (pUpdate->SrcBottom - 1)); if ((pVia->Chipset == VIA_VX800) || (pVia->Chipset == VIA_VX855) || (pVia->Chipset == VIA_VX900)) { SaveVideoRegister(pVia, HQV_CME_REG(hwDiff, HQV_SDO_CTRL2),0); SaveVideoRegister(pVia, HQV_CME_REG(hwDiff, HQV_SDO_CTRL4),((pUpdate->SrcRight - 1 ) << 16) | (pUpdate->SrcBottom - 1)); if ((pVia->Chipset == VIA_VX855) || (pVia->Chipset == VIA_VX900)) { SaveVideoRegister(pVia, HQV_DST_DATA_OFFSET_CTRL1,0); SaveVideoRegister(pVia, HQV_DST_DATA_OFFSET_CTRL3,((pUpdate->SrcRight - 1 ) << 16) | (pUpdate->SrcBottom - 1)); SaveVideoRegister(pVia, HQV_DST_DATA_OFFSET_CTRL2,0); SaveVideoRegister(pVia, HQV_DST_DATA_OFFSET_CTRL4,((pUpdate->SrcRight - 1 ) << 16) | (pUpdate->SrcBottom - 1)); SaveVideoRegister(pVia, HQV_BACKGROUND_DATA_OFFSET,((pUpdate->SrcRight - 1 ) << 16) | (pUpdate->SrcBottom - 1)); SaveVideoRegister(pVia, HQV_EXTENDED_CONTROL,0); /*0x3e0*/ SaveVideoRegister(pVia, HQV_SUBP_HSCALE_CTRL,0); /*0x3e8*/ SaveVideoRegister(pVia, HQV_SUBP_VSCALE_CTRL,0); } if (pVia->Chipset == VIA_VX900) { SaveVideoRegister(pVia, HQV_SHARPNESS_DECODER_HANDSHAKE_CTRL_410, 0); } // TODO Need to be tested on VX800 /* 0x3B8 */ SaveVideoRegister(pVia, HQV_DEFAULT_VIDEO_COLOR, HQV_FIX_COLOR); } } /* Set up video control */ if (videoFlag & VIDEO_HQV_INUSE) { if (!pVia->swov.SWVideo_ON) { DBG_DD(ErrorF(" First HQV\n")); FlushVidRegBuffer(pVia); DBG_DD(ErrorF(" Wait flips")); if (hwDiff->dwHQVInitPatch) { DBG_DD(ErrorF(" Initializing HQV twice ...")); for (i = 0; i < 2; i++) { viaWaitHQVFlipClear(pVia, ((hqvCtl & ~HQV_SW_FLIP) | HQV_FLIP_STATUS) & ~HQV_ENABLE); VIASETREG(HQV_CONTROL + proReg, hqvCtl); viaWaitHQVFlip(pVia); } DBG_DD(ErrorF(" done.\n")); } else { /* CLE_C0 */ CARD32 volatile *HQVCtrl = (CARD32 volatile *)(pVia->MapBase + HQV_CONTROL + proReg); /* Check that HQV is idle */ DBG_DD(ErrorF("HQV control wf - %08lx\n", *HQVCtrl)); while (!(*HQVCtrl & HQV_IDLE)) { DBG_DD(ErrorF("HQV control busy - %08lx\n", *HQVCtrl)); usleep(1); } VIASETREG(HQV_CONTROL + proReg, hqvCtl & ~HQV_SW_FLIP); VIASETREG(HQV_CONTROL + proReg, hqvCtl | HQV_SW_FLIP); DBG_DD(ErrorF("HQV control wf5 - %08lx\n", *HQVCtrl)); DBG_DD(ErrorF(" Wait flips5")); if (pVia->VideoEngine != VIDEO_ENGINE_CME) { for (i = 0; (i < 50) && !(*HQVCtrl & HQV_FLIP_STATUS); i++) { DBG_DD(ErrorF(" HQV wait %d %08lx\n", i, *HQVCtrl)); *HQVCtrl |= HQV_SW_FLIP | HQV_FLIP_STATUS; usleep(1); } } else { viaWaitHQVFlip(pVia); } DBG_DD(ErrorF(" Wait flips6")); } if (videoFlag & VIDEO_1_INUSE) { VIASETREG(V1_CONTROL, vidCtl); VIASETREG(V_COMPOSE_MODE, compose | V1_COMMAND_FIRE); if (pVia->swov.gdwUseExtendedFIFO) { /* Set Display FIFO */ DBG_DD(ErrorF(" Wait flips7")); viaWaitVBI(pVia); DBG_DD(ErrorF(" Wait flips 8")); hwp->writeSeq(hwp, 0x17, 0x2F); ViaSeqMask(hwp, 0x16, 0x14, 0x1F); hwp->writeSeq(hwp, 0x18, 0x56); DBG_DD(ErrorF(" Wait flips 9")); } } else { DBG_DD(ErrorF(" Wait flips 10")); VIASETREG(V3_CONTROL, vidCtl); VIASETREG(V_COMPOSE_MODE, compose | V3_COMMAND_FIRE); } DBG_DD(ErrorF(" Done flips")); } else { DBG_DD(ErrorF(" Normal called\n")); SaveVideoRegister(pVia, HQV_CONTROL + proReg, hqvCtl | HQV_FLIP_STATUS); SetVideoControl(pVia, videoFlag, vidCtl); FireVideoCommand(pVia, videoFlag, compose); viaWaitHQVDone(pVia); FlushVidRegBuffer(pVia); } } else { SetVideoControl(pVia, videoFlag, vidCtl); FireVideoCommand(pVia, videoFlag, compose); viaWaitHQVDone(pVia); FlushVidRegBuffer(pVia); } pVia->swov.SWVideo_ON = TRUE; DBG_DD(ErrorF(" Done Upd_Video")); return TRUE; } /* Upd_Video */ /* * VIAVidUpdateOverlay() * Parameters: src rectangle, dst rectangle, colorkey... * Return value: unsigned long of state * Note: updates the overlay image parameter. */ Bool VIAVidUpdateOverlay(xf86CrtcPtr crtc, LPDDUPDATEOVERLAY pUpdate) { ScrnInfoPtr pScrn = crtc->scrn; VIAPtr pVia = VIAPTR(pScrn); OVERLAYRECORD *ovlV1 = &pVia->swov.overlayRecordV1; unsigned long flags = pUpdate->dwFlags; unsigned long videoFlag = 0; unsigned long startAddr = 0; unsigned long deinterlaceMode = 0; unsigned long haveColorKey = 0, haveChromaKey = 0; unsigned long colorKeyLow = 0, colorKeyHigh = 0; unsigned long chromaKeyLow = 0, chromaKeyHigh = 0; unsigned long scrnWidth, scrnHeight; int dstTop, dstBottom, dstLeft, dstRight; int panDX, panDY; /* Panning delta */ unsigned long proReg = 0; panDX = pVia->swov.panning_x; panDY = pVia->swov.panning_y; pVia->swov.oldPanningX = pVia->swov.panning_x; pVia->swov.oldPanningY = pVia->swov.panning_y; pUpdate->DstLeft -= panDX; pUpdate->DstTop -= panDY; pUpdate->DstRight -= panDX; pUpdate->DstBottom -= panDY; DBG_DD(ErrorF("Raw rSrc X (%ld,%ld) Y (%ld,%ld)\n", pUpdate->SrcLeft, pUpdate->SrcRight, pUpdate->SrcTop, pUpdate->SrcBottom)); DBG_DD(ErrorF("Raw rDest X (%ld,%ld) Y (%ld,%ld)\n", pUpdate->DstLeft, pUpdate->DstRight, pUpdate->DstTop, pUpdate->DstBottom)); if ((pVia->swov.SrcFourCC == FOURCC_YUY2) || (pVia->swov.SrcFourCC == FOURCC_RV15) || (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) { videoFlag = pVia->swov.gdwVideoFlagSW; } if (pVia->ChipId == PCI_CHIP_VT3259 && !(videoFlag & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; flags |= DDOVER_INTERLEAVED; /* Disable destination color keying if the alpha window is in use. */ if (pVia->swov.gdwAlphaEnabled) flags &= ~DDOVER_KEYDEST; ResetVidRegBuffer(pVia); /* For SW decode HW overlay use */ startAddr = VIAGETREG(HQV_SRC_STARTADDR_Y + proReg); if (flags & DDOVER_KEYDEST) { haveColorKey = 1; colorKeyLow = pUpdate->dwColorSpaceLowValue; } if (flags & DDOVER_INTERLEAVED) deinterlaceMode |= DDOVER_INTERLEAVED; if (flags & DDOVER_BOB) deinterlaceMode |= DDOVER_BOB; if ((pVia->ChipId == PCI_CHIP_CLE3122) && (pScrn->currentMode->HDisplay > 1024)) { DBG_DD(ErrorF("UseExtendedFIFO\n")); pVia->swov.gdwUseExtendedFIFO = 1; } else pVia->swov.gdwUseExtendedFIFO = 0; /* Figure out actual rSrc rectangle */ dstLeft = pUpdate->DstLeft; dstTop = pUpdate->DstTop; dstRight = pUpdate->DstRight; dstBottom = pUpdate->DstBottom; scrnWidth = pScrn->currentMode->HDisplay; scrnHeight = pScrn->currentMode->VDisplay; if (dstLeft < 0) { pUpdate->SrcLeft = ((((-dstLeft) * ovlV1->dwV1OriWidth) + ((dstRight - dstLeft) >> 1)) / (dstRight - dstLeft)); } if (dstRight > scrnWidth) { pUpdate->SrcRight = ((((scrnWidth - dstLeft) * ovlV1->dwV1OriWidth) + ((dstRight - dstLeft) >> 1)) / (dstRight - dstLeft)); } if (dstTop < 0) { pUpdate->SrcTop = ((((-dstTop) * ovlV1->dwV1OriHeight) + ((dstBottom - dstTop) >> 1)) / (dstBottom - dstTop)); } if (dstBottom > scrnHeight) { pUpdate->SrcBottom = ((((scrnHeight - dstTop) * ovlV1->dwV1OriHeight) + ((dstBottom - dstTop) >> 1)) / (dstBottom - dstTop)); } /* Save modified src & original dest rectangle parameters */ if ((pVia->swov.SrcFourCC == FOURCC_YUY2) || (pVia->swov.SrcFourCC == FOURCC_RV15) || (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) { pVia->swov.SWDevice.gdwSWDstLeft = pUpdate->DstLeft + panDX; pVia->swov.SWDevice.gdwSWDstTop = pUpdate->DstTop + panDY; pVia->swov.SWDevice.gdwSWDstWidth = pUpdate->DstRight - pUpdate->DstLeft; pVia->swov.SWDevice.gdwSWDstHeight = pUpdate->DstBottom - pUpdate->DstTop; pVia->swov.SWDevice.gdwSWSrcWidth = ovlV1->dwV1SrcWidth = pUpdate->SrcRight - pUpdate->SrcLeft; pVia->swov.SWDevice.gdwSWSrcHeight = ovlV1->dwV1SrcHeight = pUpdate->SrcBottom - pUpdate->SrcTop; } ovlV1->dwV1SrcLeft = pUpdate->SrcLeft; ovlV1->dwV1SrcRight = pUpdate->SrcRight; ovlV1->dwV1SrcTop = pUpdate->SrcTop; ovlV1->dwV1SrcBot = pUpdate->SrcBottom; /* Figure out actual rDest rectangle */ pUpdate->DstLeft = (dstLeft < 0) ? 0 : dstLeft; pUpdate->DstTop = (dstTop < 0) ? 0 : dstTop; if (pUpdate->DstTop >= scrnHeight) pUpdate->DstTop = scrnHeight - 1; pUpdate->DstRight = (dstRight > scrnWidth) ? scrnWidth : dstRight; pUpdate->DstBottom = (dstBottom > scrnHeight) ? scrnHeight : dstBottom; /* Update the overlay */ if (!Upd_Video(crtc, videoFlag, startAddr, pUpdate, pVia->swov.SWDevice.dwPitch, ovlV1->dwV1OriWidth, ovlV1->dwV1OriHeight, deinterlaceMode, haveColorKey, haveChromaKey, colorKeyLow, colorKeyHigh, chromaKeyLow, chromaKeyHigh)) return FALSE; pVia->swov.SWVideo_ON = FALSE; return TRUE; } /* VIAVidUpdateOverlay */ /* * */ void ViaOverlayHide(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); vgaHWPtr hwp = VGAHWPTR(pScrn); CARD32 videoFlag = 0; unsigned long proReg = 0; if ((pVia->swov.SrcFourCC == FOURCC_YUY2) || (pVia->swov.SrcFourCC == FOURCC_RV15) || (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) videoFlag = pVia->swov.gdwVideoFlagSW; if (pVia->ChipId == PCI_CHIP_VT3259 && !(videoFlag & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; ResetVidRegBuffer(pVia); if (pVia->HWDiff.dwHQVDisablePatch) ViaSeqMask(hwp, 0x2E, 0x00, 0x10); SaveVideoRegister(pVia, V_FIFO_CONTROL, V1_FIFO_PRETHRESHOLD12 | V1_FIFO_THRESHOLD8 | V1_FIFO_DEPTH16); SaveVideoRegister(pVia, ALPHA_V3_FIFO_CONTROL, ALPHA_FIFO_THRESHOLD4 | ALPHA_FIFO_DEPTH8 | V3_FIFO_THRESHOLD24 | V3_FIFO_DEPTH32); if (videoFlag & VIDEO_HQV_INUSE) SaveVideoRegister(pVia, HQV_CONTROL + proReg, VIAGETREG(HQV_CONTROL + proReg) & ~HQV_ENABLE); if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_CONTROL, VIAGETREG(V1_CONTROL) & ~V1_ENABLE); else SaveVideoRegister(pVia, V3_CONTROL, VIAGETREG(V3_CONTROL) & ~V3_ENABLE); FireVideoCommand(pVia, videoFlag, VIAGETREG(V_COMPOSE_MODE)); FlushVidRegBuffer(pVia); if (pVia->HWDiff.dwHQVDisablePatch) ViaSeqMask(hwp, 0x2E, 0x10, 0x10); pVia->swov.SWVideo_ON = FALSE; pVia->VideoStatus &= ~VIDEO_SWOV_ON; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_xv_overlay.h000066400000000000000000000102461267025031400250250ustar00rootroot00000000000000/* * 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_SWOV_H_ #define _VIA_SWOV_H_ 1 /*#define XV_DEBUG 1 write log msg to /var/log/XFree86.0.log */ #ifdef XV_DEBUG # define DBG_DD(x) (x) #else # define DBG_DD(x) #endif #include "via_priv.h" #include "via_xvpriv.h" /* Definition for VideoStatus */ #define VIDEO_NULL 0x00000000 #define VIDEO_SWOV_SURFACE_CREATED 0x00000001 #define VIDEO_SWOV_ON 0x00000002 /*For Video HW Difference */ #define VID_HWDIFF_TRUE 0x00000001 #define VID_HWDIFF_FALSE 0x00000000 /* * Video HW Difference Structure */ typedef struct __VIAHWDiff { unsigned long dwThreeHQVBuffer; /* Use Three HQV Buffers */ /* unsigned long dwV3SrcHeightSetting; *//* Set Video Source Width and Height */ /* unsigned long dwSupportExtendFIFO; *//* Support Extend FIFO */ unsigned long dwHQVFetchByteUnit; /* HQV Fetch Count unit is byte */ unsigned long dwHQVInitPatch; /* Initialize HQV Engine 2 times */ /*unsigned long dwSupportV3Gamma; *//* Support V3 Gamma */ /*unsigned long dwUpdFlip; *//* Set HQV3D0[15] to flip video */ unsigned long dwHQVDisablePatch; /* Change Video Engine Clock setting for HQV disable bug */ /*unsigned long dwSUBFlip; *//* Set HQV3D0[15] to flip video for sub-picture blending */ unsigned long dwNeedV1Prefetch; /*V1 pre-fetch function for K8*/ /*unsigned long dwNeedV3Prefetch; *//* V3 pre-fetch function for K8 */ /*unsigned long dwNeedV4Prefetch; *//* V4 pre-fetch function for K8 */ /*unsigned long dwUseSystemMemory; *//* Use system memory for DXVA compressed data buffers */ /*unsigned long dwExpandVerPatch; *//* Patch video HW bug in expand SIM mode or same display path */ /*unsigned long dwExpandVerHorPatch; *//* Patch video HW bug in expand SAMM mode or same display path */ /*unsigned long dwV3ExpireNumTune; *//* Change V3 expire number setting for V3 bandwidth issue */ /*unsigned long dwV3FIFOThresholdTune; *//* Change V3 FIFO, Threshold and Pre-threshold setting for V3 bandwidth issue */ /*unsigned long dwCheckHQVFIFOEmpty; *//* HW Flip path, need to check HQV FIFO status */ /*unsigned long dwUseMPEGAGP; *//* Use MPEG AGP function */ /*unsigned long dwV3FIFOPatch; *//* For CLE V3 FIFO Bug (srcWidth <= 8) */ unsigned long dwSupportTwoColorKey; /* Support two color key */ /* unsigned long dwCxColorSpace; *//* CLE_Cx ColorSpace */ unsigned dwNewScaleCtl; /* Use new HQV scale engine code */ const unsigned *HQVCmeRegs; /* Which set of CME regs to use for newer chipsets */ } VIAHWDiff; void VIAVidHWDiffInit(ScrnInfoPtr pScrn); int ViaSwovSurfaceCreate(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, CARD32 FourCC, CARD16 Width, CARD16 Height); void ViaSwovSurfaceDestroy(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv); Bool VIAVidUpdateOverlay(xf86CrtcPtr crtc, LPDDUPDATEOVERLAY pUpdate); void ViaOverlayHide(ScrnInfoPtr pScrn); #endif /* _VIA_SWOV_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_xvmc.c000066400000000000000000000752031267025031400236030ustar00rootroot00000000000000/* * Copyright (c) 2004 The Unichrome Project. All rights reserved. * Copyright (c) 2000 Intel Corporation. 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, 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 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 * 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. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "xf86.h" #include "xf86_OSproc.h" #if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 #include "xf86Resources.h" #endif #include "compiler.h" #include "xf86Pci.h" #include "regionstr.h" #ifdef HAVE_DRI #include "via_drmclient.h" #include "via_drm.h" #include "via_dri.h" #include "via_driver.h" #include "xf86xv.h" #include "fourcc.h" #if defined(X_NEED_XVPRIV_H) || defined (_XF86_FOURCC_H_) #include "xf86xvpriv.h" #endif #include "xf86xvmc.h" #include #include #include "dixstruct.h" #include "via_xvmc.h" #include "dristruct.h" #include "dri.h" #include "via_xvpriv.h" #include "via_xv.h" #define MAKE_ATOM(a) MakeAtom(a, strlen(a), TRUE) /* * List of attributes for the XvMC extension to handle. * As long as the attribute is supported by the Xv adaptor, it needs only * 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", "XV_AUTOPAINT_COLORKEY", "XV_BRIGHTNESS", "XV_CONTRAST", "XV_SATURATION", "XV_HUE" }; static Atom attrAtoms[VIA_NUM_XVMC_ATTRIBUTES]; /* * Xv Port private structure for XvMC. */ typedef struct { unsigned ctxDisplaying; int xvmc_port; ViaXvMCAttrHolder xvAttr; int newAttribute; SetPortAttributeFuncPtr SetPortAttribute; GetPortAttributeFuncPtr GetPortAttribute; PutImageFuncPtr PutImage; } ViaXvMCXVPriv; /* Proposed XvMC VIA driver extension. */ #define XVMC_VLD 0x0020000 /* Function declarations. */ static int ViaXvMCCreateContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext, int *num_priv, INT32 ** priv); static void ViaXvMCDestroyContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext); static int ViaXvMCCreateSurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, int *num_priv, INT32 ** priv); static void ViaXvMCDestroySurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf); static int ViaXvMCCreateSubpicture(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSurf, int *num_priv, INT32 ** priv); static void ViaXvMCDestroySubpicture(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp); static int viaXvMCInterceptXvAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 value, pointer data); static int viaXvMCInterceptPutImage(ScrnInfoPtr, short, short, short, short, short, short, short, short, int, unsigned char *, short, short, Bool, RegionPtr, pointer, DrawablePtr); static int viaXvMCInterceptXvGetAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 * value, pointer data); /* * Initialize and clean up the screen private parts of XvMC. */ static void initViaXvMC(ViaXvMCPtr vXvMC) { unsigned i; for (i = 0; i < VIA_XVMC_MAX_CONTEXTS; ++i) { vXvMC->contexts[i] = 0; vXvMC->cPrivs[i] = 0; } for (i = 0; i < VIA_XVMC_MAX_SURFACES; ++i) { vXvMC->surfaces[i] = 0; vXvMC->sPrivs[i] = 0; } } static void cleanupViaXvMC(ViaXvMCPtr vXvMC, XF86VideoAdaptorPtr * XvAdaptors, int XvAdaptorCount) { unsigned i; for (i = 0; i < VIA_XVMC_MAX_CONTEXTS; ++i) { vXvMC->contexts[i] = 0; if (vXvMC->cPrivs[i]) { free(vXvMC->cPrivs[i]); vXvMC->cPrivs[i] = 0; } } for (i = 0; i < VIA_XVMC_MAX_SURFACES; ++i) { vXvMC->surfaces[i] = 0; if (vXvMC->sPrivs[i]) { free(vXvMC->sPrivs[i]); vXvMC->sPrivs[i] = 0; } } } static unsigned stride(int w) { return (w + 31) & ~31; } static unsigned long size_yuv420(int w, int h) { unsigned yPitch = stride(w); return h * (yPitch + (yPitch >> 1)); } static unsigned long size_xx44(int w, int h) { return h * stride(w); } static int yv12_subpicture_index_list[2] = { FOURCC_IA44, FOURCC_AI44 }; static XF86MCImageIDList yv12_subpicture_list = { 2, yv12_subpicture_index_list }; static XF86MCSurfaceInfoRec Via_YV12_mpg2_surface = { FOURCC_YV12, XVMC_CHROMA_FORMAT_420, 0, 1024, 1024, 1024, 1024, XVMC_MPEG_2 | XVMC_VLD, XVMC_OVERLAID_SURFACE | XVMC_BACKEND_SUBPICTURE, &yv12_subpicture_list }; static XF86MCSurfaceInfoRec Via_pga_mpg2_surface = { FOURCC_YV12, XVMC_CHROMA_FORMAT_420, 0, 2048, 2048, 2048, 2048, XVMC_MPEG_2 | XVMC_VLD, XVMC_OVERLAID_SURFACE | XVMC_BACKEND_SUBPICTURE, &yv12_subpicture_list }; static XF86MCSurfaceInfoRec Via_YV12_mpg1_surface = { FOURCC_YV12, XVMC_CHROMA_FORMAT_420, 0, 1024, 1024, 1024, 1024, XVMC_MPEG_1 | XVMC_VLD, XVMC_OVERLAID_SURFACE | XVMC_BACKEND_SUBPICTURE, &yv12_subpicture_list }; static XF86MCSurfaceInfoRec Via_pga_mpg1_surface = { FOURCC_YV12, XVMC_CHROMA_FORMAT_420, 0, 2048, 2048, 2048, 2048, XVMC_MPEG_1 | XVMC_VLD, XVMC_OVERLAID_SURFACE | XVMC_BACKEND_SUBPICTURE, &yv12_subpicture_list }; static XF86MCSurfaceInfoPtr ppSI[2] = { (XF86MCSurfaceInfoPtr) & Via_YV12_mpg2_surface, (XF86MCSurfaceInfoPtr) & Via_YV12_mpg1_surface }; static XF86MCSurfaceInfoPtr ppSI_pga[2] = { (XF86MCSurfaceInfoPtr) & Via_pga_mpg2_surface, (XF86MCSurfaceInfoPtr) & Via_pga_mpg1_surface }; /* List of supported subpicture types. */ static XF86ImageRec ia44_subpicture = XVIMAGE_IA44; static XF86ImageRec ai44_subpicture = XVIMAGE_AI44; static XF86ImagePtr Via_subpicture_list[2] = { (XF86ImagePtr) & ia44_subpicture, (XF86ImagePtr) & ai44_subpicture }; /* * Filling in the device dependent adaptor record. * This is named "VIA Video Overlay" because this code falls under the * XV extension, the name must match or it won't be used. * * For surface and subpicture, see above. * The function pointers point to functions below. */ static XF86MCAdaptorRec pAdapt = { "XV_SWOV", /* name */ 2, /* num_surfaces */ ppSI, /* surfaces */ 2, /* num_subpictures */ Via_subpicture_list, /* subpictures */ (xf86XvMCCreateContextProcPtr) ViaXvMCCreateContext, (xf86XvMCDestroyContextProcPtr) ViaXvMCDestroyContext, (xf86XvMCCreateSurfaceProcPtr) ViaXvMCCreateSurface, (xf86XvMCDestroySurfaceProcPtr) ViaXvMCDestroySurface, (xf86XvMCCreateSubpictureProcPtr) ViaXvMCCreateSubpicture, (xf86XvMCDestroySubpictureProcPtr) ViaXvMCDestroySubpicture }; static XF86MCAdaptorRec pAdapt_pga = { "XV_SWOV", /* name */ 2, /* num_surfaces */ ppSI_pga, /* surfaces */ 2, /* num_subpictures */ Via_subpicture_list, /* subpictures */ (xf86XvMCCreateContextProcPtr) ViaXvMCCreateContext, (xf86XvMCDestroyContextProcPtr) ViaXvMCDestroyContext, (xf86XvMCCreateSurfaceProcPtr) ViaXvMCCreateSurface, (xf86XvMCDestroySurfaceProcPtr) ViaXvMCDestroySurface, (xf86XvMCCreateSubpictureProcPtr) ViaXvMCCreateSubpicture, (xf86XvMCDestroySubpictureProcPtr) ViaXvMCDestroySubpicture }; static XF86MCAdaptorPtr ppAdapt[1] = { (XF86MCAdaptorPtr) & pAdapt }; static XF86MCAdaptorPtr ppAdapt_pga[1] = { (XF86MCAdaptorPtr) & pAdapt_pga }; static void mpegDisable(VIAPtr pVia, CARD32 val) { MPGOutD(0x0c, MPGInD(0x0c) & (val ^ 0xffffffff)); } void ViaInitXVMC(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); volatile ViaXvMCSAreaPriv *saPriv; pVia->XvMCEnabled = 0; if ((pVia->Chipset == VIA_KM400) || (pVia->Chipset == VIA_CX700) || (pVia->Chipset == VIA_K8M890) || (pVia->Chipset == VIA_P4M900) || (pVia->Chipset == VIA_VX800) || (pVia->Chipset == VIA_VX855) || (pVia->Chipset == VIA_VX900)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] XvMC is not supported on this chipset.\n"); return; } if (!pVia->directRenderingType) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] Cannot use XvMC without DRI!\n"); return; } if (((pVia->drmVerMajor <= 2) && (pVia->drmVerMinor < 4))) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] Kernel drm is not compatible with XvMC.\n"); 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); xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[XvMC] Please update. Disabling XvMC.\n"); return; } vXvMC->mmioBase = pVia->registerHandle; if (drmAddMap(pVia->drmmode.fd, (drm_handle_t) pVia->FrameBufferBase, pVia->videoRambytes, DRM_FRAME_BUFFER, 0, &(vXvMC->fbBase)) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] drmAddMap(FB) failed. Disabling XvMC.\n"); return; } initViaXvMC(vXvMC); if (!xf86XvMCScreenInit(pScreen, 1, ((pVia->Chipset == VIA_PM800) ? ppAdapt_pga : ppAdapt))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] XvMCScreenInit failed. Disabling XvMC.\n"); drmRmMap(pVia->drmmode.fd, vXvMC->fbBase); return; } #if (XvMCVersion > 1) || (XvMCRevision > 0) { DRIInfoPtr pDRIInfo = pVia->pDRIInfo; if (pVia->ChipId != PCI_CHIP_VT3259 && pVia->ChipId != PCI_CHIP_VT3364) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Registering chromeXvMC.\n"); xf86XvMCRegisterDRInfo(pScreen, "chromeXvMC", pDRIInfo->busIdString, VIAXVMC_MAJOR, VIAXVMC_MINOR, VIAXVMC_PL); } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Registering chromeXvMCPro.\n"); xf86XvMCRegisterDRInfo(pScreen, "chromeXvMCPro", pDRIInfo->busIdString, VIAXVMC_MAJOR, VIAXVMC_MINOR, VIAXVMC_PL); } } #endif vXvMC->activePorts = 0; saPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScreen); saPriv->XvMCCtxNoGrabbed = ~0; XVMCLOCKPTR(saPriv, UNICHROME_LOCK_DECODER1)->lock = 0; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Initialized XvMC extension.\n"); pVia->XvMCEnabled = 1; } void ViaCleanupXVMC(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr * XvAdaptors, int XvAdaptorCount) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); int i, j; if (pVia->XvMCEnabled) { mpegDisable(pVia, 0); drmRmMap(pVia->drmmode.fd, vXvMC->mmioBase); cleanupViaXvMC(vXvMC, XvAdaptors, XvAdaptorCount); } for (i = 0; i < XvAdaptorCount; ++i) { if (!XvAdaptors[i]) continue; for (j = 0; j < XvAdaptors[i]->nPorts; ++j) { viaPortPrivPtr pPriv = XvAdaptors[i]->pPortPrivates[j].ptr; if (pPriv->xvmc_priv) free(pPriv->xvmc_priv); } } pVia->XvMCEnabled = 0; } static int ViaXvMCCreateContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext, int *num_priv, INT32 ** priv) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); DRIInfoPtr pDRIInfo = pVia->pDRIInfo; VIADRIPtr pViaDRI = pDRIInfo->devPrivate; ViaXvMCCreateContextRec *contextRec; unsigned ctxNo; ViaXvMCContextPriv *cPriv; XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr) pContext->port_priv; viaPortPrivPtr pPriv = (viaPortPrivPtr) portPriv->DevPriv.ptr; ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; volatile ViaXvMCSAreaPriv *sAPriv; sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); if (-1 == vx->xvmc_port) { vx->xvmc_port = (vXvMC->activePorts++); sAPriv->XvMCSubPicOn[vx->xvmc_port] = 0; sAPriv->XvMCDisplaying[vx->xvmc_port] = 0; } if (vXvMC->nContexts >= VIA_XVMC_MAX_CONTEXTS) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateContext: Out of contexts.\n"); return BadAlloc; } *priv = calloc(1, sizeof(ViaXvMCCreateContextRec)); contextRec = (ViaXvMCCreateContextRec *) * priv; if (!*priv) { *num_priv = 0; return BadAlloc; } *num_priv = sizeof(ViaXvMCCreateContextRec) >> 2; for (ctxNo = 0; ctxNo < VIA_XVMC_MAX_CONTEXTS; ++ctxNo) { if (0 == vXvMC->contexts[ctxNo]) break; } cPriv = (ViaXvMCContextPriv *) calloc(1, sizeof(ViaXvMCContextPriv)); if (!cPriv) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateContext: Unable to allocate memory!\n"); free(*priv); *num_priv = 0; return BadAlloc; } /* Export framebuffer and mmio to non-root clients. */ contextRec->ctxNo = ctxNo; contextRec->xvmc_port = vx->xvmc_port; contextRec->fbOffset = vXvMC->fbBase; contextRec->fbSize = pVia->videoRambytes; contextRec->mmioOffset = vXvMC->mmioBase; contextRec->mmioSize = VIA_MMIO_REGSIZE; contextRec->sAreaSize = pDRIInfo->SAREASize; contextRec->sAreaPrivOffset = sizeof(XF86DRISAREARec); contextRec->major = VIAXVMC_MAJOR; contextRec->minor = VIAXVMC_MINOR; contextRec->pl = VIAXVMC_PL; contextRec->initAttrs = vx->xvAttr; contextRec->useAGP = (pViaDRI->ringBufActive && ((pVia->Chipset == VIA_CLE266) || (pVia->Chipset == VIA_KM400) || (pVia->Chipset == VIA_PM800) || (pVia->Chipset == VIA_P4M900))); contextRec->chipId = pVia->ChipId; contextRec->screen = pScrn->scrnIndex; contextRec->depth = pScrn->bitsPerPixel; contextRec->stride = pVia->Bpp * pScrn->virtualX; vXvMC->nContexts++; vXvMC->contexts[ctxNo] = pContext->context_id; vXvMC->cPrivs[ctxNo] = cPriv; return Success; } static int ViaXvMCCreateSurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf, int *num_priv, INT32 ** priv) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); unsigned srfNo, numBuffers, i; ViaXvMCSurfacePriv *sPriv; XvMCContextPtr ctx; unsigned bufSize, yBufSize; void *buf; if (VIA_XVMC_MAX_SURFACES == vXvMC->nSurfaces) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSurface: Too many surfaces !\n"); return BadAlloc; } sPriv = (ViaXvMCSurfacePriv *) calloc(1, sizeof(ViaXvMCSurfacePriv)); if (!sPriv) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSurface: Unable to allocate memory!\n"); *num_priv = 0; return BadAlloc; } numBuffers = 1; /* * Some chips require more than one buffer per surface (and a special * flipping procedure; See Ivor Hewitt's ddmpeg.c version 1.6). The client * lib will detect the number of buffers allocated and determine the * flipping method from that. */ #if 0 /* Not enabled yet. */ switch (pVia->ChipSet) { case VIA_CLE266: switch (pVia->ChipRev) { case 0x10: /* CLE266 C0 only? Or all C? */ numBuffers = 2; break; default: break; } break; default: break; } #endif *num_priv = numBuffers + 2; *priv = (INT32 *) calloc(*num_priv, sizeof(INT32)); if (!*priv) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSurface: Unable to allocate memory!\n"); *num_priv = 0; free(sPriv); return BadAlloc; } for (srfNo = 0; srfNo < VIA_XVMC_MAX_SURFACES; ++srfNo) { if (0 == vXvMC->sPrivs[srfNo]) break; } (*priv)[0] = srfNo; ctx = pSurf->context; bufSize = size_yuv420(ctx->width, ctx->height); sPriv->memory_ref = drm_bo_alloc(pScrn, numBuffers * bufSize, 32, TTM_PL_FLAG_VRAM); if (!sPriv->memory_ref) { free(*priv); free(sPriv); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSurface: " "Unable to allocate frambuffer memory!\n"); return BadAlloc; } buf = drm_bo_map(pScrn, sPriv->memory_ref); (*priv)[1] = numBuffers; (*priv)[2] = sPriv->offsets[0] = sPriv->memory_ref->offset; for (i = 1; i < numBuffers; ++i) { (*priv)[i + 2] = sPriv->offsets[i] = sPriv->offsets[i - 1] + bufSize; } yBufSize = stride(ctx->width) * ctx->height; for (i = 0; i < numBuffers; ++i) { memset(buf, 0, yBufSize); memset(buf + yBufSize, 0x80, yBufSize >> 1); buf += bufSize; } drm_bo_unmap(pScrn, sPriv->memory_ref); vXvMC->sPrivs[srfNo] = sPriv; vXvMC->surfaces[srfNo] = pSurf->surface_id; vXvMC->nSurfaces++; return Success; } static int ViaXvMCCreateSubpicture(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp, int *num_priv, INT32 ** priv) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); unsigned srfNo; ViaXvMCSurfacePriv *sPriv; XvMCContextPtr ctx; unsigned bufSize; if (VIA_XVMC_MAX_SURFACES == vXvMC->nSurfaces) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSubpicture: Too many surfaces !\n"); return BadAlloc; } sPriv = (ViaXvMCSurfacePriv *) calloc(1, sizeof(ViaXvMCSurfacePriv)); if (!sPriv) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSubpicture:" " Unable to allocate memory!\n"); *num_priv = 0; return BadAlloc; } *priv = (INT32 *) calloc(3, sizeof(INT32)); if (!*priv) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSubpicture:" " Unable to allocate memory!\n"); *num_priv = 0; free(sPriv); return BadAlloc; } *num_priv = 2; for (srfNo = 0; srfNo < VIA_XVMC_MAX_SURFACES; ++srfNo) { if (0 == vXvMC->sPrivs[srfNo]) break; } (*priv)[0] = srfNo; ctx = pSubp->context; bufSize = size_xx44(ctx->width, ctx->height); sPriv->memory_ref = drm_bo_alloc(pScrn, 1 * bufSize, 32, TTM_PL_FLAG_VRAM); if (!sPriv->memory_ref) { free(*priv); free(sPriv); xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] ViaXvMCCreateSubpicture:" " Unable to allocate framebuffer memory!\n"); return BadAlloc; } (*priv)[1] = sPriv->offsets[0] = sPriv->memory_ref->offset; vXvMC->sPrivs[srfNo] = sPriv; vXvMC->surfaces[srfNo] = pSubp->subpicture_id; vXvMC->nSurfaces++; return Success; } static void ViaXvMCDestroyContext(ScrnInfoPtr pScrn, XvMCContextPtr pContext) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); int i; volatile ViaXvMCSAreaPriv *sAPriv; viaPortPrivPtr pPriv; XvPortRecPrivatePtr portPriv; ViaXvMCXVPriv *vx; 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; if ((i | VIA_XVMC_VALID) == vx->ctxDisplaying) { vx->ctxDisplaying = 0; } free(vXvMC->cPrivs[i]); vXvMC->cPrivs[i] = 0; vXvMC->nContexts--; vXvMC->contexts[i] = 0; return; } } return; } static void ViaXvMCDestroySurface(ScrnInfoPtr pScrn, XvMCSurfacePtr pSurf) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); int i; volatile ViaXvMCSAreaPriv *sAPriv; XvMCContextPtr pContext = pSurf->context; XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr) pContext->port_priv; viaPortPrivPtr pPriv = (viaPortPrivPtr) portPriv->DevPriv.ptr; ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; for (i = 0; i < VIA_XVMC_MAX_SURFACES; i++) { if (vXvMC->surfaces[i] == pSurf->surface_id) { sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); { DRM_CAS_RESULT(__ret); DRM_CAS(&(sAPriv->XvMCDisplaying[vx->xvmc_port]), i | VIA_XVMC_VALID, 0, __ret); if (!__ret) ViaOverlayHide(pScrn); } drm_bo_free(pScrn, vXvMC->sPrivs[i]->memory_ref); free(vXvMC->sPrivs[i]); vXvMC->nSurfaces--; vXvMC->sPrivs[i] = 0; vXvMC->surfaces[i] = 0; return; } } return; } static void ViaXvMCDestroySubpicture(ScrnInfoPtr pScrn, XvMCSubpicturePtr pSubp) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCPtr vXvMC = &(pVia->xvmc); int i; volatile ViaXvMCSAreaPriv *sAPriv; XvMCContextPtr pContext = pSubp->context; XvPortRecPrivatePtr portPriv = (XvPortRecPrivatePtr) pContext->port_priv; viaPortPrivPtr pPriv = (viaPortPrivPtr) portPriv->DevPriv.ptr; ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; for (i = 0; i < VIA_XVMC_MAX_SURFACES; i++) { if (vXvMC->surfaces[i] == pSubp->subpicture_id) { sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); { DRM_CAS_RESULT(__ret); DRM_CAS(&(sAPriv->XvMCSubPicOn[vx->xvmc_port]), i | VIA_XVMC_VALID, 0, __ret); if (!__ret) { /* Turn subpicture off. */ while (VIAGETREG(V_COMPOSE_MODE) & (V1_COMMAND_FIRE | V3_COMMAND_FIRE)) ; VIASETREG(SUBP_CONTROL_STRIDE, VIAGETREG(SUBP_CONTROL_STRIDE) & ~SUBP_HQV_ENABLE); } } drm_bo_free(pScrn, vXvMC->sPrivs[i]->memory_ref); free(vXvMC->sPrivs[i]); vXvMC->nSurfaces--; vXvMC->sPrivs[i] = 0; vXvMC->surfaces[i] = 0; return; } } return; } /* * Tell XvMC clients that Xv is currently displaying; * return 1 if another client was displaying before. */ static int viaXvMCSetDisplayLock(ScrnInfoPtr pScrn, ViaXvMCXVPriv * vx) { VIAPtr pVia = VIAPTR(pScrn); ViaXvMCSAreaPriv *sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); if (vx->xvmc_port > 0) { if ((VIA_XVMC_MAX_SURFACES | VIA_XVMC_VALID) != sAPriv->XvMCDisplaying[vx->xvmc_port]) { sAPriv->XvMCDisplaying[vx->xvmc_port] = (VIA_XVMC_MAX_SURFACES | VIA_XVMC_VALID); } if (sAPriv->XvMCSubPicOn[vx->xvmc_port] & VIA_XVMC_VALID) { sAPriv->XvMCSubPicOn[vx->xvmc_port] = 0; while (VIAGETREG(V_COMPOSE_MODE) & (V1_COMMAND_FIRE | V3_COMMAND_FIRE)) ; VIASETREG(SUBP_CONTROL_STRIDE, VIAGETREG(SUBP_CONTROL_STRIDE) & ~SUBP_HQV_ENABLE); } } return 0; } int viaXvMCInitXv(ScrnInfoPtr pScrn, XF86VideoAdaptorPtr XvAdapt) { viaPortPrivPtr pPriv; ViaXvMCXVPriv *vx; unsigned i, j; for (j = 0; j < XvAdapt->nPorts; ++j) { pPriv = (viaPortPrivPtr) XvAdapt->pPortPrivates[j].ptr; if (NULL == (pPriv->xvmc_priv = calloc(1, sizeof(ViaXvMCXVPriv)))) return BadAlloc; for (i = 0; i < VIA_NUM_XVMC_ATTRIBUTES; ++i) { attrAtoms[i] = MAKE_ATOM(attrXvMC[i]); } vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; vx->ctxDisplaying = 0; vx->xvAttr.numAttr = VIA_NUM_XVMC_ATTRIBUTES; vx->xvmc_port = -1; vx->newAttribute = 1; /* Set up wrappers. */ vx->GetPortAttribute = XvAdapt->GetPortAttribute; vx->SetPortAttribute = XvAdapt->SetPortAttribute; vx->PutImage = XvAdapt->PutImage; XvAdapt->GetPortAttribute = viaXvMCInterceptXvGetAttribute; XvAdapt->SetPortAttribute = viaXvMCInterceptXvAttribute; XvAdapt->PutImage = viaXvMCInterceptPutImage; for (i = 0; i < VIA_NUM_XVMC_ATTRIBUTES; ++i) { vx->xvAttr.attributes[i].attribute = attrAtoms[i]; vx->xvAttr.attributes[i].value = 0; vx->GetPortAttribute(pScrn, attrAtoms[i], &(vx->xvAttr.attributes[i].value), pPriv); } } return Success; } static int viaXvMCInterceptXvAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 value, pointer data) { unsigned i; viaPortPrivPtr pPriv = (viaPortPrivPtr) data; ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; if (VIAPTR(pScrn)->XvMCEnabled) { for (i = 0; i < vx->xvAttr.numAttr; ++i) { if (vx->xvAttr.attributes[i].attribute == attribute) { vx->xvAttr.attributes[i].value = value; if (vx->ctxDisplaying != (VIA_XVMC_MAX_CONTEXTS | VIA_XVMC_VALID)) { vx->newAttribute = 1; return 0; } } } } return vx->SetPortAttribute(pScrn, attribute, value, data); } static int viaXvMCInterceptXvGetAttribute(ScrnInfoPtr pScrn, Atom attribute, INT32 * value, pointer data) { unsigned i; viaPortPrivPtr pPriv = (viaPortPrivPtr) data; ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; if (VIAPTR(pScrn)->XvMCEnabled) { for (i = 0; i < vx->xvAttr.numAttr; ++i) { if (vx->xvAttr.attributes[i].attribute == attribute) { *value = vx->xvAttr.attributes[i].value; return Success; } } } return vx->GetPortAttribute(pScrn, attribute, value, data); } static int viaXvMCDisplayAttributes(ScrnInfoPtr pScrn, const ViaXvMCAttrHolder * ah, viaPortPrivPtr pPriv) { ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; unsigned i; int ret; for (i = 0; i < ah->numAttr; ++i) { ret = vx->SetPortAttribute(pScrn, ah->attributes[i].attribute, ah->attributes[i].value, pPriv); if (ret) return ret; } return Success; } static int viaXvMCInterceptPutImage(ScrnInfoPtr pScrn, short src_x, short src_y, short drw_x, short drw_y, short src_w, short src_h, short drw_w, short drw_h, int id, unsigned char *buf, short width, short height, Bool sync, RegionPtr clipBoxes, pointer data, DrawablePtr pDraw) { viaPortPrivPtr pPriv = (viaPortPrivPtr) data; ViaXvMCXVPriv *vx = (ViaXvMCXVPriv *) pPriv->xvmc_priv; if (VIAPTR(pScrn)->XvMCEnabled) { if (FOURCC_XVMC == id) { volatile ViaXvMCSAreaPriv *sAPriv; ViaXvMCCommandBuffer *vXvMCData = (ViaXvMCCommandBuffer *) buf; sAPriv = (ViaXvMCSAreaPriv *) DRIGetSAREAPrivate(pScrn->pScreen); switch (vXvMCData->command) { case VIA_XVMC_COMMAND_ATTRIBUTES: if ((vXvMCData->ctxNo | VIA_XVMC_VALID) != vx->ctxDisplaying) return 1; viaXvMCDisplayAttributes(pScrn, &vXvMCData->attrib, pPriv); return 0; case VIA_XVMC_COMMAND_FDISPLAY: if (sAPriv->XvMCDisplaying[vx->xvmc_port] != vXvMCData->srfNo) return 1; viaXvMCDisplayAttributes(pScrn, &vXvMCData->attrib, pPriv); vx->ctxDisplaying = vXvMCData->ctxNo; break; case VIA_XVMC_COMMAND_DISPLAY: if ((vXvMCData->ctxNo | VIA_XVMC_VALID) != vx->ctxDisplaying) { viaXvMCDisplayAttributes(pScrn, &vXvMCData->attrib, pPriv); } if (sAPriv->XvMCDisplaying[vx->xvmc_port] != vXvMCData->srfNo) return 1; vx->ctxDisplaying = vXvMCData->ctxNo; break; case VIA_XVMC_COMMAND_UNDISPLAY: { DRM_CAS_RESULT(__ret); DRM_CAS(&(sAPriv->XvMCDisplaying[vx->xvmc_port]), vXvMCData->srfNo, 0, __ret); if (!__ret) ViaOverlayHide(pScrn); } return Success; default: break; } } else { if ((VIA_XVMC_MAX_CONTEXTS | VIA_XVMC_VALID) != vx->ctxDisplaying) { viaXvMCDisplayAttributes(pScrn, &vx->xvAttr, pPriv); vx->ctxDisplaying = VIA_XVMC_MAX_CONTEXTS | VIA_XVMC_VALID; } else if (vx->newAttribute) { vx->newAttribute = 0; viaXvMCDisplayAttributes(pScrn, &vx->xvAttr, pPriv); } viaXvMCSetDisplayLock(pScrn, vx); } } return vx->PutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h, drw_w, drw_h, id, buf, width, height, sync, clipBoxes, data, pDraw); } unsigned long viaXvMCPutImageSize(ScrnInfoPtr pScrn) { if (VIAPTR(pScrn)->XvMCEnabled) return sizeof(ViaXvMCCommandBuffer); return 0; } #endif /* HAVE_DRI */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_xvmc.h000066400000000000000000000056211267025031400236050ustar00rootroot00000000000000/***************************************************************************** * VIA Unichrome XvMC extension X server driver. * * Copyright (c) 2004 The Unichrome project. 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, 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 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 * 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. * */ #ifndef _VIA_XVMC_H #define _VIA_XVMC_H 1 #include "via_drmclient.h" #include "via_drm.h" /* * This file contains the common definitions between the XvMC lib and the * X server side. It is referenced also by the XvMC lib. Make sure any * structure change is reflected also in a change in minor version number!! */ #define VIAXVMC_MAJOR 0 #define VIAXVMC_MINOR 10 #define VIAXVMC_PL 0 #define VIA_NUM_XVMC_ATTRIBUTES 6 #define VIA_XVMC_VALID 0x80000000 /* * Commands that client submits through XvPutImage: */ #define VIA_XVMC_COMMAND_FDISPLAY 0 #define VIA_XVMC_COMMAND_DISPLAY 1 #define VIA_XVMC_COMMAND_UNDISPLAY 2 #define VIA_XVMC_COMMAND_ATTRIBUTES 3 typedef drm_via_sarea_t ViaXvMCSAreaPriv; typedef struct { INT32 attribute; INT32 value; } ViaAttrPair; typedef struct { unsigned numAttr; ViaAttrPair attributes[VIA_NUM_XVMC_ATTRIBUTES]; } ViaXvMCAttrHolder; /* * Passed from client to X server during overlay updates. */ typedef struct { unsigned command; unsigned ctxNo; unsigned srfNo; unsigned subPicNo; ViaXvMCAttrHolder attrib; unsigned pad; } ViaXvMCCommandBuffer; /* * Passed from X server to client at context creation. */ typedef struct { unsigned int ctxNo; unsigned int major, minor, pl; unsigned xvmc_port; unsigned int fbOffset; unsigned int fbSize; unsigned int mmioOffset; unsigned int mmioSize; unsigned int sAreaSize; unsigned int sAreaPrivOffset; ViaXvMCAttrHolder initAttrs; int useAGP; unsigned int chipId; unsigned int screen; unsigned int depth; unsigned int stride; unsigned int pad; } ViaXvMCCreateContextRec; #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/via_xvpriv.h000066400000000000000000000045511267025031400241670ustar00rootroot00000000000000/* * 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_XVPRIV_H_ #define _VIA_XVPRIV_H_ 1 #include "xf86xv.h" enum { XV_ADAPT_SWOV = 0, XV_ADAPT_NUM }; typedef enum { xve_none = 0, xve_bandwidth, xve_dmablit, xve_mem, xve_general, xve_adaptor, xve_numerr } XvError; #define VIA_MAX_XV_PORTS 1 typedef struct { unsigned char xv_adaptor; unsigned char xv_portnum; int adaptor; int brightness; int saturation; int contrast; int hue; RegionRec clip; CARD32 colorKey; Bool autoPaint; CARD32 FourCC; /* from old SurfaceDesc -- passed down from viaPutImageG */ /* store old video source & dst data */ short old_src_x; short old_src_y; short old_src_w; short old_src_h; short old_drw_x; short old_drw_y; short old_drw_w; short old_drw_h; void *xvmc_priv; /* * For PCI DMA image transfer to frame-buffer memory. */ unsigned char *dmaBounceBuffer; unsigned dmaBounceStride; unsigned dmaBounceLines; XvError xvErr; } viaPortPrivRec, *viaPortPrivPtr; extern viaPortPrivPtr viaPortPriv[]; extern unsigned viaNumXvPorts; #endif /* _VIA_XVPRIV_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/000077500000000000000000000000001267025031400225715ustar00rootroot00000000000000xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/Imakefile000066400000000000000000000034371267025031400244110ustar00rootroot00000000000000#define DoNormalLib NormalLibXvMC #define DoSharedLib SharedLibXvMC #define DoDebugLib DebugLibXvMC #define DoProfileLib ProfileLibXvMC /*#define LibName viaXvMC*/ #define SoRev SOXVMCREV #define LibHeaders NO #include /* Anyone know how to determine this properly? * Comment out the following to build in the x tree */ #define OUTOFTREE #ifdef OUTOFTREE VIADRIVERSRC=../unichrome #else VIADRIVERSRC=$(XF86DRIVERSRC)/via #endif #ifdef SharedXvMCReqs REQUIREDLIBS = SharedXvMCReqs -lXv #endif #if Malloc0ReturnsNull ALLOC_DEFINES = -DMALLOC_0_RETURNS_NULL #endif DEFINES = $(ALLOC_DEFINES) $(PICFLAGS) -DTRUE=1 -DFALSE=0 INCLUDES = -I$(XINCLUDESRC) -I$(INCLUDESRC) -I$(XLIBSRC) -I$(EXTINCSRC) \ -I$(XF86COMSRC) -I$(XF86OSSRC) -I$(DRMSRCDIR)/shared-core \ -I$(DRMSRCDIR)/shared \ -I$(XF86OSSRC)/linux/drm/kernel -I$(VIADRIVERSRC) SRCS = viaXvMC.c viaLowLevel.c viaLowLevelPro.c xf86dri.c driDrawable.c OBJS = viaXvMC.o viaLowLevel.o xf86drm.o xf86drmHash.o \ xf86drmRandom.o xf86drmSL.o xf86dri.o driDrawable.o OBJSPRO = viaXvMC.o viaLowLevelPro.o xf86drm.o xf86drmHash.o \ xf86drmRandom.o xf86drmSL.o xf86dri.o driDrawable.o LINTLIBS = $(LINTXLIB) #include SharedLibraryTarget(viaXvMC,$(SoRev),$(OBJS) $(EXTRASHAREDOBJS),.,.) SharedLibraryTarget(viaXvMCPro,$(SoRev),$(OBJSPRO) $(EXTRASHAREDOBJS),.,.) InstallSharedLibrary(viaXvMC,$(SoRev),$(SHLIBDIR)) InstallSharedLibrary(viaXvMCPro,$(SoRev),$(SHLIBDIR)) #if defined(LinuxArchitecture) OS_SUBDIR = linux LinkSourceFile(xf86drm.c,$(XF86OSSRC)/$(OS_SUBDIR)/drm) LinkSourceFile(xf86drmHash.c,$(XF86OSSRC)/$(OS_SUBDIR)/drm) LinkSourceFile(xf86drmRandom.c,$(XF86OSSRC)/$(OS_SUBDIR)/drm) LinkSourceFile(xf86drmSL.c,$(XF86OSSRC)/$(OS_SUBDIR)/drm) #endif DependTarget() xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/Makefile.am000066400000000000000000000020711267025031400246250ustar00rootroot00000000000000if XVMC lib_LTLIBRARIES=libchromeXvMC.la libchromeXvMCPro.la libchromeXvMC_la_SOURCES = \ viaLowLevel.c \ driDrawable.c \ viaXvMC.c \ xf86dri.c \ viaLowLevel.h \ driDrawable.h \ viaXvMCPriv.h \ xf86dri.h \ xf86dristr.h \ vldXvMC.h libchromeXvMCPro_la_SOURCES = \ viaLowLevelPro.c \ driDrawable.c \ viaXvMC.c \ xf86dri.c \ viaLowLevel.h \ driDrawable.h \ viaXvMCPriv.h \ xf86dri.h \ xf86dristr.h \ vldXvMC.h libchromeXvMC_la_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ @XVMC_CFLAGS@ -I$(top_srcdir)/src -I$(top_srcdir)/src/xvmc -DTRUE=1 -DFALSE=0 libchromeXvMC_la_LDFLAGS = -version-number 1:0:0 libchromeXvMC_la_LIBADD = @DRI_LIBS@ @XVMC_LIBS@ libchromeXvMCPro_la_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ @XVMC_CFLAGS@ -I$(top_srcdir)/src -I$(top_srcdir)/src/xvmc -DTRUE=1 -DFALSE=0 libchromeXvMCPro_la_LDFLAGS = -version-number 1:0:0 libchromeXvMCPro_la_LIBADD = @DRI_LIBS@ @XVMC_LIBS@ else EXTRA_DIST = \ driDrawable.c \ driDrawable.h \ viaLowLevelPro.c \ viaLowLevel.c \ viaLowLevel.h \ viaXvMC.c \ viaXvMCPriv.h \ xf86dri.c \ xf86dri.h \ xf86dristr.h endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/driDrawable.c000066400000000000000000000114611267025031400251600ustar00rootroot00000000000000/***************************************************************************** * driDrawable.c: Lean Version of DRI utilities. * * Copyright (c) 2005 Thomas Hellstrom. 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, 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 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 * 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. */ #include #include #include "xf86drm.h" #include "drm.h" #include "xf86dri.h" #include "drm_sarea.h" #include "driDrawable.h" static unsigned drawStamp(volatile drm_sarea_t * pSarea, int index) { return pSarea->drawableTable[index].stamp; } int getDRIDrawableInfoLocked(void *drawHash, Display * display, int screen, Drawable draw, unsigned lockFlags, int drmFD, drm_context_t drmContext, drmAddress sarea, Bool updateInfo, drawableInfo ** info, unsigned long infoSize) { drawableInfo *drawInfo; void *res; drm_drawable_t drmDraw = 0; volatile drm_sarea_t *pSarea = (drm_sarea_t *) sarea; drm_clip_rect_t *clipFront, *clipBack; int ret; if (drmHashLookup(drawHash, (unsigned long)draw, &res)) { /* * The drawable is unknown to us. Create it and put it in the * hash table. */ DRM_UNLOCK(drmFD, &pSarea->lock, drmContext); if (!uniDRICreateDrawable(display, screen, draw, &drmDraw)) { DRM_LOCK(drmFD, &pSarea->lock, drmContext, lockFlags); return 1; } DRM_LOCK(drmFD, &pSarea->lock, drmContext, lockFlags); drawInfo = (drawableInfo *) malloc(infoSize); if (!drawInfo) return 1; drawInfo->drmDraw = drmDraw; drawInfo->stamp = 0; drawInfo->clipFront = 0; drawInfo->clipBack = 0; drmHashInsert(drawHash, (unsigned long)draw, drawInfo); } else { drawInfo = res; } drawInfo->touched = FALSE; while (!drawInfo->clipFront || drawInfo->stamp != drawStamp(pSarea, drawInfo->index)) { /* * The drawable has been touched since we last got info about it. * obtain new info from the X server. */ drawInfo->touched = TRUE; if (updateInfo || !drawInfo->clipFront) { DRM_UNLOCK(drmFD, &pSarea->lock, drmContext); ret = uniDRIGetDrawableInfo(display, screen, draw, &drawInfo->index, &drawInfo->stamp, &drawInfo->x, &drawInfo->y, &drawInfo->w, &drawInfo->h, &drawInfo->numClipFront, &clipFront, &drawInfo->backX, &drawInfo->backY, &drawInfo->numClipBack, &clipBack); DRM_LIGHT_LOCK(drmFD, &pSarea->lock, drmContext); /* * Error. Probably the drawable is destroyed. Return error and old values. */ if (!ret) { free(drawInfo); drawInfo = NULL; drmHashDelete(drawHash, (unsigned long)draw); DRM_UNLOCK(drmFD, &pSarea->lock, drmContext); uniDRIDestroyDrawable(display, screen, draw); DRM_LOCK(drmFD, &pSarea->lock, drmContext, lockFlags); return 1; } if (drawInfo->stamp != drawStamp(pSarea, drawInfo->index)) { /* * The info is already outdated. Sigh. Have another go. */ XFree(clipFront); XFree(clipBack); continue; } if (drawInfo->clipFront) XFree(drawInfo->clipFront); drawInfo->clipFront = clipFront; if (drawInfo->clipBack) XFree(drawInfo->clipBack); drawInfo->clipBack = clipBack; } else { if (!drawInfo->clipFront) drawInfo->clipFront = (drm_clip_rect_t *) ~ 0UL; drawInfo->stamp = drawStamp(pSarea, drawInfo->index); } } *info = drawInfo; return 0; } void driDestroyHashContents(void *drawHash) { unsigned long key; void *content; drawableInfo *drawInfo; if (drmHashFirst(drawHash, &key, &content) < 1) return; drawInfo = (drawableInfo *) content; if (drawInfo->clipBack) XFree(drawInfo->clipBack); if (drawInfo->clipFront) XFree(drawInfo->clipFront); free(drawInfo); while (drmHashNext(drawHash, &key, &content) == 1) { drawInfo = (drawableInfo *) content; if (drawInfo->clipBack) XFree(drawInfo->clipBack); if (drawInfo->clipFront) XFree(drawInfo->clipFront); free(drawInfo); } return; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/driDrawable.h000066400000000000000000000043641267025031400251710ustar00rootroot00000000000000/***************************************************************************** * driDrawable.h: Lean Version of DRI utilities. * * Copyright (c) 2005 Thomas Hellstrom. 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, 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 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 * 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. */ #ifndef _DRIDRAWABLE_H #define _DRIDRAWABLE_H typedef struct _drawableInfo { drm_drawable_t drmDraw; unsigned stamp; unsigned index; drm_clip_rect_t *clipFront; drm_clip_rect_t *clipBack; int x; int y; int w; int h; int backX; int backY; int numClipFront; int numClipBack; Bool touched; } drawableInfo; /* * Get updated info about the drawable "draw". The drawableInfo record returned is malloced * and administrated internally. Never free it unless you know exactly what you are doing. * The drm hash table "drawHash" needs to be initialized externally. */ extern int getDRIDrawableInfoLocked(void *drawHash, Display * display, int screen, Drawable draw, unsigned lockFlags, int drmFD, drm_context_t drmContext, drmAddress sarea, Bool updateInfo, drawableInfo ** info, unsigned long infoSize); /* * Free all resources created by the above function. Typically done on exit. */ extern void driDestroyHashContents(void *drawHash); #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/viaLowLevel.c000066400000000000000000000664531267025031400252040ustar00rootroot00000000000000/***************************************************************************** * VIA Unichrome XvMC extension client lib. * * Copyright (c) 2004 Thomas Hellström. All rights reserved. * Copyright (c) 2003 Andreas Robinson. 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, 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 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 * 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. */ /* * Low-level functions that deal directly with the hardware. In the future, * these functions might be implemented in a kernel module. Also, some of them * would benefit from DMA. * * Authors: Andreas Robinson 2003. Thomas Hellström 2004. */ #include "viaXvMCPriv.h" #include "viaLowLevel.h" #include #include #include typedef struct { CARD32 agp_buffer[LL_AGP_CMDBUF_SIZE]; CARD32 pci_buffer[LL_PCI_CMDBUF_SIZE]; unsigned agp_pos; unsigned pci_pos; unsigned flip_pos; int use_agp; int agp_mode; int agp_header_start; int agp_index; int fd; drm_context_t *drmcontext; drmLockPtr hwLock; drmAddress mmioAddress; drmAddress fbAddress; unsigned fbStride; unsigned fbDepth; unsigned width; unsigned height; unsigned curWaitFlags; int performLocking; unsigned errors; drm_via_mem_t tsMem; CARD32 tsOffset; volatile CARD32 *tsP; CARD32 curTimeStamp; CARD32 lastReadTimeStamp; int agpSync; CARD32 agpSyncTimeStamp; unsigned chipId; } XvMCLowLevel; /* * For Other architectures than i386 these might have to be modified for * bigendian etc. */ #define MPEGIN(xl,reg) \ *((volatile CARD32 *)(((CARD8 *)(xl)->mmioAddress) + 0xc00 + (reg))) #define VIDIN(ctx,reg) \ *((volatile CARD32 *)(((CARD8 *)(ctx)->mmioAddress) + (reg))) #define REGIN(ctx,reg) \ *((volatile CARD32 *)(((CARD8 *)(ctx)->mmioAddress) + 0x0000 + (reg))) #define HQV_CONTROL 0x3D0 #define HQV_SRC_STARTADDR_Y 0x3D4 #define HQV_SRC_STARTADDR_U 0x3D8 #define HQV_SRC_STARTADDR_V 0x3DC #define HQV_MINIFY_DEBLOCK 0x3E8 #define HQV_SW_FLIP 0x00000010 #define HQV_FLIP_STATUS 0x00000001 #define HQV_SUBPIC_FLIP 0x00008000 #define HQV_FLIP_ODD 0x00000020 #define HQV_DEINTERLACE 0x00010000 #define HQV_FIELD_2_FRAME 0x00020000 #define HQV_FRAME_2_FIELD 0x00040000 #define HQV_FIELD_UV 0x00100000 #define HQV_DEBLOCK_HOR 0x00008000 #define HQV_DEBLOCK_VER 0x80000000 #define V_COMPOSE_MODE 0x298 #define V1_COMMAND_FIRE 0x80000000 #define V3_COMMAND_FIRE 0x40000000 /* SUBPICTURE Registers */ #define SUBP_CONTROL_STRIDE 0x3C0 #define SUBP_STARTADDR 0x3C4 #define RAM_TABLE_CONTROL 0x3C8 #define RAM_TABLE_READ 0x3CC /* SUBP_CONTROL_STRIDE 0x3c0 */ #define SUBP_HQV_ENABLE 0x00010000 #define SUBP_IA44 0x00020000 #define SUBP_AI44 0x00000000 #define SUBP_STRIDE_MASK 0x00001fff #define SUBP_CONTROL_MASK 0x00070000 /* RAM_TABLE_CONTROL 0x3c8 */ #define RAM_TABLE_RGB_ENABLE 0x00000007 #define VIA_REG_STATUS 0x400 #define VIA_REG_GEMODE 0x004 #define VIA_REG_SRCBASE 0x030 #define VIA_REG_DSTBASE 0x034 #define VIA_REG_PITCH 0x038 #define VIA_REG_SRCCOLORKEY 0x01C #define VIA_REG_KEYCONTROL 0x02C #define VIA_REG_SRCPOS 0x008 #define VIA_REG_DSTPOS 0x00C #define VIA_REG_GECMD 0x000 #define VIA_REG_DIMENSION 0x010 /* width and height */ #define VIA_REG_FGCOLOR 0x018 #define VIA_VR_QUEUE_BUSY 0x00020000 /* Virtual Queue is busy */ #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_GEM_8bpp 0x00000000 #define VIA_GEM_16bpp 0x00000100 #define VIA_GEM_32bpp 0x00000300 #define VIA_GEC_BLT 0x00000001 #define VIA_PITCH_ENABLE 0x80000000 #define VIA_GEC_INCX 0x00000000 #define VIA_GEC_DECY 0x00004000 #define VIA_GEC_INCY 0x00000000 #define VIA_GEC_DECX 0x00008000 #define VIA_GEC_FIXCOLOR_PAT 0x00002000 #define VIA_BLIT_CLEAR 0x00 #define VIA_BLIT_COPY 0xCC #define VIA_BLIT_FILL 0xF0 #define VIA_BLIT_SET 0xFF #define VIA_SYNCWAITTIMEOUT 50000 /* Might be a bit conservative */ #define VIA_DMAWAITTIMEOUT 150000 #define VIA_VIDWAITTIMEOUT 50000 #define VIA_XVMC_DECODERTIMEOUT 50000 /*(microseconds) */ #define H1_ADDR(val) (((val) >> 2) | 0xF0000000) #define WAITFLAGS(xl, flags) \ (xl)->curWaitFlags |= (flags) #define BEGIN_RING_AGP(xl,size) \ do { \ if ((xl)->agp_pos > (LL_AGP_CMDBUF_SIZE-(size))) { \ agpFlush(xl); \ } \ } while(0) #define OUT_RING_AGP(xl, val) \ (xl)->agp_buffer[(xl)->agp_pos++] = (val) #define OUT_RING_QW_AGP(xl, val1, val2) \ do { \ (xl)->agp_buffer[(xl)->agp_pos++] = (val1); \ (xl)->agp_buffer[(xl)->agp_pos++] = (val2); \ } while (0) #define LL_HW_LOCK(xl) \ do { \ DRM_LOCK((xl)->fd,(xl)->hwLock,*(xl)->drmcontext,0); \ } while(0); #define LL_HW_UNLOCK(xl) \ do { \ DRM_UNLOCK((xl)->fd,(xl)->hwLock,*(xl)->drmcontext); \ } while(0); /* * We want to have two concurrent types of thread taking the hardware * lock simulataneously. One is the video out thread that needs immediate * access to flip an image. The other is everything else which may have * the lock for quite some time. This is only so the video out thread can * sneak in and display an image while other resources are busy. */ void hwlLock(void *xlp, int videoLock) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; LL_HW_LOCK(xl); } void hwlUnlock(void *xlp, int videoLock) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; LL_HW_UNLOCK(xl); } static unsigned timeDiff(struct timeval *now, struct timeval *then) { return (now->tv_usec >= then->tv_usec) ? now->tv_usec - then->tv_usec : 1000000 - (then->tv_usec - now->tv_usec); } void setAGPSyncLowLevel(void *xlp, int val, CARD32 timeStamp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; xl->agpSync = val; xl->agpSyncTimeStamp = timeStamp; } CARD32 viaDMATimeStampLowLevel(void *xlp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (xl->use_agp) { viaBlit(xl, 32, xl->tsOffset, 1, xl->tsOffset, 1, 1, 1, 0, 0, VIABLIT_FILL, xl->curTimeStamp); return xl->curTimeStamp++; } return 0; } static void viaDMAWaitTimeStamp(XvMCLowLevel * xl, CARD32 timeStamp, int doSleep) { struct timeval now, then; struct timezone here; struct timespec sleep, rem; if (xl->use_agp && (timeStamp > xl->lastReadTimeStamp)) { sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while (timeStamp > (xl->lastReadTimeStamp = *xl->tsP)) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_DMAWAITTIMEOUT) { if ((timeStamp > (xl->lastReadTimeStamp = *xl->tsP))) { xl->errors |= LL_DMA_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } } static int viaDMAInitTimeStamp(XvMCLowLevel * xl) { int ret = 0; if (xl->use_agp) { xl->tsMem.context = *(xl->drmcontext); xl->tsMem.size = 64; xl->tsMem.type = VIA_MEM_VIDEO; if ((ret = drmCommandWriteRead(xl->fd, DRM_VIA_ALLOCMEM, &xl->tsMem, sizeof(xl->tsMem))) < 0) return ret; if (xl->tsMem.size != 64) return -1; xl->tsOffset = (xl->tsMem.offset + 31) & ~31; xl->tsP = (CARD32 *) xl->fbAddress + (xl->tsOffset >> 2); xl->curTimeStamp = 1; *xl->tsP = 0; } return 0; } static int viaDMACleanupTimeStamp(XvMCLowLevel * xl) { if (!(xl->tsMem.size) || !xl->use_agp) return 0; return drmCommandWrite(xl->fd, DRM_VIA_FREEMEM, &xl->tsMem, sizeof(xl->tsMem)); } static CARD32 viaMpegGetStatus(XvMCLowLevel * xl) { return MPEGIN(xl, 0x54); } static int viaMpegIsBusy(XvMCLowLevel * xl, CARD32 mask, CARD32 idle) { CARD32 tmp = viaMpegGetStatus(xl); /* * Error detected. * FIXME: Are errors really shown when error concealment is on? */ if (tmp & 0x70) return 0; return (tmp & mask) != idle; } static void syncDMA(XvMCLowLevel * xl, unsigned int doSleep) { /* * Ideally, we'd like to have an interrupt wait here, but, according to second hand * information, the hardware does not support this, although earlier S3 chips do that. * It is therefore not implemented into the DRM, and we'll do a user space wait here. */ struct timeval now, then; struct timezone here; struct timespec sleep, rem; sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while (!(REGIN(xl, VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY)) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_DMAWAITTIMEOUT) { if (!(REGIN(xl, VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY)) { xl->errors |= LL_DMA_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } while (REGIN(xl, VIA_REG_STATUS) & VIA_CMD_RGTR_BUSY) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_DMAWAITTIMEOUT) { if (REGIN(xl, VIA_REG_STATUS) & VIA_CMD_RGTR_BUSY) { xl->errors |= LL_DMA_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } static void syncVideo(XvMCLowLevel * xl, unsigned int doSleep) { /* * Wait for HQV completion. Nothing strange here. We assume that the HQV * Handles syncing to the V1 / V3 engines by itself. It should be safe to * always wait for SUBPIC_FLIP completion although subpictures are not * always used. */ struct timeval now, then; struct timezone here; struct timespec sleep, rem; sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while (VIDIN(xl, HQV_CONTROL) & (HQV_SW_FLIP | HQV_SUBPIC_FLIP)) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_SYNCWAITTIMEOUT) { if (VIDIN(xl, HQV_CONTROL) & (HQV_SW_FLIP | HQV_SUBPIC_FLIP)) { xl->errors |= LL_VIDEO_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } static void syncAccel(XvMCLowLevel * xl, unsigned int mode, unsigned int doSleep) { struct timeval now, then; struct timezone here; struct timespec sleep, rem; CARD32 mask = ((mode & LL_MODE_2D) ? VIA_2D_ENG_BUSY : 0) | ((mode & LL_MODE_3D) ? VIA_3D_ENG_BUSY : 0); sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while (REGIN(xl, VIA_REG_STATUS) & mask) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_SYNCWAITTIMEOUT) { if (REGIN(xl, VIA_REG_STATUS) & mask) { xl->errors |= LL_ACCEL_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } static void syncMpeg(XvMCLowLevel * xl, unsigned int mode, unsigned int doSleep) { /* * Ideally, we'd like to have an interrupt wait here, but from information from VIA * at least the MPEG completion interrupt is broken on the CLE266, which was * discovered during validation of the chip. */ struct timeval now, then; struct timezone here; struct timespec sleep, rem; CARD32 busyMask = 0; CARD32 idleVal = 0; CARD32 ret; sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); if (mode & LL_MODE_DECODER_SLICE) { busyMask = VIA_SLICEBUSYMASK; idleVal = VIA_SLICEIDLEVAL; } if (mode & LL_MODE_DECODER_IDLE) { busyMask |= VIA_BUSYMASK; idleVal = VIA_IDLEVAL; } while (viaMpegIsBusy(xl, busyMask, idleVal)) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_XVMC_DECODERTIMEOUT) { if (viaMpegIsBusy(xl, busyMask, idleVal)) { xl->errors |= LL_DECODER_TIMEDOUT; } break; } if (doSleep) nanosleep(&sleep, &rem); } ret = viaMpegGetStatus(xl); if (ret & 0x70) { xl->errors |= ((ret & 0x70) >> 3); } return; } static void pciFlush(XvMCLowLevel * xl) { int ret; drm_via_cmdbuffer_t b; unsigned mode = xl->curWaitFlags; b.buf = (char *)xl->pci_buffer; b.size = xl->pci_pos * sizeof(CARD32); if (xl->performLocking) hwlLock(xl, 0); if ((mode != LL_MODE_VIDEO) && (mode != 0)) syncDMA(xl, 0); if ((mode & LL_MODE_2D) || (mode & LL_MODE_3D)) syncAccel(xl, mode, 0); if (mode & LL_MODE_VIDEO) syncVideo(xl, 0); if (mode & (LL_MODE_DECODER_SLICE | LL_MODE_DECODER_IDLE)) syncMpeg(xl, mode, 0); ret = drmCommandWrite(xl->fd, DRM_VIA_PCICMD, &b, sizeof(b)); if (xl->performLocking) hwlUnlock(xl, 0); if (ret) { xl->errors |= LL_PCI_COMMAND_ERR; } xl->pci_pos = 0; xl->curWaitFlags = 0; } static void agpFlush(XvMCLowLevel * xl) { drm_via_cmdbuffer_t b; int ret; if (xl->use_agp) { b.buf = (char *)xl->agp_buffer; b.size = xl->agp_pos * sizeof(CARD32); if (xl->agpSync) { syncXvMCLowLevel(xl, LL_MODE_DECODER_IDLE, 1, xl->agpSyncTimeStamp); xl->agpSync = 0; } if (xl->performLocking) hwlLock(xl, 0); do { ret = drmCommandWrite(xl->fd, DRM_VIA_CMDBUFFER, &b, sizeof(b)); } while (-EAGAIN == ret); if (xl->performLocking) hwlUnlock(xl, 0); if (ret) { xl->errors |= LL_AGP_COMMAND_ERR; } else { xl->agp_pos = 0; } xl->curWaitFlags &= LL_MODE_VIDEO; } else { unsigned mode = xl->curWaitFlags; b.buf = (char *)xl->agp_buffer; b.size = xl->agp_pos * sizeof(CARD32); if (xl->performLocking) hwlLock(xl, 0); if ((mode != LL_MODE_VIDEO) && (mode != 0)) syncDMA(xl, 0); if ((mode & LL_MODE_2D) || (mode & LL_MODE_3D)) syncAccel(xl, mode, 0); if (mode & LL_MODE_VIDEO) syncVideo(xl, 0); if (mode & (LL_MODE_DECODER_SLICE | LL_MODE_DECODER_IDLE)) syncMpeg(xl, mode, 0); ret = drmCommandWrite(xl->fd, DRM_VIA_PCICMD, &b, sizeof(b)); if (xl->performLocking) hwlUnlock(xl, 0); if (ret) { xl->errors |= LL_PCI_COMMAND_ERR; } xl->agp_pos = 0; xl->curWaitFlags = 0; } } unsigned flushXvMCLowLevel(void *xlp) { unsigned errors; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (xl->pci_pos) pciFlush(xl); if (xl->agp_pos) agpFlush(xl); errors = xl->errors; xl->errors = 0; return errors; } void flushPCIXvMCLowLevel(void *xlp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (xl->pci_pos) pciFlush(xl); if (!xl->use_agp && xl->agp_pos) agpFlush(xl); } __inline static void pciCommand(XvMCLowLevel * xl, unsigned offset, unsigned value, unsigned flags) { if (xl->pci_pos > (LL_PCI_CMDBUF_SIZE - 2)) pciFlush(xl); if (flags) xl->curWaitFlags |= flags; xl->pci_buffer[xl->pci_pos++] = (offset >> 2) | 0xF0000000; xl->pci_buffer[xl->pci_pos++] = value; } void viaMpegSetSurfaceStride(void *xlp, ViaXvMCContext * ctx) { CARD32 y_stride = ctx->yStride; CARD32 uv_stride = y_stride >> 1; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; BEGIN_RING_AGP(xl, 2); OUT_RING_QW_AGP(xl, H1_ADDR(0xc50), (y_stride >> 3) | ((uv_stride >> 3) << 16)); WAITFLAGS(xl, LL_MODE_DECODER_IDLE); } void viaVideoSetSWFLipLocked(void *xlp, unsigned yOffs, unsigned uOffs, unsigned vOffs, unsigned yStride, unsigned uvStride) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; pciCommand(xl, HQV_SRC_STARTADDR_Y, yOffs, LL_MODE_VIDEO); pciCommand(xl, HQV_SRC_STARTADDR_U, uOffs, 0); pciCommand(xl, HQV_SRC_STARTADDR_V, vOffs, 0); } void viaVideoSWFlipLocked(void *xlp, unsigned flags, int progressiveSequence) { CARD32 andWd, orWd; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; andWd = 0; orWd = 0; if ((flags & XVMC_FRAME_PICTURE) == XVMC_BOTTOM_FIELD) { andWd = 0xFFFFFFFFU; orWd = HQV_FIELD_UV | HQV_DEINTERLACE | HQV_FIELD_2_FRAME | HQV_FRAME_2_FIELD | HQV_SW_FLIP | HQV_FLIP_ODD | HQV_FLIP_STATUS | HQV_SUBPIC_FLIP; } else if ((flags & XVMC_FRAME_PICTURE) == XVMC_TOP_FIELD) { andWd = ~HQV_FLIP_ODD; orWd = HQV_FIELD_UV | HQV_DEINTERLACE | HQV_FIELD_2_FRAME | HQV_FRAME_2_FIELD | HQV_SW_FLIP | HQV_FLIP_STATUS | HQV_SUBPIC_FLIP; } else if ((flags & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE) { andWd = ~(HQV_DEINTERLACE | HQV_FRAME_2_FIELD | HQV_FIELD_2_FRAME | HQV_FIELD_UV); orWd = HQV_SW_FLIP | HQV_FLIP_STATUS | HQV_SUBPIC_FLIP; } if (progressiveSequence) { andWd &= ~HQV_FIELD_UV; orWd &= ~HQV_FIELD_UV; } pciCommand(xl, HQV_CONTROL, (VIDIN(xl, HQV_CONTROL) & andWd) | orWd, 0); } void viaMpegSetFB(void *xlp, unsigned i, unsigned yOffs, unsigned uOffs, unsigned vOffs) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; i *= 12; BEGIN_RING_AGP(xl, 6); OUT_RING_QW_AGP(xl, H1_ADDR(0xc20 + i), yOffs >> 3); OUT_RING_QW_AGP(xl, H1_ADDR(0xc24 + i), uOffs >> 3); OUT_RING_QW_AGP(xl, H1_ADDR(0xc28 + i), vOffs >> 3); WAITFLAGS(xl, LL_MODE_DECODER_IDLE); } void viaMpegBeginPicture(void *xlp, ViaXvMCContext * ctx, unsigned width, unsigned height, const XvMCMpegControl * control) { unsigned j, mb_width, mb_height; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; mb_width = (width + 15) >> 4; mb_height = ((control->mpeg_coding == XVMC_MPEG_2) && (control->flags & XVMC_PROGRESSIVE_SEQUENCE)) ? 2 * ((height + 31) >> 5) : (((height + 15) >> 4)); BEGIN_RING_AGP(xl, 144); WAITFLAGS(xl, LL_MODE_DECODER_IDLE); OUT_RING_QW_AGP(xl, H1_ADDR(0xc00), ((control->picture_structure & XVMC_FRAME_PICTURE) << 2) | ((control->picture_coding_type & 3) << 4) | ((control->flags & XVMC_ALTERNATE_SCAN) ? (1 << 6) : 0)); if (!(ctx->intraLoaded)) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc5c), 0); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc60), ctx->intra_quantiser_matrix[j] | (ctx->intra_quantiser_matrix[j + 1] << 8) | (ctx->intra_quantiser_matrix[j + 2] << 16) | (ctx->intra_quantiser_matrix[j + 3] << 24)); } ctx->intraLoaded = 1; } if (!(ctx->nonIntraLoaded)) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc5c), 1); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc60), ctx->non_intra_quantiser_matrix[j] | (ctx->non_intra_quantiser_matrix[j + 1] << 8) | (ctx->non_intra_quantiser_matrix[j + 2] << 16) | (ctx->non_intra_quantiser_matrix[j + 3] << 24)); } ctx->nonIntraLoaded = 1; } if (!(ctx->chromaIntraLoaded)) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc5c), 2); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc60), ctx->chroma_intra_quantiser_matrix[j] | (ctx->chroma_intra_quantiser_matrix[j + 1] << 8) | (ctx->chroma_intra_quantiser_matrix[j + 2] << 16) | (ctx->chroma_intra_quantiser_matrix[j + 3] << 24)); } ctx->chromaIntraLoaded = 1; } if (!(ctx->chromaNonIntraLoaded)) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc5c), 3); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc60), ctx->chroma_non_intra_quantiser_matrix[j] | (ctx->chroma_non_intra_quantiser_matrix[j + 1] << 8) | (ctx->chroma_non_intra_quantiser_matrix[j + 2] << 16) | (ctx->chroma_non_intra_quantiser_matrix[j + 3] << 24)); } ctx->chromaNonIntraLoaded = 1; } OUT_RING_QW_AGP(xl, H1_ADDR(0xc90), ((mb_width * mb_height) & 0x3fff) | ((control->flags & XVMC_PRED_DCT_FRAME) ? (1 << 14) : 0) | ((control->flags & XVMC_TOP_FIELD_FIRST) ? (1 << 15) : 0) | ((control->mpeg_coding == XVMC_MPEG_2) ? (1 << 16) : 0) | ((mb_width & 0xff) << 18)); OUT_RING_QW_AGP(xl, H1_ADDR(0xc94), ((control->flags & XVMC_CONCEALMENT_MOTION_VECTORS) ? 1 : 0) | ((control->flags & XVMC_Q_SCALE_TYPE) ? 2 : 0) | ((control->intra_dc_precision & 3) << 2) | (((1 + 0x100000 / mb_width) & 0xfffff) << 4) | ((control->flags & XVMC_INTRA_VLC_FORMAT) ? (1 << 24) : 0)); OUT_RING_QW_AGP(xl, H1_ADDR(0xc98), (((control->FHMV_range) & 0xf) << 0) | (((control->FVMV_range) & 0xf) << 4) | (((control->BHMV_range) & 0xf) << 8) | (((control->BVMV_range) & 0xf) << 12) | ((control->flags & XVMC_SECOND_FIELD) ? (1 << 20) : 0) | (0x0a6 << 16)); } void viaMpegReset(void *xlp) { int i, j; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; BEGIN_RING_AGP(xl, 100); WAITFLAGS(xl, LL_MODE_DECODER_IDLE); for (i = 0; i < 14; i++) OUT_RING_QW_AGP(xl, H1_ADDR(0xc08), 0); OUT_RING_QW_AGP(xl, H1_ADDR(0xc98), 0x400000); for (i = 0; i < 6; i++) { OUT_RING_QW_AGP(xl, H1_ADDR(0xc0c), 0x43 | 0x20); for (j = 0xc10; j < 0xc20; j += 4) OUT_RING_QW_AGP(xl, H1_ADDR(j), 0); } OUT_RING_QW_AGP(xl, H1_ADDR(0xc0c), 0xc3 | 0x20); for (j = 0xc10; j < 0xc20; j += 4) OUT_RING_QW_AGP(xl, H1_ADDR(j), 0); } void viaMpegWriteSlice(void *xlp, CARD8 * slice, int nBytes, CARD32 sCode) { int i, n, r; CARD32 *buf; int count; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (xl->errors & (LL_DECODER_TIMEDOUT | LL_IDCT_FIFO_ERROR | LL_SLICE_FIFO_ERROR | LL_SLICE_FAULT)) return; n = nBytes >> 2; if (sCode) nBytes += 4; r = nBytes & 3; buf = (CARD32 *) slice; if (r) nBytes += 4 - r; nBytes += 8; BEGIN_RING_AGP(xl, 4); WAITFLAGS(xl, LL_MODE_DECODER_IDLE); OUT_RING_QW_AGP(xl, H1_ADDR(0xc9c), nBytes); if (sCode) OUT_RING_QW_AGP(xl, H1_ADDR(0xca0), sCode); i = 0; count = 0; do { count += (LL_AGP_CMDBUF_SIZE - 20) >> 1; count = (count > n) ? n : count; BEGIN_RING_AGP(xl, (count - i) << 1); for (; i < count; i++) { OUT_RING_QW_AGP(xl, H1_ADDR(0xca0), *buf++); } } while (i < n); BEGIN_RING_AGP(xl, 6); if (r) { OUT_RING_QW_AGP(xl, H1_ADDR(0xca0), *buf & ((1 << (r << 3)) - 1)); } OUT_RING_QW_AGP(xl, H1_ADDR(0xca0), 0); OUT_RING_QW_AGP(xl, H1_ADDR(0xca0), 0); } void viaVideoSubPictureOffLocked(void *xlp) { CARD32 stride; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; stride = VIDIN(xl, SUBP_CONTROL_STRIDE); pciCommand(xl, SUBP_CONTROL_STRIDE, stride & ~SUBP_HQV_ENABLE, LL_MODE_VIDEO); } void viaVideoSubPictureLocked(void *xlp, ViaXvMCSubPicture * pViaSubPic) { unsigned i; CARD32 cWord; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; for (i = 0; i < VIA_SUBPIC_PALETTE_SIZE; ++i) { pciCommand(xl, RAM_TABLE_CONTROL, pViaSubPic->palette[i], LL_MODE_VIDEO); } pciCommand(xl, SUBP_STARTADDR, pViaSubPic->offset, 0); cWord = (pViaSubPic->stride & SUBP_STRIDE_MASK) | SUBP_HQV_ENABLE; cWord |= (pViaSubPic->ia44) ? SUBP_IA44 : SUBP_AI44; pciCommand(xl, SUBP_CONTROL_STRIDE, cWord, 0); } void viaBlit(void *xlp, unsigned bpp, unsigned srcBase, unsigned srcPitch, unsigned dstBase, unsigned dstPitch, unsigned w, unsigned h, int xdir, int ydir, unsigned blitMode, unsigned color) { CARD32 dwGEMode = 0, srcY = 0, srcX, dstY = 0, dstX; CARD32 cmd; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (!w || !h) return; switch (bpp) { case 16: dwGEMode |= VIA_GEM_16bpp; break; case 32: dwGEMode |= VIA_GEM_32bpp; break; default: dwGEMode |= VIA_GEM_8bpp; break; } srcX = srcBase & 31; dstX = dstBase & 31; switch (bpp) { case 16: dwGEMode |= VIA_GEM_16bpp; srcX >>= 2; dstX >>= 2; break; case 32: dwGEMode |= VIA_GEM_32bpp; srcX >>= 4; dstX >>= 4; break; default: dwGEMode |= VIA_GEM_8bpp; break; } BEGIN_RING_AGP(xl, 20); WAITFLAGS(xl, LL_MODE_2D); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_GEMODE), dwGEMode); cmd = 0; if (xdir < 0) { cmd |= VIA_GEC_DECX; srcX += (w - 1); dstX += (w - 1); } if (ydir < 0) { cmd |= VIA_GEC_DECY; srcY += (h - 1); dstY += (h - 1); } switch (blitMode) { case VIABLIT_TRANSCOPY: OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_SRCCOLORKEY), color); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_KEYCONTROL), 0x4000); cmd |= VIA_GEC_BLT | (VIA_BLIT_COPY << 24); break; case VIABLIT_FILL: OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_FGCOLOR), color); cmd |= VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT | (VIA_BLIT_FILL << 24); break; default: OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_KEYCONTROL), 0x0); cmd |= VIA_GEC_BLT | (VIA_BLIT_COPY << 24); } OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_SRCBASE), (srcBase & ~31) >> 3); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_DSTBASE), (dstBase & ~31) >> 3); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_PITCH), VIA_PITCH_ENABLE | (srcPitch >> 3) | (((dstPitch) >> 3) << 16)); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_SRCPOS), ((srcY << 16) | srcX)); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_DSTPOS), ((dstY << 16) | dstX)); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_DIMENSION), (((h - 1) << 16) | (w - 1))); OUT_RING_QW_AGP(xl, H1_ADDR(VIA_REG_GECMD), cmd); } unsigned syncXvMCLowLevel(void *xlp, unsigned int mode, unsigned int doSleep, CARD32 timeStamp) { unsigned errors; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (mode == 0) { errors = xl->errors; xl->errors = 0; return errors; } if ((mode & (LL_MODE_VIDEO | LL_MODE_3D)) || !xl->use_agp) { if (xl->performLocking) hwlLock(xl, 0); if ((mode != LL_MODE_VIDEO)) syncDMA(xl, doSleep); if (mode & LL_MODE_3D) syncAccel(xl, mode, doSleep); if (mode & LL_MODE_VIDEO) syncVideo(xl, doSleep); if (xl->performLocking) hwlUnlock(xl, 0); } else { viaDMAWaitTimeStamp(xl, timeStamp, doSleep); } if (mode & (LL_MODE_DECODER_SLICE | LL_MODE_DECODER_IDLE)) syncMpeg(xl, mode, doSleep); errors = xl->errors; xl->errors = 0; return errors; } extern void * initXvMCLowLevel(int fd, drm_context_t * ctx, drmLockPtr hwLock, drmAddress mmioAddress, drmAddress fbAddress, unsigned fbStride, unsigned fbDepth, unsigned width, unsigned height, int useAgp, unsigned chipId) { int ret; XvMCLowLevel *xl; if (chipId == PCI_CHIP_VT3259 || chipId == PCI_CHIP_VT3364) { fprintf(stderr, "You are using an XvMC driver for the wrong chip.\n"); fprintf(stderr, "Chipid is 0x%04x.\n", chipId); return NULL; } xl = (XvMCLowLevel *) malloc(sizeof(XvMCLowLevel)); if (!xl) return NULL; xl->agp_pos = 0; xl->pci_pos = 0; xl->use_agp = useAgp; xl->fd = fd; xl->drmcontext = ctx; xl->hwLock = hwLock; xl->mmioAddress = mmioAddress; xl->fbAddress = fbAddress; xl->curWaitFlags = 0; xl->performLocking = 1; xl->errors = 0; xl->agpSync = 0; ret = viaDMAInitTimeStamp(xl); if (ret) { free(xl); return NULL; } return xl; } void setLowLevelLocking(void *xlp, int performLocking) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; xl->performLocking = performLocking; } void closeXvMCLowLevel(void *xlp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; viaDMACleanupTimeStamp(xl); free(xl); } xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/viaLowLevel.h000066400000000000000000000115311267025031400251740ustar00rootroot00000000000000/***************************************************************************** * VIA Unichrome XvMC extension client lib. * * Copyright (c) 2004 The Unichrome Project. 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, 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 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 * 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. */ /* * Authors: Thomas Hellström 2004 - 2005. */ #ifndef VIA_LOWLEVEL_H #define VIA_LOWLEVEL_H /* * The below define is cache size sensitive. Increasing the AGP buffer size * will enable the library to do deeper pipelining, but will degrade the * performance in the drm dma command verifier. */ #define LL_AGP_CMDBUF_SIZE (4096*2) #define LL_PCI_CMDBUF_SIZE (4096) #define LL_MODE_DECODER_SLICE 0x01 #define LL_MODE_DECODER_IDLE 0x02 #define LL_MODE_VIDEO 0x04 #define LL_MODE_2D 0x08 #define LL_MODE_3D 0x10 /* * Errors */ #define LL_DECODER_TIMEDOUT 0x00000001 #define LL_IDCT_FIFO_ERROR 0x00000002 #define LL_SLICE_FIFO_ERROR 0x00000004 #define LL_SLICE_FAULT 0x00000008 #define LL_DMA_TIMEDOUT 0x00000010 #define LL_VIDEO_TIMEDOUT 0x00000020 #define LL_ACCEL_TIMEDOUT 0x00000040 #define LL_PCI_COMMAND_ERR 0x00000080 #define LL_AGP_COMMAND_ERR 0x00000100 #define VIA_SLICEBUSYMASK 0x00000200 #define VIA_BUSYMASK 0x00000207 #define VIA_SLICEIDLEVAL 0x00000200 #define VIA_IDLEVAL 0x00000204 #include "via_drm.h" #include "viaXvMCPriv.h" #define setRegion(xx,yy,ww,hh,region) \ do { \ (region).x = (xx); \ (region).y = (yy); \ (region).w = (ww); \ (region).h = (hh); \ } while(0) #define regionEqual(r1, r2) \ ((r1).x == (r2).x && \ (r1).y == (r2).y && \ (r1).w == (r2).w && \ (r1).h == (r2).h) extern void *initXvMCLowLevel(int fd, drm_context_t * ctx, drmLockPtr hwLock, drmAddress mmioAddress, drmAddress fbAddress, unsigned fbStride, unsigned fbDepth, unsigned width, unsigned height, int useAgp, unsigned chipId); extern void setLowLevelLocking(void *xlp, int perFormLocking); extern void closeXvMCLowLevel(void *xlp); extern void flushPCIXvMCLowLevel(void *xlp); extern CARD32 viaDMATimeStampLowLevel(void *xlp); extern void setAGPSyncLowLevel(void *xlp, int val, CARD32 timeStamp); /* * These two functions also return and clear the current error status. */ extern unsigned flushXvMCLowLevel(void *xlp); extern unsigned syncXvMCLowLevel(void *xlp, unsigned int mode, unsigned int doSleep, CARD32 timeStamp); extern void hwlUnlock(void *xlp, int videoLock); extern void hwlLock(void *xlp, int videoLock); extern void viaVideoSetSWFLipLocked(void *xlp, unsigned yOffs, unsigned uOffs, unsigned vOffs, unsigned yStride, unsigned uvStride); extern void viaMpegReset(void *xlp); extern void viaMpegWriteSlice(void *xlp, CARD8 * slice, int nBytes, CARD32 sCode); extern void viaMpegSetSurfaceStride(void *xlp, ViaXvMCContext * ctx); extern void viaMpegSetFB(void *xlp, unsigned i, unsigned yOffs, unsigned uOffs, unsigned vOffs); extern void viaMpegBeginPicture(void *xlp, ViaXvMCContext * ctx, unsigned width, unsigned height, const XvMCMpegControl * control); /* * Low-level Video functions in viaLowLevel.c */ extern void viaBlit(void *xlp, unsigned bpp, unsigned srcBase, unsigned srcPitch, unsigned dstBase, unsigned dstPitch, unsigned w, unsigned h, int xdir, int ydir, unsigned blitMode, unsigned color); extern void viaVideoSWFlipLocked(void *xlp, unsigned flags, int progressiveSequence); extern void viaVideoSubPictureLocked(void *xlp, ViaXvMCSubPicture * pViaSubPic); extern void viaVideoSubPictureOffLocked(void *xlp); #define PCI_CHIP_VT3204 0x3108 /* K8M800 */ #define PCI_CHIP_VT3259 0x3118 /* PM800/PM880/CN400 */ #define PCI_CHIP_CLE3122 0x3122 /* CLE266 */ #define PCI_CHIP_VT3205 0x7205 /* KM400 */ #define PCI_CHIP_VT3327 0x3343 /* P4M890 */ #define PCI_CHIP_VT3364 0x3371 /* P4M900 */ #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/viaLowLevelPro.c000066400000000000000000001220001267025031400256420ustar00rootroot00000000000000/***************************************************************************** * VIA Unichrome XvMC extension client lib. * * Copyright (c) 2004 Thomas Hellström. All rights reserved. * Copyright (c) 2003 Andreas Robinson. 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, 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 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 * 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. */ /* * Low-level functions that deal directly with the hardware. In the future, * these functions might be implemented in a kernel module. Also, some of them * would benefit from DMA. * * Authors: * Andreas Robinson 2003. (Initial decoder interface functions). * Thomas Hellstrom 2004, 2005 (Blitting functions, AGP and locking, Unichrome Pro Video AGP). * Ivor Hewitt 2005 (Unichrome Pro modifications and merging). */ /* IH * I've left the proReg or-ing in case we need/want to implement the V1/V3 * register toggle too, which also moves the register locations. * The CN400 has dual mpeg decoders, not sure at the moment whether these * are also operated through independent registers also. */ #undef VIDEO_DMA #define HQV_USE_IRQ #define UNICHROME_PRO #include "viaXvMCPriv.h" #include "viaLowLevel.h" #include "driDrawable.h" #include #include #include typedef enum { ll_init, ll_agpBuf, ll_pciBuf, ll_timeStamp, ll_llBuf } LLState; typedef struct { drm_via_mem_t mem; unsigned offset; unsigned stride; unsigned height; } LowLevelBuffer; struct _XvMCLowLevel; typedef struct _ViaCommandBuffer { CARD32 *buf; CARD32 waitFlags; unsigned pos; unsigned bufSize; int mode; int header_start; int rindex; void (*flushFunc) (struct _ViaCommandBuffer * cb, struct _XvMCLowLevel * xl); } ViaCommandBuffer; typedef struct _XvMCLowLevel { ViaCommandBuffer agpBuf, pciBuf, *videoBuf; int use_agp; int fd; drm_context_t *drmcontext; drmLockPtr hwLock; drmAddress mmioAddress; drmAddress fbAddress; unsigned fbStride; unsigned fbDepth; unsigned width; unsigned height; int performLocking; unsigned errors; drm_via_mem_t tsMem; CARD32 tsOffset; volatile CARD32 *tsP; CARD32 curTimeStamp; CARD32 lastReadTimeStamp; int agpSync; CARD32 agpSyncTimeStamp; unsigned chipId; /* * Data for video-engine less display */ XvMCRegion sRegion; XvMCRegion dRegion; LowLevelBuffer scale; LowLevelBuffer back; Bool downScaling; CARD32 downScaleW; CARD32 downScaleH; CARD32 upScaleW; CARD32 upScaleH; unsigned fetch; unsigned line; LLState state; } XvMCLowLevel; /* * For Other architectures than i386 these might have to be modified for * bigendian etc. */ #define MPEGIN(xl,reg) \ *((volatile CARD32 *)(((CARD8 *)(xl)->mmioAddress) + 0xc00 + (reg))) #define VIDIN(ctx,reg) \ *((volatile CARD32 *)(((CARD8 *)(ctx)->mmioAddress) + (reg))) #define REGIN(ctx,reg) \ *((volatile CARD32 *)(((CARD8 *)(ctx)->mmioAddress) + 0x0000 + (reg))) #define HQV_CONTROL 0x3D0 #define HQV_SRC_OFFSET 0x3CC #define HQV_SRC_STARTADDR_Y 0x3D4 #define HQV_SRC_STARTADDR_U 0x3D8 #define HQV_SRC_STARTADDR_V 0x3DC #define HQV_MINIFY_DEBLOCK 0x3E8 #define REG_HQV1_INDEX 0x00001000 #define HQV_SW_FLIP 0x00000010 #define HQV_FLIP_STATUS 0x00000001 #define HQV_SUBPIC_FLIP 0x00008000 #define HQV_FLIP_ODD 0x00000020 #define HQV_DEINTERLACE 0x00010000 #define HQV_FIELD_2_FRAME 0x00020000 #define HQV_FRAME_2_FIELD 0x00040000 #define HQV_FIELD_UV 0x00100000 #define HQV_DEBLOCK_HOR 0x00008000 #define HQV_DEBLOCK_VER 0x80000000 #define HQV_YUV420 0xC0000000 #define HQV_YUV422 0x80000000 #define HQV_ENABLE 0x08000000 #define HQV_GEN_IRQ 0x00000080 #define HQV_SCALE_ENABLE 0x00000800 #define HQV_SCALE_DOWN 0x00001000 #define V_COMPOSE_MODE 0x298 #define V1_COMMAND_FIRE 0x80000000 #define V3_COMMAND_FIRE 0x40000000 /* SUBPICTURE Registers */ #define SUBP_CONTROL_STRIDE 0x3C0 #define SUBP_STARTADDR 0x3C4 #define RAM_TABLE_CONTROL 0x3C8 #define RAM_TABLE_READ 0x3CC /* SUBP_CONTROL_STRIDE 0x3c0 */ #define SUBP_HQV_ENABLE 0x00010000 #define SUBP_IA44 0x00020000 #define SUBP_AI44 0x00000000 #define SUBP_STRIDE_MASK 0x00001fff #define SUBP_CONTROL_MASK 0x00070000 /* RAM_TABLE_CONTROL 0x3c8 */ #define RAM_TABLE_RGB_ENABLE 0x00000007 #define VIA_REG_STATUS 0x400 #define VIA_REG_GEMODE 0x004 #define VIA_REG_SRCBASE 0x030 #define VIA_REG_DSTBASE 0x034 #define VIA_REG_PITCH 0x038 #define VIA_REG_SRCCOLORKEY 0x01C #define VIA_REG_KEYCONTROL 0x02C #define VIA_REG_SRCPOS 0x008 #define VIA_REG_DSTPOS 0x00C #define VIA_REG_GECMD 0x000 #define VIA_REG_DIMENSION 0x010 /* width and height */ #define VIA_REG_FGCOLOR 0x018 #define VIA_VR_QUEUE_BUSY 0x00020000 /* Virtual Queue is busy */ #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_GEM_8bpp 0x00000000 #define VIA_GEM_16bpp 0x00000100 #define VIA_GEM_32bpp 0x00000300 #define VIA_GEC_BLT 0x00000001 #define VIA_PITCH_ENABLE 0x80000000 #define VIA_GEC_INCX 0x00000000 #define VIA_GEC_DECY 0x00004000 #define VIA_GEC_INCY 0x00000000 #define VIA_GEC_DECX 0x00008000 #define VIA_GEC_FIXCOLOR_PAT 0x00002000 #define VIA_BLIT_CLEAR 0x00 #define VIA_BLIT_COPY 0xCC #define VIA_BLIT_FILL 0xF0 #define VIA_BLIT_SET 0xFF #define VIA_SYNCWAITTIMEOUT 50000 /* Might be a bit conservative */ #define VIA_DMAWAITTIMEOUT 150000 #define VIA_VIDWAITTIMEOUT 50000 #define VIA_XVMC_DECODERTIMEOUT 50000 /*(microseconds) */ #define VIA_AGP_HEADER5 0xFE040000 #define VIA_AGP_HEADER6 0xFE050000 typedef struct { CARD32 data; Bool set; } HQVRegister; #define H1_ADDR(val) (((val) >> 2) | 0xF0000000) #define WAITFLAGS(cb, flags) \ (cb)->waitFlags |= (flags) #define BEGIN_RING_AGP(cb, xl, size) \ do { \ if ((cb)->pos > ((cb)->bufSize-(size))) { \ cb->flushFunc(cb, xl); \ } \ } while(0) #define OUT_RING_AGP(cb, val) do{ \ (cb)->buf[(cb)->pos++] = (val); \ } while(0); #define OUT_RING_QW_AGP(cb, val1, val2) \ do { \ (cb)->buf[(cb)->pos++] = (val1); \ (cb)->buf[(cb)->pos++] = (val2); \ } while (0) #define BEGIN_HEADER5_AGP(cb, xl, index) \ do { \ BEGIN_RING_AGP(cb, xl, 8); \ (cb)->mode = VIA_AGP_HEADER5; \ (cb)->rindex = (index); \ (cb)->header_start = (cb)->pos; \ (cb)->pos += 4; \ } while (0) #define BEGIN_HEADER6_AGP(cb, xl) \ do { \ BEGIN_RING_AGP(cb, xl, 8); \ (cb)->mode = VIA_AGP_HEADER6; \ (cb)->header_start = (cb)->pos; \ (cb)->pos += 4; \ } while (0) #define BEGIN_HEADER5_DATA(cb, xl, size, index) \ do { \ if ((cb)->pos > ((cb)->bufSize - ((size) + 16))) { \ cb->flushFunc(cb, xl); \ BEGIN_HEADER5_AGP(cb, xl, index); \ } else if ((cb)->mode && (((cb)->mode != VIA_AGP_HEADER5) || \ ((cb)->rindex != index))) { \ finish_header_agp(cb); \ BEGIN_HEADER5_AGP((cb), xl, (index)); \ } else if (cb->mode != VIA_AGP_HEADER5) { \ BEGIN_HEADER5_AGP((cb), xl, (index)); \ } \ }while(0) #define BEGIN_HEADER6_DATA(cb, xl, size) \ do{ \ if ((cb)->pos > (cb->bufSize-(((size) << 1) + 16))) { \ cb->flushFunc(cb, xl); \ BEGIN_HEADER6_AGP(cb, xl); \ } else if ((cb)->mode && ((cb)->mode != VIA_AGP_HEADER6)) { \ finish_header_agp(cb); \ BEGIN_HEADER6_AGP(cb, xl); \ } \ else if ((cb->mode != VIA_AGP_HEADER6)) { \ BEGIN_HEADER6_AGP(cb, (xl)); \ } \ }while(0) #define HQV_SHADOW_BASE 0x3CC #define HQV_SHADOW_SIZE 13 #define SETHQVSHADOW(shadow, offset, value) \ do { \ HQVRegister *r = (shadow) + (((offset) - HQV_SHADOW_BASE) >> 2); \ r->data = (value); \ r->set = TRUE; \ } while(0) #define GETHQVSHADOW(shadow, offset) ((shadow)[(offset - HQV_SHADOW_BASE) >> 2].data) #define LL_HW_LOCK(xl) \ do { \ DRM_LOCK((xl)->fd,(xl)->hwLock,*(xl)->drmcontext,0); \ } while(0); #define LL_HW_UNLOCK(xl) \ do { \ DRM_UNLOCK((xl)->fd,(xl)->hwLock,*(xl)->drmcontext); \ } while(0); static HQVRegister hqvShadow[HQV_SHADOW_SIZE]; static void initHQVShadow(HQVRegister * r) { int i; for (i = 0; i < HQV_SHADOW_SIZE; ++i) { r->data = 0; r++->set = FALSE; } } #if 0 static void setHQVHWDeinterlacing(HQVRegister * shadow, Bool on, Bool motionDetect, CARD32 stride, CARD32 height) { CARD32 tmp = GETHQVSHADOW(shadow, 0x3E4); if (!on) { tmp &= ~((1 << 0) | (1 << 12) | (1 << 27) | (1 << 31)); SETHQVSHADOW(shadow, 0x3E4, tmp); return; } tmp = (1 << 31) | (4 << 28) | (1 << 27) | (3 << 25) | (1 << 18) | (2 << 14) | (8 << 8) | (8 << 1) | (1 << 0); if (motionDetect) tmp |= (1 << 12); SETHQVSHADOW(shadow, 0x3E4, tmp); tmp = GETHQVSHADOW(shadow, 0x3DC); tmp |= (stride * height * 1536) / 1024 & 0x7ff; SETHQVSHADOW(shadow, 0x3DC, tmp); tmp = GETHQVSHADOW(shadow, 0x3D0); tmp |= (1 << 23); SETHQVSHADOW(shadow, 0x3D0, tmp); } #endif static void setHQVDeblocking(HQVRegister * shadow, Bool on, Bool lowPass) { CARD32 tmp = GETHQVSHADOW(shadow, 0x3DC); if (!on) { tmp &= ~(1 << 27); SETHQVSHADOW(shadow, 0x3DC, tmp); return; } tmp |= (8 << 16) | (1 << 27); if (lowPass) tmp |= (1 << 26); SETHQVSHADOW(shadow, 0x3DC, tmp); tmp = GETHQVSHADOW(shadow, 0x3D4); tmp |= (6 << 27); SETHQVSHADOW(shadow, 0x3D4, tmp); tmp = GETHQVSHADOW(shadow, 0x3D8); tmp |= (19 << 27); SETHQVSHADOW(shadow, 0x3D8, tmp); } static void setHQVStartAddress(HQVRegister * shadow, unsigned yOffs, unsigned uOffs, unsigned stride, unsigned format) { CARD32 tmp = GETHQVSHADOW(shadow, 0x3D4); tmp |= yOffs & 0x03FFFFF0; SETHQVSHADOW(shadow, 0x3D4, tmp); tmp = GETHQVSHADOW(shadow, 0x3D8); tmp |= uOffs & 0x03FFFFF0; SETHQVSHADOW(shadow, 0x3D8, tmp); tmp = GETHQVSHADOW(shadow, 0x3F8); tmp |= (stride & 0x1FF8); SETHQVSHADOW(shadow, 0x3F8, tmp); tmp = GETHQVSHADOW(shadow, 0x3D0); if (format == 0) { /* * NV12 */ tmp |= (0x0C << 28); } else if (format == 1) { /* * RGB16 */ tmp |= (0x02 << 28); } else if (format == 2) { /* * RGB32 */ ; } SETHQVSHADOW(shadow, 0x3D0, tmp); } #if 0 static void setHQVColorSpaceConversion(HQVRegister * shadow, unsigned depth, Bool on) { CARD32 tmp = GETHQVSHADOW(shadow, 0x3DC); if (!on) { tmp &= ~(1 << 28); SETHQVSHADOW(shadow, 0x3DC, tmp); return; } if (depth == 32) tmp |= (1 << 29); tmp |= (1 << 28); tmp &= ~(1 << 15); SETHQVSHADOW(shadow, 0x3DC, tmp); } static void setHQVFetchLine(HQVRegister * shadow, unsigned fetch, unsigned lines) { SETHQVSHADOW(shadow, 0x3E0, ((lines - 1) & 0x7FF) | (((fetch - 1) & 0x1FFF) << 16)); } static void setHQVScale(HQVRegister * shadow, unsigned horizontal, unsigned vertical) { SETHQVSHADOW(shadow, 0x3E8, (horizontal & 0xFFFF) | ((vertical & 0xFFFF) << 16)); } static void setHQVSingleDestination(HQVRegister * shadow, unsigned offset, unsigned stride) { CARD32 tmp = GETHQVSHADOW(shadow, 0x3D0); tmp |= (1 << 6); SETHQVSHADOW(shadow, 0x3D0, tmp); SETHQVSHADOW(shadow, 0x3EC, offset & 0x03FFFFF8); SETHQVSHADOW(shadow, 0x3F4, stride & 0x1FF8); } #endif static void setHQVDeinterlacing(HQVRegister * shadow, CARD32 frameType) { CARD32 tmp = GETHQVSHADOW(shadow, 0x3D0); if ((frameType & XVMC_FRAME_PICTURE) == XVMC_TOP_FIELD) { tmp |= HQV_FIELD_UV | HQV_DEINTERLACE | HQV_FIELD_2_FRAME | HQV_FRAME_2_FIELD; } else if ((frameType & XVMC_FRAME_PICTURE) == XVMC_BOTTOM_FIELD) { tmp |= HQV_FIELD_UV | HQV_DEINTERLACE | HQV_FIELD_2_FRAME | HQV_FRAME_2_FIELD | HQV_FLIP_ODD; } SETHQVSHADOW(shadow, 0x3D0, tmp); } static void setHQVTripleBuffer(HQVRegister * shadow, Bool on) { CARD32 tmp = GETHQVSHADOW(shadow, 0x3D0); if (on) tmp |= (1 << 26); else tmp &= ~(1 << 26); SETHQVSHADOW(shadow, 0x3D0, tmp); } static void finish_header_agp(ViaCommandBuffer * cb) { int numDWords, i; CARD32 *hb; if (!cb->mode) return; numDWords = cb->pos - cb->header_start - 4; hb = cb->buf + cb->header_start; switch (cb->mode) { case VIA_AGP_HEADER5: hb[0] = VIA_AGP_HEADER5 | cb->rindex; hb[1] = numDWords; hb[2] = 0x00F50000; /* SW debug flag. (?) */ break; default: hb[0] = VIA_AGP_HEADER6; hb[1] = numDWords >> 1; hb[2] = 0x00F60000; /* SW debug flag. (?) */ break; } hb[3] = 0; if (numDWords & 3) { for (i = 0; i < (4 - (numDWords & 3)); ++i) OUT_RING_AGP(cb, 0x00000000); } cb->mode = 0; } void hwlLock(void *xlp, int videoLock) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; LL_HW_LOCK(xl); } void hwlUnlock(void *xlp, int videoLock) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; LL_HW_UNLOCK(xl); } static unsigned timeDiff(struct timeval *now, struct timeval *then) { return (now->tv_usec >= then->tv_usec) ? now->tv_usec - then->tv_usec : 1000000 - (then->tv_usec - now->tv_usec); } void setAGPSyncLowLevel(void *xlp, int val, CARD32 timeStamp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; xl->agpSync = val; xl->agpSyncTimeStamp = timeStamp; } CARD32 viaDMATimeStampLowLevel(void *xlp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (xl->use_agp) { viaBlit(xl, 32, xl->tsOffset, 1, xl->tsOffset, 1, 1, 1, 0, 0, VIABLIT_FILL, xl->curTimeStamp); return xl->curTimeStamp++; } return 0; } static void viaDMAWaitTimeStamp(XvMCLowLevel * xl, CARD32 timeStamp, int doSleep) { struct timeval now, then; struct timezone here; struct timespec sleep, rem; if (xl->use_agp && (xl->lastReadTimeStamp - timeStamp > (1 << 23))) { sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while (((xl->lastReadTimeStamp = *xl->tsP) - timeStamp) > (1 << 23)) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_DMAWAITTIMEOUT) { if (((xl->lastReadTimeStamp = *xl->tsP) - timeStamp) > (1 << 23)) { xl->errors |= LL_DMA_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } } static int viaDMAInitTimeStamp(XvMCLowLevel * xl) { int ret = 0; if (xl->use_agp) { xl->tsMem.context = *(xl->drmcontext); xl->tsMem.size = 64; xl->tsMem.type = VIA_MEM_VIDEO; if ((ret = drmCommandWriteRead(xl->fd, DRM_VIA_ALLOCMEM, &xl->tsMem, sizeof(xl->tsMem))) < 0) return ret; if (xl->tsMem.size != 64) return -1; xl->tsOffset = (xl->tsMem.offset + 31) & ~31; xl->tsP = (CARD32 *) xl->fbAddress + (xl->tsOffset >> 2); xl->curTimeStamp = 1; *xl->tsP = 0; } return 0; } static int viaDMACleanupTimeStamp(XvMCLowLevel * xl) { if (!(xl->tsMem.size) || !xl->use_agp) return 0; return drmCommandWrite(xl->fd, DRM_VIA_FREEMEM, &xl->tsMem, sizeof(xl->tsMem)); } static CARD32 viaMpegGetStatus(XvMCLowLevel * xl) { return MPEGIN(xl, 0x54); } static int viaMpegIsBusy(XvMCLowLevel * xl, CARD32 mask, CARD32 idle) { CARD32 tmp = viaMpegGetStatus(xl); /* * Error detected. * FIXME: Are errors really shown when error concealment is on? */ if (tmp & 0x70) return 0; return (tmp & mask) != idle; } static void syncDMA(XvMCLowLevel * xl, unsigned int doSleep) { /* * Ideally, we'd like to have an interrupt wait here, but, according to second hand * information, the hardware does not support this, although earlier S3 chips do that. * It is therefore not implemented into the DRM, and we'll do a user space wait here. */ struct timeval now, then; struct timezone here; struct timespec sleep, rem; sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while (!(REGIN(xl, VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY)) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_DMAWAITTIMEOUT) { if (!(REGIN(xl, VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY)) { xl->errors |= LL_DMA_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } while (REGIN(xl, VIA_REG_STATUS) & VIA_CMD_RGTR_BUSY) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_DMAWAITTIMEOUT) { if (REGIN(xl, VIA_REG_STATUS) & VIA_CMD_RGTR_BUSY) { xl->errors |= LL_DMA_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } #ifdef HQV_USE_IRQ static void syncVideo(XvMCLowLevel * xl, unsigned int doSleep) { int proReg = REG_HQV1_INDEX; /* * Wait for HQV completion using completion interrupt. Nothing strange here. * Note that the interrupt handler clears the HQV_FLIP_STATUS bit, so we * can't wait on that one. */ if ((VIDIN(xl, HQV_CONTROL | proReg) & (HQV_SW_FLIP | HQV_SUBPIC_FLIP))) { drm_via_irqwait_t irqw; irqw.request.irq = 1; irqw.request.type = VIA_IRQ_ABSOLUTE; if (drmCommandWriteRead(xl->fd, DRM_VIA_WAIT_IRQ, &irqw, sizeof(irqw)) < 0) xl->errors |= LL_VIDEO_TIMEDOUT; } } #else static void syncVideo(XvMCLowLevel * xl, unsigned int doSleep) { /* * Wait for HQV completion. Nothing strange here. We assume that the HQV * Handles syncing to the V1 / V3 engines by itself. It should be safe to * always wait for SUBPIC_FLIP completion although subpictures are not * always used. */ struct timeval now, then; struct timezone here; struct timespec sleep, rem; int proReg = REG_HQV1_INDEX; sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while ((VIDIN(xl, HQV_CONTROL | proReg) & (HQV_SW_FLIP | HQV_SUBPIC_FLIP))) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_SYNCWAITTIMEOUT) { if ((VIDIN(xl, HQV_CONTROL | proReg) & (HQV_SW_FLIP | HQV_SUBPIC_FLIP))) { xl->errors |= LL_VIDEO_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } #endif static void syncAccel(XvMCLowLevel * xl, unsigned int mode, unsigned int doSleep) { struct timeval now, then; struct timezone here; struct timespec sleep, rem; CARD32 mask = ((mode & LL_MODE_2D) ? VIA_2D_ENG_BUSY : 0) | ((mode & LL_MODE_3D) ? VIA_3D_ENG_BUSY : 0); sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); while (REGIN(xl, VIA_REG_STATUS) & mask) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_SYNCWAITTIMEOUT) { if (REGIN(xl, VIA_REG_STATUS) & mask) { xl->errors |= LL_ACCEL_TIMEDOUT; break; } } if (doSleep) nanosleep(&sleep, &rem); } } static void syncMpeg(XvMCLowLevel * xl, unsigned int mode, unsigned int doSleep) { /* * Ideally, we'd like to have an interrupt wait here, but from information from VIA * at least the MPEG completion interrupt is broken on the CLE266, which was * discovered during validation of the chip. */ struct timeval now, then; struct timezone here; struct timespec sleep, rem; CARD32 busyMask = 0; CARD32 idleVal = 0; CARD32 ret; sleep.tv_nsec = 1; sleep.tv_sec = 0; here.tz_minuteswest = 0; here.tz_dsttime = 0; gettimeofday(&then, &here); if (mode & LL_MODE_DECODER_SLICE) { busyMask = VIA_SLICEBUSYMASK; idleVal = VIA_SLICEIDLEVAL; } if (mode & LL_MODE_DECODER_IDLE) { busyMask |= VIA_BUSYMASK; idleVal = VIA_IDLEVAL; } while (viaMpegIsBusy(xl, busyMask, idleVal)) { gettimeofday(&now, &here); if (timeDiff(&now, &then) > VIA_XVMC_DECODERTIMEOUT) { if (viaMpegIsBusy(xl, busyMask, idleVal)) { xl->errors |= LL_DECODER_TIMEDOUT; } break; } if (doSleep) nanosleep(&sleep, &rem); } ret = viaMpegGetStatus(xl); if (ret & 0x70) { xl->errors |= ((ret & 0x70) >> 3); } return; } static void pciFlush(ViaCommandBuffer * cb, XvMCLowLevel * xl) { int ret; drm_via_cmdbuffer_t b; unsigned mode = cb->waitFlags; finish_header_agp(cb); b.buf = (char *)cb->buf; b.size = cb->pos * sizeof(CARD32); if (xl->performLocking) hwlLock(xl, 0); if (((mode == LL_MODE_VIDEO) && (xl->videoBuf == &xl->agpBuf)) || ((mode != LL_MODE_VIDEO) && (mode != 0))) syncDMA(xl, 0); if ((mode & LL_MODE_2D) || (mode & LL_MODE_3D)) { syncAccel(xl, mode, 0); } if (mode & LL_MODE_VIDEO) { syncVideo(xl, 1); } if (mode & (LL_MODE_DECODER_SLICE | LL_MODE_DECODER_IDLE)) { syncMpeg(xl, mode, 0); } ret = drmCommandWrite(xl->fd, DRM_VIA_PCICMD, &b, sizeof(b)); if (xl->performLocking) hwlUnlock(xl, 0); if (ret) { xl->errors |= LL_PCI_COMMAND_ERR; } cb->pos = 0; cb->waitFlags = 0; } static void agpFlush(ViaCommandBuffer * cb, XvMCLowLevel * xl) { drm_via_cmdbuffer_t b; int ret; int i; finish_header_agp(cb); if (xl->use_agp) { b.buf = (char *)cb->buf; b.size = cb->pos * sizeof(CARD32); if (xl->agpSync) { syncXvMCLowLevel(xl, LL_MODE_DECODER_IDLE, 1, xl->agpSyncTimeStamp); xl->agpSync = 0; } if (xl->performLocking) hwlLock(xl, 0); do { ret = drmCommandWrite(xl->fd, DRM_VIA_CMDBUFFER, &b, sizeof(b)); } while (-EAGAIN == ret); if (xl->performLocking) hwlUnlock(xl, 0); if (ret) { xl->errors |= LL_AGP_COMMAND_ERR; for (i = 0; i < cb->pos; i += 2) { printf("0x%x, 0x%x\n", (unsigned)cb->buf[i], (unsigned)cb->buf[i + 1]); } exit(-1); } else { cb->pos = 0; } cb->waitFlags &= LL_MODE_VIDEO; /* FIXME: Check this! */ } else { unsigned mode = cb->waitFlags; b.buf = (char *)cb->buf; b.size = cb->pos * sizeof(CARD32); if (xl->performLocking) hwlLock(xl, 0); if (((mode == LL_MODE_VIDEO) && (cb == &xl->agpBuf)) || ((mode != LL_MODE_VIDEO) && (mode != 0))) syncDMA(xl, 0); if ((mode & LL_MODE_2D) || (mode & LL_MODE_3D)) syncAccel(xl, mode, 0); if (mode & LL_MODE_VIDEO) syncVideo(xl, 1); if (mode & (LL_MODE_DECODER_SLICE | LL_MODE_DECODER_IDLE)) syncMpeg(xl, mode, 0); ret = drmCommandWrite(xl->fd, DRM_VIA_PCICMD, &b, sizeof(b)); if (xl->performLocking) hwlUnlock(xl, 0); if (ret) { xl->errors |= LL_PCI_COMMAND_ERR; } cb->pos = 0; cb->waitFlags = 0; } } #if 0 /* Needs debugging */ static void uploadHQVDeinterlace(XvMCLowLevel * xl, unsigned offset, HQVRegister * shadow, CARD32 cur_offset, CARD32 prev_offset, CARD32 stride, Bool top_field_first, CARD32 height) { CARD32 tmp; ViaCommandBuffer *cb = &xl->agpBuf; BEGIN_HEADER6_DATA(cb, xl, 9); tmp = GETHQVSHADOW(shadow, 0x3F8); tmp &= ~(3 << 30); tmp |= (1 << 30); OUT_RING_QW_AGP(cb, 0x3F8 + offset, tmp); OUT_RING_QW_AGP(cb, 0x3D4 + offset, prev_offset + ((top_field_first) ? stride : 0)); OUT_RING_QW_AGP(cb, 0x3D8 + offset, prev_offset + stride * height); tmp &= ~(3 << 30); tmp |= (2 << 30); OUT_RING_QW_AGP(cb, 0x3F8 + offset, tmp); OUT_RING_QW_AGP(cb, 0x3D4 + offset, cur_offset + ((top_field_first) ? 0 : stride)); OUT_RING_QW_AGP(cb, 0x3D8 + offset, cur_offset + stride * height); tmp |= (3 << 30); OUT_RING_QW_AGP(cb, 0x3F8 + offset, tmp); OUT_RING_QW_AGP(cb, 0x3D4 + offset, cur_offset + ((top_field_first) ? stride : 0)); OUT_RING_QW_AGP(cb, 0x3D8 + offset, cur_offset + stride * height); } #endif static void uploadHQVShadow(XvMCLowLevel * xl, unsigned offset, HQVRegister * shadow, Bool flip) { int i; CARD32 tmp; ViaCommandBuffer *cb = xl->videoBuf; BEGIN_HEADER6_DATA(cb, xl, HQV_SHADOW_SIZE); WAITFLAGS(cb, LL_MODE_VIDEO); if (shadow[0].set) OUT_RING_QW_AGP(cb, 0x3CC + offset, 0); for (i = 2; i < HQV_SHADOW_SIZE; ++i) { if (shadow[i].set) { OUT_RING_QW_AGP(cb, offset + HQV_SHADOW_BASE + (i << 2), shadow[i].data); shadow[i].set = FALSE; } } /* * Finally the control register for flip. */ if (flip) { tmp = GETHQVSHADOW(shadow, 0x3D0); OUT_RING_QW_AGP(cb, offset + HQV_CONTROL, HQV_ENABLE | HQV_GEN_IRQ | HQV_SUBPIC_FLIP | HQV_SW_FLIP | tmp); } shadow[0].set = FALSE; shadow[1].set = FALSE; } unsigned flushXvMCLowLevel(void *xlp) { unsigned errors; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (xl->pciBuf.pos) pciFlush(&xl->pciBuf, xl); if (xl->agpBuf.pos) agpFlush(&xl->agpBuf, xl); errors = xl->errors; if (errors) printf("Error 0x%x\n", errors); xl->errors = 0; return errors; } void flushPCIXvMCLowLevel(void *xlp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (xl->pciBuf.pos) pciFlush(&xl->pciBuf, xl); if ((!xl->use_agp && xl->agpBuf.pos)) agpFlush(&xl->agpBuf, xl); } void viaMpegSetSurfaceStride(void *xlp, ViaXvMCContext * ctx) { CARD32 y_stride = ctx->yStride; CARD32 uv_stride = y_stride >> 1; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; ViaCommandBuffer *cb = &xl->agpBuf; BEGIN_HEADER6_DATA(cb, xl, 1); OUT_RING_QW_AGP(cb, 0xc50, (y_stride >> 3) | ((uv_stride >> 3) << 16)); WAITFLAGS(cb, LL_MODE_DECODER_IDLE); } void viaVideoSetSWFLipLocked(void *xlp, unsigned yOffs, unsigned uOffs, unsigned vOffs, unsigned yStride, unsigned uvStride) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; initHQVShadow(hqvShadow); setHQVStartAddress(hqvShadow, yOffs, vOffs, yStride, 0); if (xl->videoBuf == &xl->agpBuf) syncDMA(xl, 1); syncVideo(xl, 1); uploadHQVShadow(xl, REG_HQV1_INDEX, hqvShadow, FALSE); xl->videoBuf->flushFunc(xl->videoBuf, xl); } void viaVideoSWFlipLocked(void *xlp, unsigned flags, Bool progressiveSequence) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; setHQVDeinterlacing(hqvShadow, flags); setHQVDeblocking(hqvShadow, ((flags & XVMC_FRAME_PICTURE) == XVMC_FRAME_PICTURE), TRUE); setHQVTripleBuffer(hqvShadow, TRUE); if (xl->videoBuf == &xl->agpBuf) syncDMA(xl, 1); syncVideo(xl, 1); uploadHQVShadow(xl, REG_HQV1_INDEX, hqvShadow, TRUE); xl->videoBuf->flushFunc(xl->videoBuf, xl); } void viaMpegSetFB(void *xlp, unsigned i, unsigned yOffs, unsigned uOffs, unsigned vOffs) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; ViaCommandBuffer *cb = &xl->agpBuf; i *= (4 * 2); BEGIN_HEADER6_DATA(cb, xl, 2); OUT_RING_QW_AGP(cb, 0xc28 + i, yOffs >> 3); OUT_RING_QW_AGP(cb, 0xc2c + i, vOffs >> 3); WAITFLAGS(cb, LL_MODE_DECODER_IDLE); } void viaMpegBeginPicture(void *xlp, ViaXvMCContext * ctx, unsigned width, unsigned height, const XvMCMpegControl * control) { unsigned j, mb_width, mb_height; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; ViaCommandBuffer *cb = &xl->agpBuf; mb_width = (width + 15) >> 4; mb_height = ((control->mpeg_coding == XVMC_MPEG_2) && (control->flags & XVMC_PROGRESSIVE_SEQUENCE)) ? 2 * ((height + 31) >> 5) : (((height + 15) >> 4)); BEGIN_HEADER6_DATA(cb, xl, 72); WAITFLAGS(cb, LL_MODE_DECODER_IDLE); OUT_RING_QW_AGP(cb, 0xc00, ((control->picture_structure & XVMC_FRAME_PICTURE) << 2) | ((control->picture_coding_type & 3) << 4) | ((control->flags & XVMC_ALTERNATE_SCAN) ? (1 << 6) : 0)); if (!(ctx->intraLoaded)) { OUT_RING_QW_AGP(cb, 0xc5c, 0); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(cb, 0xc60, ctx->intra_quantiser_matrix[j] | (ctx->intra_quantiser_matrix[j + 1] << 8) | (ctx->intra_quantiser_matrix[j + 2] << 16) | (ctx->intra_quantiser_matrix[j + 3] << 24)); } ctx->intraLoaded = 1; } if (!(ctx->nonIntraLoaded)) { OUT_RING_QW_AGP(cb, 0xc5c, 1); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(cb, 0xc60, ctx->non_intra_quantiser_matrix[j] | (ctx->non_intra_quantiser_matrix[j + 1] << 8) | (ctx->non_intra_quantiser_matrix[j + 2] << 16) | (ctx->non_intra_quantiser_matrix[j + 3] << 24)); } ctx->nonIntraLoaded = 1; } if (!(ctx->chromaIntraLoaded)) { OUT_RING_QW_AGP(cb, 0xc5c, 2); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(cb, 0xc60, ctx->chroma_intra_quantiser_matrix[j] | (ctx->chroma_intra_quantiser_matrix[j + 1] << 8) | (ctx->chroma_intra_quantiser_matrix[j + 2] << 16) | (ctx->chroma_intra_quantiser_matrix[j + 3] << 24)); } ctx->chromaIntraLoaded = 1; } if (!(ctx->chromaNonIntraLoaded)) { OUT_RING_QW_AGP(cb, 0xc5c, 3); for (j = 0; j < 64; j += 4) { OUT_RING_QW_AGP(cb, 0xc60, ctx->chroma_non_intra_quantiser_matrix[j] | (ctx->chroma_non_intra_quantiser_matrix[j + 1] << 8) | (ctx->chroma_non_intra_quantiser_matrix[j + 2] << 16) | (ctx->chroma_non_intra_quantiser_matrix[j + 3] << 24)); } ctx->chromaNonIntraLoaded = 1; } OUT_RING_QW_AGP(cb, 0xc90, ((mb_width * mb_height) & 0x3fff) | ((control->flags & XVMC_PRED_DCT_FRAME) ? (1 << 14) : 0) | ((control->flags & XVMC_TOP_FIELD_FIRST) ? (1 << 15) : 0) | ((control->mpeg_coding == XVMC_MPEG_2) ? (1 << 16) : 0) | ((mb_width & 0xff) << 18)); OUT_RING_QW_AGP(cb, 0xc94, ((control->flags & XVMC_CONCEALMENT_MOTION_VECTORS) ? 1 : 0) | ((control->flags & XVMC_Q_SCALE_TYPE) ? 2 : 0) | ((control->intra_dc_precision & 3) << 2) | (((1 + 0x100000 / mb_width) & 0xfffff) << 4) | ((control->flags & XVMC_INTRA_VLC_FORMAT) ? (1 << 24) : 0)); OUT_RING_QW_AGP(cb, 0xc98, (((control->FHMV_range) & 0xf) << 0) | (((control->FVMV_range) & 0xf) << 4) | (((control->BHMV_range) & 0xf) << 8) | (((control->BVMV_range) & 0xf) << 12) | ((control->flags & XVMC_SECOND_FIELD) ? (1 << 20) : 0) | (0x0a6 << 16)); } void viaMpegReset(void *xlp) { int i, j; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; ViaCommandBuffer *cb = &xl->agpBuf; BEGIN_HEADER6_DATA(cb, xl, 99); WAITFLAGS(cb, LL_MODE_DECODER_IDLE); OUT_RING_QW_AGP(cb, 0xcf0, 0); for (i = 0; i < 6; i++) { OUT_RING_QW_AGP(cb, 0xcc0, 0); OUT_RING_QW_AGP(cb, 0xc0c, 0x43 | 0x20); for (j = 0xc10; j < 0xc20; j += 4) OUT_RING_QW_AGP(cb, j, 0); } OUT_RING_QW_AGP(cb, 0xc0c, 0x1c3); for (j = 0xc10; j < 0xc20; j += 4) OUT_RING_QW_AGP(cb, j, 0); for (i = 0; i < 19; i++) OUT_RING_QW_AGP(cb, 0xc08, 0); OUT_RING_QW_AGP(cb, 0xc98, 0x400000); for (i = 0; i < 6; i++) { OUT_RING_QW_AGP(cb, 0xcc0, 0); OUT_RING_QW_AGP(cb, 0xc0c, 0x1c3 | 0x20); for (j = 0xc10; j < 0xc20; j += 4) OUT_RING_QW_AGP(cb, j, 0); } OUT_RING_QW_AGP(cb, 0xcf0, 0); } void viaMpegWriteSlice(void *xlp, CARD8 * slice, int nBytes, CARD32 sCode) { int i, n, r; CARD32 *buf; int count; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; ViaCommandBuffer *cb = &xl->agpBuf; if (xl->errors & (LL_DECODER_TIMEDOUT | LL_IDCT_FIFO_ERROR | LL_SLICE_FIFO_ERROR | LL_SLICE_FAULT)) return; n = nBytes >> 2; if (sCode) nBytes += 4; r = nBytes & 3; buf = (CARD32 *) slice; if (r) nBytes += 4 - r; nBytes += 8; BEGIN_HEADER6_DATA(cb, xl, 2); WAITFLAGS(cb, LL_MODE_DECODER_IDLE); OUT_RING_QW_AGP(cb, 0xc9c, nBytes); if (sCode) OUT_RING_QW_AGP(cb, 0xca0, sCode); i = 0; count = 0; do { count += (LL_AGP_CMDBUF_SIZE - 20); count = (count > n) ? n : count; BEGIN_HEADER5_DATA(cb, xl, (count - i), 0xca0); for (; i < count; i++) { OUT_RING_AGP(cb, *buf++); } finish_header_agp(cb); } while (i < n); BEGIN_HEADER5_DATA(cb, xl, 3, 0xca0); if (r) { OUT_RING_AGP(cb, *buf & ((1 << (r << 3)) - 1)); } OUT_RING_AGP(cb, 0); OUT_RING_AGP(cb, 0); finish_header_agp(cb); } void viaVideoSubPictureOffLocked(void *xlp) { CARD32 stride; int proReg = REG_HQV1_INDEX; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; ViaCommandBuffer *cb = xl->videoBuf; if (xl->videoBuf == &xl->agpBuf) syncDMA(xl, 1); stride = VIDIN(xl, proReg | SUBP_CONTROL_STRIDE); WAITFLAGS(cb, LL_MODE_VIDEO); BEGIN_HEADER6_DATA(cb, xl, 1); OUT_RING_QW_AGP(cb, proReg | SUBP_CONTROL_STRIDE, stride & ~SUBP_HQV_ENABLE); } void viaVideoSubPictureLocked(void *xlp, ViaXvMCSubPicture * pViaSubPic) { unsigned i; CARD32 cWord; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; int proReg = REG_HQV1_INDEX; ViaCommandBuffer *cb = xl->videoBuf; if (xl->videoBuf == &xl->agpBuf) syncDMA(xl, 1); WAITFLAGS(cb, LL_MODE_VIDEO); BEGIN_HEADER6_DATA(cb, xl, VIA_SUBPIC_PALETTE_SIZE + 2); for (i = 0; i < VIA_SUBPIC_PALETTE_SIZE; ++i) { OUT_RING_QW_AGP(cb, proReg | RAM_TABLE_CONTROL, pViaSubPic->palette[i]); } cWord = (pViaSubPic->stride & SUBP_STRIDE_MASK) | SUBP_HQV_ENABLE; cWord |= (pViaSubPic->ia44) ? SUBP_IA44 : SUBP_AI44; OUT_RING_QW_AGP(cb, proReg | SUBP_STARTADDR, pViaSubPic->offset); OUT_RING_QW_AGP(cb, proReg | SUBP_CONTROL_STRIDE, cWord); } void viaBlit(void *xlp, unsigned bpp, unsigned srcBase, unsigned srcPitch, unsigned dstBase, unsigned dstPitch, unsigned w, unsigned h, int xdir, int ydir, unsigned blitMode, unsigned color) { CARD32 dwGEMode = 0, srcY = 0, srcX, dstY = 0, dstX; CARD32 cmd; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; ViaCommandBuffer *cb = &xl->agpBuf; if (!w || !h) return; finish_header_agp(cb); switch (bpp) { case 16: dwGEMode |= VIA_GEM_16bpp; break; case 32: dwGEMode |= VIA_GEM_32bpp; break; default: dwGEMode |= VIA_GEM_8bpp; break; } srcX = srcBase & 31; dstX = dstBase & 31; switch (bpp) { case 16: dwGEMode |= VIA_GEM_16bpp; srcX >>= 2; dstX >>= 2; break; case 32: dwGEMode |= VIA_GEM_32bpp; srcX >>= 4; dstX >>= 4; break; default: dwGEMode |= VIA_GEM_8bpp; break; } BEGIN_RING_AGP(cb, xl, 20); WAITFLAGS(cb, LL_MODE_2D); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_GEMODE), dwGEMode); cmd = 0; if (xdir < 0) { cmd |= VIA_GEC_DECX; srcX += (w - 1); dstX += (w - 1); } if (ydir < 0) { cmd |= VIA_GEC_DECY; srcY += (h - 1); dstY += (h - 1); } switch (blitMode) { case VIABLIT_TRANSCOPY: OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_SRCCOLORKEY), color); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_KEYCONTROL), 0x4000); cmd |= VIA_GEC_BLT | (VIA_BLIT_COPY << 24); break; case VIABLIT_FILL: OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_FGCOLOR), color); cmd |= VIA_GEC_BLT | VIA_GEC_FIXCOLOR_PAT | (VIA_BLIT_FILL << 24); break; default: OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_KEYCONTROL), 0x0); cmd |= VIA_GEC_BLT | (VIA_BLIT_COPY << 24); } OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_SRCBASE), (srcBase & ~31) >> 3); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_DSTBASE), (dstBase & ~31) >> 3); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_PITCH), VIA_PITCH_ENABLE | (srcPitch >> 3) | (((dstPitch) >> 3) << 16)); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_SRCPOS), ((srcY << 16) | srcX)); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_DSTPOS), ((dstY << 16) | dstX)); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_DIMENSION), (((h - 1) << 16) | (w - 1))); OUT_RING_QW_AGP(cb, H1_ADDR(VIA_REG_GECMD), cmd); } unsigned syncXvMCLowLevel(void *xlp, unsigned int mode, unsigned int doSleep, CARD32 timeStamp) { unsigned errors; XvMCLowLevel *xl = (XvMCLowLevel *) xlp; if (mode == 0) { errors = xl->errors; xl->errors = 0; return errors; } if ((mode & (LL_MODE_VIDEO | LL_MODE_3D)) || !xl->use_agp) { if (xl->performLocking) hwlLock(xl, 0); if ((xl->videoBuf == &xl->agpBuf) || (mode != LL_MODE_VIDEO)) syncDMA(xl, doSleep); if (mode & LL_MODE_3D) syncAccel(xl, mode, doSleep); if (mode & LL_MODE_VIDEO) syncVideo(xl, doSleep); if (xl->performLocking) hwlUnlock(xl, 0); } else { viaDMAWaitTimeStamp(xl, timeStamp, doSleep); } if (mode & (LL_MODE_DECODER_SLICE | LL_MODE_DECODER_IDLE)) syncMpeg(xl, mode, doSleep); errors = xl->errors; xl->errors = 0; return errors; } static int updateLowLevelBuf(XvMCLowLevel * xl, LowLevelBuffer * buf, unsigned width, unsigned height) { unsigned stride, size; drm_via_mem_t *mem = &buf->mem; int ret; stride = (width + 31) & ~31; size = stride * height + (xl->fbDepth >> 3); if (size != mem->size) { if (mem->size) drmCommandWrite(xl->fd, DRM_VIA_FREEMEM, mem, sizeof(*mem)); mem->context = *(xl->drmcontext); mem->size = size; mem->type = VIA_MEM_VIDEO; if (((ret = drmCommandWriteRead(xl->fd, DRM_VIA_ALLOCMEM, mem, sizeof(*mem))) < 0) || mem->size != size) { mem->size = 0; return -1; } } buf->offset = (mem->offset + 31) & ~31; buf->stride = stride; buf->height = height; return 0; } static void cleanupLowLevelBuf(XvMCLowLevel * xl, LowLevelBuffer * buf) { drm_via_mem_t *mem = &buf->mem; if (mem->size) drmCommandWrite(xl->fd, DRM_VIA_FREEMEM, mem, sizeof(*mem)); mem->size = 0; } static void * releaseXvMCLowLevel(XvMCLowLevel * xl) { switch (xl->state) { case ll_llBuf: cleanupLowLevelBuf(xl, &xl->scale); case ll_timeStamp: viaDMACleanupTimeStamp(xl); case ll_pciBuf: free(xl->pciBuf.buf); case ll_agpBuf: free(xl->agpBuf.buf); case ll_init: free(xl); default: ; } return NULL; } void * initXvMCLowLevel(int fd, drm_context_t * ctx, drmLockPtr hwLock, drmAddress mmioAddress, drmAddress fbAddress, unsigned fbStride, unsigned fbDepth, unsigned width, unsigned height, int useAgp, unsigned chipId) { XvMCLowLevel *xl; if (chipId != PCI_CHIP_VT3259 && chipId != PCI_CHIP_VT3364) { fprintf(stderr, "You are using an XvMC driver for the wrong chip.\n"); fprintf(stderr, "Chipid is 0x%04x.\n", chipId); return NULL; } xl = (XvMCLowLevel *) malloc(sizeof(XvMCLowLevel)); if (!xl) return NULL; xl->state = ll_init; xl->agpBuf.buf = (CARD32 *) malloc(LL_AGP_CMDBUF_SIZE * sizeof(CARD32)); if (!xl->agpBuf.buf) return releaseXvMCLowLevel(xl); xl->state = ll_agpBuf; xl->agpBuf.bufSize = LL_AGP_CMDBUF_SIZE; xl->agpBuf.flushFunc = &agpFlush; xl->agpBuf.pos = 0; xl->agpBuf.mode = 0; xl->agpBuf.waitFlags = 0; xl->pciBuf.buf = (CARD32 *) malloc(LL_PCI_CMDBUF_SIZE * sizeof(CARD32)); if (!xl->pciBuf.buf) return releaseXvMCLowLevel(xl); xl->state = ll_pciBuf; xl->pciBuf.bufSize = LL_PCI_CMDBUF_SIZE; xl->pciBuf.flushFunc = &pciFlush; xl->pciBuf.pos = 0; xl->pciBuf.mode = 0; xl->pciBuf.waitFlags = 0; xl->use_agp = useAgp; xl->fd = fd; xl->drmcontext = ctx; xl->hwLock = hwLock; xl->mmioAddress = mmioAddress; xl->fbAddress = fbAddress; xl->fbDepth = fbDepth; xl->fbStride = fbStride; xl->width = width; xl->height = height; xl->performLocking = 1; xl->errors = 0; xl->agpSync = 0; xl->chipId = chipId; if (viaDMAInitTimeStamp(xl)) return releaseXvMCLowLevel(xl); xl->state = ll_timeStamp; xl->scale.mem.size = 0; xl->back.mem.size = 0; if (updateLowLevelBuf(xl, &xl->scale, width, height)) return releaseXvMCLowLevel(xl); xl->state = ll_llBuf; #ifdef VIDEO_DMA xl->videoBuf = &xl->agpBuf; #else xl->videoBuf = &xl->pciBuf; #endif return xl; } void setLowLevelLocking(void *xlp, int performLocking) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; xl->performLocking = performLocking; } void closeXvMCLowLevel(void *xlp) { XvMCLowLevel *xl = (XvMCLowLevel *) xlp; releaseXvMCLowLevel(xl); } #if 0 /* Under development */ static CARD32 computeDownScaling(int dst, int *src) { CARD32 value = 0x800; while (*src > dst) { *src >>= 1; value--; } return value; } static void computeHQVScaleAndFilter(XvMCLowLevel * xl) { int srcW, srcH; const XvMCRegion *src = &xl->sRegion, *back = &xl->dRegion; xl->downScaling = FALSE; if (back->w < src->w || back->h < src->h) { xl->downScaling = TRUE; srcW = src->w; srcH = src->h; xl->downScaleW = (back->w >= srcW) ? 0 : HQV_SCALE_ENABLE | HQV_SCALE_DOWN | (computeDownScaling(back->w, &srcW)); xl->downScaleH = (back->h >= srcH) ? 0 : HQV_SCALE_ENABLE | HQV_SCALE_DOWN | (computeDownScaling(back->h, &srcH)); } xl->upScaleW = (back->w == srcW) ? 0 : (0x800 * srcW / back->w) | HQV_SCALE_ENABLE; xl->upScaleH = (back->h == srcH) ? 0 : (0x800 * srcH / back->h) | HQV_SCALE_ENABLE; } static int setupBackBuffer(XvMCLowLevel * xl) { return updateLowLevelBuf(xl, &xl->back, xl->dRegion.w, xl->dRegion.h); } #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/viaXvMC.c000066400000000000000000001531351267025031400242620ustar00rootroot00000000000000/***************************************************************************** * VIA Unichrome XvMC extension client lib. * * Copyright (c) 2004-2005 Thomas Hellström. 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, 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 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 * 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. */ /* *Author: Thomas Hellström, 2004. *Bugfixes by among others Pascal Brisset and Terry Barnaby. *DRI protocol support by Thomas Hellström, 2005. */ #undef WAITPAUSE #include "viaXvMCPriv.h" #include "viaLowLevel.h" #include #include #include #include #include #include #include #include #include "vldXvMC.h" #include "xf86dri.h" #include "driDrawable.h" #define SAREAPTR(ctx) ((ViaXvMCSAreaPriv *) \ (((CARD8 *)(ctx)->sAreaAddress) + \ (ctx)->sAreaPrivOffset)) typedef struct { int major; int minor; int patchlevel; } ViaDRMVersion; static int error_base; static int event_base; static unsigned numContexts = 0; static int globalFD; static drmAddress sAreaAddress; static drmAddress fbAddress; static drmAddress mmioAddress; static const ViaDRMVersion drmExpected = { 2, 0, 0 }; static const ViaDRMVersion drmCompat = { 2, 0, 0 }; #define FOURCC_XVMC (('C' << 24) + ('M' << 16) + ('V' << 8) + 'X') #define ppthread_mutex_lock(arg) \ { \ pthread_mutex_lock(arg); \ } \ #define ppthread_mutex_unlock(arg) \ { \ pthread_mutex_unlock(arg); \ } \ static unsigned yOffs(ViaXvMCSurface * srf) { return srf->offsets[0]; } static unsigned vOffs(ViaXvMCSurface * srf) { return srf->offsets[0] + srf->yStride * srf->height; } static unsigned uOffs(ViaXvMCSurface * srf) { return srf->offsets[0] + (srf->yStride * srf->height) + (srf->yStride >> 1) * (srf->height >> 1); } static void defaultQMatrices(ViaXvMCContext * ctx) { int i; static const char intra[64] = { 8, 16, 19, 22, 26, 27, 29, 34, 16, 16, 22, 24, 27, 29, 34, 37, 19, 22, 26, 27, 29, 34, 34, 38, 22, 22, 26, 27, 29, 34, 37, 40, 22, 26, 27, 29, 32, 35, 40, 48, 26, 27, 29, 32, 35, 40, 48, 58, 26, 27, 29, 34, 38, 46, 56, 69, 27, 29, 35, 38, 46, 56, 69, 83 }; for (i = 0; i < 64; ++i) { ctx->intra_quantiser_matrix[i] = intra[i]; ctx->non_intra_quantiser_matrix[i] = 16; } ctx->intraLoaded = 0; ctx->nonIntraLoaded = 0; } static void releaseDecoder(ViaXvMCContext * ctx, int clearCtx) { volatile ViaXvMCSAreaPriv *sAPriv; sAPriv = SAREAPTR(ctx); UNICHROME_UNLOCK(ctx->fd, UNICHROME_LOCK_DECODER1, sAPriv, ctx->drmcontext); } static int grabDecoder(ViaXvMCContext * ctx, int *hadLastLock) { volatile ViaXvMCSAreaPriv *sAPriv = SAREAPTR(ctx); int retFtx, lc; /* * Try to grab the decoder. If it is not available we will sleep until * it becomes available or for a maximum of 20 ms. * Then try to grab it again, unless a timeout occured. If the decoder is * available, the lock should be reasonably fast. */ if (ctx->haveDecoder) { flushXvMCLowLevel(ctx->xl); /* Ignore errors here. */ /*fprintf(stderr,"ViaXvMC: ERROR: Trying to re-lock decoder.\n"); */ *hadLastLock = 1; return 0; } UNICHROME_LOCK(ctx->fd, UNICHROME_LOCK_DECODER1, sAPriv, ctx->drmcontext, lc, retFtx); *hadLastLock = (ctx->drmcontext == lc); return retFtx; } static void setupAttribDesc(Display * display, XvPortID port, const ViaXvMCAttrHolder * attrib, XvAttribute attribDesc[]) { XvAttribute *XvAttribs, *curAD; int num; unsigned i, j; XLockDisplay(display); XvAttribs = XvQueryPortAttributes(display, port, &num); for (i = 0; i < attrib->numAttr; ++i) { curAD = attribDesc + i; curAD->flags = 0; curAD->min_value = 0; curAD->max_value = 0; curAD->name = NULL; for (j = 0; j < num; ++j) { if (attrib->attributes[i].attribute == XInternAtom(display, XvAttribs[j].name, TRUE)) { *curAD = XvAttribs[j]; curAD->name = strdup(XvAttribs[j].name); break; } } } if (XvAttribs) XFree(XvAttribs); XUnlockDisplay(display); } static void releaseAttribDesc(int numAttr, XvAttribute attribDesc[]) { int i; for (i = 0; i < numAttr; ++i) { if (attribDesc[i].name) free(attribDesc[i].name); } } static Status releaseContextResources(Display * display, XvMCContext * context, int freePrivate, Status errType) { ViaXvMCContext *pViaXvMC = (ViaXvMCContext *) context->privData; switch (pViaXvMC->resources) { case context_drawHash: driDestroyHashContents(pViaXvMC->drawHash); drmHashDestroy(pViaXvMC->drawHash); case context_lowLevel: closeXvMCLowLevel(pViaXvMC->xl); case context_mutex: pthread_mutex_destroy(&pViaXvMC->ctxMutex); case context_drmContext: XLockDisplay(display); uniDRIDestroyContext(display, pViaXvMC->screen, pViaXvMC->id); XUnlockDisplay(display); case context_sAreaMap: numContexts--; if (numContexts == 0) drmUnmap(pViaXvMC->sAreaAddress, pViaXvMC->sAreaSize); case context_fbMap: if (numContexts == 0) drmUnmap(pViaXvMC->fbAddress, pViaXvMC->fbSize); case context_mmioMap: if (numContexts == 0) drmUnmap(pViaXvMC->mmioAddress, pViaXvMC->mmioSize); case context_fd: if (numContexts == 0) { if (pViaXvMC->fd >= 0) drmClose(pViaXvMC->fd); } pViaXvMC->fd = -1; case context_driConnection: if (numContexts == 0) { XLockDisplay(display); uniDRICloseConnection(display, pViaXvMC->screen); XUnlockDisplay(display); } case context_context: XLockDisplay(display); _xvmc_destroy_context(display, context); XUnlockDisplay(display); if (!freePrivate) break; default: free(pViaXvMC); context->privData = NULL; } return errType; } _X_EXPORT Status XvMCCreateContext(Display * display, XvPortID port, int surface_type_id, int width, int height, int flags, XvMCContext * context) { ViaXvMCContext *pViaXvMC; int priv_count; uint *priv_data; uint magic; unsigned i; Status ret; int major, minor; ViaXvMCCreateContextRec *tmpComm; drmVersionPtr drmVer; char *curBusID; int isCapable; /* * Verify Obvious things first */ if (context == NULL) { return XvMCBadContext; } if (!(flags & XVMC_DIRECT)) { fprintf(stderr, "Indirect Rendering not supported! Using Direct.\n"); } /* *FIXME: Check $DISPLAY for legal values here */ context->surface_type_id = surface_type_id; context->width = (unsigned short)((width + 15) & ~15); context->height = (unsigned short)((height + 15) & ~15); context->flags = flags; context->port = port; /* * Width, Height, and flags are checked against surface_type_id * and port for validity inside the X server, no need to check * here. */ /* Allocate private Context data */ context->privData = (void *)malloc(sizeof(ViaXvMCContext)); if (!context->privData) { fprintf(stderr, "Unable to allocate resources for XvMC context.\n"); return BadAlloc; } pViaXvMC = (ViaXvMCContext *) context->privData; pViaXvMC->resources = context_none; /* Verify the XvMC extension exists */ XLockDisplay(display); if (!XvMCQueryExtension(display, &event_base, &error_base)) { fprintf(stderr, "XvMC Extension is not available!\n"); free(pViaXvMC); XUnlockDisplay(display); return BadAlloc; } /* Verify XvMC version */ ret = XvMCQueryVersion(display, &major, &minor); if (ret) { fprintf(stderr, "XvMCQuery Version Failed, unable to determine " "protocol version!\n"); } XUnlockDisplay(display); /* FIXME: Check Major and Minor here */ XLockDisplay(display); if ((ret = _xvmc_create_context(display, context, &priv_count, &priv_data))) { XUnlockDisplay(display); fprintf(stderr, "Unable to create XvMC Context!\n"); return releaseContextResources(display, context, 1, BadAlloc); } XUnlockDisplay(display); /* * Check size and version of returned data. */ tmpComm = (ViaXvMCCreateContextRec *) priv_data; if (priv_count != (sizeof(ViaXvMCCreateContextRec) >> 2)) { fprintf(stderr, "_xvmc_create_context() returned incorrect " "data size!\n"); fprintf(stderr, "\tExpected %d, got %d\n", ((int)(sizeof(ViaXvMCCreateContextRec) >> 2)), priv_count); XFree(priv_data); return releaseContextResources(display, context, 1, BadAlloc); } pViaXvMC->resources = context_context; if ((tmpComm->major != VIAXVMC_MAJOR) || (tmpComm->minor != VIAXVMC_MINOR)) { fprintf(stderr, "Version mismatch between the X via driver\n" "and the XvMC library. Cannot continue!\n"); XFree(priv_data); return releaseContextResources(display, context, 1, BadAlloc); } pViaXvMC->ctxNo = tmpComm->ctxNo; pViaXvMC->fbOffset = tmpComm->fbOffset; pViaXvMC->fbSize = tmpComm->fbSize; pViaXvMC->mmioOffset = tmpComm->mmioOffset; pViaXvMC->mmioSize = tmpComm->mmioSize; pViaXvMC->sAreaSize = tmpComm->sAreaSize; pViaXvMC->sAreaPrivOffset = tmpComm->sAreaPrivOffset; pViaXvMC->decoderOn = 0; pViaXvMC->xvMCPort = tmpComm->xvmc_port; pViaXvMC->useAGP = tmpComm->useAGP; pViaXvMC->attrib = tmpComm->initAttrs; pViaXvMC->screen = tmpComm->screen; pViaXvMC->depth = tmpComm->depth; pViaXvMC->stride = tmpComm->stride; pViaXvMC->chipId = tmpComm->chipId; /* * Must free the private data we were passed from X */ XFree(priv_data); priv_data = NULL; /* * Check for direct rendering capable, establish DRI and DRM connections, * map framebuffer, DRI shared area and read-only register areas. * Initial checking for drm has already been done by the server. * Only do this for the first context we create. */ if (numContexts == 0) { XLockDisplay(display); ret = uniDRIQueryDirectRenderingCapable(display, pViaXvMC->screen, &isCapable); if (!ret || !isCapable) { XUnlockDisplay(display); fprintf(stderr, "Direct Rendering is not available on this system!\n"); return releaseContextResources(display, context, 1, BadAlloc); } if (!uniDRIOpenConnection(display, pViaXvMC->screen, &pViaXvMC->sAreaOffset, &curBusID)) { XUnlockDisplay(display); fprintf(stderr, "Could not open DRI connection to X server!\n"); return releaseContextResources(display, context, 1, BadAlloc); } XUnlockDisplay(display); strncpy(pViaXvMC->busIdString, curBusID, 20); pViaXvMC->busIdString[20] = '\0'; XFree(curBusID); pViaXvMC->resources = context_driConnection; if ((pViaXvMC->fd = drmOpen("via", pViaXvMC->busIdString)) < 0) { fprintf(stderr, "DRM Device for via could not be opened.\n"); return releaseContextResources(display, context, 1, BadAlloc); } globalFD = pViaXvMC->fd; pViaXvMC->resources = context_fd; if (NULL == (drmVer = drmGetVersion(pViaXvMC->fd))) { fprintf(stderr, "viaXvMC: Could not get drm version."); return releaseContextResources(display, context, 1, BadAlloc); } if ((drmVer->version_major < drmExpected.major) || (drmVer->version_major > drmCompat.major) || ((drmVer->version_major == drmExpected.major) && (drmVer->version_minor < drmExpected.minor))) { fprintf(stderr, "viaXvMC: Kernel drm is not compatible with XvMC.\n"); fprintf(stderr, "viaXvMC: Kernel drm version: %d.%d.%d " "and I can work with versions %d.%d.x - %d.x.x\n" "Please update either this XvMC driver or your kernel DRM.\n", drmVer->version_major, drmVer->version_minor, drmVer->version_patchlevel, drmExpected.major, drmExpected.minor, drmCompat.major); drmFreeVersion(drmVer); return releaseContextResources(display, context, 1, BadAlloc); } drmFreeVersion(drmVer); drmGetMagic(pViaXvMC->fd, &magic); XLockDisplay(display); if (!uniDRIAuthConnection(display, pViaXvMC->screen, magic)) { XUnlockDisplay(display); fprintf(stderr, "viaXvMC: X server did not allow DRI. Check permissions.\n"); return releaseContextResources(display, context, 1, BadAlloc); } XUnlockDisplay(display); /* * Map the register memory */ if (drmMap(pViaXvMC->fd, pViaXvMC->mmioOffset, pViaXvMC->mmioSize, &mmioAddress) < 0) { fprintf(stderr, "Unable to map the display chip mmio registers.\n"); return releaseContextResources(display, context, 1, BadAlloc); } pViaXvMC->mmioAddress = mmioAddress; pViaXvMC->resources = context_mmioMap; /* * Map Framebuffer memory */ if (drmMap(pViaXvMC->fd, pViaXvMC->fbOffset, pViaXvMC->fbSize, &fbAddress) < 0) { fprintf(stderr, "Unable to map XvMC Framebuffer.\n"); return releaseContextResources(display, context, 1, BadAlloc); } pViaXvMC->fbAddress = fbAddress; pViaXvMC->resources = context_fbMap; /* * Map DRI Sarea. */ if (drmMap(pViaXvMC->fd, pViaXvMC->sAreaOffset, pViaXvMC->sAreaSize, &sAreaAddress) < 0) { fprintf(stderr, "Unable to map DRI SAREA.\n"); return releaseContextResources(display, context, 1, BadAlloc); } } else { pViaXvMC->fd = globalFD; pViaXvMC->mmioAddress = mmioAddress; pViaXvMC->fbAddress = fbAddress; } pViaXvMC->sAreaAddress = sAreaAddress; pViaXvMC->resources = context_sAreaMap; numContexts++; /* * Find a matching visual. Important only for direct drawing to the visible * frame-buffer. */ XLockDisplay(display); ret = XMatchVisualInfo(display, pViaXvMC->screen, (pViaXvMC->depth == 32) ? 24 : pViaXvMC->depth, TrueColor, &pViaXvMC->visualInfo); XUnlockDisplay(display); if (!ret) { fprintf(stderr, "viaXvMC: Could not find a matching TrueColor visual.\n"); return releaseContextResources(display, context, 1, BadAlloc); } if (!uniDRICreateContext(display, pViaXvMC->screen, pViaXvMC->visualInfo.visual, &pViaXvMC->id, &pViaXvMC->drmcontext)) { fprintf(stderr, "viaXvMC: Could not create DRI context.\n"); return releaseContextResources(display, context, 1, BadAlloc); } pViaXvMC->resources = context_drmContext; for (i = 0; i < VIA_MAX_RENDSURF; ++i) { pViaXvMC->rendSurf[i] = 0; } pViaXvMC->lastSrfDisplaying = ~0; setupAttribDesc(display, port, &pViaXvMC->attrib, pViaXvMC->attribDesc); pViaXvMC->hwLock = (drmLockPtr) pViaXvMC->sAreaAddress; defaultQMatrices(pViaXvMC); pViaXvMC->chromaIntraLoaded = 1; pViaXvMC->chromaNonIntraLoaded = 1; pViaXvMC->yStride = (width + 31) & ~31; pViaXvMC->haveDecoder = 0; pViaXvMC->attribChanged = 1; pViaXvMC->haveXv = 0; pViaXvMC->port = context->port; pthread_mutex_init(&pViaXvMC->ctxMutex, NULL); pViaXvMC->resources = context_mutex; pViaXvMC->timeStamp = 0; setRegion(0, 0, -1, -1, pViaXvMC->sRegion); setRegion(0, 0, -1, -1, pViaXvMC->dRegion); if (NULL == (pViaXvMC->xl = initXvMCLowLevel(pViaXvMC->fd, &pViaXvMC->drmcontext, pViaXvMC->hwLock, pViaXvMC->mmioAddress, pViaXvMC->fbAddress, pViaXvMC->stride, pViaXvMC->depth, context->width, context->height, pViaXvMC->useAGP, pViaXvMC->chipId))) { fprintf(stderr, "ViaXvMC: Could not allocate timestamp blit area.\n"); return releaseContextResources(display, context, 1, BadAlloc); } pViaXvMC->resources = context_lowLevel; setAGPSyncLowLevel(pViaXvMC->xl, 1, 0); if (NULL == (pViaXvMC->drawHash = drmHashCreate())) { fprintf(stderr, "ViaXvMC: Could not allocate drawable hash table.\n"); return releaseContextResources(display, context, 1, BadAlloc); } pViaXvMC->resources = context_drawHash; if (numContexts == 1) { hwlLock(pViaXvMC->xl, 1); setLowLevelLocking(pViaXvMC->xl, 0); viaVideoSubPictureOffLocked(pViaXvMC->xl); flushXvMCLowLevel(pViaXvMC->xl); setLowLevelLocking(pViaXvMC->xl, 1); hwlUnlock(pViaXvMC->xl, 1); } return Success; } _X_EXPORT Status XvMCDestroyContext(Display * display, XvMCContext * context) { ViaXvMCContext *pViaXvMC; if (context == NULL) { return (error_base + XvMCBadContext); } if (NULL == (pViaXvMC = context->privData)) { return (error_base + XvMCBadContext); } /* * Release decoder if we have it. In case of crash or termination * before XvMCDestroyContext, the X server will take care of this. */ releaseAttribDesc(pViaXvMC->attrib.numAttr, pViaXvMC->attribDesc); releaseDecoder(pViaXvMC, 1); return releaseContextResources(display, context, 1, Success); } _X_EXPORT Status XvMCCreateSurface(Display * display, XvMCContext * context, XvMCSurface * surface) { ViaXvMCContext *pViaXvMC; ViaXvMCSurface *pViaSurface; int priv_count; unsigned *priv_data; unsigned i; Status ret; if ((surface == NULL) || (context == NULL) || (display == NULL)) { return BadValue; } pViaXvMC = (ViaXvMCContext *) context->privData; ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (pViaXvMC == NULL) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return (error_base + XvMCBadContext); } pViaSurface = surface->privData = (ViaXvMCSurface *) malloc(sizeof(ViaXvMCSurface)); if (!surface->privData) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadAlloc; } XLockDisplay(display); if ((ret = _xvmc_create_surface(display, context, surface, &priv_count, &priv_data))) { XUnlockDisplay(display); free(pViaSurface); fprintf(stderr, "Unable to create XvMC Surface.\n"); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return ret; } XUnlockDisplay(display); pViaSurface->srfNo = priv_data[0]; /* * Store framebuffer offsets to the buffers allocated for this surface. * For some chipset revisions, surfaces may be double-buffered. */ pViaSurface->numBuffers = priv_data[1]; for (i = 0; i < pViaSurface->numBuffers; ++i) { pViaSurface->offsets[i] = priv_data[i + 2]; } pViaSurface->curBuf = 0; /* Free data returned from xvmc_create_surface */ XFree(priv_data); pViaSurface->width = context->width; pViaSurface->height = context->height; pViaSurface->yStride = pViaXvMC->yStride; pViaSurface->privContext = pViaXvMC; pViaSurface->privSubPic = NULL; pViaSurface->needsSync = 0; ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCDestroySurface(Display * display, XvMCSurface * surface) { ViaXvMCSurface *pViaSurface; if ((display == NULL) || (surface == NULL)) { return BadValue; } if (surface->privData == NULL) { return (error_base + XvMCBadSurface); } pViaSurface = (ViaXvMCSurface *) surface->privData; XLockDisplay(display); _xvmc_destroy_surface(display, surface); XUnlockDisplay(display); free(pViaSurface); surface->privData = NULL; return Success; } _X_EXPORT Status XvMCPutSlice2(Display * display, XvMCContext * context, char *slice, int nBytes, int sliceCode) { ViaXvMCContext *pViaXvMC; CARD32 sCode = 0x00010000 | (sliceCode & 0xFF) << 24; if ((display == NULL) || (context == NULL)) { return BadValue; } if (NULL == (pViaXvMC = context->privData)) { return (error_base + XvMCBadContext); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (!pViaXvMC->haveDecoder) { fprintf(stderr, "XvMCPutSlice: This context does not own decoder!\n"); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadAlloc; } viaMpegWriteSlice(pViaXvMC->xl, (CARD8 *) slice, nBytes, sCode); flushPCIXvMCLowLevel(pViaXvMC->xl); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCPutSlice(Display * display, XvMCContext * context, char *slice, int nBytes) { ViaXvMCContext *pViaXvMC; if ((display == NULL) || (context == NULL)) { return BadValue; } if (NULL == (pViaXvMC = context->privData)) { return (error_base + XvMCBadContext); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (!pViaXvMC->haveDecoder) { fprintf(stderr, "XvMCPutSlice: This context does not own decoder!\n"); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadAlloc; } viaMpegWriteSlice(pViaXvMC->xl, (CARD8 *) slice, nBytes, 0); flushPCIXvMCLowLevel(pViaXvMC->xl); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } static Status updateXVOverlay(Display * display, ViaXvMCContext * pViaXvMC, ViaXvMCSurface * pViaSurface, Drawable draw, short srcx, short srcy, unsigned short srcw, unsigned short srch, short destx, short desty, unsigned short destw, unsigned short desth) { ViaXvMCCommandBuffer buf; ViaXvMCSubPicture *pViaSubPic; Status ret; if (!pViaXvMC->haveXv) { pViaXvMC->xvImage = XvCreateImage(display, pViaXvMC->port, FOURCC_XVMC, (char *)&buf, pViaSurface->width, pViaSurface->height); pViaXvMC->gc = XCreateGC(display, draw, 0, 0); pViaXvMC->haveXv = 1; } pViaXvMC->draw = draw; pViaXvMC->xvImage->data = (char *)&buf; buf.command = (pViaXvMC->attribChanged) ? VIA_XVMC_COMMAND_FDISPLAY : VIA_XVMC_COMMAND_DISPLAY; buf.ctxNo = pViaXvMC->ctxNo | VIA_XVMC_VALID; buf.srfNo = pViaSurface->srfNo | VIA_XVMC_VALID; pViaSubPic = pViaSurface->privSubPic; buf.subPicNo = ((NULL == pViaSubPic) ? 0 : pViaSubPic->srfNo) | VIA_XVMC_VALID; buf.attrib = pViaXvMC->attrib; XLockDisplay(display); if ((ret = XvPutImage(display, pViaXvMC->port, draw, pViaXvMC->gc, pViaXvMC->xvImage, srcx, srcy, srcw, srch, destx, desty, destw, desth))) { XUnlockDisplay(display); return ret; } XSync(display, 0); XUnlockDisplay(display); pViaXvMC->attribChanged = 0; return Success; } _X_EXPORT Status XvMCPutSurface(Display * display, XvMCSurface * surface, Drawable draw, short srcx, short srcy, unsigned short srcw, unsigned short srch, short destx, short desty, unsigned short destw, unsigned short desth, int flags) { /* * This function contains some hairy locking logic. What we really want to * do is to flip the picture ASAP, to get a low latency and smooth playback. * However, if somebody else used the overlay since we used it last or if it is * our first time, we'll have to call X to update the overlay first. Otherwise * we'll do the overlay update once we've flipped. Since we release the hardware * lock when we call X, X needs to verify using the SAREA that nobody else flipped * in a picture between the lock release and the X server control. Similarly * when the overlay update returns, we have to make sure that we still own the * overlay. */ ViaXvMCSurface *pViaSurface; ViaXvMCContext *pViaXvMC; ViaXvMCSubPicture *pViaSubPic; volatile ViaXvMCSAreaPriv *sAPriv; Status ret; unsigned dispSurface, lastSurface; int overlayUpdated; drawableInfo *drawInfo; XvMCRegion sReg, dReg; Bool forceUpdate = FALSE; if ((display == NULL) || (surface == NULL)) { return BadValue; } if (NULL == (pViaSurface = surface->privData)) { return (error_base + XvMCBadSurface); } if (NULL == (pViaXvMC = pViaSurface->privContext)) { return (error_base + XvMCBadContext); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); pViaSubPic = pViaSurface->privSubPic; sAPriv = SAREAPTR(pViaXvMC); setRegion(srcx, srcy, srcw, srch, sReg); setRegion(destx, desty, destw, desth, dReg); if ((!regionEqual(sReg, pViaXvMC->sRegion)) || (!regionEqual(dReg, pViaXvMC->dRegion))) { /* * Force update of the video overlay to match the new format. */ pViaXvMC->sRegion = sReg; pViaXvMC->dRegion = dReg; forceUpdate = TRUE; } hwlLock(pViaXvMC->xl, 1); if (getDRIDrawableInfoLocked(pViaXvMC->drawHash, display, pViaXvMC->screen, draw, 0, pViaXvMC->fd, pViaXvMC->drmcontext, pViaXvMC->sAreaAddress, FALSE, &drawInfo, sizeof(*drawInfo))) { hwlUnlock(pViaXvMC->xl, 1); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadAccess; } setLowLevelLocking(pViaXvMC->xl, 0); /* * Put a surface ID in the SAREA to "authenticate" to the * X server. */ dispSurface = sAPriv->XvMCDisplaying[pViaXvMC->xvMCPort]; lastSurface = pViaXvMC->lastSrfDisplaying; sAPriv->XvMCDisplaying[pViaXvMC->xvMCPort] = pViaXvMC->lastSrfDisplaying = pViaSurface->srfNo | VIA_XVMC_VALID; overlayUpdated = 0; viaVideoSetSWFLipLocked(pViaXvMC->xl, yOffs(pViaSurface), uOffs(pViaSurface), vOffs(pViaSurface), pViaSurface->yStride, pViaSurface->yStride >> 1); while ((lastSurface != dispSurface) || forceUpdate) { forceUpdate = FALSE; flushPCIXvMCLowLevel(pViaXvMC->xl); setLowLevelLocking(pViaXvMC->xl, 1); hwlUnlock(pViaXvMC->xl, 1); /* * We weren't the last to display. Update the overlay before flipping. */ ret = updateXVOverlay(display, pViaXvMC, pViaSurface, draw, srcx, srcy, srcw, srch, destx, desty, destw, desth); if (ret) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return ret; } hwlLock(pViaXvMC->xl, 1); if (getDRIDrawableInfoLocked(pViaXvMC->drawHash, display, pViaXvMC->screen, draw, 0, pViaXvMC->fd, pViaXvMC->drmcontext, pViaXvMC->sAreaAddress, FALSE, &drawInfo, sizeof(*drawInfo))) { hwlUnlock(pViaXvMC->xl, 1); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadAccess; } setLowLevelLocking(pViaXvMC->xl, 0); lastSurface = pViaSurface->srfNo | VIA_XVMC_VALID; dispSurface = sAPriv->XvMCDisplaying[pViaXvMC->xvMCPort]; overlayUpdated = 1; } /* * Subpictures */ if (NULL != pViaSubPic) { if (sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] != (pViaSubPic->srfNo | VIA_XVMC_VALID)) { sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] = pViaSubPic->srfNo | VIA_XVMC_VALID; viaVideoSubPictureLocked(pViaXvMC->xl, pViaSubPic); } } else { if (sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] & VIA_XVMC_VALID) { viaVideoSubPictureOffLocked(pViaXvMC->xl); sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] &= ~VIA_XVMC_VALID; } } /* * Flip */ viaVideoSWFlipLocked(pViaXvMC->xl, flags, pViaSurface->progressiveSequence); flushXvMCLowLevel(pViaXvMC->xl); setLowLevelLocking(pViaXvMC->xl, 1); hwlUnlock(pViaXvMC->xl, 1); if (overlayUpdated || !drawInfo->touched) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } /* * Update overlay */ ret = updateXVOverlay(display, pViaXvMC, pViaSurface, draw, srcx, srcy, srcw, srch, destx, desty, destw, desth); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return ret; } void debugControl(const XvMCMpegControl * control) { printf("BVMV_range: %u\n", control->BVMV_range); printf("BHMV_range: %u\n", control->BHMV_range); printf("FVMV_range: %u\n", control->FVMV_range); printf("FHMV_range: %u\n", control->FHMV_range); printf("picture_structure: %u\n", control->picture_structure); printf("intra_dc_precision: %u\n", control->intra_dc_precision); printf("picture_coding_type: %u\n", control->picture_coding_type); printf("mpeg_coding: %u\n", control->mpeg_coding); printf("flags: 0x%x\n", control->flags); } _X_EXPORT Status XvMCBeginSurface(Display * display, XvMCContext * context, XvMCSurface * target_surface, XvMCSurface * past_surface, XvMCSurface * future_surface, const XvMCMpegControl * control) { ViaXvMCSurface *targS, *futS, *pastS; ViaXvMCContext *pViaXvMC; int hadDecoderLast; CARD32 timeStamp; if ((display == NULL) || (context == NULL) || (target_surface == NULL)) { return BadValue; } pViaXvMC = context->privData; ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (grabDecoder(pViaXvMC, &hadDecoderLast)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadAlloc; } pViaXvMC->haveDecoder = 1; /* * We need to wait for decoder idle at next flush, since hardware doesn't queue * beginsurface requests until the decoder is idle. This is * done by waiting on the last previous timestamp, or if there was another context * having the decoder before us, by emitting a new one. */ if (pViaXvMC->useAGP) { if (!hadDecoderLast || pViaXvMC->timeStamp == 0) { timeStamp = viaDMATimeStampLowLevel(pViaXvMC->xl); if (flushXvMCLowLevel(pViaXvMC->xl)) { releaseDecoder(pViaXvMC, 0); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadAlloc; } pViaXvMC->timeStamp = timeStamp; } else { timeStamp = pViaXvMC->timeStamp; } setAGPSyncLowLevel(pViaXvMC->xl, 1, timeStamp); } if (!hadDecoderLast || !pViaXvMC->decoderOn) { pViaXvMC->intraLoaded = 0; pViaXvMC->nonIntraLoaded = 0; } viaMpegReset(pViaXvMC->xl); targS = (ViaXvMCSurface *) target_surface->privData; futS = NULL; pastS = NULL; pViaXvMC->rendSurf[0] = targS->srfNo | VIA_XVMC_VALID; if (future_surface) { futS = (ViaXvMCSurface *) future_surface->privData; futS->needsSync = 0; } if (past_surface) { pastS = (ViaXvMCSurface *) past_surface->privData; pastS->needsSync = 0; } targS->progressiveSequence = (control->flags & XVMC_PROGRESSIVE_SEQUENCE); targS->topFieldFirst = (control->flags & XVMC_TOP_FIELD_FIRST); targS->privSubPic = NULL; viaMpegSetSurfaceStride(pViaXvMC->xl, pViaXvMC); viaMpegSetFB(pViaXvMC->xl, 0, yOffs(targS), uOffs(targS), vOffs(targS)); if (past_surface) { viaMpegSetFB(pViaXvMC->xl, 1, yOffs(pastS), uOffs(pastS), vOffs(pastS)); } else { viaMpegSetFB(pViaXvMC->xl, 1, 0, 0, 0); } if (future_surface) { viaMpegSetFB(pViaXvMC->xl, 2, yOffs(futS), uOffs(futS), vOffs(futS)); } else { viaMpegSetFB(pViaXvMC->xl, 2, 0, 0, 0); } viaMpegBeginPicture(pViaXvMC->xl, pViaXvMC, context->width, context->height, control); flushPCIXvMCLowLevel(pViaXvMC->xl); targS->needsSync = 1; targS->syncMode = LL_MODE_DECODER_IDLE; pViaXvMC->decoderOn = 1; ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCSyncSurface(Display * display, XvMCSurface * surface) { ViaXvMCSurface *pViaSurface; ViaXvMCContext *pViaXvMC; unsigned i; if ((display == NULL) || (surface == NULL)) { return BadValue; } if (surface->privData == NULL) { return (error_base + XvMCBadSurface); } pViaSurface = (ViaXvMCSurface *) surface->privData; pViaXvMC = pViaSurface->privContext; if (pViaXvMC == NULL) { return (error_base + XvMCBadSurface); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (pViaSurface->needsSync) { CARD32 timeStamp = pViaSurface->timeStamp; int syncMode = pViaSurface->syncMode; if (pViaXvMC->useAGP) { 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)) { pViaSurface->needsSync = 0; ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } if (syncXvMCLowLevel(pViaXvMC->xl, syncMode, 1, pViaSurface->timeStamp)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadValue; } pViaSurface->needsSync = 0; } if (pViaXvMC->rendSurf[0] == (pViaSurface->srfNo | VIA_XVMC_VALID)) { pViaSurface->needsSync = 0; for (i = 0; i < VIA_MAX_RENDSURF; ++i) { pViaXvMC->rendSurf[i] = 0; } } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCLoadQMatrix(Display * display, XvMCContext * context, const XvMCQMatrix * qmx) { ViaXvMCContext * pViaXvMC; if ((display == NULL) || (context == NULL)) { return BadValue; } if (NULL == (pViaXvMC = context->privData)) { return (error_base + XvMCBadContext); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (qmx->load_intra_quantiser_matrix) { memcpy(pViaXvMC->intra_quantiser_matrix, qmx->intra_quantiser_matrix, sizeof(qmx->intra_quantiser_matrix)); pViaXvMC->intraLoaded = 0; } if (qmx->load_non_intra_quantiser_matrix) { memcpy(pViaXvMC->non_intra_quantiser_matrix, qmx->non_intra_quantiser_matrix, sizeof(qmx->non_intra_quantiser_matrix)); pViaXvMC->nonIntraLoaded = 0; } if (qmx->load_chroma_intra_quantiser_matrix) { memcpy(pViaXvMC->chroma_intra_quantiser_matrix, qmx->chroma_intra_quantiser_matrix, sizeof(qmx->chroma_intra_quantiser_matrix)); pViaXvMC->chromaIntraLoaded = 0; } if (qmx->load_chroma_non_intra_quantiser_matrix) { memcpy(pViaXvMC->chroma_non_intra_quantiser_matrix, qmx->chroma_non_intra_quantiser_matrix, sizeof(qmx->chroma_non_intra_quantiser_matrix)); pViaXvMC->chromaNonIntraLoaded = 0; } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } /* * Below, we provide functions unusable for this implementation, but for * standard completeness. */ _X_EXPORT Status XvMCRenderSurface (Display * display, XvMCContext * context, unsigned int picture_structure, XvMCSurface * target_surface, XvMCSurface * past_surface, XvMCSurface * future_surface, unsigned int flags, unsigned int num_macroblocks, unsigned int first_macroblock, XvMCMacroBlockArray * macroblock_array, XvMCBlockArray * blocks) { return (error_base + XvMCBadContext); } _X_EXPORT Status XvMCCreateBlocks (Display * display, XvMCContext * context, unsigned int num_blocks, XvMCBlockArray * block) { return (error_base + XvMCBadContext); } _X_EXPORT Status XvMCDestroyBlocks(Display * display, XvMCBlockArray * block) { return Success; } _X_EXPORT Status XvMCCreateMacroBlocks (Display * display, XvMCContext * context, unsigned int num_blocks, XvMCMacroBlockArray * blocks) { return (error_base + XvMCBadContext); } _X_EXPORT Status XvMCDestroyMacroBlocks(Display * display, XvMCMacroBlockArray * block) { return (error_base + XvMCBadContext); } _X_EXPORT Status XvMCCreateSubpicture(Display * display, XvMCContext * context, XvMCSubpicture * subpicture, unsigned short width, unsigned short height, int xvimage_id) { ViaXvMCContext *pViaXvMC; ViaXvMCSubPicture *pViaSubPic; int priv_count; unsigned *priv_data; Status ret; if ((subpicture == NULL) || (context == NULL) || (display == NULL)) { return BadValue; } pViaXvMC = (ViaXvMCContext *) context->privData; if (pViaXvMC == NULL) { return (error_base + XvMCBadContext); } subpicture->privData = (ViaXvMCSubPicture *) malloc(sizeof(ViaXvMCSubPicture)); if (!subpicture->privData) { return BadAlloc; } ppthread_mutex_lock(&pViaXvMC->ctxMutex); subpicture->width = context->width; subpicture->height = context->height; subpicture->xvimage_id = xvimage_id; pViaSubPic = (ViaXvMCSubPicture *) subpicture->privData; XLockDisplay(display); if ((ret = _xvmc_create_subpicture(display, context, subpicture, &priv_count, &priv_data))) { XUnlockDisplay(display); free(pViaSubPic); fprintf(stderr, "Unable to create XvMC Subpicture.\n"); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return ret; } XUnlockDisplay(display); subpicture->num_palette_entries = VIA_SUBPIC_PALETTE_SIZE; subpicture->entry_bytes = 3; strncpy(subpicture->component_order, "YUV", 4); pViaSubPic->srfNo = priv_data[0]; pViaSubPic->offset = priv_data[1]; pViaSubPic->stride = (subpicture->width + 31) & ~31; pViaSubPic->privContext = pViaXvMC; pViaSubPic->ia44 = (xvimage_id == FOURCC_IA44); pViaSubPic->needsSync = 0; /* Free data returned from _xvmc_create_subpicture */ XFree(priv_data); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCSetSubpicturePalette(Display * display, XvMCSubpicture * subpicture, unsigned char *palette) { ViaXvMCSubPicture *pViaSubPic; ViaXvMCContext *pViaXvMC; volatile ViaXvMCSAreaPriv *sAPriv; unsigned i; CARD32 tmp; if ((subpicture == NULL) || (display == NULL)) { return BadValue; } if (subpicture->privData == NULL) { return (error_base + XvMCBadSubpicture); } pViaSubPic = (ViaXvMCSubPicture *) subpicture->privData; for (i = 0; i < VIA_SUBPIC_PALETTE_SIZE; ++i) { tmp = *palette++ << 8; tmp |= *palette++ << 16; tmp |= *palette++ << 24; tmp |= ((i & 0x0f) << 4) | 0x07; pViaSubPic->palette[i] = tmp; } pViaXvMC = pViaSubPic->privContext; ppthread_mutex_lock(&pViaXvMC->ctxMutex); sAPriv = SAREAPTR(pViaXvMC); hwlLock(pViaXvMC->xl, 1); setLowLevelLocking(pViaXvMC->xl, 0); /* * If the subpicture is displaying, Immeadiately update it with the * new palette. */ if (sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] == (pViaSubPic->srfNo | VIA_XVMC_VALID)) { viaVideoSubPictureLocked(pViaXvMC->xl, pViaSubPic); } flushPCIXvMCLowLevel(pViaXvMC->xl); setLowLevelLocking(pViaXvMC->xl, 1); hwlUnlock(pViaXvMC->xl, 1); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } static int findOverlap(unsigned width, unsigned height, short *dstX, short *dstY, short *srcX, short *srcY, unsigned short *areaW, unsigned short *areaH) { int w, h; unsigned mWidth, mHeight; w = *areaW; h = *areaH; if ((*dstX >= width) || (*dstY >= height)) return 1; if (*dstX < 0) { w += *dstX; *srcX -= *dstX; *dstX = 0; } if (*dstY < 0) { h += *dstY; *srcY -= *dstY; *dstY = 0; } if ((w <= 0) || ((h <= 0))) return 1; mWidth = width - *dstX; mHeight = height - *dstY; *areaW = (w <= mWidth) ? w : mWidth; *areaH = (h <= mHeight) ? h : mHeight; return 0; } _X_EXPORT Status XvMCClearSubpicture(Display * display, XvMCSubpicture * subpicture, short x, short y, unsigned short width, unsigned short height, unsigned int color) { ViaXvMCContext *pViaXvMC; ViaXvMCSubPicture *pViaSubPic; short dummyX, dummyY; unsigned long bOffs; if ((subpicture == NULL) || (display == NULL)) { return BadValue; } if (subpicture->privData == NULL) { return (error_base + XvMCBadSubpicture); } pViaSubPic = (ViaXvMCSubPicture *) subpicture->privData; pViaXvMC = pViaSubPic->privContext; ppthread_mutex_lock(&pViaXvMC->ctxMutex); /* Clip clearing area so that it fits inside subpicture. */ if (findOverlap(subpicture->width, subpicture->height, &x, &y, &dummyX, &dummyY, &width, &height)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } bOffs = pViaSubPic->offset + y * pViaSubPic->stride + x; viaBlit(pViaXvMC->xl, 8, 0, pViaSubPic->stride, bOffs, pViaSubPic->stride, width, height, 1, 1, VIABLIT_FILL, color); pViaSubPic->needsSync = 1; pViaSubPic->timeStamp = viaDMATimeStampLowLevel(pViaXvMC->xl); if (flushXvMCLowLevel(pViaXvMC->xl)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadValue; } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCCompositeSubpicture(Display * display, XvMCSubpicture * subpicture, XvImage * image, short srcx, short srcy, unsigned short width, unsigned short height, short dstx, short dsty) { unsigned i; ViaXvMCContext *pViaXvMC; ViaXvMCSubPicture *pViaSubPic; CARD8 *dAddr, *sAddr; if ((subpicture == NULL) || (display == NULL) || (image == NULL)) { return BadValue; } if (NULL == (pViaSubPic = (ViaXvMCSubPicture *) subpicture->privData)) { return (error_base + XvMCBadSubpicture); } pViaXvMC = pViaSubPic->privContext; if (image->id != subpicture->xvimage_id) return BadMatch; ppthread_mutex_lock(&pViaXvMC->ctxMutex); /* * Clip copy area so that it fits inside subpicture and image. */ if (findOverlap(subpicture->width, subpicture->height, &dstx, &dsty, &srcx, &srcy, &width, &height)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } if (findOverlap(image->width, image->height, &srcx, &srcy, &dstx, &dsty, &width, &height)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } if (pViaSubPic->needsSync) { if (syncXvMCLowLevel(pViaXvMC->xl, LL_MODE_2D, 0, pViaSubPic->timeStamp)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadValue; } pViaSubPic->needsSync = 0; } for (i = 0; i < height; ++i) { dAddr = (((CARD8 *) pViaXvMC->fbAddress) + (pViaSubPic->offset + (dsty + i) * pViaSubPic->stride + dstx)); sAddr = (((CARD8 *) image->data) + (image->offsets[0] + (srcy + i) * image->pitches[0] + srcx)); memcpy(dAddr, sAddr, width); } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCBlendSubpicture(Display * display, XvMCSurface * target_surface, XvMCSubpicture * subpicture, short subx, short suby, unsigned short subw, unsigned short subh, short surfx, short surfy, unsigned short surfw, unsigned short surfh) { ViaXvMCSurface *pViaSurface; ViaXvMCSubPicture *pViaSubPic; if ((display == NULL) || target_surface == NULL) { return BadValue; } if (subx || suby || surfx || surfy || (subw != surfw) || (subh != surfh)) { fprintf(stderr, "ViaXvMC: Only completely overlapping subpicture " "supported.\n"); return BadValue; } if (NULL == (pViaSurface = target_surface->privData)) { return (error_base + XvMCBadSurface); } if (subpicture) { if (NULL == (pViaSubPic = subpicture->privData)) { return (error_base + XvMCBadSubpicture); } pViaSurface->privSubPic = pViaSubPic; } else { pViaSurface->privSubPic = NULL; } return Success; } _X_EXPORT Status XvMCBlendSubpicture2(Display * display, XvMCSurface * source_surface, XvMCSurface * target_surface, XvMCSubpicture * subpicture, short subx, short suby, unsigned short subw, unsigned short subh, short surfx, short surfy, unsigned short surfw, unsigned short surfh) { ViaXvMCSurface *pViaSurface, *pViaSSurface; ViaXvMCSubPicture *pViaSubPic; ViaXvMCContext *pViaXvMC; unsigned width, height; if ((display == NULL) || target_surface == NULL || source_surface == NULL) { return BadValue; } if (subx || suby || surfx || surfy || (subw != surfw) || (subh != surfh)) { fprintf(stderr, "ViaXvMC: Only completely overlapping subpicture " "supported.\n"); return BadMatch; } if (NULL == (pViaSurface = target_surface->privData)) { return (error_base + XvMCBadSurface); } if (NULL == (pViaSSurface = source_surface->privData)) { return (error_base + XvMCBadSurface); } pViaXvMC = pViaSurface->privContext; width = pViaSSurface->width; height = pViaSSurface->height; if (width != pViaSurface->width || height != pViaSSurface->height) { return BadMatch; } if (XvMCSyncSurface(display, source_surface)) { return BadValue; } ppthread_mutex_lock(&pViaXvMC->ctxMutex); viaBlit(pViaXvMC->xl, 8, yOffs(pViaSSurface), pViaSSurface->yStride, yOffs(pViaSurface), pViaSurface->yStride, width, height, 1, 1, VIABLIT_COPY, 0); flushPCIXvMCLowLevel(pViaXvMC->xl); if (pViaXvMC->chipId != PCI_CHIP_VT3259) { /* * YV12 Chroma blit. */ viaBlit(pViaXvMC->xl, 8, uOffs(pViaSSurface), pViaSSurface->yStride >> 1, uOffs(pViaSurface), pViaSurface->yStride >> 1, width >> 1, height >> 1, 1, 1, VIABLIT_COPY, 0); flushPCIXvMCLowLevel(pViaXvMC->xl); viaBlit(pViaXvMC->xl, 8, vOffs(pViaSSurface), pViaSSurface->yStride >> 1, vOffs(pViaSurface), pViaSurface->yStride >> 1, width >> 1, height >> 1, 1, 1, VIABLIT_COPY, 0); } else { /* * NV12 Chroma blit. */ viaBlit(pViaXvMC->xl, 8, vOffs(pViaSSurface), pViaSSurface->yStride, vOffs(pViaSurface), pViaSurface->yStride, width, height >> 1, 1, 1, VIABLIT_COPY, 0); } pViaSurface->needsSync = 1; pViaSurface->syncMode = LL_MODE_2D; pViaSurface->timeStamp = viaDMATimeStampLowLevel(pViaXvMC->xl); if (flushXvMCLowLevel(pViaXvMC->xl)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadValue; } if (subpicture) { if (NULL == (pViaSubPic = subpicture->privData)) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return (error_base + XvMCBadSubpicture); } pViaSurface->privSubPic = pViaSubPic; } else { pViaSurface->privSubPic = NULL; } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCSyncSubpicture(Display * display, XvMCSubpicture * subpicture) { ViaXvMCSubPicture *pViaSubPic; ViaXvMCContext *pViaXvMC; Status retVal = 0; if ((display == NULL) || subpicture == NULL) { return BadValue; } if (NULL == (pViaSubPic = subpicture->privData)) { return (error_base + XvMCBadSubpicture); } pViaXvMC = pViaSubPic->privContext; ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (pViaSubPic->needsSync) { if (syncXvMCLowLevel(pViaXvMC->xl, LL_MODE_2D, 0, pViaSubPic->timeStamp)) { retVal = BadValue; } pViaSubPic->needsSync = 0; } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return retVal; } _X_EXPORT Status XvMCFlushSubpicture(Display * display, XvMCSubpicture * subpicture) { ViaXvMCSubPicture *pViaSubPic; if ((display == NULL) || subpicture == NULL) { return BadValue; } if (NULL == (pViaSubPic = subpicture->privData)) { return (error_base + XvMCBadSubpicture); } return Success; } _X_EXPORT Status XvMCDestroySubpicture(Display * display, XvMCSubpicture * subpicture) { ViaXvMCSubPicture *pViaSubPic; ViaXvMCContext *pViaXvMC; volatile ViaXvMCSAreaPriv *sAPriv; if ((display == NULL) || subpicture == NULL) { return BadValue; } if (NULL == (pViaSubPic = subpicture->privData)) { return (error_base + XvMCBadSubpicture); } pViaXvMC = pViaSubPic->privContext; ppthread_mutex_lock(&pViaXvMC->ctxMutex); sAPriv = SAREAPTR(pViaXvMC); hwlLock(pViaXvMC->xl, 1); setLowLevelLocking(pViaXvMC->xl, 0); if (sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] == (pViaSubPic->srfNo | VIA_XVMC_VALID)) { viaVideoSubPictureOffLocked(pViaXvMC->xl); sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] = 0; } flushPCIXvMCLowLevel(pViaXvMC->xl); setLowLevelLocking(pViaXvMC->xl, 1); hwlUnlock(pViaXvMC->xl, 1); XLockDisplay(display); _xvmc_destroy_subpicture(display, subpicture); XUnlockDisplay(display); free(pViaSubPic); subpicture->privData = NULL; ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCGetSubpictureStatus(Display * display, XvMCSubpicture * subpic, int *stat) { ViaXvMCSubPicture *pViaSubPic; ViaXvMCContext *pViaXvMC; volatile ViaXvMCSAreaPriv *sAPriv; if ((display == NULL) || subpic == NULL) { return BadValue; } if (NULL == (pViaSubPic = subpic->privData)) { return (error_base + XvMCBadSubpicture); } if (stat) { *stat = 0; pViaXvMC = pViaSubPic->privContext; sAPriv = SAREAPTR(pViaXvMC); if (sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] == (pViaSubPic->srfNo | VIA_XVMC_VALID)) *stat |= XVMC_DISPLAYING; } return Success; } _X_EXPORT Status XvMCFlushSurface(Display * display, XvMCSurface * surface) { ViaXvMCSurface *pViaSurface; ViaXvMCContext *pViaXvMC; Status ret; if ((display == NULL) || surface == NULL) { return BadValue; } if (NULL == (pViaSurface = surface->privData)) { return (error_base + XvMCBadSurface); } pViaXvMC = pViaSurface->privContext; ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (pViaSurface->needsSync) pViaSurface->timeStamp = pViaXvMC->timeStamp = viaDMATimeStampLowLevel(pViaXvMC->xl); ret = (flushXvMCLowLevel(pViaXvMC->xl)) ? BadValue : Success; if (pViaXvMC->rendSurf[0] == (pViaSurface->srfNo | VIA_XVMC_VALID)) { hwlLock(pViaXvMC->xl, 0); pViaXvMC->haveDecoder = 0; releaseDecoder(pViaXvMC, 0); hwlUnlock(pViaXvMC->xl, 0); } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return ret; } _X_EXPORT Status XvMCGetSurfaceStatus(Display * display, XvMCSurface * surface, int *stat) { ViaXvMCSurface *pViaSurface; ViaXvMCContext *pViaXvMC; volatile ViaXvMCSAreaPriv *sAPriv; unsigned i; int ret = 0; if ((display == NULL) || surface == NULL) { return BadValue; } if (NULL == (pViaSurface = surface->privData)) { return (error_base + XvMCBadSurface); } if (stat) { *stat = 0; pViaXvMC = pViaSurface->privContext; ppthread_mutex_lock(&pViaXvMC->ctxMutex); sAPriv = SAREAPTR(pViaXvMC); if (sAPriv->XvMCDisplaying[pViaXvMC->xvMCPort] == (pViaSurface->srfNo | VIA_XVMC_VALID)) *stat |= XVMC_DISPLAYING; for (i = 0; i < VIA_MAX_RENDSURF; ++i) { if (pViaXvMC->rendSurf[i] == (pViaSurface->srfNo | VIA_XVMC_VALID)) { *stat |= XVMC_RENDERING; break; } } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); } return ret; } _X_EXPORT XvAttribute * XvMCQueryAttributes(Display * display, XvMCContext * context, int *number) { ViaXvMCContext *pViaXvMC; XvAttribute *ret; unsigned long siz; *number = 0; if ((display == NULL) || (context == NULL)) { return NULL; } if (NULL == (pViaXvMC = context->privData)) { return NULL; } ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (NULL != (ret = (XvAttribute *) malloc(siz = VIA_NUM_XVMC_ATTRIBUTES * sizeof(XvAttribute)))) { memcpy(ret, pViaXvMC->attribDesc, siz); *number = VIA_NUM_XVMC_ATTRIBUTES; } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return ret; } _X_EXPORT Status XvMCSetAttribute(Display * display, XvMCContext * context, Atom attribute, int value) { int found; unsigned i; ViaXvMCContext *pViaXvMC; ViaXvMCCommandBuffer buf; if ((display == NULL) || (context == NULL)) { return (error_base + XvMCBadContext); } if (NULL == (pViaXvMC = context->privData)) { return (error_base + XvMCBadContext); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); found = 0; for (i = 0; i < pViaXvMC->attrib.numAttr; ++i) { if (attribute == pViaXvMC->attrib.attributes[i].attribute) { if ((!(pViaXvMC->attribDesc[i].flags & XvSettable)) || value < pViaXvMC->attribDesc[i].min_value || value > pViaXvMC->attribDesc[i].max_value) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadValue; } pViaXvMC->attrib.attributes[i].value = value; found = 1; pViaXvMC->attribChanged = 1; break; } } if (!found) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return BadMatch; } if (pViaXvMC->haveXv) { buf.command = VIA_XVMC_COMMAND_ATTRIBUTES; pViaXvMC->xvImage->data = (char *)&buf; buf.ctxNo = pViaXvMC->ctxNo | VIA_XVMC_VALID; buf.attrib = pViaXvMC->attrib; XLockDisplay(display); pViaXvMC->attribChanged = XvPutImage(display, pViaXvMC->port, pViaXvMC->draw, pViaXvMC->gc, pViaXvMC->xvImage, 0, 0, 1, 1, 0, 0, 1, 1); XUnlockDisplay(display); } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } _X_EXPORT Status XvMCGetAttribute(Display * display, XvMCContext * context, Atom attribute, int *value) { int found; unsigned i; ViaXvMCContext *pViaXvMC; if ((display == NULL) || (context == NULL)) { return (error_base + XvMCBadContext); } if (NULL == (pViaXvMC = context->privData)) { return (error_base + XvMCBadContext); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); found = 0; for (i = 0; i < pViaXvMC->attrib.numAttr; ++i) { if (attribute == pViaXvMC->attrib.attributes[i].attribute) { if (pViaXvMC->attribDesc[i].flags & XvGettable) { *value = pViaXvMC->attrib.attributes[i].value; found = 1; break; } } } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); if (!found) return BadMatch; return Success; } _X_EXPORT Status XvMCHideSurface(Display * display, XvMCSurface * surface) { ViaXvMCSurface *pViaSurface; ViaXvMCContext *pViaXvMC; ViaXvMCSubPicture *pViaSubPic; volatile ViaXvMCSAreaPriv *sAPriv; ViaXvMCCommandBuffer buf; Status ret; if ((display == NULL) || (surface == NULL)) { return BadValue; } if (NULL == (pViaSurface = surface->privData)) { return (error_base + XvMCBadSurface); } if (NULL == (pViaXvMC = pViaSurface->privContext)) { return (error_base + XvMCBadContext); } ppthread_mutex_lock(&pViaXvMC->ctxMutex); if (!pViaXvMC->haveXv) { ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } sAPriv = SAREAPTR(pViaXvMC); hwlLock(pViaXvMC->xl, 1); if (sAPriv->XvMCDisplaying[pViaXvMC->xvMCPort] != (pViaSurface->srfNo | VIA_XVMC_VALID)) { hwlUnlock(pViaXvMC->xl, 1); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } setLowLevelLocking(pViaXvMC->xl, 0); if (NULL != (pViaSubPic = pViaSurface->privSubPic)) { if (sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] == (pViaSubPic->srfNo | VIA_XVMC_VALID)) { sAPriv->XvMCSubPicOn[pViaXvMC->xvMCPort] &= ~VIA_XVMC_VALID; viaVideoSubPictureOffLocked(pViaXvMC->xl); } } flushPCIXvMCLowLevel(pViaXvMC->xl); setLowLevelLocking(pViaXvMC->xl, 1); hwlUnlock(pViaXvMC->xl, 1); buf.command = VIA_XVMC_COMMAND_UNDISPLAY; buf.ctxNo = pViaXvMC->ctxNo | VIA_XVMC_VALID; buf.srfNo = pViaSurface->srfNo | VIA_XVMC_VALID; pViaXvMC->xvImage->data = (char *)&buf; if ((ret = XvPutImage(display, pViaXvMC->port, pViaXvMC->draw, pViaXvMC->gc, pViaXvMC->xvImage, 0, 0, 1, 1, 0, 0, 1, 1))) { fprintf(stderr, "XvMCPutSurface: Hiding overlay failed.\n"); ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return ret; } ppthread_mutex_unlock(&pViaXvMC->ctxMutex); return Success; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/viaXvMCPriv.h000066400000000000000000000174371267025031400251340ustar00rootroot00000000000000/***************************************************************************** * VIA Unichrome XvMC extension client lib. * * Copyright (c) 2004 Thomas Hellström. 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, 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 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 * 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. */ #ifndef _VIAXVMCPRIV_H #define _VIAXVMCPRIV_H 1 #include #include #include #include #include #include "vldXvMC.h" #include "via_xvmc.h" typedef struct { int x; int y; int w; int h; } XvMCRegion; extern Status _xvmc_create_context(Display * dpy, XvMCContext * context, int *priv_count, uint ** priv_data); extern Status _xvmc_destroy_context(Display * dpy, XvMCContext * context); extern Status _xvmc_create_surface(Display * dpy, XvMCContext * context, XvMCSurface * surface, int *priv_count, uint ** priv_data); extern Status _xvmc_destroy_surface(Display * dpy, XvMCSurface * surface); extern Status _xvmc_create_subpicture(Display * dpy, XvMCContext * context, XvMCSubpicture * subpicture, int *priv_count, uint ** priv_data); extern Status _xvmc_destroy_subpicture(Display * dpy, XvMCSubpicture * subpicture); #define VIA_SUBPIC_PALETTE_SIZE 16 /*Number of colors in subpicture palette */ #define VIA_CBUFFERSIZE 4096 /*Hardware command buffer size */ #define VIA_MAX_BUFS 2 /*Number of YUV buffers per surface */ #define VIA_MAX_RENDSURF 3 /*Maximum numbers of surfaces per context * that can answer RENDERING to a rendering * query */ typedef enum { context_drawHash, context_lowLevel, context_mutex, context_sAreaMap, context_fbMap, context_mmioMap, context_drmContext, context_fd, context_driConnection, context_context, context_none } ContextRes; typedef struct { unsigned ctxNo; /* XvMC private context reference number */ pthread_mutex_t ctxMutex; /* Mutex for multi-threading. Not used */ drm_context_t drmcontext; /* The drm context */ drm_handle_t fbOffset; /* Handle to drm frame-buffer area */ drm_handle_t mmioOffset; /* Handle to drm mmio area */ drm_handle_t sAreaOffset; /* Handle to drm shared memory area */ unsigned fbSize; /* Size of drm frame-buffer area */ unsigned mmioSize; /* Size of drm mmio area */ unsigned sAreaSize; /* Size of drm shared memory area */ unsigned sAreaPrivOffset; /* Offset in sarea to private part */ drmAddress fbAddress; /* Virtual address of frame buffer area */ drmAddress mmioAddress; /* Virtual address of mmio area */ drmAddress sAreaAddress; /* Virtual address of shared memory area */ char busIdString[21]; /* Busid of video card */ unsigned yStride; /* Y stride of surfaces in this context */ int fd; /* FD for connection to drm module */ unsigned char intra_quantiser_matrix[64]; unsigned char non_intra_quantiser_matrix[64]; unsigned char chroma_intra_quantiser_matrix[64]; unsigned char chroma_non_intra_quantiser_matrix[64]; unsigned rendSurf[VIA_MAX_RENDSURF]; /* Which surfaces answer rendering to * a rendering query */ int decoderOn; /* Decoder switched on ? */ int intraLoaded; /* Intra quantiser matrix loaded in * decoder? */ int nonIntraLoaded; /* Non-Intra quantiser matrix loaded * in decoder */ int chromaIntraLoaded; int chromaNonIntraLoaded; int haveDecoder; /* Does this context own decoder? */ int attribChanged; /* Attributes have changed and need to * be uploaded to Xv at next frame * display */ drmLockPtr hwLock; /* Virtual address Pointer to the * heavyweight drm hardware lock */ unsigned xvMCPort; /* XvMC private port. Corresponds to * an Xv port, but not by number */ ViaXvMCAttrHolder attrib; /* This contexts attributes and their * values */ XvAttribute attribDesc[VIA_NUM_XVMC_ATTRIBUTES]; /* Attribute decriptions */ int useAGP; /* Use the AGP ringbuffer to upload data to the chip */ void *xl; /* Lowlevel context. Opaque to us. */ int haveXv; /* Have I initialized the Xv * connection for this surface? */ XvImage *xvImage; /* Fake Xv Image used for command * buffer transport to the X server */ GC gc; /* X GC needed for displaying */ Drawable draw; /* Drawable to undisplay from */ XvPortID port; /* Xv Port ID when displaying */ int lastSrfDisplaying; ContextRes resources; CARD32 timeStamp; CARD32 videoTimeStamp; XID id; unsigned screen; unsigned depth; unsigned stride; XVisualInfo visualInfo; void *drawHash; CARD32 chipId; XvMCRegion sRegion; XvMCRegion dRegion; } ViaXvMCContext; typedef struct { pthread_mutex_t subMutex; /* Currently not used. */ unsigned srfNo; /* XvMC private surface number */ unsigned offset; /* Offset into frame-buffer area */ unsigned stride; /* Storage stride */ unsigned width; /* Width */ unsigned height; /* Height */ CARD32 palette[VIA_SUBPIC_PALETTE_SIZE]; /* YUV Palette */ ViaXvMCContext *privContext; /* Pointer to context private data */ int ia44; /* IA44 or AI44 format */ int needsSync; CARD32 timeStamp; } ViaXvMCSubPicture; typedef struct { pthread_mutex_t srfMutex; /* For multithreading. Not used. */ pthread_cond_t bufferAvailable; /* For multithreading. Not used. */ unsigned srfNo; /* XvMC private surface numbers */ unsigned numBuffers; /* Number of picture buffers */ unsigned curBuf; /* Which is the current buffer? */ unsigned offsets[VIA_MAX_BUFS]; /* Offsets of picture buffers * into the frame-buffer area */ unsigned yStride; /* Stride of YUV420 Y component. */ unsigned width; /* Dimensions */ unsigned height; int progressiveSequence; /* Mpeg progressive picture? Hmm? */ ViaXvMCContext *privContext; /* XvMC context private part. */ ViaXvMCSubPicture *privSubPic; /* Subpicture to be blended when * displaying. NULL if none. */ int needsSync; int syncMode; CARD32 timeStamp; int topFieldFirst; } ViaXvMCSurface; /* * Take and release the global drm hardware lock. */ #define HW_LOCK(ctx) \ DRM_LOCK((ctx)->fd,(ctx)->hwLock,(ctx)->drmcontext,0) #define HW_UNLOCK(ctx) \ DRM_UNLOCK((ctx)->fd,(ctx->hwLock),(ctx)->drmcontext) /* * Low-level Mpeg functions in viaLowLevel.c */ #define VIABLIT_TRANSCOPY 0 #define VIABLIT_COPY 1 #define VIABLIT_FILL 2 #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/vldXvMC.h000066400000000000000000000131051267025031400242650ustar00rootroot00000000000000/***************************************************************************** * VLD Nonstandard XvMC extension. * * Copyright (c) 2004 The Unichrome Project. 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, 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 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 * 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. * * Author: Thomas Hellström, 2004. */ #ifndef _VLDXVMC_H #define _VLDXVMC_H #include #include #include /* * New "Motion compensation type". */ #define XVMC_VLD 0x0020000 /* * Below Flags to be passed in the XvMCMpegControl structure 'flag' field. */ #define XVMC_PROGRESSIVE_SEQUENCE 0x00000010 /* * Zig-Zag Scan / Alternative Scan. */ #define XVMC_ZIG_ZAG_SCAN 0x00000000 #define XVMC_ALTERNATE_SCAN 0x00000100 /* * Frame DCT and frame prediction are used. / * Field prediction */ #define XVMC_PRED_DCT_FRAME 0x00000040 #define XVMC_PRED_DCT_FIELD 0x00000000 /* * Top / Bottom field first */ #define XVMC_TOP_FIELD_FIRST 0x00000080 #define XVMC_BOTTOM_FIELD_FIRST 0x00000000 /* * Motion vectors coded in intra macroblocks */ #define XVMC_CONCEALMENT_MOTION_VECTORS 0x00000200 /* * Which of two mappings between quantiser_scale_code * and quantiser_scale shall apply. */ #define XVMC_Q_SCALE_TYPE 0x00000400 /* * Intra VLC Format: Bit = 0, Bit = 1 * Intra blocks B-14 B-15 * Non-intra blocks B-14 B-14 */ #define XVMC_INTRA_VLC_FORMAT 0x00000800 /* * Also XVMC_SECOND_FIELD should be set in flags if active. */ #define XVMC_I_PICTURE 1 #define XVMC_P_PICTURE 2 #define XVMC_B_PICTURE 3 typedef struct _XvMCMpegControl { unsigned BVMV_range, /* Backward vertical motion vector range */ BHMV_range, /* Backward horizontal motion vector range */ FVMV_range, /* Forward vertical motion vector range */ FHMV_range, /* Forward horizontal motion vector range */ picture_structure, /* XVMC_TOP_FIELD, XVMC_BOTTOM_FIELD, * XVMC_FRAME_PICTURE */ intra_dc_precision, /* 0x00 - 0x03 corresponds to 8 to 11 bits prec. */ picture_coding_type, /* XVMC_X_PICTURE */ mpeg_coding, /* XVMC_MPEG_2 */ flags; /* See above */ } XvMCMpegControl; /* * The following function is called BEFORE starting sending slices to the * lib. It grabs the decoder hardware and prepares it for coming slices. * The function XvMCSyncSurface will release the hardware for other contexts * in addition to it's current functionality. */ extern Status XvMCBeginSurface(Display * display, XvMCContext * context, XvMCSurface * target_surface, XvMCSurface * past_surface, XvMCSurface * future_surface, const XvMCMpegControl * control); /* * The quantizer matrix structure. This should be filled in by the user and * uploaded whenever a change is needed. The lib initializes with * default matrices and will automatically load the hardware with new matrices * on decoder context switches. To load data, set the corresponding load flag * to true and fill in the values. The VIA MPEG2 engine only uses the * intra_quantiser_matrix and the non_intra_quantiser_matrix. RFC: Are * the other fields needed for future compatibility? */ typedef struct _XvMCQMatrix { int load_intra_quantiser_matrix; int load_non_intra_quantiser_matrix; int load_chroma_intra_quantiser_matrix; int load_chroma_non_intra_quantiser_matrix; unsigned char intra_quantiser_matrix[64]; unsigned char non_intra_quantiser_matrix[64]; unsigned char chroma_intra_quantiser_matrix[64]; unsigned char chroma_non_intra_quantiser_matrix[64]; } XvMCQMatrix; /* * Upload a XvMCQMatrix structure to the clientlib. * The hardware will start using it the next XvMCBeginSurface. */ extern Status XvMCLoadQMatrix(Display * display, XvMCContext * context, const XvMCQMatrix * qmx); /* * Put a slice to the decoder. The hardware will start processing it * immediately. */ extern Status XvMCPutSlice(Display * display, XvMCContext * context, char *slice, int nBytes); /* * Put a slice without the slice start code to the decoder. * The hardware will start processing it * immediately. This function is for client optimization. * XvMCPutSlice(display,context,slice,nBytes) is equivalent to * XvMCPutSlice2(display,context,slice+4,nBytes-4,slice[3]); */ extern Status XvMCPutSlice2(Display * display, XvMCContext * context, char *slice, int nBytes, int sliceCode); /* * Debug the XvMCControl structure. For convenience only. */ extern void debugControl(const XvMCMpegControl * control); #endif xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/xf86dri.c000066400000000000000000000420221267025031400242270ustar00rootroot00000000000000/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.13 2002/10/30 12:51:25 alanh Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. Copyright 2000 VA Linux Systems, 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 PRECISION INSIGHT AND/OR ITS SUPPLIERS 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. **************************************************************************/ /* * Authors: * Kevin E. Martin * Jens Owen * Rickard E. (Rik) Faith * */ /* THIS IS NOT AN X CONSORTIUM STANDARD */ #define NEED_REPLIES #include #include #include #include "xf86dristr.h" #include static XExtensionInfo _xf86dri_info_data; static XExtensionInfo *xf86dri_info = &_xf86dri_info_data; static char xf86dri_extension_name[] = XF86DRINAME; #define uniDRICheckExtension(dpy,i,val) \ XextCheckExtension (dpy, i, xf86dri_extension_name, val) /***************************************************************************** * * * private utility routines * * * *****************************************************************************/ static int close_display(Display * dpy, XExtCodes * extCodes); static /* const */ XExtensionHooks xf86dri_extension_hooks = { NULL, /* create_gc */ NULL, /* copy_gc */ NULL, /* flush_gc */ NULL, /* free_gc */ NULL, /* create_font */ NULL, /* free_font */ close_display, /* close_display */ NULL, /* wire_to_event */ NULL, /* event_to_wire */ NULL, /* error */ NULL, /* error_string */ }; static XEXT_GENERATE_FIND_DISPLAY(find_display, xf86dri_info, xf86dri_extension_name, &xf86dri_extension_hooks, 0, NULL) static XEXT_GENERATE_CLOSE_DISPLAY(close_display, xf86dri_info) /***************************************************************************** * * * public XFree86-DRI Extension routines * * * *****************************************************************************/ #if 0 #include #define TRACE(msg) fprintf(stderr,"uniDRI%s\n", msg); #else #define TRACE(msg) #endif Bool uniDRIQueryExtension(dpy, event_basep, error_basep) Display *dpy; int *event_basep, *error_basep; { XExtDisplayInfo *info = find_display(dpy); TRACE("QueryExtension..."); if (XextHasExtension(info)) { *event_basep = info->codes->first_event; *error_basep = info->codes->first_error; TRACE("QueryExtension... return True"); return True; } else { TRACE("QueryExtension... return False"); return False; } } Bool uniDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion) Display *dpy; int *majorVersion; int *minorVersion; int *patchVersion; { XExtDisplayInfo *info = find_display(dpy); xXF86DRIQueryVersionReply rep; xXF86DRIQueryVersionReq *req; TRACE("QueryVersion..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIQueryVersion, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIQueryVersion; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("QueryVersion... return False"); return False; } *majorVersion = rep.majorVersion; *minorVersion = rep.minorVersion; *patchVersion = rep.patchVersion; UnlockDisplay(dpy); SyncHandle(); TRACE("QueryVersion... return True"); return True; } Bool uniDRIQueryDirectRenderingCapable(dpy, screen, isCapable) Display *dpy; int screen; Bool *isCapable; { XExtDisplayInfo *info = find_display(dpy); xXF86DRIQueryDirectRenderingCapableReply rep; xXF86DRIQueryDirectRenderingCapableReq *req; TRACE("QueryDirectRenderingCapable..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIQueryDirectRenderingCapable, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIQueryDirectRenderingCapable; req->screen = screen; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("QueryDirectRenderingCapable... return False"); return False; } *isCapable = rep.isCapable; UnlockDisplay(dpy); SyncHandle(); TRACE("QueryDirectRenderingCapable... return True"); return True; } Bool uniDRIOpenConnection(dpy, screen, hSAREA, busIdString) Display *dpy; int screen; drm_handle_t *hSAREA; char **busIdString; { XExtDisplayInfo *info = find_display(dpy); xXF86DRIOpenConnectionReply rep; xXF86DRIOpenConnectionReq *req; TRACE("OpenConnection..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIOpenConnection, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIOpenConnection; req->screen = screen; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("OpenConnection... return False"); return False; } *hSAREA = rep.hSAREALow; #ifdef LONG64 if (sizeof(drm_handle_t) == 8) { *hSAREA |= ((unsigned long)rep.hSAREAHigh) << 32; } #endif if (rep.length) { if (rep.busIdStringLength < INT_MAX) *busIdString = Xcalloc(rep.busIdStringLength + 1, 1); else *busIdString = NULL; if (*busIdString == NULL) { _XEatData(dpy, ((rep.busIdStringLength + 3) & ~3)); UnlockDisplay(dpy); SyncHandle(); TRACE("OpenConnection... return False"); return False; } _XReadPad(dpy, *busIdString, rep.busIdStringLength); } else { *busIdString = NULL; } UnlockDisplay(dpy); SyncHandle(); TRACE("OpenConnection... return True"); return True; } Bool uniDRIAuthConnection(dpy, screen, magic) Display *dpy; int screen; drm_magic_t magic; { XExtDisplayInfo *info = find_display(dpy); xXF86DRIAuthConnectionReq *req; xXF86DRIAuthConnectionReply rep; TRACE("AuthConnection..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIAuthConnection, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIAuthConnection; req->screen = screen; req->magic = magic; rep.authenticated = 0; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.authenticated) { UnlockDisplay(dpy); SyncHandle(); TRACE("AuthConnection... return False"); return False; } UnlockDisplay(dpy); SyncHandle(); TRACE("AuthConnection... return True"); return True; } Bool uniDRICloseConnection(dpy, screen) Display *dpy; int screen; { XExtDisplayInfo *info = find_display(dpy); xXF86DRICloseConnectionReq *req; TRACE("CloseConnection..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRICloseConnection, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRICloseConnection; req->screen = screen; UnlockDisplay(dpy); SyncHandle(); TRACE("CloseConnection... return True"); return True; } Bool uniDRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName) Display *dpy; int screen; int *ddxDriverMajorVersion; int *ddxDriverMinorVersion; int *ddxDriverPatchVersion; char **clientDriverName; { XExtDisplayInfo *info = find_display(dpy); xXF86DRIGetClientDriverNameReply rep; xXF86DRIGetClientDriverNameReq *req; TRACE("GetClientDriverName..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIGetClientDriverName, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIGetClientDriverName; req->screen = screen; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("GetClientDriverName... return False"); return False; } *ddxDriverMajorVersion = rep.ddxDriverMajorVersion; *ddxDriverMinorVersion = rep.ddxDriverMinorVersion; *ddxDriverPatchVersion = rep.ddxDriverPatchVersion; if (rep.length) { if (rep.clientDriverNameLength < INT_MAX) *clientDriverName = Xcalloc(rep.clientDriverNameLength + 1, 1); else *clientDriverName = NULL; if (*clientDriverName == NULL) { _XEatData(dpy, ((rep.clientDriverNameLength + 3) & ~3)); UnlockDisplay(dpy); SyncHandle(); TRACE("GetClientDriverName... return False"); return False; } _XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength); } else { *clientDriverName = NULL; } UnlockDisplay(dpy); SyncHandle(); TRACE("GetClientDriverName... return True"); return True; } Bool uniDRICreateContextWithConfig(dpy, screen, configID, context, hHWContext) Display *dpy; int screen; int configID; XID *context; drm_context_t *hHWContext; { XExtDisplayInfo *info = find_display(dpy); xXF86DRICreateContextReply rep; xXF86DRICreateContextReq *req; TRACE("CreateContext..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRICreateContext, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRICreateContext; req->visual = configID; req->screen = screen; *context = XAllocID(dpy); req->context = *context; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("CreateContext... return False"); return False; } *hHWContext = rep.hHWContext; UnlockDisplay(dpy); SyncHandle(); TRACE("CreateContext... return True"); return True; } Bool uniDRICreateContext(dpy, screen, visual, context, hHWContext) Display *dpy; int screen; Visual *visual; XID *context; drm_context_t *hHWContext; { return uniDRICreateContextWithConfig(dpy, screen, visual->visualid, context, hHWContext); } Bool uniDRIDestroyContext(Display * ndpy, int screen, XID context) { Display *const dpy = (Display *) ndpy; XExtDisplayInfo *info = find_display(dpy); xXF86DRIDestroyContextReq *req; TRACE("DestroyContext..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIDestroyContext, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIDestroyContext; req->screen = screen; req->context = context; UnlockDisplay(dpy); SyncHandle(); TRACE("DestroyContext... return True"); return True; } Bool uniDRICreateDrawable(Display * ndpy, int screen, Drawable drawable, drm_drawable_t * hHWDrawable) { Display *const dpy = (Display *) ndpy; XExtDisplayInfo *info = find_display(dpy); xXF86DRICreateDrawableReply rep; xXF86DRICreateDrawableReq *req; TRACE("CreateDrawable..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRICreateDrawable, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRICreateDrawable; req->screen = screen; req->drawable = drawable; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("CreateDrawable... return False"); return False; } *hHWDrawable = rep.hHWDrawable; UnlockDisplay(dpy); SyncHandle(); TRACE("CreateDrawable... return True"); return True; } Bool uniDRIDestroyDrawable(Display * ndpy, int screen, Drawable drawable) { Display *const dpy = (Display *) ndpy; XExtDisplayInfo *info = find_display(dpy); xXF86DRIDestroyDrawableReq *req; TRACE("DestroyDrawable..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIDestroyDrawable, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIDestroyDrawable; req->screen = screen; req->drawable = drawable; UnlockDisplay(dpy); SyncHandle(); TRACE("DestroyDrawable... return True"); return True; } Bool uniDRIGetDrawableInfo(Display * dpy, int screen, Drawable drawable, unsigned int *index, unsigned int *stamp, int *X, int *Y, int *W, int *H, int *numClipRects, drm_clip_rect_t ** pClipRects, int *backX, int *backY, int *numBackClipRects, drm_clip_rect_t ** pBackClipRects) { XExtDisplayInfo *info = find_display(dpy); xXF86DRIGetDrawableInfoReply rep; xXF86DRIGetDrawableInfoReq *req; int total_rects; TRACE("GetDrawableInfo..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIGetDrawableInfo, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIGetDrawableInfo; req->screen = screen; req->drawable = drawable; if (!_XReply(dpy, (xReply *) & rep, 1, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("GetDrawableInfo... return False"); return False; } *index = rep.drawableTableIndex; *stamp = rep.drawableTableStamp; *X = (int)rep.drawableX; *Y = (int)rep.drawableY; *W = (int)rep.drawableWidth; *H = (int)rep.drawableHeight; *numClipRects = rep.numClipRects; total_rects = *numClipRects; *backX = rep.backX; *backY = rep.backY; *numBackClipRects = rep.numBackClipRects; total_rects += *numBackClipRects; #if 0 /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks * backwards compatibility (Because of the >> 2 shift) but the fix * enables multi-threaded apps to work. */ if (rep.length != ((((SIZEOF(xXF86DRIGetDrawableInfoReply) - SIZEOF(xGenericReply) + total_rects * sizeof(drm_clip_rect_t)) + 3) & ~3) >> 2)) { _XEatData(dpy, rep.length); UnlockDisplay(dpy); SyncHandle(); TRACE("GetDrawableInfo... return False"); return False; } #endif if (*numClipRects) { int len = sizeof(drm_clip_rect_t) * (*numClipRects); *pClipRects = (drm_clip_rect_t *) Xcalloc(len, 1); if (*pClipRects) _XRead(dpy, (char *)*pClipRects, len); } else { *pClipRects = NULL; } if (*numBackClipRects) { int len = sizeof(drm_clip_rect_t) * (*numBackClipRects); *pBackClipRects = (drm_clip_rect_t *) Xcalloc(len, 1); if (*pBackClipRects) _XRead(dpy, (char *)*pBackClipRects, len); } else { *pBackClipRects = NULL; } UnlockDisplay(dpy); SyncHandle(); TRACE("GetDrawableInfo... return True"); return True; } Bool uniDRIGetDeviceInfo(dpy, screen, hFrameBuffer, fbOrigin, fbSize, fbStride, devPrivateSize, pDevPrivate) Display *dpy; int screen; drm_handle_t *hFrameBuffer; int *fbOrigin; int *fbSize; int *fbStride; int *devPrivateSize; void **pDevPrivate; { XExtDisplayInfo *info = find_display(dpy); xXF86DRIGetDeviceInfoReply rep; xXF86DRIGetDeviceInfoReq *req; TRACE("GetDeviceInfo..."); uniDRICheckExtension(dpy, info, False); LockDisplay(dpy); GetReq(XF86DRIGetDeviceInfo, req); req->reqType = info->codes->major_opcode; req->driReqType = X_XF86DRIGetDeviceInfo; req->screen = screen; if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { UnlockDisplay(dpy); SyncHandle(); TRACE("GetDeviceInfo... return False"); return False; } *hFrameBuffer = rep.hFrameBufferLow; #ifdef LONG64 if (sizeof(drm_handle_t) == 8) { *hFrameBuffer |= ((unsigned long)rep.hFrameBufferHigh) << 32; } #endif *fbOrigin = rep.framebufferOrigin; *fbSize = rep.framebufferSize; *fbStride = rep.framebufferStride; *devPrivateSize = rep.devPrivateSize; if (rep.length) { if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) { _XEatData(dpy, ((rep.devPrivateSize + 3) & ~3)); UnlockDisplay(dpy); SyncHandle(); TRACE("GetDeviceInfo... return False"); return False; } _XRead(dpy, (char *)*pDevPrivate, rep.devPrivateSize); } else { *pDevPrivate = NULL; } UnlockDisplay(dpy); SyncHandle(); TRACE("GetDeviceInfo... return True"); return True; } xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/xf86dri.h000066400000000000000000000104041267025031400242330ustar00rootroot00000000000000/* $XFree86: xc/lib/GL/dri/xf86dri.h,v 1.8 2002/10/30 12:51:25 alanh Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. Copyright 2000 VA Linux Systems, 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 PRECISION INSIGHT AND/OR ITS SUPPLIERS 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 xf86dri.h * Protocol numbers and function prototypes for DRI X protocol. * * \author Kevin E. Martin * \author Jens Owen * \author Rickard E. (Rik) Faith */ #ifndef _XF86DRI_H_ #define _XF86DRI_H_ #include #include #define X_XF86DRIQueryVersion 0 #define X_XF86DRIQueryDirectRenderingCapable 1 #define X_XF86DRIOpenConnection 2 #define X_XF86DRICloseConnection 3 #define X_XF86DRIGetClientDriverName 4 #define X_XF86DRICreateContext 5 #define X_XF86DRIDestroyContext 6 #define X_XF86DRICreateDrawable 7 #define X_XF86DRIDestroyDrawable 8 #define X_XF86DRIGetDrawableInfo 9 #define X_XF86DRIGetDeviceInfo 10 #define X_XF86DRIAuthConnection 11 #define X_XF86DRIOpenFullScreen 12 /* Deprecated */ #define X_XF86DRICloseFullScreen 13 /* Deprecated */ #define XF86DRINumberEvents 0 #define XF86DRIClientNotLocal 0 #define XF86DRIOperationNotSupported 1 #define XF86DRINumberErrors (XF86DRIOperationNotSupported + 1) #ifndef _XF86DRI_SERVER_ _XFUNCPROTOBEGIN Bool uniDRIQueryExtension(Display * dpy, int *event_base, int *error_base); Bool uniDRIQueryVersion(Display * dpy, int *majorVersion, int *minorVersion, int *patchVersion); Bool uniDRIQueryDirectRenderingCapable(Display * dpy, int screen, Bool * isCapable); Bool uniDRIOpenConnection(Display * dpy, int screen, drm_handle_t * hSAREA, char **busIDString); Bool uniDRIAuthConnection(Display * dpy, int screen, drm_magic_t magic); Bool uniDRICloseConnection(Display * dpy, int screen); Bool uniDRIGetClientDriverName(Display * dpy, int screen, int *ddxDriverMajorVersion, int *ddxDriverMinorVersion, int *ddxDriverPatchVersion, char **clientDriverName); Bool uniDRICreateContext(Display * dpy, int screen, Visual * visual, XID * ptr_to_returned_context_id, drm_context_t * hHWContext); Bool uniDRICreateContextWithConfig(Display * dpy, int screen, int configID, XID * ptr_to_returned_context_id, drm_context_t * hHWContext); extern Bool uniDRIDestroyContext(Display * dpy, int screen, XID context_id); extern Bool uniDRICreateDrawable(Display * dpy, int screen, Drawable drawable, drm_drawable_t * hHWDrawable); extern Bool uniDRIDestroyDrawable(Display * dpy, int screen, Drawable drawable); Bool uniDRIGetDrawableInfo(Display * dpy, int screen, Drawable drawable, unsigned int *index, unsigned int *stamp, int *X, int *Y, int *W, int *H, int *numClipRects, drm_clip_rect_t ** pClipRects, int *backX, int *backY, int *numBackClipRects, drm_clip_rect_t ** pBackClipRects); Bool uniDRIGetDeviceInfo(Display * dpy, int screen, drm_handle_t * hFrameBuffer, int *fbOrigin, int *fbSize, int *fbStride, int *devPrivateSize, void **pDevPrivate); _XFUNCPROTOEND #endif /* _XF86DRI_SERVER_ */ #endif /* _XF86DRI_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/src/xvmc/xf86dristr.h000066400000000000000000000241461267025031400247740ustar00rootroot00000000000000/* $XFree86: xc/lib/GL/dri/xf86dristr.h,v 1.10 2002/10/30 12:51:25 alanh Exp $ */ /************************************************************************** Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. Copyright 2000 VA Linux Systems, 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 PRECISION INSIGHT AND/OR ITS SUPPLIERS 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. **************************************************************************/ /* * Authors: * Kevin E. Martin * Jens Owen * Rickard E. (Rik) Fiath * */ #ifndef _XF86DRISTR_H_ #define _XF86DRISTR_H_ #include "xf86dri.h" #define XF86DRINAME "XFree86-DRI" /* The DRI version number. This was originally set to be the same of the * XFree86 version number. However, this version is really indepedent of * the XFree86 version. * * Version History: * 4.0.0: Original * 4.0.1: Patch to bump clipstamp when windows are destroyed, 28 May 02 * 4.1.0: Add transition from single to multi in DRMInfo rec, 24 Jun 02 */ #define XF86DRI_MAJOR_VERSION 4 #define XF86DRI_MINOR_VERSION 1 #define XF86DRI_PATCH_VERSION 0 typedef struct _XF86DRIQueryVersion { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIQueryVersion */ CARD16 length B16; } xXF86DRIQueryVersionReq; #define sz_xXF86DRIQueryVersionReq 4 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; } xXF86DRIQueryVersionReply; #define sz_xXF86DRIQueryVersionReply 32 typedef struct _XF86DRIQueryDirectRenderingCapable { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* X_DRIQueryDirectRenderingCapable */ CARD16 length B16; CARD32 screen B32; } xXF86DRIQueryDirectRenderingCapableReq; #define sz_xXF86DRIQueryDirectRenderingCapableReq 8 typedef struct { BYTE type; /* X_Reply */ BOOL pad1; CARD16 sequenceNumber B16; CARD32 length B32; BOOL isCapable; BOOL pad2; BOOL pad3; BOOL pad4; CARD32 pad5 B32; CARD32 pad6 B32; CARD32 pad7 B32; CARD32 pad8 B32; CARD32 pad9 B32; } xXF86DRIQueryDirectRenderingCapableReply; #define sz_xXF86DRIQueryDirectRenderingCapableReply 32 typedef struct _XF86DRIOpenConnection { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIOpenConnection */ CARD16 length B16; CARD32 screen B32; } xXF86DRIOpenConnectionReq; #define sz_xXF86DRIOpenConnectionReq 8 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; } xXF86DRIOpenConnectionReply; #define sz_xXF86DRIOpenConnectionReply 32 typedef struct _XF86DRIAuthConnection { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICloseConnection */ CARD16 length B16; CARD32 screen B32; CARD32 magic B32; } xXF86DRIAuthConnectionReq; #define sz_xXF86DRIAuthConnectionReq 12 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; } xXF86DRIAuthConnectionReply; #define zx_xXF86DRIAuthConnectionReply 32 typedef struct _XF86DRICloseConnection { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICloseConnection */ CARD16 length B16; CARD32 screen B32; } xXF86DRICloseConnectionReq; #define sz_xXF86DRICloseConnectionReq 8 typedef struct _XF86DRIGetClientDriverName { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIGetClientDriverName */ CARD16 length B16; CARD32 screen B32; } xXF86DRIGetClientDriverNameReq; #define sz_xXF86DRIGetClientDriverNameReq 8 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; } xXF86DRIGetClientDriverNameReply; #define sz_xXF86DRIGetClientDriverNameReply 32 typedef struct _XF86DRICreateContext { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICreateContext */ CARD16 length B16; CARD32 screen B32; CARD32 visual B32; CARD32 context B32; } xXF86DRICreateContextReq; #define sz_xXF86DRICreateContextReq 16 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; } xXF86DRICreateContextReply; #define sz_xXF86DRICreateContextReply 32 typedef struct _XF86DRIDestroyContext { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIDestroyContext */ CARD16 length B16; CARD32 screen B32; CARD32 context B32; } xXF86DRIDestroyContextReq; #define sz_xXF86DRIDestroyContextReq 12 typedef struct _XF86DRICreateDrawable { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICreateDrawable */ CARD16 length B16; CARD32 screen B32; CARD32 drawable B32; } xXF86DRICreateDrawableReq; #define sz_xXF86DRICreateDrawableReq 12 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; } xXF86DRICreateDrawableReply; #define sz_xXF86DRICreateDrawableReply 32 typedef struct _XF86DRIDestroyDrawable { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIDestroyDrawable */ CARD16 length B16; CARD32 screen B32; CARD32 drawable B32; } xXF86DRIDestroyDrawableReq; #define sz_xXF86DRIDestroyDrawableReq 12 typedef struct _XF86DRIGetDrawableInfo { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIGetDrawableInfo */ CARD16 length B16; CARD32 screen B32; CARD32 drawable B32; } xXF86DRIGetDrawableInfoReq; #define sz_xXF86DRIGetDrawableInfoReq 12 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; } xXF86DRIGetDrawableInfoReply; #define sz_xXF86DRIGetDrawableInfoReply 36 typedef struct _XF86DRIGetDeviceInfo { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIGetDeviceInfo */ CARD16 length B16; CARD32 screen B32; } xXF86DRIGetDeviceInfoReq; #define sz_xXF86DRIGetDeviceInfoReq 8 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; } xXF86DRIGetDeviceInfoReply; #define sz_xXF86DRIGetDeviceInfoReply 32 typedef struct _XF86DRIOpenFullScreen { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRIOpenFullScreen */ CARD16 length B16; CARD32 screen B32; CARD32 drawable B32; } xXF86DRIOpenFullScreenReq; #define sz_xXF86DRIOpenFullScreenReq 12 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; } xXF86DRIOpenFullScreenReply; #define sz_xXF86DRIOpenFullScreenReply 32 typedef struct _XF86DRICloseFullScreen { CARD8 reqType; /* always DRIReqCode */ CARD8 driReqType; /* always X_DRICloseFullScreen */ CARD16 length B16; CARD32 screen B32; CARD32 drawable B32; } xXF86DRICloseFullScreenReq; #define sz_xXF86DRICloseFullScreenReq 12 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; } xXF86DRICloseFullScreenReply; #define sz_xXF86DRICloseFullScreenReply 32 #endif /* _XF86DRISTR_H_ */ xserver-xorg-video-openchrome-0.3.3+git20160310/tools/000077500000000000000000000000001267025031400221655ustar00rootroot00000000000000xserver-xorg-video-openchrome-0.3.3+git20160310/tools/Makefile.am000066400000000000000000000001571267025031400242240ustar00rootroot00000000000000if TOOLS sbin_PROGRAMS = via_regs_dump via_regs_dump_SOURCES = registers.c else EXTRA_DIST = registers.c endif xserver-xorg-video-openchrome-0.3.3+git20160310/tools/registers.c000066400000000000000000001100601267025031400243360ustar00rootroot00000000000000/* * Copyright 2009 VIA Technologies, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; * either version 2, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE.See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) struct bit_desc { uint8_t mask; char *name; }; struct io_index { char *name; struct bit_desc *bit_desc; }; struct io_reg { uint16_t io_port_addr; /* port for address */ uint16_t io_port_data; /* port for address */ char * name; struct io_index index[0xff]; }; struct io_reg attr_regs = { .io_port_addr = 0x3c0, .io_port_data = 0x3c1, .name = "Attribute Controller", .index = { [0x00] = { "Palette 0", }, [0x01] = { "Palette 1", }, [0x02] = { "Palette 2", }, [0x03] = { "Palette 3", }, [0x04] = { "Palette 4", }, [0x05] = { "Palette 5", }, [0x06] = { "Palette 6", }, [0x07] = { "Palette 7", }, [0x08] = { "Palette 8", }, [0x09] = { "Palette 9", }, [0x0a] = { "Palette a", }, [0x0b] = { "Palette b", }, [0x0c] = { "Palette c", }, [0x0d] = { "Palette d", }, [0x0e] = { "Palette e", }, [0x0f] = { "Palette f", }, [0x10] = { "Mode Control", }, [0x11] = { "Overscan Color", }, [0x12] = { "Color Plane Enable", }, [0x13] = { "Horizontal Pixel Panning", }, [0x14] = { "Color Select", }, }, }; struct io_reg graphic_regs = { .io_port_addr = 0x3ce, .io_port_data = 0x3cf, .name = "Graphic Controller", .index = { [0x00] = { "Set / Reset", }, [0x01] = { "Enable Set / Reset", }, [0x02] = { "Color Compare", }, [0x03] = { "Data Rotate", }, [0x04] = { "Read Map Select", }, [0x05] = { "Mode", }, [0x06] = { "Miscellaneous", }, [0x07] = { "Color Don't Care", }, [0x08] = { "Bit Mask", }, /* Extended */ [0x20] = { "Offset Register Control", }, [0x21] = { "Offset Register A", }, [0x22] = { "Offset Register B", }, }, }; static struct bit_desc crtc_32_desc[] = { { 0x01, "Real-Time Flipping", }, { 0x02, "Digital Video Port (DVP) Grammar Correction", }, { 0x04, "Display End Blanking Enable", }, { 0x08, "CRT SYNC Driving Selection (0: Low, 1: High)", }, { 0xE0, "HSYNC Delay Number by VCLK", }, { 0 }, }; struct io_reg crtc_regs = { .io_port_addr = 0x3d4, .io_port_data = 0x3d5, .name = "CRT controller", .index = { /* CRT Controller registers */ [0x00] = { "Horizontal Total", }, [0x01] = { "Horizontal Display End", }, [0x02] = { "Start Horizontal Blank", }, [0x03] = { "End Horizontal Blank", }, [0x04] = { "Start Horizontal Retrace", }, [0x05] = { "End Horizontal Retrace", }, [0x06] = { "Vertical Total", }, [0x07] = { "Overflow", }, [0x08] = { "Preset Row Scan", }, [0x09] = { "Max Scan Line", }, [0x0a] = { "Cursor Start", }, [0x0b] = { "Cursor End", }, [0x0c] = { "Start Address High", }, [0x0d] = { "Start Address Low", }, [0x0e] = { "Cursor Location High", }, [0x0f] = { "Cursor Location Low", }, [0x10] = { "Vertical Retrace Start", }, [0x11] = { "Vertical Retrace End", }, [0x12] = { "Vertical Display End", }, [0x13] = { "Offset", }, [0x14] = { "Underline Location", }, [0x15] = { "Start Vertical Blank", }, [0x16] = { "End Vertical Blank", }, [0x17] = { "CRTC Mode Control", }, [0x18] = { "Line Compare", }, /* CRT Controller Extended Register */ [0x30] = { "Display Fetch Blocking Control", }, [0x31] = { "Half Line Position", }, [0x32] = { "Mode Control", crtc_32_desc, }, [0x33] = { "Hsync Adjuster", }, [0x34] = { "Starting Address Overflow, Bits [23:16]", }, [0x35] = { "Extended Overflow", }, [0x36] = { "Power Management Control 3", }, [0x37] = { "DAC Control", }, [0x38] = { "Signature Data B0", }, [0x39] = { "Signature Data B1", }, [0x3a] = { "Signature Data B2", }, [0x3b] = { "Scratch Pad 2", }, [0x3c] = { "Scratch Pad 3", }, [0x3d] = { "Scratch Pad 4", }, [0x3e] = { "Scratch Pad 5", }, [0x3f] = { "Scratch Pad 6", }, [0x40] = { "Test Mode Control 0", }, [0x43] = { "IGA1 Display Control", }, [0x45] = { "Power Now Indicator Control 3", }, [0x46] = { "Test Mode Control 1", }, [0x47] = { "Test Mode Control 2", }, [0x48] = { "Starting Address Overflow", }, /* Sequencer Extended Registers */ [0x50] = { "Second CRTC Horizontal Total Period", }, [0x51] = { "Second CRTC Horizontal Active Data Period", }, [0x52] = { "Second CRTC Horizontal Blanking Start", }, [0x53] = { "Second CRTC Horizontal Blanking End", }, [0x54] = { "Second CRTC Horizontal Blanking Overflow", }, [0x55] = { "Second CRTC Horizontal Period Overflow", }, [0x56] = { "Second CRTC Horizontal Retrace Start", }, [0x57] = { "Second CRTC Horizontal Retrace End", }, [0x58] = { "Second CRTC Vertical Total Period", }, [0x59] = { "Second CRTC Vertical Active Data Period", }, [0x5a] = { "Second CRTC Vertical Blanking Start", }, [0x5b] = { "Second CRTC Vertical Blanking End", }, [0x5c] = { "Second CRTC Vertical Blanking Overflow", }, [0x5d] = { "Second CRTC Vertical Period Overflow", }, [0x5e] = { "Second CRTC Vertical Retrace Start", }, [0x5f] = { "Second CRTC Vertical Retrace End", }, [0x60] = { "Second CRTC Vertical Status 1", }, [0x61] = { "Second CRTC Vertical Status 2", }, [0x62] = { "Second Display Starting Address Low", }, [0x63] = { "Second Display Starting Address Middle", }, [0x64] = { "Second Display Starting Address High", }, [0x65] = { "Second Display Horizontal Quadword Count", }, [0x66] = { "Second Display Horizontal Offset", }, [0x67] = { "Second Display Color Depth and Horizontal Overflow", }, [0x68] = { "Second Display Queue Depth and Read Threshold", }, [0x69] = { "Second Display Interrupt Enable and Status", }, [0x6a] = { "Second Display Channel and LCD Enable", }, [0x6b] = { "Channel 1 and 2 Clock Mode Selection", }, [0x6c] = { "TV Clock Control", }, [0x6d] = { "Horizontal Total Shadow", }, [0x6e] = { "End Horizontal Blanking Shadow", }, [0x6f] = { "Vertical Total Shadow", }, [0x70] = { "Vertical Display Enable End Shadow", }, [0x71] = { "Vertical Display Overflow Shadow", }, [0x72] = { "Start Vertical Blank Shadow", }, [0x73] = { "End Vertical Blank Shadow", }, [0x74] = { "Vertical Blank Overflow Shadow", }, [0x75] = { "Vertical Retrace Start Shadow", }, [0x76] = { "Vertical Retrace End Shadow", }, [0x77] = { "LCD Horizontal Scaling Factor", }, [0x78] = { "LCD Vertical Scaling Factor", }, [0x79] = { "LCD Scaling Control", }, [0x7a] = { "LCD Scaling Parameter 1", }, [0x7b] = { "LCD Scaling Parameter 2", }, [0x7c] = { "LCD Scaling Parameter 3", }, [0x7d] = { "LCD Scaling Parameter 4", }, [0x7e] = { "LCD Scaling Parameter 5", }, [0x7f] = { "LCD Scaling Parameter 6", }, [0x80] = { "LCD Scaling Parameter 7", }, [0x81] = { "LCD Scaling Parameter 8", }, [0x82] = { "LCD Scaling Parameter 9", }, [0x83] = { "LCD Scaling Parameter 10", }, [0x84] = { "LCD Scaling Parameter 11", }, [0x85] = { "LCD Scaling Parameter 12", }, [0x86] = { "LCD Scaling Parameter 13", }, [0x87] = { "LCD Scaling Parameter 14", }, [0x88] = { "LCD Panel Type", }, [0x8a] = { "LCD Timing Control 1", }, [0x8b] = { "LCD Power Sequence Control 0", }, [0x8c] = { "LCD Power Sequence Control 1", }, [0x8d] = { "LCD Power Sequence Control 2", }, [0x8e] = { "LCD Power Sequence Control 3", }, [0x8f] = { "LCD Power Sequence Control 4", }, [0x90] = { "LCD Power Sequence Control 5", }, [0x91] = { "Software Control Power Sequence", }, [0x92] = { "Read Threshold 2", }, [0x94] = { "Expire Number and Display Queue Extend", }, [0x95] = { "Extend Threshold Bit", }, [0x97] = { "LVDS Channel 2 Function Select 0", }, [0x98] = { "LVDS Channel 2 Function Select 1", }, [0x99] = { "LVDS Channel 1 Function Select 0", }, [0x9a] = { "LVDS Channel 1 Function Select 1", }, [0x9b] = { "Digital Video Port 1 Function Select 0", }, [0x9c] = { "Digital Video Port 1 Function Select 1", }, [0x9d] = { "Power Now Control 2", }, [0x9e] = { "Power Now Control 3", }, [0x9f] = { "Power Now Control 4", }, [0xa0] = { "Horizontal Scaling Initial Value", }, [0xa1] = { "Vertical Scaling Initial Value", }, [0xa2] = { "Horizontal and Vertical Scaling Enable", }, [0xa3] = { "Second Display Starting Address Extended", }, [0xa5] = { "Second LCD Vertical Scaling Factor", }, [0xa6] = { "Second LCD Vertical Scaling Factor", }, [0xa7] = { "Expected IGA1 Vertical Display End", }, [0xa8] = { "Expected IGA1 Vertical Display End", }, [0xa9] = { "Hardware Gamma Control", }, [0xaa] = { "FIFO Depth + Threshold Overflow", }, [0xab] = { "IGA2 Interlace Half Line", }, [0xac] = { "IGA2 Interlace Half Line", }, [0xaf] = { "P-Arbiter Write Expired Number", }, [0xb0] = { "IGA2 Pack Circuit Request Threshold", }, [0xb1] = { "IGA2 Pack Circuit Request High Threshold", }, [0xb2] = { "IGA2 Pack Circuit Request Expire Threshold", }, [0xb3] = { "IGA2 Pack Circuit Control", }, [0xb4] = { "IGA2 Pack Circuit Target Base Address 0", }, [0xb5] = { "IGA2 Pack Circuit Target Base Address 0", }, [0xb6] = { "IGA2 Pack Circuit Target Base Address 0", }, [0xb7] = { "IGA2 Pack Circuit Target Base Address 0", }, [0xb8] = { "IGA2 Pack Circuit Target Line Pitch", }, [0xb9] = { "IGA2 Pack Circuit Target Line Pitch", }, [0xba] = { "V Counter Set Pointer", }, [0xbb] = { "V Counter Set Pointer", }, [0xbc] = { "V Counter Reset Value", }, [0xbd] = { "V Counter Reset Value", }, [0xbe] = { "Frame Buffer Limit Value", }, [0xbf] = { "Frame Buffer Limit Value", }, [0xc0] = { "Expected IGA1 Vertical Display End 1", }, [0xc1] = { "Expected IGA1 Vertical Display End 1", }, [0xc2] = { "Third LCD Vertical Scaling Factor", }, [0xc3] = { "Third LCD Vertical Scaling Factor", }, [0xc4] = { "Expected IGA1 Vertical Display End 2", }, [0xc5] = { "Expected IGA1 Vertical Display End 2", }, [0xc7] = { "Fourth LCD Vertical Scaling Factor", }, [0xc8] = { "IGA2 Pack Circuit Target Base Address 1", }, [0xc9] = { "IGA2 Pack Circuit Target Base Address 1", }, [0xca] = { "IGA2 Pack Circuit Target Base Address 1", }, [0xcb] = { "IGA2 Pack Circuit Target Base Address 1", }, [0xd0] = { "LVDS PLL1 Control", }, [0xd1] = { "LVDS PLL2 Control", }, [0xd2] = { "LVDS Control", }, [0xd3] = { "LVDS Second Power Sequence Control 0", }, [0xd4] = { "LVDS Second Power Sequence Control 1", }, [0xd5] = { "LVDS Texting Mode Control", }, [0xd6] = { "DCVI Control Register 0", }, [0xd7] = { "DCVI Control Register 1", }, [0xd9] = { "Scaling Down Source Data Offset Control", }, [0xda] = { "Scaling Down Source Data Offset Control", }, [0xdb] = { "Scaling Down Source Data Offset Control", }, [0xdc] = { "Scaling Down Vertical Scale Control", }, [0xdd] = { "Scaling Down Vertical Scale Control", }, [0xde] = { "Scaling Down Vertical Scale Control", }, [0xdf] = { "Scaling Down Vertical Scale Control", }, [0xe0] = { "Scaling Down Destination FB Starting Addr 0", }, [0xe1] = { "Scaling Down Destination FB Starting Addr 0", }, [0xe2] = { "Scaling Down Destination FB Starting Addr 0", }, [0xe3] = { "Scaling Down Destination FB Starting Addr 0", }, [0xe4] = { "Scaling Down SW Source FB Stride", }, [0xe5] = { "Scaling Down Destination FB Starting Addr 1", }, [0xe6] = { "Scaling Down Destination FB Starting Addr 1", }, [0xe7] = { "Scaling Down Destination FB Starting Addr 1", }, [0xe8] = { "Scaling Down Destination FB Starting Addr 1", }, [0xe9] = { "Scaling Down Destination FB Starting Addr 2", }, [0xea] = { "Scaling Down Destination FB Starting Addr 2", }, [0xeb] = { "Scaling Down Destination FB Starting Addr 2", }, [0xec] = { "IGA1 Down Scaling Destination Control", }, [0xf0] = { "Snapshot Mode - Starting Address of Disp Data", }, [0xf1] = { "Snapshot Mode - Starting Address of Disp Data", }, [0xf2] = { "Snapshot Mode - Starting Address of Disp Data", }, [0xf3] = { "Snapshot Mode Control", }, [0xf4] = { "Snapshot Mode Control", }, [0xf5] = { "Snapshot Mode Control", }, [0xf6] = { "Snapshot Mode Control", }, }, }; static struct bit_desc seq_19_desc[] = { { 0x01, "CPU Interface Clock Control", }, { 0x02, "Display Interface Clock Control", }, { 0x04, "MC Interface Clock Control", }, { 0x08, "Typical Arbiter Interface Clock Control", }, { 0x10, "AGP Interface Clock Control", }, { 0x20, "P-Arbiter Interface Clock Control", }, { 0x40, "MIU/AGP Interface Clock Control", }, { 0 }, }; static struct bit_desc seq_1a_desc[] = { { 0x01, "LUT Shadow Access", }, { 0x04, "PCI Burst Write Wait State Select (0: 0 Wait state, 1: 1 Wait state)", }, { 0x08, "Extended Mode Memory Access Enable (0: Disable, 1: Enable)", }, { 0x40, "Software Reset (0: Default value, 1: Reset)", }, { 0x80, "Read Cache Enable (0: Disable, 1: Enable)", }, { 0 }, }; static struct bit_desc seq_1b_desc[] = { { 0x01, "Primary Display's LUT Off", }, { 0x18, "Primary Display Engine VCK Gating", }, { 0x60, "Secondary Display Engine LCK Gating", }, { 0 }, }; static struct bit_desc seq_1e_desc[] = { { 0x01, "ROC ECK", }, { 0x02, "Replace ECK by MCK", }, { 0x08, "Spread Spectrum", }, { 0x30, "DVP1 Power Control", }, { 0xc0, "VCP Power Control", }, { 0 }, }; static struct bit_desc seq_2a_desc[] = { { 0x03, "LVDS Channel 1 Pad Control" }, { 0x0c, "LVDS Channel 2 Pad Control" }, { 0x40, "Spread Spectrum Type FIFO" }, { 0 }, }; static struct bit_desc seq_2b_desc[] = { { 0x01, "MSI Pending IRQ Re-trigger", }, { 0x02, "CRT Hot Plug Detect Enable", }, { 0x04, "CRT Sense IRQ status", }, { 0x08, "CRT Sense IRQ enable", }, { 0x10, "LVDS Sense IRQ status", }, { 0x20, "LVDS Sense IRQ enable", }, { 0 }, }; static struct bit_desc seq_2d_desc[] = { { 0x03, "ECK Pll Power Control", }, { 0x0c, "LCK PLL Power Control", }, { 0x30, "VCK PLL Power Control", }, { 0xc0, "E3_ECK_N Selection", }, { 0 }, }; static struct bit_desc seq_2e_desc[] = { { 0x03, "Video Playback Engine V3/V4 Gated Clock VCK", }, { 0x0c, "PCI Master / DMA Gated Clock ECK/CPUCK", }, { 0x30, "Video Processor Gated Clock ECK", }, { 0xc0, "Capturer Gated Clock ECK", }, { 0 }, }; static struct bit_desc seq_3c_desc[] = { { 0x01, "AGP Bus Pack Door AGP3 Enable", }, { 0x02, "Switch 3 PLLs to Prime Output", }, { 0x04, "LCDCK PLL Locked Detect", }, { 0x08, "VCK PLL Locked Detect", }, { 0x10, "ECL PLL Locked Detect", }, { 0x60, "PLL Frequency Division Select for Testing", }, { 0 }, }; static struct bit_desc seq_3f_desc[] = { { 0x03, "Video Clock Control (Gated ECK)", }, { 0x0c, "2D Clock Control (Gated ECK/CPUCK)", }, { 0x30, "3D Clock Control (Gated ECK)", }, { 0xc0, "CR Clock Control (Gated ECK)", }, { 0 }, }; static struct bit_desc seq_40_desc[] = { { 0x01, "Reset ECK PLL", }, { 0x02, "Reset VCK PLL", }, { 0x04, "Reset LCDCK PLL", }, { 0x08, "LVDS Interrupt Method", }, { 0x30, "Free Run ECK Frequency within Idle Mode", }, { 0x80, "CRT Sense Enable", }, { 0 }, }; static struct bit_desc seq_43_desc[] = { { 0x01, "Notebook Used Flag", }, { 0x04, "Typical Channel 1 Arbiter Read Back Data Overwrite Flag", }, { 0x08, "Typical Channel 0 Arbiter Read Back Data Overwrite Flag", }, { 0x10, "IGA1 Display FIFO Underflow Flag", }, { 0x20, "IGA2 Display FIFO Underflow Flag", }, { 0x40, "Windows Media Video Enable Flag", }, { 0x80, "Advance Video Enable Flag", }, { 0 }, }; static struct bit_desc seq_4e_desc[] = { { 0x01, "HQV/Video/Capture Engine Reset", }, { 0x02, "HQV/Video/Capture Register Reset", }, { 0x04, "2D Engine Reset", }, { 0x08, "2D Register Reset", }, { 0x10, "3D Engine Reset", }, { 0x20, "3D Register Reset", }, { 0x40, "CR Engine Reset", }, { 0x80, "CR Register Reset", }, { 0 }, }; static struct bit_desc seq_59_desc[] = { { 0x01, "GFX-NM AGP Dynamic Clock Enable", }, { 0x02, "GFX-NM GMINT Channel 0 Dynamic Clock Enable", }, { 0x04, "GFX-NM GMINT Channel 1 Dynamic Clock Enable", }, { 0x08, "GFX-NM PCIC Dynamic Clock Enable", }, { 0x10, "GFX-NM IGA Dynamic Clock Enable", }, { 0x20, "IGA Low Threshold Enable", }, { 0x80, "IGA1 Enable", }, { 0 }, }; static struct bit_desc seq_5b_desc[] = { { 0x01, "LVDS1 Used IGA2 Source", }, { 0x02, "LBDS1 Used IGA1 Source", }, { 0x04, "LVDS0 Used IGA2 Source", }, { 0x08, "LVDS1 Used IGA1 Source", }, { 0x10, "DAC0 Used IGA2 Source", }, { 0x20, "DAC0 Used IGA1 Source", }, { 0x40, "DAC0 User is TV", }, { 0x80, "DCVI Source Selection is TV", }, { 0 }, }; static struct bit_desc seq_5c_desc[] = { { 0x01, "DVP1 Used IGA2 Source", }, { 0x02, "DVP1 Used IGA1 Source", }, { 0x10, "DAC1 Used IGA2 Source", }, { 0x20, "DAC1 Used IGA1 Source", }, { 0x40, "DAC1 User is TV", }, { 0 }, }; static struct bit_desc seq_76_desc[] = { { 0x01, "Backlight Control Enable", }, { 0 }, }; struct io_reg sequencer_regs = { .io_port_addr = 0x3c4, .io_port_data = 0x3c5, .name = "Sequencer", .index = { /* Sequencer Registers */ [0x00] = { "Reset", }, [0x01] = { "Clocking Mode", }, [0x02] = { "Map Mask", }, [0x03] = { "Character Map Select", }, [0x04] = { "Memory Mode", }, /* Extended Sequencer Registers */ [0x10] = { "Extended Register Unlock", }, [0x11] = { "Configuration 0", }, [0x12] = { "Configuration 1", }, [0x13] = { "Configuration 2 (DVP1 strapping)", }, [0x14] = { "Frame Buffer Size Control", }, [0x15] = { "Display Mode Control", }, [0x16] = { "Display FIFO Threshold Control", }, [0x17] = { "Display FIFO Control", }, [0x18] = { "Display Arbiter Control 0", }, [0x19] = { "Power Management", seq_19_desc, }, [0x1a] = { "PCI Bus Control", seq_1a_desc, }, [0x1b] = { "Power Management Control 0", seq_1b_desc, }, [0x1c] = { "Horizontal Display Fetch Count Data", }, [0x1d] = { "Horizontal Display Fetch Count Control", }, [0x1e] = { "Power Management Control", seq_1e_desc, }, /* 1f: reserved */ [0x20] = { "Typical Arbiter Control 0", }, [0x21] = { "Typical Arbiter Control 1", }, [0x22] = { "Display Arbiter Control 1", }, [0x26] = { "IIC Serial Port Control 0", }, [0x2a] = { "Power Management Control 5", seq_2a_desc, }, [0x2b] = { "LVDS Interrupt Control", seq_2b_desc, }, [0x2c] = { "General Purpose I/O Port", }, [0x2d] = { "Power Management Control 1", seq_2d_desc, }, [0x2e] = { "Power Management Control 2", seq_2e_desc, }, [0x31] = { "IIC Serial Port Control 1", }, [0x35] = { "Subsystem Vendor ID Low", }, [0x36] = { "Subsystem Vendor ID High", }, [0x37] = { "Subsystem ID Low", }, [0x38] = { "Subsystem ID High", }, [0x39] = { "BIOS Reserved Register 0", }, [0x3a] = { "BIOS Reserved Register 1", }, [0x3b] = { "PCI Revision ID Back Door", }, [0x3c] = { "Miscellaneous", seq_3c_desc, }, [0x3d] = { "General Purpose I/O Port", }, [0x3e] = { "Miscellaneous Register for AGP Mux", }, [0x3f] = { "Power Management Control 2", seq_3f_desc, }, [0x40] = { "PLL Control", seq_40_desc, }, [0x41] = { "Typical Arbiter Control 1", }, [0x42] = { "Typical Arbiter Control 2", }, [0x43] = { "Graphics Bonding Option", seq_43_desc, }, [0x44] = { "VCK Clock Synthesizer Value 0", }, [0x45] = { "VCK Clock Synthesizer Value 1", }, [0x46] = { "VCK Clock Synthesizer Value 2", }, [0x47] = { "ECK Clock Synthesizer Value 0", }, [0x48] = { "ECK Clock Synthesizer Value 1", }, [0x49] = { "ECK Clock Synthesizer Value 2", }, [0x4a] = { "LDCK Clock Synthesizer Value 0", }, [0x4b] = { "LDCK Clock Synthesizer Value 1", }, [0x4c] = { "LDCK Clock Synthesizer Value 2", }, [0x4d] = { "Preemptive Arbiter Control", }, [0x4e] = { "Software Reset Control", seq_4e_desc, }, [0x4f] = { "CR Gating Clock Control", }, [0x50] = { "AGP Control", }, [0x51] = { "Display FIFO Control 1", }, [0x52] = { "Integrated TV Shadow Register Control", }, [0x53] = { "DAC Sense Control 1", }, [0x54] = { "DAC Sense Control 2", }, [0x55] = { "DAC Sense Control 3", }, [0x56] = { "DAC Sense Control 4", }, [0x57] = { "Display FIFO Control 2", }, [0x58] = { "GFX Power Control 1", }, [0x59] = { "GFX Power Control 2", seq_59_desc, }, [0x5a] = { "PCI Bus Control 2", }, [0x5b] = { "Device Used Status 0", seq_5b_desc, }, [0x5c] = { "Device Used Status 1", seq_5c_desc, }, [0x5d] = { "Timer Control", }, [0x5e] = { "DAC Control 2", }, [0x60] = { "I2C Mode Control", }, [0x61] = { "I2C Host Address", }, [0x62] = { "I2C Host Data", }, [0x63] = { "I2C Host Control", }, [0x64] = { "I2C Status", }, [0x65] = { "Power Management Control 6", }, [0x66] = { "GTI Control 0", }, [0x67] = { "GTI Control 1", }, [0x68] = { "GTI Control 2", }, [0x69] = { "GTI Control 3", }, [0x6a] = { "GTI Control 4", }, [0x6b] = { "GTI Control 5", }, [0x6c] = { "GTI Control 6", }, [0x6d] = { "GTI Control 7", }, [0x6e] = { "GTI Control 8", }, [0x6f] = { "GTI Control 9", }, [0x70] = { "GARB Control 0", }, [0x71] = { "Typical Arbiter Control 2", }, [0x72] = { "Typical Arbiter Control 3", }, [0x73] = { "Typical Arbiter Control 4", }, [0x74] = { "Typical Arbiter Control 5", }, [0x75] = { "Typical Arbiter Control 6", }, [0x76] = { "Backlight Control 1", seq_76_desc, }, [0x77] = { "Backlight Control 2", }, [0x78] = { "Backlight Control 3", }, }, }; static uint8_t readb_idx_reg(uint16_t port, uint8_t index) { outb(index, port-1); return inb(port); } static void writeb_idx_reg(uint16_t port, uint8_t index, uint8_t val) { outb(index, port-1); outb(val, port); } static void writeb_idx_mask(uint16_t reg, uint8_t idx, uint8_t val, uint8_t mask) { uint8_t tmp; tmp = readb_idx_reg(reg, idx); tmp &= ~ mask; tmp |= (val & mask); writeb_idx_reg(reg, idx, tmp); } struct io_reg *io_regs[] = { //&attr_regs, &sequencer_regs, &graphic_regs, &crtc_regs, NULL }; struct half_mode { uint16_t total; uint16_t active; uint16_t blank_start; uint16_t blank_end; uint16_t retr_start; uint16_t retr_end; int n_sync; }; struct mode { struct half_mode h; struct half_mode v; uint32_t addr_start; uint8_t bpp; uint16_t horiz_quad_count; uint16_t horiz_offset; }; static int get_mode(struct mode *m, int secondary) { uint8_t val; memset(m, 0, sizeof(*m)); if (!secondary) { m->h.total = readb_idx_reg(0x3d5, 0x00); m->h.active = readb_idx_reg(0x3d5, 0x01); m->h.blank_start = readb_idx_reg(0x3d5, 0x02); m->h.blank_end = readb_idx_reg(0x3d5, 0x03) & 0x1f; m->h.retr_start = readb_idx_reg(0x3d5, 0x04); m->h.retr_end = readb_idx_reg(0x3d5, 0x05) & 0x1f; m->v.total = readb_idx_reg(0x3d5, 0x06) + 2; m->addr_start = readb_idx_reg(0x3d5, 0x0d); m->addr_start |= readb_idx_reg(0x3d5, 0x0c) << 8; m->v.retr_start = readb_idx_reg(0x3d5, 0x10); m->v.retr_end = readb_idx_reg(0x3d5, 0x11) & 0x0f; m->v.active = readb_idx_reg(0x3d5, 0x12) + 1; m->horiz_offset = readb_idx_reg(0x3d5, 0x13); m->v.blank_start = readb_idx_reg(0x3d5, 0x15) + 1; m->v.blank_end = readb_idx_reg(0x3d5, 0x16) + 1; /* overflow register 0x07 */ val = readb_idx_reg(0x3d5, 0x07); m->v.total |= ((val >> 0) & 0x1) << 8; m->v.active |= ((val >> 1) & 0x1) << 8; m->v.retr_start |= ((val >> 2) & 0x1) << 8; m->v.blank_start |= ((val >> 3) & 0x1) << 8; /* line compare */ m->v.total |= ((val >> 5) & 0x1) << 9; m->v.active |= ((val >> 6) & 0x1) << 9; m->v.retr_start |= ((val >> 7) & 0x1) << 9; val = readb_idx_reg(0x3d5, 0x09); m->v.blank_start |= ((val >> 5) & 0x1) << 9; val = readb_idx_reg(0x3d5, 0x33); m->h.retr_start |= ((val >> 4) & 0x1) << 8; m->h.blank_end |= ((val >> 5) & 0x1) << 6; val = readb_idx_reg(0x3d5, 0x34); m->addr_start |= val << 16; val = readb_idx_reg(0x3d5, 0x35); m->v.total |= ((val >> 0) & 0x1) << 10; m->v.retr_start |= ((val >> 1) & 0x1) << 10; m->v.active |= ((val >> 2) & 0x1) << 10; m->v.blank_start |= ((val >> 3) & 0x1) << 10; //line_comp |= ((val >> 4) & 0x1) << 10; m->horiz_offset |= ((val >> 5) & 0x7) << 8; val = readb_idx_reg(0x3d5, 0x36); m->h.total |= ((val >> 3) & 0x1) << 8; val = readb_idx_reg(0x3d5, 0x48); m->addr_start |= ((val >> 0) & 0x1f) << 24; val = readb_idx_reg(0x3c5, 0x15); switch ((val >> 2) & 0x3) { case 0: m->bpp = 8; break; case 1: m->bpp = 16; break; case 2: m->bpp = 30; break; case 3: m->bpp = 32; break; } val = inb(0x3cc); if (val & 0x40) m->h.n_sync; if (val & 0x80) m->v.n_sync; /* add some weird multipliers and offsets */ m->h.total = (m->h.total + 5) << 3; m->h.active = (m->h.active + 1) << 3; m->h.blank_start = (m->h.blank_start + 1) << 3; m->h.blank_end = (m->h.blank_end + 1) << 3; m->h.retr_start = (m->h.retr_start << 3); m->h.retr_end = (m->h.retr_end << 3); } else { /* horizontal */ m->h.total = readb_idx_reg(0x3d5, 0x50) + 1; m->h.active = readb_idx_reg(0x3d5, 0x51) + 1; m->h.blank_start = readb_idx_reg(0x3d5, 0x52) + 1; m->h.blank_end = readb_idx_reg(0x3d5, 0x53) + 1; m->h.retr_start = readb_idx_reg(0x3d5, 0x56); m->h.retr_end = readb_idx_reg(0x3d5, 0x57); /* add blanking overflow */ val = readb_idx_reg(0x3d5, 0x54); m->h.blank_start |= ((val >> 0) & 0x7) << 8; m->h.blank_end |= ((val >> 3) & 0x7) << 8; m->h.retr_start |= ((val >> 6) & 0x3) << 8; /* add period overflow */ val = readb_idx_reg(0x3d5, 0x55); m->h.total |= ((val >> 0) & 0xf) << 8; m->h.active |= ((val >> 4) & 0x7) << 8; /* vertical */ m->v.total = readb_idx_reg(0x3d5, 0x58) + 1; m->v.active = readb_idx_reg(0x3d5, 0x59) + 1; m->v.blank_start = readb_idx_reg(0x3d5, 0x5a) + 1; m->v.blank_end = readb_idx_reg(0x3d5, 0x5b) + 1; m->v.retr_start = readb_idx_reg(0x3d5, 0x5e); val = readb_idx_reg(0x3d5, 0x5f); m->v.retr_end = val & 0x1f; m->v.retr_start |= (val >> 5) << 8; /* add blanking overflow */ val = readb_idx_reg(0x3d5, 0x5c); m->v.blank_start |= ((val >> 0) & 0x7) << 8; m->v.blank_end |= ((val >> 3) & 0x7) << 8; m->h.retr_end |= ((val >> 6) & 0x1) << 8; m->h.retr_start |= ((val >> 7) & 0x1) << 10; /* add period overflow */ val = readb_idx_reg(0x3d5, 0x5d); m->v.total |= ((val >> 0) & 0x7) << 8; m->v.active |= ((val >> 3) & 0x7) << 8; m->h.blank_end |= ((val >> 6) & 0x7) << 11; m->h.retr_start |= ((val >> 7) & 0x7) << 11; /* puzzle together the start address */ val = readb_idx_reg(0x3d5, 0x62); m->addr_start = (val >> 1) << 3; val = readb_idx_reg(0x3d5, 0x63); m->addr_start |= (val << 10); val = readb_idx_reg(0x3d5, 0x64); m->addr_start |= (val << 18); val = readb_idx_reg(0x3d5, 0xa3); m->addr_start |= (val & 0x7) << 26; m->horiz_quad_count = readb_idx_reg(0x3d5, 0x65); m->horiz_offset = readb_idx_reg(0x3d5, 0x66) << 3; val = readb_idx_reg(0x3d5, 0x67); m->horiz_offset |= ((val >> 0) & 0x3) << 11; m->horiz_quad_count |= ((val >> 2) & 0x3) << 8; switch (val >> 6) { case 0: m->bpp = 8; break; case 1: m->bpp = 16; break; case 2: m->bpp = 30; break; case 3: m->bpp = 32; break; } } } static void dump_scaling(void) { u_int32_t h_scaling, v_scaling; uint8_t val; val = readb_idx_reg(0x3d5, 0x79); if (val & 0x01) { printf("Panel Scaling enabled, mode %s\n", val & 0x02 ? "Interpolation" : "Duplication"); v_scaling = (val >> 3) & 0x1; h_scaling = ((val >> 4) & 0x3) << 10; v_scaling |= ((val >> 6) & 0x3) << 9; val = readb_idx_reg(0x3d5, 0x77); h_scaling |= val << 2; val = readb_idx_reg(0x3d5, 0x78); v_scaling |= val << 1; val = readb_idx_reg(0x3d5, 0x9f); h_scaling |= val & 0x3; printf("Scaling Factors: horizontal=%u, vertical=%u\n", h_scaling, v_scaling); } else printf("Panel Scaling disabled\n"); } static void dump_registers(struct io_reg *ior) { uint8_t idx; printf("%s register dump (IO Port address: 0x%03x): \n", ior->name, ior->io_port_addr); for (idx = 0; idx < 0xff; idx++) { uint8_t val; struct bit_desc *desc = ior->index[idx].bit_desc; if (!ior->index[idx].name) continue; outb(idx, ior->io_port_addr); val = inb(ior->io_port_data); printf(" %03x.%02x = 0x%02x (%s)\n", ior->io_port_data, idx, val, ior->index[idx].name); if (!desc) continue; while (desc->mask) { printf(" 0x%02x %s: 0x%02x\n", desc->mask, desc->name, val & desc->mask); desc++; } } printf("\n"); } enum pll { PLL_VCK, PLL_ECK, PLL_LDCK, }; #define REF_FREQ 14318 static void get_vck_clock(enum pll pll, unsigned int f_ref_khz) { uint8_t reg_ofs = 0; uint8_t val; unsigned int dm, dtz, dr, dn; unsigned long f_vco, f_out; char *name; switch (pll) { case PLL_VCK: reg_ofs = 0; name = "VCK"; break; case PLL_ECK: reg_ofs = 3; name = "ECK"; break; case PLL_LDCK: reg_ofs = 6; name = "LDCK"; break; default: return; } dm = readb_idx_reg(0x3c5, 0x44 + reg_ofs); val = readb_idx_reg(0x3c5, 0x45 + reg_ofs); dtz = val & 0x1; dr = (val >> 3) & 0x7; dm |= ((val >> 6) & 0x3) << 8; val = readb_idx_reg(0x3c5, 0x46 + reg_ofs); dtz |= (val & 0x1) << 1; dn = val >> 1; printf("%s PLL: dm=%u, dtx=%u, dr=%u, dn=%u ", name, dm, dtz, dr, dn); f_vco = f_ref_khz * (dm + 2) / (dn + 2); if (dr) f_out = f_ref_khz * (dm + 2) / ( (dn + 2) * (2 * dr) ); else f_out = 0; printf("%s Fvco=%lu kHz, Fout=%lu kHz\n", name, f_vco, f_out); } struct gpio_state { u_int32_t mode_output; u_int32_t pin_status; u_int32_t output_bit; u_int32_t alt_function; }; static int get_gpio_state(struct gpio_state *s) { uint8_t val; memset(s, 0, sizeof(*s)); val = readb_idx_reg(0x3c5, 0x2c); if (val & 0x01) s->alt_function |= (3 << 2); if (val & 0x04) s->pin_status |= (1 << 3); if (val & 0x08) s->pin_status |= (1 << 2); if (val & 0x10) s->output_bit |= (1 << 3); if (val & 0x20) s->output_bit |= (1 << 2); if (val & 0x40) s->mode_output |= (1 << 3); if (val & 0x80) s->mode_output |= (1 << 2); val = readb_idx_reg(0x3c5, 0x3d); if (val & 0x01) s->alt_function |= (3 << 4); if (val & 0x04) s->pin_status |= (1 << 5); if (val & 0x08) s->pin_status |= (1 << 4); if (val & 0x10) s->output_bit |= (1 << 5); if (val & 0x20) s->output_bit |= (1 << 4); if (val & 0x40) s->mode_output |= (1 << 5); if (val & 0x80) s->mode_output |= (1 << 4); } static void dump_gpio_state(const char *pfx, const struct gpio_state *gs) { unsigned int i; for (i = 2; i < 6; i++) { printf("%sGPIO %u: function=", pfx, i); if (gs->alt_function & (1 << i)) printf("alternate\n"); else if (gs->mode_output & (1 << i)) printf("output(%u)\n", gs->output_bit & (1 <pin_status & (1 << i) ? 1 : 0); } } static void dump_all_registers(void) { int i; for (i = 0; i < ARRAY_SIZE(io_regs); i++) { struct io_reg *reg = io_regs[i]; if (!reg) break; dump_registers(reg); } } static void dump_mode(const char *pfx, struct mode *m) { printf("%sH total=%u, active=%u, blank (%u-%u), sync(%u-%u)\n", pfx, m->h.total, m->h.active, m->h.blank_start, m->h.blank_end, m->h.retr_start, m->h.retr_end); printf("%sV total=%u, active=%u, blank (%u-%u), sync(%u-%u)\n", pfx, m->v.total, m->v.active, m->v.blank_start, m->v.blank_end, m->v.retr_start, m->v.retr_end); printf("base_addr=0x%08x, bpp=%d\n", m->addr_start, m->bpp); } static void dump_sl(const char *pfx) { uint8_t val; unsigned int sl_size_mb; unsigned long rtsf_in_sl_addr; uint64_t sl_in_mem_addr, temp; val = readb_idx_reg(0x3c5, 0x68); switch (val) { case 0: sl_size_mb = 512; break; case 0x80: sl_size_mb = 256; break; case 0xc0: sl_size_mb = 128; break; case 0xe0: sl_size_mb = 64; break; case 0xf0: sl_size_mb = 32; break; case 0xf8: sl_size_mb = 16; break; case 0xfc: sl_size_mb = 8; break; case 0xfe: sl_size_mb = 4; break; case 0xff: sl_size_mb = 2; break; } rtsf_in_sl_addr = readb_idx_reg(0x3c5, 0x6a) << 12; rtsf_in_sl_addr |= readb_idx_reg(0x3c5, 0x6b) << 20; val = readb_idx_reg(0x3c5, 0x6c); rtsf_in_sl_addr |= (val & 0x1) << 28; sl_in_mem_addr = readb_idx_reg(0x3c5, 0x6d) << 21; sl_in_mem_addr |= readb_idx_reg(0x3c5, 0x6d) << 29; temp = (readb_idx_reg(0x3c5, 0x6d) & 0x7f); sl_in_mem_addr |= (temp << 37); printf("%sSL in System memory: 0x%llx, RTSF in SL: 0x%lx\n", pfx, sl_in_mem_addr, rtsf_in_sl_addr); } static int dump_lvds(void) { uint8_t val; char *mode; writeb_idx_mask(0x3c5, 0x5a, 0x01, 0x01); val = readb_idx_reg(0x3c5, 0x13); switch (val >> 6) { case 0: mode = "LVDS1 + LVDS2"; break; case 2: mode = "One Dual LVDS Channel"; break; default: mode = "RESERVED"; break; } printf("LVDS Seq Mode: %s\n", mode); val = readb_idx_reg(0x3d5, 0xd2); switch ((val >> 4) & 3) { case 0: mode = "LVDS1 + LVDS2"; break; case 2: mode = "One Dual LVDS Channel"; break; default: mode = "RESERVED"; break; } printf("LVDS CRT Mode: %s\n", mode); printf("LVDS Channel 1 Format %s, Power %s\n", val & 2 ? "OpenLDI":"SPWG", val & 0x80 ? "Down" : "Up"); printf("LVDS Channel 2 Format %s, Power %s\n", val & 1 ? "OpenLDI":"SPWG", val & 0x40 ? "Down" : "Up"); } static int parse_ioreg(uint16_t *reg, uint8_t *index, char *str) { char *dot; char buf[255]; memset(buf, 0, sizeof(*buf)); strncpy(buf, str, sizeof(buf)-1); dot = strchr(buf, '.'); if (!dot) return -EINVAL; *dot = '\0'; *reg = strtoul(buf, NULL, 16); *index = strtoul(dot+1, NULL, 16); return 0; } static void reset_mode(int secondary) { if (!secondary) { writeb_idx_mask(0x3d5, 0x11, 0x00 , 0x80); writeb_idx_mask(0x3d5, 0x03, 0x80 , 0x80); } else { } } static void unlock_registers(void) { writeb_idx_reg(0x3c5, 0x10, 0x01); /* unlock extended */ writeb_idx_mask(0x3d5, 0x47, 0x00, 0x01); /* unlock CRT */ writeb_idx_mask(0x3d5, 0x03, 0x80, 0x80); /* disable EGA lightpen */ writeb_idx_mask(0x3d5, 0x11, 0x00, 0x80); /* unlock 0..7 */ } static void usage(void) { printf("Usage :\n"); printf("-h | --help : Display this usage message.\n"); printf("-d | --dump : Dump all registers.\n"); printf("-p | --pll : Display PLL.\n"); printf("-m | --mode : Display modes.\n"); printf("-r | --read : Read register. Example : $0 -r 3d5.17\n"); printf("-w | --write : Write register. Example : $0 -w 3d5.17 0xa3\n"); printf("-g | --gpio : Display GPIO state.\n"); } int main(int argc, char **argv) { struct mode m; struct gpio_state gs; int rc, option_index = 0; printf("via-chrome-tool (C) 2009 by VIA Technologies, Inc.\n"); printf("This is FREE SOFTWARE with ABSOLUTELY NO WARRANTY\n\n"); rc = iopl(3); if (rc < 0) { perror("iopl"); printf("Need root privileges.\n"); exit(1); } if (argc <= 1) { usage(); exit(1); } unlock_registers(); while (1) { int c; uint16_t reg; uint8_t index; unsigned long val; static struct option long_options[] = { { "help", 0, 0, 'h' }, { "dump", 0, 0, 'd' }, { "pll", 0, 0, 'p' }, { "mode", 0, 0, 'm' }, { "read", 1, 0, 'r' }, { "write", 1, 0, 'w' }, { "gpio", 1, 0, 'g' }, }; c = getopt_long(argc, argv, "hdpmr:w:g", long_options, &option_index); if (c == -1) { break; } switch (c) { case 'h': usage(); exit(1); case 'd': dump_all_registers(); break; case 'p': get_vck_clock(PLL_VCK, REF_FREQ); get_vck_clock(PLL_ECK, REF_FREQ); get_vck_clock(PLL_LDCK, REF_FREQ); break; case 'm': dump_sl(""); printf("Primary Display:\n"); get_mode(&m, 0); dump_mode(" ", &m); printf("\n"); printf("Secondary Display:\n"); get_mode(&m, 1); dump_mode(" ", &m); printf("\n"); dump_scaling(); printf("\n"); dump_lvds(); printf("\n"); break; case 'r': parse_ioreg(®, &index, optarg); printf("%03x.%02x = 0x%02x\n", reg, index, readb_idx_reg(reg, index)); break; case 'w': parse_ioreg(®, &index, optarg); /* we need one extra argument */ if (argc <= optind) exit(1); val = strtoul(argv[optind], NULL, 16); if (val > 0xff) exit(1); writeb_idx_reg(reg, index, val); printf("%03x.%02x = 0x%02x\n", reg, index, readb_idx_reg(reg, index)); break; case 'g': printf("GPIO State\n"); get_gpio_state(&gs); dump_gpio_state(" ", &gs); printf("\n"); break; default: usage(); exit(1); } } exit(0); }