diff options
author | Otavio Salvador <otavio@ossystems.com.br> | 2010-06-01 19:45:54 -0300 |
---|---|---|
committer | Otavio Salvador <otavio@ossystems.com.br> | 2010-06-01 19:45:54 -0300 |
commit | c9ebd877197924bb97412019db498712f3b14d22 (patch) | |
tree | 4d3a09af0fb56ed88f4cf6f6064020efe28488e3 |
Import version 0.60.6
-rw-r--r-- | COPYING | 19 | ||||
-rw-r--r-- | Makefile.am | 22 | ||||
-rw-r--r-- | autogen.sh | 12 | ||||
-rw-r--r-- | configure.ac | 77 | ||||
-rw-r--r-- | src/CInt10.c | 4021 | ||||
-rw-r--r-- | src/CInt10.h | 158 | ||||
-rw-r--r-- | src/CInt10FunProto.h | 151 | ||||
-rw-r--r-- | src/CInt10Tbl.h | 319 | ||||
-rw-r--r-- | src/Makefile | 533 | ||||
-rw-r--r-- | src/Makefile.am | 43 | ||||
-rw-r--r-- | src/Makefile.in | 533 | ||||
-rw-r--r-- | src/rdc.h | 320 | ||||
-rw-r--r-- | src/rdc_2dtool.c | 315 | ||||
-rw-r--r-- | src/rdc_2dtool.h | 496 | ||||
-rw-r--r-- | src/rdc_accel.c | 1471 | ||||
-rw-r--r-- | src/rdc_cursor.c | 852 | ||||
-rw-r--r-- | src/rdc_cursor.h | 44 | ||||
-rw-r--r-- | src/rdc_driver.c | 1701 | ||||
-rw-r--r-- | src/rdc_extension.c | 575 | ||||
-rw-r--r-- | src/rdc_extension.h | 180 | ||||
-rw-r--r-- | src/rdc_mode.c | 483 | ||||
-rw-r--r-- | src/rdc_mode.h | 107 | ||||
-rw-r--r-- | src/rdc_tool.c | 259 | ||||
-rw-r--r-- | src/rdc_vgatool.c | 321 | ||||
-rw-r--r-- | src/rdc_vgatool.h | 78 | ||||
-rw-r--r-- | src/rdc_video.c | 914 | ||||
-rw-r--r-- | src/rdc_video.h | 111 | ||||
-rw-r--r-- | src/typedef.h | 504 |
28 files changed, 14619 insertions, 0 deletions
@@ -0,0 +1,19 @@ +Copyright (c) 2009 RDC Semiconductor Co.,Ltd
+
+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, and that the name of the authors not be used in
+advertising or publicity pertaining to distribution of the software without
+specific, written prior permission. The authors makes no representations
+about the suitability of this software for any purpose. It is provided
+"as is" without express or implied warranty.
+
+THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..5dc01a5 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,22 @@ +# 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
\ No newline at end of file diff --git a/autogen.sh b/autogen.sh new file mode 100644 index 0000000..904cd67 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,12 @@ +#! /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 "$@" diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..d61b761 --- /dev/null +++ b/configure.ac @@ -0,0 +1,77 @@ +# 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 + +AC_PREREQ(2.57) +AC_INIT([xf86-video-aip], + 0.80, + [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], + xf86-video-aip) + +AC_CONFIG_SRCDIR([Makefile.am]) +AM_CONFIG_HEADER([config.h]) +AC_CONFIG_AUX_DIR(.) + +AM_INIT_AUTOMAKE([dist-bzip2]) + +AM_MAINTAINER_MODE + +# Checks for programs. +AC_DISABLE_STATIC +AC_PROG_LIBTOOL +AC_PROG_CC + +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"]) + +# 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(DPMSExtension, xextproto) + +# Checks for pkg-config packages +PKG_CHECK_MODULES(XORG, [xorg-server xproto fontsproto $REQUIRED_MODULES]) +sdkdir=$(pkg-config --variable=sdkdir xorg-server) + +# Checks for libraries. + +# Checks for header files. +AC_HEADER_STDC + +AC_SUBST([XORG_CFLAGS]) +AC_SUBST([moduledir]) + +DRIVER_NAME=nv +AC_SUBST([DRIVER_NAME]) + +XORG_MANPAGE_SECTIONS +XORG_RELEASE_VERSION + +AC_OUTPUT([ + Makefile + src/Makefile +]) diff --git a/src/CInt10.c b/src/CInt10.c new file mode 100644 index 0000000..1510ce8 --- /dev/null +++ b/src/CInt10.c @@ -0,0 +1,4021 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#include <string.h> + +#ifndef XFree86Module +#include "compiler.h" +#else +#include "xf86_ansic.h" +#endif + +#include "typedef.h" +#include "CInt10.h" +#include "CInt10FunProto.h" +#include "CInt10Tbl.h" + + +/* Global for related IO address */ +USHORT Relocate_IOAddress; + +/*-------------------------------------------------------------------------- +; +; IO port function replace +; +;---------------------------------------------------------------------------*/ +__inline void OutPort(UCHAR Index,UCHAR Value) +{ + + outb(Relocate_IOAddress+Index, Value); + + return; +} + +__inline UCHAR InPort(UCHAR Index) +{ + UCHAR bInVal = 0x0; + + bInVal = inb(Relocate_IOAddress+Index); + + return bInVal; +} + +/*---------------------------------------------------------------------------- +; +; SetVBERerurnStatus +; +; in: +; VBEReturnStatus = +; VBEFunctionCallSuccessful 0x004F +; VBEFunctionCallFail 0x014F +; VBEFunctionCallNotSupported 0x024F +; VBEFunctionCallInvalid 0x034F +; out: +; pCBiosArguments->Eax +;---------------------------------------------------------------------------*/ +void SetVBERerurnStatus(USHORT VBEReturnStatus, CBIOS_ARGUMENTS *pCBiosArguments) +{ + pCBiosArguments->reg.x.AX = VBEReturnStatus; +} + +/*---------------------------------------------------------------------------- +; +; SetTimingRegs +; +; in: +; bDisplayPath = display path +; pMODE_INFO = pointer to MODE_INFO +; pRRATE_TABLE = pointer to RRATE_TABLE +; +;---------------------------------------------------------------------------*/ +void SetTimingRegs(UCHAR ucDisplayPath, MODE_INFO *pModeInfo, RRATE_TABLE *pRRateTable) +{ + USHORT usHBorder = 0, usVBorder = 0; + USHORT usHtotal, usHDispEnd, usHBlankStart, usHBlankEnd, usHSyncStart, usHSyncEnd; + USHORT usVtotal, usVDispEnd, usVBlankStart, usVBlankEnd, usVSyncStart, usVSyncEnd; + ULONG ulPixelClock; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter SetTimingRegs()==\n"); + + if (pRRateTable->Attribute & HB) + { + usHBorder = 8; + } + + if (pRRateTable->Attribute & VB) + { + usVBorder = 8; + } + + usHtotal = pModeInfo->H_Size + usHBorder*2 + pRRateTable->H_Blank_Time; + usHDispEnd = pModeInfo->H_Size; + usHBlankStart = pModeInfo->H_Size + usHBorder; + usHBlankEnd = pModeInfo->H_Size + usHBorder + pRRateTable->H_Blank_Time; + usHSyncStart = pRRateTable->H_Sync_Start; + usHSyncEnd = pRRateTable->H_Sync_Start + pRRateTable->H_Sync_Time; + + usVtotal = pModeInfo->V_Size + usVBorder*2 + pRRateTable->V_Blank_Time; + usVDispEnd = pModeInfo->V_Size; + usVBlankStart = pModeInfo->V_Size + usVBorder; + usVBlankEnd = pModeInfo->V_Size + usVBorder + pRRateTable->V_Blank_Time; + usVSyncStart = pRRateTable->V_Sync_Start; + usVSyncEnd = pRRateTable->V_Sync_Start + pRRateTable->V_Sync_Time; + + ulPixelClock = pRRateTable->Clock; + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "H total = %d\n", usHtotal); + SetHTotal(ucDisplayPath, usHtotal); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "H disp end = %d\n", usHDispEnd); + SetHDisplayEnd(ucDisplayPath, usHDispEnd); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "H blank start = %d\n", usHBlankStart); + SetHBlankingStart(ucDisplayPath, usHBlankStart); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "H blank end = %d\n", usHBlankEnd); + SetHBlankingEnd(ucDisplayPath, usHBlankEnd); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "H sync start = %d\n", usHSyncStart); + SetHSyncStart(ucDisplayPath, usHSyncStart); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "H sync end = %d\n", usHSyncEnd); + SetHSyncEnd(ucDisplayPath, usHSyncEnd); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "V total = %d\n", usVtotal); + SetVTotal(ucDisplayPath, usVtotal); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "V disp end = %d\n", usVDispEnd); + SetVDisplayEnd(ucDisplayPath, usVDispEnd); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "V blank start = %d\n", usVBlankStart); + SetVBlankingStart(ucDisplayPath, usVBlankStart); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "V blank end = %d\n", usVBlankEnd); + SetVBlankingEnd(ucDisplayPath, usVBlankEnd); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "V sync start = %d\n", usVSyncStart); + SetVSyncStart(ucDisplayPath, usVSyncStart); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "V sync end = %d\n", usVSyncEnd); + SetVSyncEnd(ucDisplayPath, usVSyncEnd); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "Pixel clock = %d\n", ulPixelClock); + SetPixelClock(ucDisplayPath, ulPixelClock); + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit SetTimingRegs()==\n"); +} + +/*------------------------------------------------------------------- +; +; SetHTotal() +; +; in: +; DisplayPath = display path +; Value = H total in pixel +; +;------------------------------------------------------------------*/ +void SetHTotal(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 40 pixels for setting HW */ + Value -= 40; + + /* low-3-bits of H total has bug, HW will remove it. So the value have to align to 8*/ + Value += 7; + + if(DisplayPath == DISP1) + { + WriteRegToHW(HTotal1, Value); + } + else + { + WriteRegToHW(HTotal2, Value); + } + + return; +} + +/*------------------------------------------------------------------- +; +; SetHDisplayEnd() +; +; in: +; DisplayPath = display path +; Value = H display end in pixel +; +;------------------------------------------------------------------*/ +void SetHDisplayEnd(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 8 pixels for setting HW */ + Value -= 8; + + if(DisplayPath == DISP1) + { + WriteRegToHW(HDispEnd1, Value); + } + else + { + WriteRegToHW(HDispEnd2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetHBlankingStart() +; +; in: +; DisplayPath = display path +; Value = H blanking start in pixel +; +;------------------------------------------------------------------*/ +void SetHBlankingStart(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 8 pixels for setting HW */ + Value -= 8; + + if(DisplayPath == DISP1) + { + WriteRegToHW(HBnkSt1, Value); + } + else + { + WriteRegToHW(HBnkSt2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetHBlankingEnd() +; +; in: +; DisplayPath = display path +; Value = H blanking end in pixel +; +;------------------------------------------------------------------*/ +void SetHBlankingEnd(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 8 pixels for setting HW */ + Value -= 8; + + if(DisplayPath == DISP1) + { + WriteRegToHW(HBnkEnd1, Value); + } + else + { + WriteRegToHW(HBnkEnd2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetHSyncStart() +; +; in: +; DisplayPath = display path +; Value = H Sync start in pixel +; +;------------------------------------------------------------------*/ +void SetHSyncStart(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 0 pixels for setting HW */ + Value -= 0; + + if(DisplayPath == DISP1) + { + WriteRegToHW(HSyncSt1, Value); + } + else + { + WriteRegToHW(HSyncSt2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetHSyncEnd() +; +; in: +; DisplayPath = display path +; Value = H Sync end in pixel +; +;------------------------------------------------------------------*/ +void SetHSyncEnd(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 0 pixels for setting HW */ + Value -= 0; + + if(DisplayPath == DISP1) + { + WriteRegToHW(HSyncEnd1, Value); + } + else + { + WriteRegToHW(HSyncEnd2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetVTotal() +; +; in: +; DisplayPath = display path +; Value = V total +; +;------------------------------------------------------------------*/ +void SetVTotal(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 2 line for setting HW */ + Value -= 2; + + if(DisplayPath == DISP1) + { + WriteRegToHW(VTotal1, Value); + } + else + { + WriteRegToHW(VTotal2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetVDisplayEnd() +; +; in: +; DisplayPath = display path +; Value = V display end +; +;------------------------------------------------------------------*/ +void SetVDisplayEnd(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 1 line for setting HW */ + Value -= 1; + + if(DisplayPath == DISP1) + { + WriteRegToHW(VDispEnd1, Value); + } + else + { + WriteRegToHW(VDispEnd2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetVBlankingStart() +; +; in: +; DisplayPath = display path +; Value = V blanking start +; +;------------------------------------------------------------------*/ +void SetVBlankingStart(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 1 line for setting HW */ + Value -= 1; + + if(DisplayPath == DISP1) + { + WriteRegToHW(VBnkSt1, Value); + } + else + { + WriteRegToHW(VBnkSt2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetVBlankingEnd() +; +; in: +; DisplayPath = display path +; Value = V blanking end +; +;------------------------------------------------------------------*/ +void SetVBlankingEnd(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 1 line for setting HW */ + Value -= 1; + + if(DisplayPath == DISP1) + { + WriteRegToHW(VBnkEnd1, Value); + } + else + { + WriteRegToHW(VBnkEnd2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetVSyncStart() +; +; in: +; DisplayPath = display path +; Value = V sync start +; +;------------------------------------------------------------------*/ +void SetVSyncStart(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 1 line for setting HW */ + Value -= 1; + + if(DisplayPath == DISP1) + { + WriteRegToHW(VSyncSt1, Value); + } + else + { + WriteRegToHW(VSyncSt2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetVSyncEnd() +; +; in: +; DisplayPath = display path +; Value = V sync end +; +;------------------------------------------------------------------*/ +void SetVSyncEnd(UCHAR DisplayPath, USHORT Value) +{ + /* Subtract the 1 line for setting HW */ + Value -= 1; + + if(DisplayPath == DISP1) + { + WriteRegToHW(VSyncEnd1, Value); + } + else + { + WriteRegToHW(VSyncEnd2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; SetPixelClock() +; +; in: +; DisplayPath = display path +; Clock = pixel clock in khz +; +;------------------------------------------------------------------*/ +void SetPixelClock(UCHAR bDisplayPath, ULONG dwClock) +{ + PLL_Info PLLInfo; + + PLLInfo = ClockToPLLF9003A(dwClock); + SetDPLL(bDisplayPath, PLLInfo); +} +/*------------------------------------------------------------------- +; +; SetHSource() +; +; in: +; DisplayPath = display path +; wValue = number of pixels of source data +; +;------------------------------------------------------------------*/ +void SetHSource(UCHAR bDisplayPath, USHORT wValue) +{ + wValue -= 1; + + if(bDisplayPath == DISP1) + { + WriteRegToHW(HSource1, wValue); + } + else + { + WriteRegToHW(HSource2, wValue); + } +} + + +/*------------------------------------------------------------------- +; +; ClockToPLLF9003A() +; +; in: +; Clock = pixel clock in khz +; return: +; PLL_Info = PLL value +; +;------------------------------------------------------------------*/ +PLL_Info ClockToPLLF9003A(ULONG Clock) +{ + ULONG MSCount, NSCount, RSCount, FCKVCO, FCKOUT; /*defined in PLL module */ + ULONG NearestClock = 0xFFFFFFFF; + PLL_Info PLLInfo; + + for (MSCount = 3; MSCount < 6; MSCount++) + { + for (NSCount = 1; NSCount < 256; NSCount++) + { + FCKVCO = PLLReferenceClock * NSCount / MSCount; + + if ( (MaxFCKVCO9003A >= FCKVCO) && (FCKVCO >= MinFCKVCO9003A) ) + { + for (RSCount = 1; RSCount < 6; RSCount++) + { + FCKOUT = FCKVCO >> RSCount; + if ( Difference(FCKOUT, Clock) < Difference(NearestClock, Clock) ) + { + NearestClock = FCKOUT; + if (MSCount == 3) + PLLInfo.MS = 0x00; + if (MSCount == 4) + PLLInfo.MS = BIT3; + if (MSCount == 5) + PLLInfo.MS = BIT4+BIT3; + PLLInfo.NS = (UCHAR)NSCount; + PLLInfo.RS = (UCHAR)RSCount-1; + } + } + } + } + + } + + return PLLInfo; + +} + +/*------------------------------------------------------------------- +; +; SetDPLL() - set display PLL +; +; in: +; DisplayPath = display path +; PLLInfo: PLL value +; +;------------------------------------------------------------------*/ +void SetDPLL(UCHAR DisplayPath, PLL_Info PLLInfo) +{ + UCHAR RetValue; + + if (DisplayPath == DISP1) + { + SetCRReg(0xC1, PLLInfo.MS, BIT4+BIT3); + SetCRReg(0xC0, PLLInfo.NS, 0xFF); + SetCRReg(0xCF, PLLInfo.RS, BIT2+BIT1+BIT0); + } + else + { + SetCRReg(0xBF, PLLInfo.MS, BIT4+BIT3); + SetCRReg(0xBE, PLLInfo.NS, 0xFF); + SetCRReg(0xCE, PLLInfo.RS, BIT2+BIT1+BIT0); + } + + /* Fire the PLL setting */ + RetValue = GetCRReg(0xBB); + SetCRReg(0xBB, RetValue, 0xFF); + +} + +/*------------------------------------------------------------------- +; +; SetPolarity() +; +; in: +; DisplayPath = display path +; Value: bit1 = 1 for positive H sync +; = 0 for negative H sync +; bit2 = 1 for positive V sync +; = 0 for negative V sync +;------------------------------------------------------------------*/ +void SetPolarity(UCHAR DevicePort, UCHAR Value) +{ + Value ^= BIT2+BIT1; /* invert Bit[2:1] */ + + switch (DevicePort) + { + case CRT_PORT: + OutPort(MISC_WRITE, ((Value<<5) & 0xC0) | (InPort(MISC_READ) & 0x3F)); + break; + + case DVP1: + case DVP12: + SetSRReg(0x20, Value>>1, BIT1+BIT0); + break; + + case DVP2: + SetSRReg(0x20, Value<<2, BIT4+BIT3); + break; + } +} + +/*------------------------------------------------------------------- +; +; SetFIFO() +; +; in: +; DisplayPath = display path +; out: +; none +;------------------------------------------------------------------*/ +void SetFIFO(UCHAR DisplayPath) +{ + if (DisplayPath == DISP1) + { + SetCRReg(0xA7, 0x3F, 0xFF); + SetCRReg(0xA6, 0x3F, 0xFF); + } + else if (DisplayPath == DISP2) + { + SetCRReg(0x35, 0x3F, 0xFF); + SetCRReg(0x34, 0x3F, 0xFF); + } +} + +/*------------------------------------------------------------------- +; +; SetPitch() +; +; in: +; DisplayPath = display path +; Value = Pitch in byte +; +;------------------------------------------------------------------*/ +void SetPitch(UCHAR DisplayPath, USHORT Value) +{ + /* adjust pitch in 8 byte alignment */ + Value += 7; + Value >>= 3; + + if(DisplayPath == DISP1) + { + WriteRegToHW(Pitch1, Value); + } + else + { + WriteRegToHW(Pitch2, Value); + } + + return; + +} + +/*------------------------------------------------------------------- +; +; GetPitch() +; +; in: +; DisplayPath = display path +; out: +; return pitch in byte +; +;------------------------------------------------------------------*/ +USHORT GetPitch(UCHAR DisplayPath) +{ + USHORT wPitch; + + if(DisplayPath == DISP1) + { + wPitch = ReadRegFromHW(Pitch1); + } + else + { + wPitch = ReadRegFromHW(Pitch2); + } + + wPitch <<= 3; + + return wPitch; +} + +/*------------------------------------------------------------------- +; +; GetVDisplayEnd() +; +; in: +; DisplayPath = display path +; out: +; return V disp end +; +;------------------------------------------------------------------*/ +USHORT GetVDisplayEnd(UCHAR DisplayPath) +{ + USHORT wDisplayEnd = 0x0; + + if(DisplayPath == DISP1) + { + wDisplayEnd = ReadRegFromHW(VDispEnd1); + } + else + { + wDisplayEnd = ReadRegFromHW(VDispEnd2); + } + + /* Add 1 for query value. */ + wDisplayEnd += 1; + + return wDisplayEnd; +} + +/*------------------------------------------------------------------- +; +; SetColorDepth() +; +; in: +; DisplayPath = display path +; Value = color depth (8/16/32) +; +;------------------------------------------------------------------*/ +void SetColorDepth(UCHAR DisplayPath, UCHAR Value) +{ + UCHAR bSetBit = 0x0; + + switch(Value) + { + case 8: + bSetBit = (UCHAR)BIT0; + break; + case 16: + bSetBit = (UCHAR)BIT2; + break; + case 32: + bSetBit = (UCHAR)BIT3; + break; + default: + return; + } + + if(DisplayPath == DISP1) + { + SetCRReg(0xA3, bSetBit, 0x0F); + } + else + { + /* Display2 would not support 8bit color depth */ + if(Value == 8) + return; + + SetCRReg(0x33, bSetBit, 0x0F); + } + +} + +/*------------------------------------------------------------------- +; +; ConfigDigitalPort() +; +; in: +; bDisplayPath = display path +; +;------------------------------------------------------------------*/ +void ConfigDigitalPort(UCHAR bDisplayPath) +{ + PORT_CONFIG *pDevicePortConfig; + UCHAR bDeviceIndex; + UCHAR bRegValue; + + bDeviceIndex = Get_DEV_ID(bDisplayPath); + + if(bDisplayPath == DISP1) + { + bRegValue = 0x3; + } + else + { + bRegValue = 0x4; + } + + if (GetDevicePortConfig(bDeviceIndex, &pDevicePortConfig)) + { + switch(pDevicePortConfig->PortID) + { + case CRT_PORT: + SetSRReg(0x1F, bRegValue, BIT2); + break; + + case DVP1: + Set12BitDVP(); + SetSRReg(0x1F, bRegValue, BIT0); + break; + + case DVP2: + Set12BitDVP(); + SetSRReg(0x1F, bRegValue, BIT1); + break; + + case DVP12: + Set24BitDVP(); + SetSRReg(0x1F, bRegValue, BIT0); + break; + } + } +} + +/*---------------------------------------------------------------------------- +; +; LoadTiming +; +; in: +; bDisplayPath = display path +; wModeNum = mode no. +; +;---------------------------------------------------------------------------*/ +void LoadTiming(UCHAR bDisplayPath, USHORT wModeNum) +{ + UCHAR bDeviceIndex = Get_DEV_ID(bDisplayPath); + + /* Obtain the display device */ + + switch(bDeviceIndex) + { + case CRT_ID: + case CRT2_ID: + case DVI_ID: + case DVI2_ID: + LoadVESATiming(bDisplayPath, wModeNum); + break; + + case LCD_ID: + case LCD2_ID: + LoadLCDTiming(bDisplayPath, wModeNum); + break; + } + +} + +/*---------------------------------------------------------------------------- +; +; LoadVESATiming +; +; in: +; bDisplayPath = display path +; wModeNum = mode no. +; +;---------------------------------------------------------------------------*/ +void LoadVESATiming(UCHAR bDisplayPath, USHORT wModeNum) +{ + UCHAR bR_Rate_value = 0x0; + MODE_INFO *pModeInfo = NULL; + RRATE_TABLE *pRRateTable = NULL; + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter LoadVESATiming()==\n"); + bR_Rate_value = Get_RRATE_ID(bDisplayPath); + + if(GetModePointerFromVESATable(wModeNum, bR_Rate_value, &pModeInfo, &pRRateTable)) + { + SetTimingRegs(bDisplayPath, pModeInfo, pRRateTable); + } + else + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "Mode not found!!\n"); + /*ASSERT(true); */ + } + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit LoadVESATiming()==\n"); +} +/*---------------------------------------------------------------------------- +; +; LoadLCDTiming +; +; in: +; bDisplayPath = display path +; wModeNum = mode no. +; +;---------------------------------------------------------------------------*/ +void LoadLCDTiming(UCHAR bDisplayPath, USHORT wModeNum) +{ + UCHAR bDeviceIndex = Get_DEV_ID(bDisplayPath); + MODE_INFO *pPanelModeInfo, *pUserModeInfo; + PANEL_TABLE *pPanelTable; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter LoadLCDTiming()==\n"); + + if(GetModePointerFromLCDTable(bDeviceIndex, &pPanelModeInfo, &pPanelTable)) + { + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "&pPanelTable->Timing = 0x%x\n", &pPanelTable->Timing); + SetTimingRegs(bDisplayPath, pPanelModeInfo, &pPanelTable->Timing); + Get_MODE_INFO(wModeNum, &pUserModeInfo); + SetScalingFactor(bDisplayPath, pUserModeInfo, pPanelModeInfo); + } + else + { + /*ASSERT(true); */ + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit LoadLCDTiming()==\n"); +} +/*---------------------------------------------------------------------------- +; +; SetScalingFactor +; +; in: +; pUserModeInfo = pointer to MODE_INFO of user mode +; pPanelModeInfo = pointer to LCD MODE_INFO of panel +; +;---------------------------------------------------------------------------*/ +void SetScalingFactor(UCHAR bDisplayPath, MODE_INFO *pUserModeInfo, MODE_INFO *pPanelModeInfo) +{ + ULONG dwScalingFactor; + + USHORT usUserModeHSize, usUserModeVSize; + USHORT usPanelModeHSize, usPanelModeVSize; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter SetScalingFactor()==\n"); + usUserModeHSize = pUserModeInfo->H_Size; + + usUserModeVSize = pUserModeInfo->V_Size; + + usPanelModeHSize = pPanelModeInfo->H_Size; + + usPanelModeVSize = pPanelModeInfo->V_Size; + + + TurnOffHorScaler(bDisplayPath); + + TurnOffVerScaler(bDisplayPath); + + SetHSource(bDisplayPath, usUserModeHSize); + + + if (usPanelModeHSize > usUserModeHSize) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "Enable H scaler\n"); + dwScalingFactor = ((ULONG)usUserModeHSize << 12) / usPanelModeHSize; + SetHorScalingFactor(bDisplayPath, dwScalingFactor); + TurnOnHorScaler(bDisplayPath); + TurnOnScaler(bDisplayPath); + } + + if (usPanelModeVSize > usUserModeVSize) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "Enable V scaler\n"); + dwScalingFactor = ((ULONG)usUserModeVSize << 11) / usPanelModeVSize; + SetVerScalingFactor(bDisplayPath, dwScalingFactor); + TurnOnVerScaler(bDisplayPath); + TurnOnScaler(bDisplayPath); + } + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit SetScalingFactor()==\n"); +} +/*------------------------------------------------------------------- +; +; SetHorScalingFactor() +; +; in: +; DisplayPath = display path +; wValue = scaling factor +; +;------------------------------------------------------------------*/ +void SetHorScalingFactor(UCHAR bDisplayPath, USHORT wValue) +{ + if(bDisplayPath == DISP1) + { + WriteRegToHW(HScalingFactor1, wValue); + } + else + { + WriteRegToHW(HScalingFactor2, wValue); + } +} +/*------------------------------------------------------------------- +; +; SetVerScalingFactor() +; +; in: +; DisplayPath = display path +; wValue = scaling factor +; +;------------------------------------------------------------------*/ +void SetVerScalingFactor(UCHAR bDisplayPath, USHORT wValue) +{ + if(bDisplayPath == DISP1) + { + WriteRegToHW(VScalingFactor1, wValue); + } + else + { + WriteRegToHW(VScalingFactor2, wValue); + } +} +/*------------------------------------------------------------------- +; +; isLCDFitMode() - +; +; Input: +; bDeviceIndex = LCD/LCD2 +; wModeNom = mode number +; return: +; true if wModeNom is LCD fit mode +; +;------------------------------------------------------------------*/ +CI_STATUS isLCDFitMode(UCHAR bDeviceIndex, USHORT wModeNum) +{ + MODE_INFO *pModeInfo; + + if (Get_MODE_INFO_From_LCD_Table(bDeviceIndex, &pModeInfo)) + { + if ((wModeNum == pModeInfo->Mode_ID_8bpp) || + (wModeNum == pModeInfo->Mode_ID_16bpp) || + (wModeNum == pModeInfo->Mode_ID_32bpp)) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } +} +/*---------------------------------------------------------------------------- +; +; GetModePointerFromVESATable +; +; in: +; wModeNum = mode no. +; bRRIndex = refresh rate index +; out: +; return = true, pModeInfo = pointer to MODE_INFO +; pRRateTable = pointer to RRATE_TABLE +; = false, fail +; +;---------------------------------------------------------------------------*/ +CI_STATUS GetModePointerFromVESATable(USHORT wModeNum, UCHAR ucRRIndex, MODE_INFO **ppModeInfo, RRATE_TABLE **ppRRateTable) +{ + int iRRateTableIndex; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter GetModePointerFromVESATable()==\n"); + + /* Don't find out any fit mode table in the vesa table */ + if(Get_MODE_INFO_From_VESA_Table(wModeNum, ppModeInfo)) + { + /* Obtain the frequence table. */ + *ppRRateTable = (RRATE_TABLE*)((int)(*ppModeInfo) + sizeof(MODE_INFO)); + + for(iRRateTableIndex = 0; iRRateTableIndex < (*ppModeInfo)->RRTableCount; iRRateTableIndex++, (*ppRRateTable)++) + { + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "*ppRRateTable = 0x%x\n", *ppRRateTable); + + if(((*ppRRateTable)->RRate_ID == ucRRIndex) && (!((*ppRRateTable)->Attribute & DISABLE))) + { + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "*ppRRateTable = 0x%x\n", *ppRRateTable); + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit1 GetModePointerFromVESATable()== return success\n"); + return true; + } + } + } + + /* Can't find any fresh rate be conformed */ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit2 GetModePointerFromVESATable()== return fail!!\n"); + return false; +} + +/*---------------------------------------------------------------------------- +; +; GetModePointerFromLCDTable +; +; in: +; bDeviceIndex = device index +; out: +; return = true, ppPanelInfo = pointer to PANEL_INFO +; pPanelTable = pointerto PANEL_TABLE +; = false, fail +; +;---------------------------------------------------------------------------*/ +CI_STATUS GetModePointerFromLCDTable(UCHAR bDeviceIndex, MODE_INFO **ppModeInfo, PANEL_TABLE **ppPanelTable) +{ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter GetModePointerFromLCDTable()==\n"); + if (Get_MODE_INFO_From_LCD_Table(bDeviceIndex, ppModeInfo)) + { + *ppPanelTable = (PANEL_TABLE*)((int)(*ppModeInfo) + sizeof(MODE_INFO)); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "*ppPanelTable = 0x%x\n", *ppPanelTable); + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 GetModePointerFromLCDTable()== return success\n"); + return true; + } + else + { + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 GetModePointerFromLCDTable()== return fail\n"); + return false; + } +} +/*---------------------------------------------------------------------------- +; +; Get_MODE_INFO +; +; in: +; wModeNum = mode no. +; out: +; return = true, pModeInfo = pointer to MODE_INFO +; = false, fail +; +;---------------------------------------------------------------------------*/ +CI_STATUS Get_MODE_INFO(USHORT wModeNum, MODE_INFO **ppModeInfo) +{ + if (Get_MODE_INFO_From_VESA_Table(wModeNum, ppModeInfo)) + { + return true; + } + else if(isLCDFitMode(LCD_ID, wModeNum)) + { + Get_MODE_INFO_From_LCD_Table(LCD_ID, ppModeInfo); + return true; + } + else if(isLCDFitMode(LCD2_ID, wModeNum)) + { + Get_MODE_INFO_From_LCD_Table(LCD2_ID, ppModeInfo); + return true; + } + else + { + return false; + } +} +/*---------------------------------------------------------------------------- +; +; Get_MODE_INFO_From_LCD_Table +; +; in: +; bDeviceIndex = device index. +; out: +; return = true, pModeInfo = pointer to PANEL_INFO +; = false, fail +; +;---------------------------------------------------------------------------*/ +CI_STATUS Get_MODE_INFO_From_LCD_Table(UCHAR bDeviceIndex, MODE_INFO **ppModeInfo) +{ + int i; + UCHAR bLCDTableIndex; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter Get_MODE_INFO_From_LCD_Table()==\n"); + + *ppModeInfo = pLCDTable; + + if (bDeviceIndex == LCD_ID) + { + bLCDTableIndex = Get_LCD_TABLE_INDEX(); + } + else if (bDeviceIndex == LCD2_ID) + { + bLCDTableIndex = Get_LCD2_TABLE_INDEX(); + } + else + { + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 Get_MODE_INFO_From_LCD_Table()== return fail!!\n"); + return false; + } + + + if (bLCDTableIndex == 0) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "LCD Index = 0\n"); + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 Get_MODE_INFO_From_LCD_Table()== return fail!!\n"); + return false; + } + + while ((*ppModeInfo)->H_Size != 0xFFFF) + { + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "(*ppModeInfo)->H_Size = %d\n", (*ppModeInfo)->H_Size); + + if (bLCDTableIndex == 1) + { + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit3 Get_MODE_INFO_From_LCD_Table()== return success\n"); + return true; + } + (*ppModeInfo) = (MODE_INFO*)((int)*ppModeInfo + sizeof(MODE_INFO) + sizeof(PANEL_TABLE)); + bLCDTableIndex--; + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit4 Get_MODE_INFO_From_LCD_Table()== return fail!!\n"); + + return false; + +} +/*---------------------------------------------------------------------------- +; +; Get_MODE_INFO_From_VESA_Table +; +; in: +; wModeNum = mode no. +; out: +; return = true, pModeInfo = pointer to MODE_INFO +; = false, fail +; +;---------------------------------------------------------------------------*/ +#if 0 +CI_STATUS Get_MODE_INFO_From_VESA_Table(USHORT wModeNum, MODE_INFO **ppModeInfo) +{ + int i; + VESA_TABLE *pVESATable = VESATable; + + for( i = 0; i < (sizeof(VESATable)/sizeof(VESA_TABLE)); i++, pVESATable++) + { + if((pVESATable->ModeInfo.Mode_ID_8bpp == wModeNum) || (pVESATable->ModeInfo.Mode_ID_16bpp == wModeNum)|| (pVESATable->ModeInfo.Mode_ID_32bpp == wModeNum)) + { + *ppModeInfo = &(pVESATable->ModeInfo); + return true; + } + } + + return false; +} +#else +CI_STATUS Get_MODE_INFO_From_VESA_Table(USHORT wModeNum, MODE_INFO **ppModeInfo) +{ + UCHAR ucColorDepth; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter Get_MODE_INFO_From_VESA_Table()==\n"); + + *ppModeInfo = pVESATable; + + while((*ppModeInfo)->H_Size != 0xFFFF) + { + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "*ppModeInfo = 0x%x\n", *ppModeInfo); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "(*ppModeInfo)->H_Size = %d\n", (*ppModeInfo)->H_Size); + + if (GetModeColorDepth(wModeNum, *ppModeInfo, &ucColorDepth)) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "*ppModeInfo = 0x%x\n", *ppModeInfo); + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit1 Get_MODE_INFO_From_VESA_Table()== return success\n"); + return true; + } + + *ppModeInfo = (MODE_INFO*)((*ppModeInfo)->RRTableCount * sizeof(RRATE_TABLE) + sizeof(MODE_INFO) + (void*)(*ppModeInfo)); + } + + *ppModeInfo = (MODE_INFO*)(&CInt10VESATable); + + while((*ppModeInfo)->H_Size != 0xFFFF) + { + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "*ppModeInfo = 0x%x\n", *ppModeInfo); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "(*ppModeInfo)->H_Size = %d\n", (*ppModeInfo)->H_Size); + + if (GetModeColorDepth(wModeNum, *ppModeInfo, &ucColorDepth)) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "*ppModeInfo = 0x%x\n", *ppModeInfo); + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit1 Get_MODE_INFO_From_VESA_Table()== return success\n"); + return true; + } + + *ppModeInfo = (MODE_INFO*)((*ppModeInfo)->RRTableCount * sizeof(RRATE_TABLE) + sizeof(MODE_INFO) + (void*)(*ppModeInfo)); + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit2 Get_MODE_INFO_From_VESA_Table()== return fail!!\n"); + return false; +} +#endif +/*---------------------------------------------------------------------------- +; +; GetModeColorDepth +; +; in: +; wModeNum = mode no. +; pMODE_INFO = pointer to MODE_INFO +; out: +; return = true, *pbColorDepth = color depth +; = false, fail +; +;---------------------------------------------------------------------------*/ +CI_STATUS GetModeColorDepth(USHORT wModeNum, MODE_INFO *pModeInfo, UCHAR *pucColorDepth) +{ +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter GetModeColorDepth()==\n"); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "pModeInfo->Mode_ID_8bpp = 0x%x\n", pModeInfo->Mode_ID_8bpp); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "pModeInfo->Mode_ID_16bpp = 0x%x\n", pModeInfo->Mode_ID_16bpp); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "pModeInfo->Mode_ID_32bpp = 0x%x\n", pModeInfo->Mode_ID_32bpp); +#endif + if(pModeInfo->Mode_ID_8bpp == wModeNum) + { + *pucColorDepth = 8; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 GetModeColorDepth()== *pucColorDepth = %d\n", *pucColorDepth); +#endif + return true; + } + else if(pModeInfo->Mode_ID_16bpp == wModeNum) + { + *pucColorDepth = 16; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 GetModeColorDepth()== *pucColorDepth = %d\n", *pucColorDepth); +#endif + return true; + } + else if(pModeInfo->Mode_ID_32bpp == wModeNum) + { + *pucColorDepth = 32; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit3 GetModeColorDepth()== *pucColorDepth = %d\n", *pucColorDepth); +#endif + return true; + } + else + { + *pucColorDepth = 0; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit4 GetModeColorDepth()== *pucColorDepth = %d\n", *pucColorDepth); +#endif + return false; + } +} +/*---------------------------------------------------------------------------- +; +; GetModePitch() +; +; In: +; ModeNum = mode no +; Out: +; return = true, *pPitch = pitch in byte +; = false, fail +; +;---------------------------------------------------------------------------*/ +CI_STATUS GetModePitch(USHORT ModeNum, USHORT *pPitch) +{ + MODE_INFO *pModeInfo = NULL; + UCHAR ucColorDepth = 0; + + /* Don't find out any fit mode table in the vesa table */ + if(!Get_MODE_INFO(ModeNum, &pModeInfo)) + { + return false; + } + else + { + if(!GetModeColorDepth(ModeNum, pModeInfo, &ucColorDepth)) + { + return false; + } + else + { + ucColorDepth = ucColorDepth >> 4; + *pPitch = ((pModeInfo->H_Size << ucColorDepth)+0x7)&0xFFF8; + } + } + + return true; +} +/*---------------------------------------------------------------------------- +; +; ReadRegFromHW +; +; in: +; pRegOp = pointer to REG_OP table +; out: +; return = register value +; +;---------------------------------------------------------------------------*/ +USHORT ReadRegFromHW(REG_OP *pRegOp) +{ + USHORT wValue = 0x0; + UCHAR btemp = 0x0, bMasktemp = 0x0; + + while((pRegOp->RegGroup)!= NR) + { + if(pRegOp->RegGroup == CR) + { + /*CR */ + OutPort(COLOR_CRTC_INDEX,(pRegOp->RegIndex)); + btemp = (UCHAR)InPort(COLOR_CRTC_DATA); + } + else + { + /*SR */ + OutPort(SEQ_INDEX,(pRegOp->RegIndex)); + btemp = (UCHAR)InPort(SEQ_DATA); + } + + bMasktemp = (pRegOp->RegMask); + + /* Mask the bit that we need. */ + btemp &= bMasktemp; + + /* Shift all register into LSB. */ + while(!(bMasktemp & BIT0)) + { + bMasktemp = bMasktemp >> 1; + btemp = btemp >> 1; + } + + /* Shift the register and add in the value. */ + wValue |= (((USHORT)btemp) << (pRegOp->RegShiftBit)); + + /* Next register. */ + pRegOp++; + + } + + return wValue; +} + +/*---------------------------------------------------------------------------- +; +; WriteRegToHW +; +; in: +; pRegOp = pointer to REG_OP table +; value = value to be written +; +;---------------------------------------------------------------------------*/ +void WriteRegToHW(REG_OP *pRegOp, USHORT value) +{ + UCHAR btemp, btemp1; + UCHAR bCount; + UCHAR bMasktemp; + + while((pRegOp->RegGroup)!= NR) + { + btemp = 0x0; btemp1 = 0x0; + bCount = 0x0; bMasktemp = 0x0; + + bMasktemp = (pRegOp->RegMask); + + /* Shift all register into LSB. */ + while(!(bMasktemp & BIT0)) + { + bMasktemp = bMasktemp >> 1; + bCount ++; + } + + /* Calculate the value that we need to set into register. */ + btemp = value >> (pRegOp->RegShiftBit); + btemp &= (bMasktemp); + + /* Shift the data bit into right position. */ + if(!(pRegOp->RegMask & BIT0)) + { + btemp = btemp << bCount; + } + + if(pRegOp->RegGroup == CR) + { + /*CR */ + OutPort(COLOR_CRTC_INDEX,(pRegOp->RegIndex)); + btemp1 = (UCHAR)InPort(COLOR_CRTC_DATA); + btemp1 &= ~(pRegOp->RegMask); + btemp1 |= btemp; + OutPort(COLOR_CRTC_DATA,btemp1); + } + else + { + /*SR */ + OutPort(SEQ_INDEX,(pRegOp->RegIndex)); + btemp1 = (UCHAR)InPort(SEQ_DATA); + btemp1 &= ~(pRegOp->RegMask); + btemp1 |= btemp; + OutPort(SEQ_DATA,btemp1); + } + + pRegOp++; + + } + +} + +/*---------------------------------------------------------------------------- +; +; UnLockCR0ToCR7 +; +; in: +; none +; out: +; none +; +;---------------------------------------------------------------------------*/ +void UnLockCR0ToCR7() +{ + /* CR11[7] = 0 */ + SetCRReg(0x11, 0x00, BIT7); +} + +/*---------------------------------------------------------------------------- +; +; LockCR0ToCR7 +; +; in: +; none +; out: +; none +; +;---------------------------------------------------------------------------*/ +void LockCR0ToCR7() +{ + /* CR11[7] = 1 */ + SetCRReg(0x11, 0x80, BIT7); +} + +/*---------------------------------------------------------------------------- +; +; CheckForModeAvailable +; +; in: +; ModeNum = mode no. +; out: +; return = true, if mode is available. Else, return false +; +;---------------------------------------------------------------------------*/ +CI_STATUS CheckForModeAvailable(USHORT ModeNum) +{ + MODE_INFO *pModeInfo = NULL; + return Get_MODE_INFO_From_VESA_Table(ModeNum, &pModeInfo); +} +/*-------------------------------------------------------------------- +; +; CheckForNewDeviceAvailable() - +; +; Input: +; bDeviceIndex = device index +; return: +; true if device is supported +;--------------------------------------------------------------------*/ +CI_STATUS CheckForNewDeviceAvailable(UCHAR bDeviceIndex) +{ + PORT_CONFIG *pDevicePortConfig; + + return GetDevicePortConfig(bDeviceIndex, &pDevicePortConfig); +} + +void Display1TurnOnTX() +{ + +} + +void Display1TurnOffTX() +{ + +} + +void Display2TurnOnTX() +{ + +} + +void Display2TurnOffTX() +{ + +} + +/*---------------------------------------------------------------------------- +; +; TurnOnDigitalPort +; +; in: +; DisplayPath = device index +; +;---------------------------------------------------------------------------*/ +void TurnOnDigitalPort(UCHAR bDeviceIndex) +{ + PORT_CONFIG *pDevicePortConfig; + + if (GetDevicePortConfig(bDeviceIndex, &pDevicePortConfig)) + { + switch(pDevicePortConfig->PortID) + { + case CRT_PORT: + TurnOnDAC(); + TurnOnCRTPad(); + break; + + case DVP1: + TurnOnDVP1Pad(); + break; + + case DVP2: + TurnOnDVP2Pad(); + break; + + case DVP12: + TurnOnDVP12Pad(); + break; + } + } +} +/*---------------------------------------------------------------------------- +; +; TurnOffDigitalPort +; +; in: +; bDeviceIndex = device index +; +;---------------------------------------------------------------------------*/ +void TurnOffDigitalPort(UCHAR bDeviceIndex) +{ + PORT_CONFIG *pDevicePortConfig; + + if (GetDevicePortConfig(bDeviceIndex, &pDevicePortConfig)) + + switch(pDevicePortConfig->PortID) + { + case CRT_PORT: + TurnOffCRTPad(); +// TurnOffDAC(); + break; + + case DVP1: + TurnOffDVP1Pad(); + break; + + case DVP2: + TurnOffDVP2Pad(); + break; + + case DVP12: + TurnOffDVP12Pad(); + break; + } +} + +/*----------------------------------------------------------------------------- +; +; GetPortConnectPath +; +; in: +; PortType = 0: CRT port, 1: DVP1, 2: DVP2, 3: 24-bit DVP1+2 +; out: +; return = 0 if port connecting on display1 +; = 1 if port connecting on display2 +; +;-----------------------------------------------------------------------------*/ +UCHAR GetPortConnectPath(UCHAR PortType) +{ + UCHAR SR1F, PortMask; + + SR1F = GetSRReg(0x1F); + SR1F ^= 0x03; + + switch(PortType) + { + case CRT_PORT: + PortMask = BIT2; + break; + + case DVP1: + case DVP12: + PortMask = BIT0; + break; + + case DVP2: + PortMask = BIT1; + break; + } + + return ((SR1F & PortMask) ? 1 : 0); + +} + +/*---------------------------------------------------------------------------- +; +; TransDevIDtoBit +; +; in: +; DeviceIndex = device index +; out: +; return device bit +; +;---------------------------------------------------------------------------*/ +USHORT TransDevIDtoBit(UCHAR DeviceIndex) +{ + return (1 << (DeviceIndex - 1)); +} + +void TurnOnCRTPad() +{ + SetCRReg(0xA8, 0x00, BIT7); +} + +void TurnOffCRTPad() +{ + SetCRReg(0xA8, 0x80, BIT7); +} + +void TurnOnDVP1Pad() +{ + SetCRReg(0xA3, 0x80, BIT7); +} + +void TurnOffDVP1Pad() +{ + SetCRReg(0xA3, 0x00, BIT7); +} + +void TurnOnDVP2Pad() +{ + SetCRReg(0xA3, 0x40, BIT6); +} + +void TurnOffDVP2Pad() +{ + SetCRReg(0xA3, 0x00, BIT6); +} + +void TurnOnDVP12Pad() +{ + TurnOnDVP1Pad(); + TurnOnDVP2Pad(); +} + +void TurnOffDVP12Pad() +{ + TurnOffDVP1Pad(); + TurnOffDVP2Pad(); +} + +void TurnOnScaler(UCHAR bDisplayPath) +{ + if (bDisplayPath == DISP1) + SetSRReg(0x58, BIT0, BIT0); + else + SetSRReg(0x50, BIT0, BIT0); +} + +void TurnOffScaler(UCHAR bDisplayPath) +{ + if (bDisplayPath == DISP1) + SetSRReg(0x58, 0, BIT0); + else + SetSRReg(0x50, 0, BIT0); +} + +void TurnOnHorScaler(UCHAR bDisplayPath) +{ + if (bDisplayPath == DISP1) + SetSRReg(0x58, BIT2, BIT2); + else + SetSRReg(0x50, BIT2, BIT2); +} + +void TurnOffHorScaler(UCHAR bDisplayPath) +{ + if (bDisplayPath == DISP1) + SetSRReg(0x58, 0, BIT2); + else + SetSRReg(0x50, 0, BIT2); +} + +void TurnOnVerScaler(UCHAR bDisplayPath) +{ + if (bDisplayPath == DISP1) + SetSRReg(0x58, BIT1, BIT1); + else + SetSRReg(0x50, BIT1, BIT1); +} + +void TurnOffVerScaler(UCHAR bDisplayPath) +{ + if (bDisplayPath == DISP1) + SetSRReg(0x58, 0, BIT1); + else + SetSRReg(0x50, 0, BIT1); +} + + +void Set12BitDVP() +{ + SetSRReg(0x1E, 0x00, BIT3); +} + +void Set24BitDVP() +{ + SetSRReg(0x1E, 0x08, BIT3); +} + +void TurnOnDAC() +{ + SetCRReg(0xDF, 0x00, BIT2); +} +void TurnOffDAC() +{ + SetCRReg(0xDF, 0x04, BIT2); +} + +#if 0 +void Display1HWResetOn() +{ + SetCRReg(0x17, 0x00, BIT7); +} +void Display1HWResetOff() +{ + SetCRReg(0x17, 0x80, BIT7); +} + +void Display2HWResetOn() +{ + SetCRReg(0x33, 0x00, BIT4); +} +void Display2HWResetOn() +{ + SetCRReg(0x33, 0x10, BIT4); +} +#endif + +/*---------------------------------------------------------------------------- +; +; SerialLoadTable +; +; in: +; pucDisplay1VESAModeInitRegs = pointer to start of table +; (ucI2Cport = I2C port) +; (ucI2CAddr = I2C address) +; out: +; *ppucTablePointer = table end + 1 +; +;---------------------------------------------------------------------------*/ +void SerialLoadTable(UCHAR **ppucTablePointer, UCHAR ucI2Cport, UCHAR ucI2CAddr) +{ + UCHAR ucRegGroup; + + while (**ppucTablePointer != 0xFF) + { + ucRegGroup = **ppucTablePointer; + (*ppucTablePointer)++; + if (ucRegGroup & BITS) + { + SerialLoadRegBits(ppucTablePointer, ucRegGroup, 0, 0); + } + else + { + SerialLoadReg(ppucTablePointer, ucRegGroup, 0, 0); + } + } + (*ppucTablePointer)++; +} + +/*--------------------- +; +; SerialLoadRegBits +; +; in: +; pucDisplay1VESAModeInitRegs = pointer to start of table +; ucRegGroup = register group +; (ucI2Cport = I2C device address) +; (ucI2CAddr = I2C port) +; out: +; *ppucTablePointer = pointer to end of table +1 +; +;----------------------*/ +void SerialLoadRegBits(UCHAR **ppucTablePointer, UCHAR ucRegGroup, UCHAR ucI2Cport, UCHAR ucI2CAddr) +{ + UCHAR ucRegIndex, ucRegValue, ucMask; + ucRegGroup &= 0x7F; + + while (**ppucTablePointer != 0xFF) + { + ucRegIndex = **ppucTablePointer; + (*ppucTablePointer)++; + + ucRegValue = **ppucTablePointer; + (*ppucTablePointer)++; + + ucMask = **ppucTablePointer; + (*ppucTablePointer)++; + + switch(ucRegGroup) + { + case SR: + SetSRReg(ucRegIndex, ucRegValue, ucMask); + break; + + case CR: + SetCRReg(ucRegIndex, ucRegValue, ucMask); + break; + + case I2C: + break; + } + } + (*ppucTablePointer)++; +} + +/*--------------------- +; +; SerialLoadReg +; +; in: +; pucDisplay1VESAModeInitRegs = pointer to start of table +; ucRegGroup = register group +; (ucI2Cport = I2C device address) +; (ucI2CAddr = I2C port) +; out: +; *ppucTablePointer = pointer to end of table +1 +; +;----------------------*/ +void SerialLoadReg(UCHAR **ppucTablePointer, UCHAR ucRegGroup, UCHAR ucI2Cport, UCHAR ucI2CAddr) +{ + UCHAR ucRegIndex, ucRegValue; + + while (**ppucTablePointer != 0xFF) + { + ucRegIndex = **ppucTablePointer; + (*ppucTablePointer)++; + + ucRegValue = **ppucTablePointer; + (*ppucTablePointer)++; + + switch(ucRegGroup) + { + case SR: + SetSRReg(ucRegIndex, ucRegValue, 0xFF); + break; + + case CR: + SetCRReg(ucRegIndex, ucRegValue, 0xFF); + break; + + case GR: + SetGRReg(ucRegIndex, ucRegValue, 0xFF); + break; + + case I2C: + break; + } + } + (*ppucTablePointer)++; +} + + +void LoadDisplay1VESAModeInitRegs() +{ + UCHAR *pucDisplay1VESAModeInitRegs = (UCHAR*)Display1VESAModeInitRegs; + + OutPort(MISC_WRITE, 0x2F); + + UnLockCR0ToCR7(); + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "&pucDisplay1VESAModeInitRegs = 0x%x\n", &pucDisplay1VESAModeInitRegs); + SerialLoadTable(&pucDisplay1VESAModeInitRegs, 0, 0); + + ResetATTR(); + + SetARReg(0x10, *pucDisplay1VESAModeInitRegs); + pucDisplay1VESAModeInitRegs++; + SetARReg(0x11, *pucDisplay1VESAModeInitRegs); + pucDisplay1VESAModeInitRegs++; + SetARReg(0x12, *pucDisplay1VESAModeInitRegs); + pucDisplay1VESAModeInitRegs++; + SetARReg(0x13, *pucDisplay1VESAModeInitRegs); + pucDisplay1VESAModeInitRegs++; + SetARReg(0x14, *pucDisplay1VESAModeInitRegs); + + EnableATTR(); +} + +void VESASetBIOSData(USHORT ModeNum) +{ + /* no need to implement */ +} + +/*---------------------------------------------------------------------------- +; +; DisableDisplayPathAndDevice +; +; in: +; bDisplayPath = display path +; +;---------------------------------------------------------------------------*/ +void DisableDisplayPathAndDevice(UCHAR bDisplayPath) +{ + UCHAR bDeviceIndex = Get_DEV_ID(bDisplayPath); + + /* disable device */ + ControlPwrSeqOff(bDeviceIndex); + + /* turn off TX */ + + /* disable port */ + TurnOffDigitalPort(bDeviceIndex); + + /* disable display path */ + SequencerOff(bDisplayPath); +} + +CI_STATUS GetDevicePortConfig(UCHAR bDeviceIndex, PORT_CONFIG **ppDevicePortConfig) +{ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter GetDevicePortConfig()==\n"); + + *ppDevicePortConfig = pPortConfig; + + while(((*ppDevicePortConfig)->DevID != 0xFF) && ((*ppDevicePortConfig)->Attribute & Dev_SUPPORT)) + { + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "(*ppDevicePortConfig)->DevID = %x\n", (*ppDevicePortConfig)->DevID); + + if (bDeviceIndex == (*ppDevicePortConfig)->DevID) + { + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit1 GetDevicePortConfig()== return success\n"); + return true; + } + (*ppDevicePortConfig)++; + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit1 GetDevicePortConfig()== return fail!!\n"); + return false; +} + +void PowerSequenceOn() +{ + /* check if power sequence already on */ + if (!(GetSRReg(0x11) & BIT0)) + { + /* Power Sequence Control Pad Output Enable */ + SetSRReg(0x32, BIT1, BIT1); + + /* panel on */ + SetSRReg(0x11, BIT0, BIT0); + + /* delay for power sequence done */ + WaitPowerSequenceDone(); + } +} + +void PowerSequenceOff() +{ + /* check if power sequence already off */ + if (GetSRReg(0x11) & BIT0) + { + /* panel off */ + SetSRReg(0x11, 0, BIT0); + + /* wait power sequence done */ + WaitPowerSequenceDone(); + + /* Power Sequence Control Pad Output Disable */ + SetSRReg(0x32, 0, BIT1); + } +} + +void SequencerOn(UCHAR DisplayPath) +{ + if (DisplayPath == DISP1) + SetSRReg(0x01, 0, BIT5); + else + SetCRReg(0x33, 0, BIT0); +} + +void SequencerOff(UCHAR bDisplayPath) +{ + if (bDisplayPath == DISP1) + { + if (!(GetSRReg(0x01) & BIT5)) + { + LongWait(); + } + SetSRReg(0x01, BIT5, BIT5); + } + else + SetCRReg(0x33, BIT0, BIT0); +} + +void ControlPwrSeqOn(UCHAR bDeviceIndex) +{ + PORT_CONFIG *pDevicePortConfig; + /* check if LCD or LCD2 */ + if ((TransDevIDtoBit(bDeviceIndex) & (B_LCD+B_LCD2)) && (GetDevicePortConfig(bDeviceIndex, &pDevicePortConfig))) + { + if (pDevicePortConfig->Attribute & TX_PS) + { + if (pDevicePortConfig->TX_Enc_ID == TX_VT1636) + { +/* VT1636PowerSequenceOnOn();*/ + } + } + else if ((pDevicePortConfig->PortID == DVP1) || (pDevicePortConfig->PortID == DVP12)) + { + PowerSequenceOn(); + } + } +} + +void ControlPwrSeqOff(UCHAR bDeviceIndex) +{ + PORT_CONFIG *pDevicePortConfig; + /* check if LCD or LCD2 */ + if ((TransDevIDtoBit(bDeviceIndex) & (B_LCD+B_LCD2)) && (GetDevicePortConfig(bDeviceIndex, &pDevicePortConfig))) + { + if (pDevicePortConfig->Attribute & TX_PS) + { + if (pDevicePortConfig->TX_Enc_ID == TX_VT1636) + { +/* VT1636PowerSequenceOnOff();*/ + } + } + else if ((pDevicePortConfig->PortID == DVP1) || (pDevicePortConfig->PortID == DVP12)) + { + PowerSequenceOff(); + } + } +} +/*---------------------------------------------------------------------------- +; +; LongWait() - wait V sync of display1 +; +; in: +; none +; out: +; none +; +;---------------------------------------------------------------------------*/ +void LongWait() +{ + while (GetIS1Reg() & BIT3); + + while (!(GetIS1Reg() & BIT3)); +} + +UCHAR Get_DEV_ID(UCHAR DisplayPath) +{ + return ((DisplayPath == DISP1) ? ReadScratch(IDX_IGA1_DEV_ID) : ReadScratch(IDX_IGA2_DEV_ID)); +} + + +void Set_DEV_ID(UCHAR DeviceID, UCHAR DisplayPath) +{ + if (DisplayPath == DISP1) + WriteScratch(IDX_IGA1_DEV_ID, DeviceID); + else + WriteScratch(IDX_IGA2_DEV_ID, DeviceID); +} + + +UCHAR Get_NEW_DEV_ID(UCHAR DisplayPath) +{ + return ((DisplayPath == DISP1) ? ReadScratch(IDX_NEW_IGA1_DEV_ID) : ReadScratch(IDX_NEW_IGA2_DEV_ID)); +} + +void Set_NEW_DEV_ID(UCHAR DeviceID, UCHAR DisplayPath) +{ + if (DisplayPath == DISP1) + WriteScratch(IDX_NEW_IGA1_DEV_ID, DeviceID); + else + WriteScratch(IDX_NEW_IGA2_DEV_ID, DeviceID); +} + +USHORT Get_LCD_H_SIZE() +{ + USHORT wValue; + + wValue = (USHORT)ReadScratch(IDX_LCD_H_SIZE_OVERFLOW); + wValue <<= 8; + wValue |= (USHORT)ReadScratch(IDX_LCD_H_SIZE); + + return wValue; +} + +USHORT Get_LCD_V_SIZE() +{ + USHORT wValue; + + wValue = (USHORT)ReadScratch(IDX_LCD_V_SIZE_OVERFLOW); + wValue <<= 8; + wValue |= (USHORT)ReadScratch(IDX_LCD_V_SIZE); + + return wValue; +} + +ULONG Get_LCD_SIZE() +{ + ULONG dwValue; + + dwValue = (ULONG)Get_LCD_V_SIZE(); + dwValue <<= 16; + dwValue |= (ULONG)Get_LCD_H_SIZE(); + + return dwValue; +} + +USHORT Get_LCD2_H_SIZE() +{ + USHORT wValue; + + wValue = (USHORT)ReadScratch(IDX_LCD2_H_SIZE_OVERFLOW); + wValue <<= 8; + wValue |= (USHORT)ReadScratch(IDX_LCD2_H_SIZE); + + return wValue; +} + +USHORT Get_LCD2_V_SIZE() +{ + USHORT wValue; + + wValue = (USHORT)ReadScratch(IDX_LCD2_V_SIZE_OVERFLOW); + wValue <<= 8; + wValue |= (USHORT)ReadScratch(IDX_LCD2_V_SIZE); + + return wValue; +} + +ULONG Get_LCD2_SIZE() +{ + ULONG dwValue; + + dwValue = (ULONG)Get_LCD2_V_SIZE(); + dwValue <<= 16; + dwValue |= (ULONG)Get_LCD2_H_SIZE(); + + return dwValue; +} + +UCHAR Get_RRATE_ID(UCHAR DisplayPath) +{ + return ((DisplayPath == DISP1) ? ReadScratch(IDX_IGA1_RRATE_ID) : ReadScratch(IDX_IGA2_RRATE_ID)); +} + +void Set_RRATE_ID(UCHAR RRateID, UCHAR DisplayPath) +{ + if (DisplayPath == DISP1) + WriteScratch(IDX_IGA1_RRATE_ID, RRateID); + else + WriteScratch(IDX_IGA2_RRATE_ID, RRateID); +} + +UCHAR Get_LCD_TABLE_INDEX(void) +{ + return ReadScratch(IDX_LCD1_TABLE_INDEX); +} + +UCHAR Get_LCD2_TABLE_INDEX(void) +{ + return ReadScratch(IDX_LCD2_TABLE_INDEX); +} + +void Set_LCD_TABLE_INDEX(UCHAR bLCDIndex) +{ + WriteScratch(IDX_LCD1_TABLE_INDEX, bLCDIndex); +} + + +USHORT Get_VESA_MODE(UCHAR DisplayPath) +{ + UCHAR VESAMode, VESAModeOver; + + if (DisplayPath == DISP1) + { + VESAMode = ReadScratch(IDX_IGA1_VESA_MODE); + VESAModeOver = ReadScratch(IDX_IGA1_VESA_MODE_OVERFLOW); + } + else + { + VESAMode = ReadScratch(IDX_IGA2_VESA_MODE); + VESAModeOver = ReadScratch(IDX_IGA2_VESA_MODE_OVERFLOW); + } + + return ((USHORT)VESAModeOver) << 8 | (USHORT)VESAMode; +} + +void Set_VESA_MODE(USHORT ModeNum, UCHAR DisplayPath) +{ + if (DisplayPath == DISP1) + { + WriteScratch(IDX_IGA1_VESA_MODE, (UCHAR)ModeNum); + WriteScratch(IDX_IGA1_VESA_MODE_OVERFLOW, (UCHAR)(ModeNum >> 8)); + } + else + { + WriteScratch(IDX_IGA2_VESA_MODE, (UCHAR)ModeNum); + WriteScratch(IDX_IGA2_VESA_MODE_OVERFLOW, (UCHAR)(ModeNum >> 8)); + } +} + +void ResetATTR() +{ + InPort(COLOR_INPUT_STATUS1_READ); + InPort(MONO_INPUT_STATUS1_READ); +} + +void EnableATTR() +{ + ResetATTR(); + OutPort(ATTR_DATA_WRITE, 0x20); +} + +/* Set Cr register value with Mask */ +void SetCRReg(UCHAR bRegIndex, UCHAR bRegValue, UCHAR bMask) +{ + UCHAR btemp = 0x0; + + if(bMask != 0xFF) + { + OutPort(COLOR_CRTC_INDEX,bRegIndex); + btemp = (UCHAR)InPort(COLOR_CRTC_DATA); + bRegValue &= bMask; + btemp &=~(bMask); + btemp |= bRegValue; + OutPort(COLOR_CRTC_DATA,btemp); + } + else + { + OutPort(COLOR_CRTC_INDEX,bRegIndex); + OutPort(COLOR_CRTC_DATA,bRegValue); + } + + return; +} + +/* Get Cr register value */ +UCHAR GetCRReg(UCHAR bRegIndex) +{ + UCHAR btemp = 0x0; + + OutPort(COLOR_CRTC_INDEX,bRegIndex); + btemp = (UCHAR)InPort(COLOR_CRTC_DATA); + + return btemp; +} + +/* Set Sr register value with Mask */ +void SetSRReg(UCHAR bRegIndex, UCHAR bRegValue, UCHAR bMask) +{ + UCHAR btemp = 0x0; + + if(bMask != 0xFF) + { + OutPort(SEQ_INDEX,bRegIndex); + btemp = (UCHAR)InPort(SEQ_DATA); + bRegValue &= bMask; + btemp &=~(bMask); + btemp |= bRegValue; + OutPort(SEQ_DATA,btemp); + } + else + { + OutPort(SEQ_INDEX,bRegIndex); + OutPort(SEQ_DATA,bRegValue); + } + + return; +} + +/* Get Sr register value */ +UCHAR GetSRReg(UCHAR bRegIndex) +{ + UCHAR btemp = 0x0; + + OutPort(SEQ_INDEX,bRegIndex); + btemp = (UCHAR)InPort(SEQ_DATA); + + return btemp; +} + +void SetARReg(UCHAR index,UCHAR value) +{ + OutPort(ATTR_DATA_WRITE,index); + OutPort(ATTR_DATA_WRITE,value); +} + +UCHAR GetARReg(UCHAR index) +{ + UCHAR bTmp; + InPort(COLOR_INPUT_STATUS1_READ); + OutPort(ATTR_DATA_WRITE,index); + bTmp = (UCHAR)InPort(ATTR_DATA_READ); + InPort(COLOR_INPUT_STATUS1_READ); + OutPort(ATTR_DATA_WRITE,BIT5); + return bTmp; +} + +/* Set Gr register value with Mask */ +void SetGRReg(UCHAR bRegIndex, UCHAR bRegValue, UCHAR bMask) +{ + UCHAR btemp = 0x0; + + if(bMask != 0xFF) + { + OutPort(GRAPH_INDEX,bRegIndex); + btemp = (UCHAR)InPort(GRAPH_DATA); + bRegValue &= bMask; + btemp &=~(bMask); + btemp |= bRegValue; + OutPort(GRAPH_DATA,btemp); + } + else + { + OutPort(GRAPH_INDEX,bRegIndex); + OutPort(GRAPH_DATA,bRegValue); + } + + return; +} + +void SetMSReg(UCHAR bRegValue) +{ + OutPort(MISC_WRITE,bRegValue); +} + +UCHAR GetIS1Reg() +{ + return InPort(COLOR_INPUT_STATUS1_READ); +} + +/* Clear frame buffer */ +void ClearFrameBuffer(UCHAR DisplayPath,ULONG *pFrameBufferBase, MODE_INFO *pModeInfo, UCHAR ucColorDepth) +{ + ULONG dwWidth = (ULONG)pModeInfo->H_Size, dwHeight = (ULONG)pModeInfo->V_Size, dwFactor = 0; + ULONG i = 0; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter ClearFrameBuffer()==\n"); + /* get display1/2 starting address */ + + /* Check the color depth */ + switch(ucColorDepth) + { + case 8: + case 16: + case 32: + dwFactor = 32 / ucColorDepth; + break; + + default: + return; + } + + /* Clear */ + for(i = 0;i<((dwWidth*dwHeight)/dwFactor);i++) + { + *(pFrameBufferBase+i) = 0x00000000; + } + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit ClearFrameBuffer()==\n"); + +} + +ULONG Difference(ULONG Value1, ULONG Value2) +{ + if (Value1 > Value2) + return (Value1 - Value2); + else + return (Value2 - Value1); +} + +/*---------------------------------------------------------------------------- +; +; ReadScratch() +; +; in: +; Index = scratch index +; out: +; return = scratch data aligned to LSB +; +;---------------------------------------------------------------------------*/ +UCHAR ReadScratch(USHORT IndexMask) +{ + UCHAR Index = (UCHAR)(IndexMask >> 8); + UCHAR Mask = (UCHAR)IndexMask; + UCHAR RetValue; + + RetValue = GetCRReg(Index); + RetValue &= Mask; + + RetValue = AlignDataToLSB(RetValue, Mask); + + return RetValue; +} + +/*---------------------------------------------------------------------------- +; +; WriteScratch() +; +; in: +; Index = scratch index +; Data = data to be written +; out: +; none +;---------------------------------------------------------------------------*/ +void WriteScratch(USHORT IndexMask, UCHAR Data) +{ + UCHAR Index = (UCHAR)(IndexMask >> 8); + UCHAR Mask = (UCHAR)IndexMask; + + Data = AlignDataToMask(Data, Mask); + Data &= Mask; + SetCRReg(Index, Data, Mask); +} + +/*---------------------------------------------------------------------------- +; +; AlignDataToLSB() +; +; in: +; Data = data to be aligned +; Mask = mask of data +; out: +; return = aligned data +; +;---------------------------------------------------------------------------*/ +UCHAR AlignDataToLSB(UCHAR bData, UCHAR bMask) +{ + bData &= bMask; + + while ((bMask & BIT0) == 0) + { + bData >>= 1; + bMask >>= 1; + } + + return bData; +} + +/*---------------------------------------------------------------------------- +; +; AlignDataToMask() +; +; in: +; Data = data to be aligned +; Mask = mask of data +; out: +; return = aligned data +; +;---------------------------------------------------------------------------*/ +UCHAR AlignDataToMask(UCHAR bData, UCHAR bMask) +{ + while ((bMask & BIT0) == 0) + { + bData <<= 1; + bMask >>= 1; + } + + return bData; +} + +/*---------------------------------------------------------------------------- +; +; SetDPMS - +; Input: +; DPMSState = DPMS_ON, DPMS_STANDBY, DPMS_SUSPEND, DPMS_OFF +; DisplayPath +; Output: +; none +; +;---------------------------------------------------------------------------*/ +void SetDPMS(UCHAR DPMSState, UCHAR DisplayPath) +{ + UCHAR RegValue; + + if (DPMSState > DPMS__OFF) + RegValue = 3; + else if (DPMSState <= DPMS__SUSPEND) + RegValue = DPMSState; + + if (DisplayPath == DISP1) + SetCRReg(0xB6, RegValue, BIT1+BIT0); + else if (DisplayPath == DISP2) + SetCRReg(0x3E, RegValue, BIT1+BIT0); + +} +/*---------------------------------------------------------------------------- +; +; DetectMonitor() +; +; in: +; none +; out: +; return = true if CRT connected +; +;---------------------------------------------------------------------------*/ +CI_STATUS DetectMonitor() +{ + CI_STATUS ConnectStatus; + + /* CRA9 = sense data = 0x80 */ + SetCRReg(0xA9, 0x80, 0xFF); + + /* CRA8[6] = 1, start DAC sense */ + SetCRReg(0xA8, BIT6, BIT6); + + /* wait H sync */ + WaitDisplayPeriod(); + + /* ISR0[4] = 1, CRT attached */ + ConnectStatus = ((InPort(INPUT_STATUS_0_READ) & BIT4) ? true : false); + + SetCRReg(0xA8, 0x00, BIT6); + + return ConnectStatus; +} +/*---------------------------------------------------------------------------- +; +; WaitDisplayPeriod() - wait H sync of display1 +; +; in: +; none +; out: +; none +; +;---------------------------------------------------------------------------*/ +void WaitDisplayPeriod() +{ + while ((InPort(COLOR_INPUT_STATUS1_READ)&BIT0) == 1); + + while ((InPort(COLOR_INPUT_STATUS1_READ)&BIT0) == 0); +} + +/*---------------------------------------------------------------------------- +; +; WaitPowerSequenceDone() - SR32[2] = 1, power sequence on complete +; = 0, power sequence off complete +; +; Input: +; none +; Output: +; none +; +;---------------------------------------------------------------------------*/ +void WaitPowerSequenceDone() +{ + UCHAR SR32; + + SR32 = GetSRReg(0x32); + + /* loop while power sequence status not changed */ + while(SR32 == GetSRReg(0x32)); +} +/*-------------------------------------------------------------------- +; +; CheckForDSTNPanel() - +; +; Input: +; bDeviceIndex = device index +; return: +; true if device is DSTN panel +; +;--------------------------------------------------------------------*/ +CI_STATUS CheckForDSTNPanel(UCHAR bDeviceIndex) +{ + PORT_CONFIG *pDevicePortConfig; + + if (GetDevicePortConfig(bDeviceIndex, &pDevicePortConfig)) + { + if ((pDevicePortConfig->TX_Enc_ID == DSTN) && + ((pDevicePortConfig->PortID == DVP1) || (pDevicePortConfig->PortID == DVP12))) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } +} +/*------------------------------------------------------------------- +; +; GetVESAMEMSize() +; Input: +; none +; Output: +; return VESA Memory Size (Unit: MB) +; +;------------------------------------------------------------------*/ +USHORT GetVESAMEMSize() +{ + UCHAR bHWStrapping; + bHWStrapping = (GetCRReg(0xAA) & (BIT2+BIT1+BIT0)); + + return (2 << (bHWStrapping+3)); +} + +void SetDeviceSupport() +{ + PORT_CONFIG *pDevicePortConfig = pPortConfig; + + if (GetDevicePortConfig(CRT_ID, &pDevicePortConfig)) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "CRT supported\n"); + bCRTSUPPORT = true; + } + + if (GetDevicePortConfig(LCD_ID, &pDevicePortConfig)) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "LCD supported\n"); + bLCDSUPPORT = true; + } + + if (GetDevicePortConfig(DVI_ID, &pDevicePortConfig)) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "DVI supported\n"); + bDVISUPPORT = true; + } + + if (GetDevicePortConfig(TV_ID, &pDevicePortConfig)) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "TV supported\n"); + bTVSUPPORT = true; + } +} + +CI_STATUS VBE_SetMode(CBIOS_Extension *pCBIOSExtension) +{ + USHORT wModeNum = pCBIOSExtension->pCBiosArguments->reg.x.BX & 0x01FF; + USHORT wPitch = 0; + MODE_INFO *pModeInfo = NULL; + UCHAR bColorDepth = 0; + UCHAR bCurDeviceID, bNewDeviceID; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry VBE_SetMode Mode number 0x%x== \n",wModeNum); +#endif + if (wModeNum < 0x100) + { + SetVBERerurnStatus(VBEFunctionCallFail, pCBIOSExtension->pCBiosArguments); + return true; + } + + bCurDeviceID = Get_DEV_ID(DISP1); + bNewDeviceID = Get_NEW_DEV_ID(DISP1); + + if(!Get_MODE_INFO(wModeNum, &pModeInfo)) + { + SetVBERerurnStatus(VBEFunctionCallFail, pCBIOSExtension->pCBiosArguments); + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 VBE_SetMode return 0x%x== \n",VBEFunctionCallFail); + #endif + return true; + } + /* update mode no */ + Set_VESA_MODE(wModeNum, DISP1); + + /* cut data */ + SequencerOff(DISP1); + + /* disable scaler */ + TurnOffScaler(DISP1); + + if (bCurDeviceID != bNewDeviceID) + { + /* control power sequence off */ + ControlPwrSeqOff(bCurDeviceID); + + /* turn off TX if necessary */ + + /* turn off digital port */ + TurnOffDigitalPort(bCurDeviceID); + + /* update scratch IDX_IGA1_DEV_ID */ + Set_DEV_ID(bNewDeviceID, DISP1); + } + + /* update BDA? */ + + /* load Display1 VESA Mode init registers */ + LoadDisplay1VESAModeInitRegs(); + + /* load timing on display1 */ + LoadTiming(DISP1, wModeNum); + + /* set pitch */ + GetModePitch(wModeNum, &wPitch); + SetPitch(DISP1, wPitch); + + /* set color depth */ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, " /* set color depth */\n"); + Get_MODE_INFO(wModeNum, &pModeInfo); + GetModeColorDepth(wModeNum, pModeInfo, &bColorDepth); + SetColorDepth(DISP1, bColorDepth); + + /* load font */ + + /* load LUT */ + + /* clear FB */ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, " /* clear FB */\n"); + if(!(pCBIOSExtension->pCBiosArguments->reg.x.BX & BIT15)) + { + ClearFrameBuffer(DISP1,(ULONG*)(pCBIOSExtension->VideoVirtualAddress),pModeInfo,bColorDepth); + } + + /* set FIFO */ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, " /* set FIFO */\n"); + SetFIFO(DISP1); + + /* config digital port */ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, " /* config difital port */\n"); + ConfigDigitalPort(DISP1); + + TurnOnDigitalPort(bNewDeviceID); + + /* Turu on TX */ + + /* turn on power sequence if necessary */ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, " /* turn on power sequence if necessary */\n"); + ControlPwrSeqOn(bNewDeviceID); + + /* turn on sequencer */ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, " /* turn on sequencer */\n"); + SequencerOn(DISP1); + + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBIOSExtension->pCBiosArguments); + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 VBE_SetMode return 0x%x== \n",VBEFunctionCallSuccessful); +#endif + return true; +} +/*------------------------------------------------------------------- +; +; VBE_SetGetScanLineLength() +; +; Input1: set/get display2 pitch +; pCBiosArguments->AX = 0x4F06 +; BL = 0x00: Set Scan Line Length in Pixels +; 0x01: Get Scan Line Length +; 0x02: Set Scan Line Length in Bytes +; 0x03: Get Maximum Scan Line Length +; CX = Desired Width in Pixels if BL = 00 +; Desired Width in Bytes if BL = 02 +; +; Input2: set/get display2 pitch +; pCBiosArguments->AX = 0x4F14 +; BL = 0x00: Set Scan Line Length in Pixels +; 0x01: Get Scan Line Length +; 0x02: Set Scan Line in Bytes +; 0x03: Get Maximum Scan Line Length +; CX = Desired Width in Pixels if BL = 00 +; Desired Width in Bytes if BL = 02 +; +; Output: +; pCBiosArguments->AX = VBE Return Status +; BX = Bytes Per Scan Line +; CX = Actual Pixels Pet Scan Line (truncated to nearest complete pixel) +; DX = Maximum Number of Scan Lines +; +;------------------------------------------------------------------*/ +CI_STATUS VBE_SetGetScanLineLength (CBIOS_ARGUMENTS *pCBiosArguments) +{ + USHORT wModeNum; + MODE_INFO *pModeInfo = NULL; + UCHAR bColorDepth; + UCHAR bDispalyPath; + ULONG dwVESAMemSizeInBytes; + USHORT wMaxPitchInBytes, wCurrentVDispEnd; + USHORT VBEReturnStatus = VBEFunctionCallFail; + USHORT wPitchToBeSet = pCBiosArguments->reg.x.CX; /* maybe in pixel or in byte */ + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry VBE_SetGetScanLineLength== \n"); +#endif + if (pCBiosArguments->reg.x.AX == 0x4f06) + { + bDispalyPath = DISP1; + } + else if ((pCBiosArguments->reg.x.AX == 0x4f14) && ((pCBiosArguments->reg.lh.BH == 0x87)||(pCBiosArguments->reg.lh.BH == 0x08))) + { + bDispalyPath = DISP2; + } + else + { + SetVBERerurnStatus(VBEFunctionCallFail, pCBiosArguments); + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 VBE_SetGetScanLineLength return 0x%x== \n",VBEFunctionCallFail); + #endif + return true; + } + + if (pCBiosArguments->reg.lh.BL <=3) + { + wModeNum = Get_VESA_MODE(bDispalyPath); + + Get_MODE_INFO(wModeNum, &pModeInfo); + + if (GetModeColorDepth(wModeNum, pModeInfo, &bColorDepth)) + { + VBEReturnStatus = VBEFunctionCallNotSupported; + + dwVESAMemSizeInBytes = ((ULONG)GetVESAMEMSize()) << 20; + + wCurrentVDispEnd = GetVDisplayEnd(bDispalyPath); + + /* align pitch to 8-byte */ + if (((ULONG)(dwVESAMemSizeInBytes / (ULONG)wCurrentVDispEnd) & 0xFFFF0000) == 0) + { + wMaxPitchInBytes = (USHORT)(dwVESAMemSizeInBytes / (ULONG)wCurrentVDispEnd) & 0xFFF8; + } + else + { + wMaxPitchInBytes = 0xFFF8; + } + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==VBE_SetGetScanLineLength Color Depth = 0x%x== \n",bColorDepth); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==VBE_SetGetScanLineLength Mem Size = 0x%x== \n",dwVESAMemSizeInBytes); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==VBE_SetGetScanLineLength Current Disp End = 0x%x== \n",wCurrentVDispEnd); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==VBE_SetGetScanLineLength Max Pitch = 0x%x== \n",wMaxPitchInBytes); + #endif + if ((pCBiosArguments->reg.lh.BL == 0) || (pCBiosArguments->reg.lh.BL == 2)) + { + if (pCBiosArguments->reg.lh.BL == 0) + { + /* transform pitch size from pixels to bytes */ + wPitchToBeSet <<= (bColorDepth >> 4); + } + + if (wPitchToBeSet <= wMaxPitchInBytes) + { + SetPitch(bDispalyPath, wPitchToBeSet); + } + else + { + SetVBERerurnStatus(VBEReturnStatus, pCBiosArguments); + return true; + } + } + + if (pCBiosArguments->reg.lh.BL == 3) + { + /* get maximum pitch in bytes */ + pCBiosArguments->reg.x.BX = wMaxPitchInBytes; + } + else + { + /* get current pitch in bytes */ + pCBiosArguments->reg.x.BX =GetPitch(bDispalyPath); + } + + /* get current pitch in pixels */ + + pCBiosArguments->reg.x.CX = pCBiosArguments->reg.x.BX >> (bColorDepth >> 4); + pCBiosArguments->reg.x.DX = (dwVESAMemSizeInBytes / (USHORT)pCBiosArguments->reg.x.BX); + } + } +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 VBE_SetGetScanLineLength return 0x%x== \n",VBEReturnStatus); +#endif + SetVBERerurnStatus(VBEReturnStatus, pCBiosArguments); + return true; +} + +CI_STATUS OEM_QueryBiosInfo (CBIOS_ARGUMENTS *pCBiosArguments) +{ + USHORT VBEReturnStatus = VBEFunctionCallFail; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_QueryBiosInfo()== \n"); +#endif + + /* bx[15:0] = version number */ + + /*-------------------EBX PART--------------------; + ; ; + ;[31:24] : Branch version number + ;[23:8] : Customer Index + ;[7:0] : Release version number + */ + + + /*-------------------ECX PART--------------------; + ; ; + ; [31:18] : Reserved + ; [17:16] : DRAM bus width + ; 00 : 16bit + ; 01 : 32bit + ; 10 : 64bit + ; 11 : reserved + ; [15:4] : memory size in 256k unit + ; [3:0] : Memory data rate + ; 000 : DDR333 + ; 001 : DDR400 + ; 010 : DDR533 + ; 011 : DDR667 + ; 100 : DDR800 + ; xxx : Reserved + */ + + + /*-------------------EDX PART--------------------; + ; ; + ; VGA BIOS Build TIME ; + ;[31:16] : Year + ;[15: 8] : Month + ;[ 7: 0] : Day + */ + + + + /*-------------------SI PART--------------------; + ; ; + ; SI = supported device + */ + pCBiosArguments->reg.x.SI = 0; + if(bCRTSUPPORT) + { + pCBiosArguments->reg.x.SI |= B_CRT; + } + if(bLCDSUPPORT) + { + pCBiosArguments->reg.x.SI |= B_LCD; + } + if(bTVSUPPORT) + { + pCBiosArguments->reg.x.SI |= B_TV; + } + if(bDVISUPPORT) + { + pCBiosArguments->reg.x.SI |= B_DVI; + } + + /*-------------------EAX PART--------------------; + ; ; + */ + + VBEReturnStatus = VBEFunctionCallSuccessful; + SetVBERerurnStatus(VBEReturnStatus, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_QueryBiosInfo()== \n"); +#endif + return true; +} +CI_STATUS OEM_QueryBiosCaps (CBIOS_ARGUMENTS *pCBiosArguments) +{ + /* VBIOS not implemented */ +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_QueryBiosCaps()== \n"); +#endif + + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_QueryBiosCaps()== \n"); +#endif + return true; +} + +CI_STATUS OEM_QueryExternalDeviceInfo (CBIOS_ARGUMENTS *pCBiosArguments) +{ +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_QueryExternalDeviceInfo()== \n"); +#endif + + pCBiosArguments->reg.lh.BL = ReadScratch(IDX_SCRATCH_20); + pCBiosArguments->reg.ex.EBX <<= 16; + + pCBiosArguments->reg.lh.BH = ReadScratch(IDX_SCRATCH_21); + + pCBiosArguments->reg.lh.BL = ReadScratch(IDX_SCRATCH_22); + + pCBiosArguments->reg.ex.ECX = BIT16; + + pCBiosArguments->reg.x.DX = 0xFFFF; + + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_QueryExternalDeviceInfo()== \n"); +#endif + return true; +} + +CI_STATUS OEM_QueryDisplayPathInfo (CBIOS_ARGUMENTS *pCBiosArguments) +{ + UCHAR ScratchTempData; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_QueryDisplayPathInfo()== \n"); +#endif + pCBiosArguments->reg.ex.EBX = 0; + + pCBiosArguments->reg.lh.BL |= Get_NEW_DEV_ID(DISP1); + + pCBiosArguments->reg.ex.EBX <<= 2; + ScratchTempData = GetSRReg(0x58); /* First Display scaling control */ + if (ScratchTempData & BIT0) + { + ScratchTempData &= (BIT2 + BIT1); /* reserve H and V scaling control bits */ + ScratchTempData >>= 1; + pCBiosArguments->reg.lh.BL |= ScratchTempData; + } + + pCBiosArguments->reg.ex.EBX <<= 4; + pCBiosArguments->reg.lh.BL |= Get_DEV_ID(DISP1); + + pCBiosArguments->reg.ex.EBX <<= 7; + pCBiosArguments->reg.lh.BL |= Get_RRATE_ID(DISP1); + + pCBiosArguments->reg.ex.EBX <<= 9; + pCBiosArguments->reg.x.BX |= Get_VESA_MODE(DISP1); + + + pCBiosArguments->reg.ex.ECX = 0; + + pCBiosArguments->reg.lh.CL |= Get_NEW_DEV_ID(DISP1); + + pCBiosArguments->reg.ex.ECX <<= 2; + ScratchTempData = GetSRReg(0x50); /* Second Display scaling control */ + if (ScratchTempData & BIT0) + { + ScratchTempData &= (BIT2 + BIT1); /* reserve H and V scaling control bits */ + ScratchTempData >>= 1; + pCBiosArguments->reg.lh.BL |= ScratchTempData; + } + + pCBiosArguments->reg.ex.ECX <<= 4; + pCBiosArguments->reg.lh.CL |= Get_DEV_ID(DISP2); + + pCBiosArguments->reg.ex.ECX <<= 7; + pCBiosArguments->reg.lh.CL |= Get_RRATE_ID(DISP2); + + pCBiosArguments->reg.ex.ECX <<= 9; + pCBiosArguments->reg.x.CX |= Get_VESA_MODE(DISP2); + + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_QueryDisplayPathInfo()== \n"); +#endif + return true; + +} + +CI_STATUS OEM_QueryDeviceConnectStatus (CBIOS_ARGUMENTS *pCBiosArguments) +{ + UCHAR *pucPCIDataStruct = (UCHAR*)PCIDataStruct; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_QueryDeviceConnectStatus()== \n"); +#endif + pCBiosArguments->reg.x.BX = 0; + + if (*(USHORT*)(pucPCIDataStruct + OFF_DID) == 0x2010) + { + if (GetSRReg(0x3c) & BIT0) + { + pCBiosArguments->reg.x.BX |= B_CRT; + } + } + else + { + /* Detect Monitor From EDID */ + } + + if (bLCDSUPPORT) + { + pCBiosArguments->reg.x.BX |= B_LCD; + } + + if (bDVISUPPORT) + { + if (*(USHORT*)(((UCHAR*)PCIDataStruct) + OFF_DID) == 0x2010) + { + if (GetSRReg(0x3c) & BIT1) + { + pCBiosArguments->reg.x.BX |= B_DVI; + } + } + else + { + /* Query DVI Connect Status */ + } + } + + if (bTVSUPPORT) + { + /* TV DAC Sense */ + } + + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_QueryDeviceConnectStatus()== \n"); +#endif + return true; +} + +CI_STATUS OEM_QuerySupportedMode (CBIOS_ARGUMENTS *pCBiosArguments) +{ + MODE_INFO *pModeInfo; + RRATE_TABLE *pRRateTable; + int RRateTableIndex = 0; + int ModeNumIndex; + USHORT wModeNum; + USHORT wSerialNumber; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter OEM_QuerySupportedMode()== \n"); +#endif + wSerialNumber = pCBiosArguments->reg.x.CX; + pModeInfo = (MODE_INFO*)pVESATable; + + while (pModeInfo->H_Size != 0xFFFF) + { +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "pModeInfo->H_Size = %d \n", pModeInfo->H_Size); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "pModeInfo->V_Size = %d \n", pModeInfo->V_Size); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "sizeof(RRATE_TABLE) = %d \n", sizeof(RRATE_TABLE)); +#endif + for (ModeNumIndex = 0; ModeNumIndex < 3; ModeNumIndex++) + { + switch (ModeNumIndex) + { + case 0: + wModeNum = pModeInfo->Mode_ID_8bpp; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "case 0: wModeNum = 0x%x \n", wModeNum); + break; + case 1: + wModeNum = pModeInfo->Mode_ID_16bpp; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "case 1: wModeNum = 0x%x \n", wModeNum); + break; + case 2: + wModeNum = pModeInfo->Mode_ID_32bpp; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "case 2: wModeNum = 0x%x \n", wModeNum); + break; + } + + pRRateTable = (RRATE_TABLE*)((int)pModeInfo + sizeof(MODE_INFO)); + + for (RRateTableIndex = 0; RRateTableIndex < pModeInfo->RRTableCount; RRateTableIndex++, pRRateTable++) + { + + xf86DrvMsgVerb(0, X_INFO, 5, "pRRateTable = 0x%x \n", pRRateTable); + + if ((pRRateTable->Attribute & DISABLE) == 0) + { + if (wSerialNumber == 0) + { + /* BX = VESA mode number */ + pCBiosArguments->reg.x.BX = wModeNum; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "mode num = 0x%x \n", pCBiosArguments->reg.x.BX); + + /* CL = Color depth */ + GetModeColorDepth(wModeNum, pModeInfo, &pCBiosArguments->reg.lh.CL); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "color depth = %d \n", pCBiosArguments->reg.lh.CL); + + /* CH = Refresh rate index */ + pCBiosArguments->reg.lh.CH = pRRateTable->RRate_ID; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "RRate ID = %d \n", pCBiosArguments->reg.lh.CH); + + /* EDX = mode resolution */ + pCBiosArguments->reg.ex.EDX = (((ULONG)pModeInfo->V_Size) << 16) | (ULONG)pModeInfo->H_Size; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "H x V = %d x %d \n", pCBiosArguments->reg.x.DX, pCBiosArguments->reg.ex.EDX>>16); + + /* ESI = attribute */ + pCBiosArguments->reg.x.SI = pRRateTable->Attribute; + + /* EDI = pixel clock */ + pCBiosArguments->reg.ex.EDI = pRRateTable->Clock; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "dot clk = %dkhz \n", pCBiosArguments->reg.ex.EDI); + + SetVBERerurnStatus (VBEFunctionCallSuccessful, pCBiosArguments); + + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit1 OEM_QuerySupportedMode() return 0x%x== \n", VBEFunctionCallSuccessful); + #endif + return true; + } + else + { + wSerialNumber--; + } + } + } + } + pModeInfo = (MODE_INFO*)((int)pModeInfo + sizeof(MODE_INFO) + pModeInfo->RRTableCount*sizeof(RRATE_TABLE)); + } + + pModeInfo = (MODE_INFO*)(&CInt10VESATable); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "*pModeInfo = %X \n", *pModeInfo); + + while (pModeInfo->H_Size != 0xFFFF) + { +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "pModeInfo->H_Size = %d \n", pModeInfo->H_Size); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "pModeInfo->V_Size = %d \n", pModeInfo->V_Size); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "sizeof(RRATE_TABLE) = %d \n", sizeof(RRATE_TABLE)); +#endif + for (ModeNumIndex = 0; ModeNumIndex < 3; ModeNumIndex++) + { + switch (ModeNumIndex) + { + case 0: + wModeNum = pModeInfo->Mode_ID_8bpp; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "case 0: wModeNum = 0x%x \n", wModeNum); + break; + case 1: + wModeNum = pModeInfo->Mode_ID_16bpp; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "case 1: wModeNum = 0x%x \n", wModeNum); + break; + case 2: + wModeNum = pModeInfo->Mode_ID_32bpp; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "case 2: wModeNum = 0x%x \n", wModeNum); + break; + } + + pRRateTable = (RRATE_TABLE*)((int)pModeInfo + sizeof(MODE_INFO)); + + for (RRateTableIndex = 0; RRateTableIndex < pModeInfo->RRTableCount; RRateTableIndex++, pRRateTable++) + { + + xf86DrvMsgVerb(0, X_INFO, 5, "pRRateTable = 0x%x \n", pRRateTable); + + if ((pRRateTable->Attribute & DISABLE) == 0) + { + if (wSerialNumber == 0) + { + /* BX = VESA mode number */ + pCBiosArguments->reg.x.BX = wModeNum; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "mode num = 0x%x \n", pCBiosArguments->reg.x.BX); + + /* CL = Color depth */ + GetModeColorDepth(wModeNum, pModeInfo, &pCBiosArguments->reg.lh.CL); + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "color depth = %d \n", pCBiosArguments->reg.lh.CL); + + /* CH = Refresh rate index */ + pCBiosArguments->reg.lh.CH = pRRateTable->RRate_ID; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "RRate ID = %d \n", pCBiosArguments->reg.lh.CH); + + /* EDX = mode resolution */ + pCBiosArguments->reg.ex.EDX = (((ULONG)pModeInfo->V_Size) << 16) | (ULONG)pModeInfo->H_Size; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "H x V = %d x %d \n", pCBiosArguments->reg.x.DX, pCBiosArguments->reg.ex.EDX>>16); + + /* ESI = attribute */ + pCBiosArguments->reg.x.SI = pRRateTable->Attribute; + + /* EDI = pixel clock */ + pCBiosArguments->reg.ex.EDI = pRRateTable->Clock; + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "dot clk = %dkhz \n", pCBiosArguments->reg.ex.EDI); + + SetVBERerurnStatus (VBEFunctionCallSuccessful, pCBiosArguments); + + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit1 OEM_QuerySupportedMode() return 0x%x== \n", VBEFunctionCallSuccessful); + #endif + return true; + } + else + { + wSerialNumber--; + } + } + } + } + pModeInfo = (MODE_INFO*)((int)pModeInfo + sizeof(MODE_INFO) + pModeInfo->RRTableCount*sizeof(RRATE_TABLE)); + } + + SetVBERerurnStatus (VBEFunctionCallFail, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, " Exit2 OEM_QuerySupportedMode() return 0x%x== \n", VBEFunctionCallFail); +#endif + return true; + +} + +CI_STATUS OEM_QueryLCDPanelSizeMode (CBIOS_ARGUMENTS *pCBiosArguments) +{ + MODE_INFO *pModeInfo; + PANEL_TABLE *pPanelTable; + UCHAR bColorDepth = pCBiosArguments->reg.lh.CL; + USHORT wModeNum; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter OEM_QueryLCDPanelSizeMode()== \n"); +#endif + + SetVBERerurnStatus (VBEFunctionCallFail, pCBiosArguments); + + if (!bLCDSUPPORT) + return true; + + if (!GetModePointerFromLCDTable(LCD_ID, &pModeInfo, &pPanelTable)) + return true; + + switch (bColorDepth) + { + case 0: + wModeNum = pModeInfo->Mode_ID_8bpp; + pCBiosArguments->reg.lh.CL = 8; + break; + case 1: + wModeNum = pModeInfo->Mode_ID_16bpp; + pCBiosArguments->reg.lh.CL = 16; + break; + case 2: + wModeNum = pModeInfo->Mode_ID_32bpp; + pCBiosArguments->reg.lh.CL = 32; + break; + default: + SetVBERerurnStatus (VBEFunctionCallFail, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 OEM_QueryLCDPanelSizeMode() return 0x%x== \n", VBEFunctionCallFail); +#endif + return true; + } + + /* BX = VESA mode number */ + pCBiosArguments->reg.x.BX = wModeNum; + + /* CH = Refresh rate index */ + pCBiosArguments->reg.lh.CH = pPanelTable->Timing.RRate_ID; + + /* EDX = mode resolution */ + pCBiosArguments->reg.ex.EDX = (ULONG)pModeInfo->H_Size | ((ULONG)pModeInfo->V_Size) << 16; + + /* SI = attribute */ + pCBiosArguments->reg.x.SI = pPanelTable->Timing.Attribute; + + /* EDI = pixel clock */ + pCBiosArguments->reg.ex.EDI = pPanelTable->Timing.Clock; + + SetVBERerurnStatus (VBEFunctionCallSuccessful, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 OEM_QueryLCDPanelSizeMode() return 0x%x== \n", VBEFunctionCallSuccessful); +#endif + return true; +} + +CI_STATUS OEM_QueryLCDPWMLevel(CBIOS_ARGUMENTS *pCBiosArguments) +{ +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_QueryLCDPWMLevel()== \n"); +#endif + SetVBERerurnStatus (VBEFunctionCallFail, pCBiosArguments); + + if (!bLCDSUPPORT) + return true; + + if ((GetSRReg(0x30)&0x03) == 0x03 ) + pCBiosArguments->reg.lh.BL = GetSRReg(0x30); + else + pCBiosArguments->reg.lh.BL = 0; + + SetVBERerurnStatus (VBEFunctionCallSuccessful, pCBiosArguments); + + return true; +} + +CI_STATUS OEM_QueryTVConfiguration (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_QueryTV2Configuration (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_QueryHDTVConfiguration (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_QueryHDTV2Configuration (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_QueryHDMIConfiguration (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_QueryHDMI2Configuration (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetActiveDisplayDevice (CBIOS_ARGUMENTS *pCBiosArguments) +{ + UCHAR bDeviceIndex1 = Get_DEV_ID(DISP1); + UCHAR bDeviceIndex2 = Get_DEV_ID(DISP2); + UCHAR bNewDeviceIndex1 = pCBiosArguments->reg.lh.CL & 0x0F; + UCHAR bNewDeviceIndex2 = (pCBiosArguments->reg.lh.CL >> 4) & 0x0F; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_SetActiveDisplayDevice()== \n"); +#endif + + /* check if new device is available */ + if ((!CheckForNewDeviceAvailable(bNewDeviceIndex1)&& (bNewDeviceIndex1!=0)) || (!CheckForNewDeviceAvailable(bNewDeviceIndex2)&& (bNewDeviceIndex2!=0))) + { + SetVBERerurnStatus(VBEFunctionCallFail, pCBiosArguments); + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 OEM_SetActiveDisplayDevice() return 0x%x== \n", VBEFunctionCallFail); + #endif + return true; + } + + if(CheckForDSTNPanel(bNewDeviceIndex1) || CheckForDSTNPanel(bNewDeviceIndex2)) + { + bNewDeviceIndex1 = 0; + } + + if (bDeviceIndex1 != bNewDeviceIndex1) + { + if (bNewDeviceIndex1 == 0) + { + DisableDisplayPathAndDevice(DISP1); + Set_DEV_ID(bNewDeviceIndex1, DISP1); + } + Set_NEW_DEV_ID(bNewDeviceIndex1, DISP1); + } + + if (bDeviceIndex2 != bNewDeviceIndex2) + { + if (bNewDeviceIndex2 == 0) + { + DisableDisplayPathAndDevice(DISP2); + Set_DEV_ID(bNewDeviceIndex2, DISP2); + } + Set_NEW_DEV_ID(bNewDeviceIndex2, DISP2); + } + + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBiosArguments); +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 OEM_SetActiveDisplayDevice() return 0x%x== \n", VBEFunctionCallSuccessful); +#endif + return true; +} +CI_STATUS OEM_SetVESAModeForDisplay2 (CBIOS_Extension *pCBIOSExtension) +{ + USHORT wModeNum = pCBIOSExtension->pCBiosArguments->reg.x.CX & 0x01FF; + USHORT wPitch = 0; + MODE_INFO *pModeInfo = NULL; + UCHAR bColorDepth = 0; + UCHAR bCurDeviceID, bNewDeviceID; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_SetVESAModeForDisplay2()== \n"); +#endif + + if (wModeNum < 0x100) + { + SetVBERerurnStatus(VBEFunctionCallFail, pCBIOSExtension->pCBiosArguments); + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 OEM_SetVESAModeForDisplay2() return 0x%x== \n", VBEFunctionCallFail); + #endif + return true; + } + + bCurDeviceID = Get_DEV_ID(DISP2); + bNewDeviceID = Get_NEW_DEV_ID(DISP2); + + /* check if mode is supported no matter which device is preferred */ + if(!Get_MODE_INFO(wModeNum, &pModeInfo)) + { + SetVBERerurnStatus(VBEFunctionCallFail, pCBIOSExtension->pCBiosArguments); + #if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 OEM_SetVESAModeForDisplay2() return 0x%x== \n", VBEFunctionCallFail); + #endif + return true; + } + /* update mode no */ + Set_VESA_MODE(wModeNum, DISP2); + + /* cut data */ + SequencerOff(DISP2); + + /* disable scaler */ + TurnOffScaler(DISP2); + + if (bCurDeviceID != bNewDeviceID) + { + /* control power sequence off */ + ControlPwrSeqOff(bCurDeviceID); + + /* turn off TX if necessary */ + + /* turn off digital port */ + TurnOffDigitalPort(bCurDeviceID); + + /* update scratch IDX_IGA2_DEV_ID */ + Set_DEV_ID(bNewDeviceID, DISP2); + } + + /* load Display2 VESA Mode init registers??*/ + + /* load timing on display2 */ + LoadTiming(DISP2, wModeNum); + + /* set pitch */ + GetModePitch(wModeNum, &wPitch); + SetPitch(DISP2, wPitch); + + /* set color depth */ + Get_MODE_INFO(wModeNum, &pModeInfo); + GetModeColorDepth(wModeNum, pModeInfo, &bColorDepth); + SetColorDepth(DISP2, bColorDepth); + + /* load font */ + + /* load LUT */ + + /* clear FB */ + if(!(pCBIOSExtension->pCBiosArguments->reg.x.CX & BIT15)) + { + ClearFrameBuffer(DISP2,(ULONG*)(pCBIOSExtension->VideoVirtualAddress),pModeInfo,bColorDepth); + } + + /* set FIFO */ + SetFIFO(DISP2); + + /* config digital port */ + ConfigDigitalPort(DISP2); + + TurnOnDigitalPort(bNewDeviceID); + + /* Turu on TX */ + + /* turn on power sequence if necessary */ + ControlPwrSeqOn(bNewDeviceID); + + SequencerOn(DISP2); + + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBIOSExtension->pCBiosArguments); + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit3 OEM_SetVESAModeForDisplay2() return 0x%x== \n", VBEFunctionCallSuccessful); +#endif + return true; +} + +CI_STATUS OEM_SetDevicePowerState (CBIOS_ARGUMENTS *pCBiosArguments) +{ + UCHAR display1DeviceID, display2DeviceID, TargetDevice, DMPSState; + USHORT VBEReturnStatus = VBEFunctionCallFail; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_SetDevicePowerState()== \n"); +#endif + + TargetDevice = pCBiosArguments->reg.lh.CL & 0x0F; + DMPSState = pCBiosArguments->reg.lh.CL & (BIT1+BIT0); + display1DeviceID = Get_DEV_ID(DISP1); + display2DeviceID = Get_DEV_ID(DISP2); + + if (display1DeviceID == TargetDevice) + { + SetDPMS(DMPSState, DISP1); + VBEReturnStatus = VBEFunctionCallSuccessful; + } + else if (display2DeviceID == TargetDevice) + { + SetDPMS(DMPSState, DISP2); + VBEReturnStatus = VBEFunctionCallSuccessful; + } + + SetVBERerurnStatus(VBEReturnStatus, pCBiosArguments); + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_SetDevicePowerState() return 0x%x== \n", VBEFunctionCallSuccessful); +#endif + return true; +} + +CI_STATUS OEM_SetRefreshRate (CBIOS_ARGUMENTS *pCBiosArguments) +{ + UCHAR bRRateID, bDisplayPath; + bRRateID = pCBiosArguments->reg.lh.CL & 0x7F; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_SetRefreshRate()== \n"); +#endif + + if ( pCBiosArguments->reg.x.BX == SetDisplay1RefreshRate) + bDisplayPath = DISP1; + else + bDisplayPath = DISP2; + + Set_RRATE_ID(bRRateID, bDisplayPath); + + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBiosArguments); + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_SetRefreshRate() return 0x%x== \n", VBEFunctionCallSuccessful); +#endif + return true; +} + +CI_STATUS OEM_SetLCDPWMLevel (CBIOS_ARGUMENTS *pCBiosArguments) +{ + SetSRReg(0x2F,7,0xFF); + SetSRReg(0x30,pCBiosArguments->reg.lh.CL,0xFF); + return true; +} + +CI_STATUS OEM_SetTVType (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetTV2Type (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetTVConnectType (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetTV2ConnectType (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetHDTVConnectType (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetHDTV2ConnectType (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetHDMIType (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetHDMIOutputSignal (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} +CI_STATUS OEM_SetHDMI2OutputSignal (CBIOS_ARGUMENTS *pCBiosArguments) +{ + return true; +} + +CI_STATUS OEM_VideoPOST (CBIOS_ARGUMENTS *pCBiosArguments) +{ + UCHAR i = 0,btemp = 0x0,btemp1 = 0x0; + CI_STATUS bDDRII400 = true; + UCHAR *pucPOSTInItRegs = POSTInItRegs; + UCHAR *pucDDRII400Tbl = DDRII400Tbl; + UCHAR *pucDDRII533Tbl = DDRII533Tbl; + UCHAR *pucExtendRegs2 = ExtendRegs2; + +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Entry OEM_VideoPOST()== \n"); +#endif + + /* Enable VGA */ + btemp = InPort(RIO_VGA_ENABLE); + btemp |= 1; + OutPort(RIO_VGA_ENABLE,btemp); + + /* Select 3D4 as CRTC I/O base & Add memory access */ + btemp = InPort(MISC_READ); + btemp |= 3; + OutPort(MISC_WRITE,btemp); + + /* Open write key */ + SetCRReg(0x80, 0xA8, 0xFF); + + /* Clear Scratch pad */ + for(i = 0x81;i < 0x9F;i++) + { + SetCRReg(i, 0x00, 0xFF); + } + + /* Load DRAM timing */ + /* Get HW Trapping */ + btemp = GetCRReg(0xAB); + if((btemp & 0x3) == 0x3) + { + bDDRII400 = false; + } + + if(bDDRII400) + { + /* Set memory PLL(Memory clock:200MHz NS:0x1B, MS:0x00, RS:0x02) */ + SetCRReg(0xD9, 0x00, 0x80); + SetCRReg(0xD8, 0x9B, 0xFF); + } + else + { + /* Set memory PLL(Memory clock:266MHz NS:0x38, MS:0x00, RS:0x01) */ + SetCRReg(0xD9, 0x80, 0x80); + SetCRReg(0xD8, 0x78, 0xFF); + } + + /* Fire memory PLL timing setting */ + /* btemp = GetCRReg(0xBB); */ + btemp = 0x00; + SetCRReg(0xBB, btemp, 0xFF); + + /* Open LCK PLL */ + /* SetCRReg(0xB4, 0x01, 0x01); */ + + /* Load extend table */ + SerialLoadTable(&pucPOSTInItRegs, 0, 0); + + /* Write the default disp1 scratch pad as CRT */ + Set_NEW_DEV_ID(0, DISP1); + + if(bDDRII400) + { + /* Load DDRII400 timing table. */ + SerialLoadTable(&pucDDRII400Tbl, 0, 0); + } + else + { + /* Load DDRII533 timing table. */ + SerialLoadTable(&pucDDRII533Tbl, 0, 0); + } + + /* Wait for DDRII setting */ + do{ + btemp = GetCRReg(0x5D); + btemp &= 0x80; + btemp1 = GetCRReg(0x5E); + btemp1 &= 0x01; + }while((btemp != 0x80)||(btemp1 != 0x01)); + + /* Set the other registers */ + SerialLoadTable(&pucExtendRegs2, 0, 0); + /* SetDCC */ +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit OEM_VideoPOST()== \n"); +#endif + return true; +} + +void* SearchString(char *pcKeyWord, UCHAR *from) +{ + int i, lenKeyWord; + + lenKeyWord = strlen(pcKeyWord); + for(i = 0; i < BIOS_ROM_SIZE; i++) + { + if ((*pcKeyWord == *(from+i)) && !memcmp(pcKeyWord, from+i, lenKeyWord)) + { + return from+i; + } + } + + return NULL; +} + +void ParseTable(char* pcKeyWord, UCHAR *from, UCHAR **pointer) +{ + *pointer = (UCHAR*)SearchString(pcKeyWord, from); + *pointer += strlen(pcKeyWord); +} + +CI_STATUS OEM_CINT10DataInit (CBIOS_ARGUMENTS *pCBiosArguments) +{ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "BIOS virtual = %x", pCBiosArguments->reg.ex.ECX); + + ParseTable("PCFG", (UCHAR*)pCBiosArguments->reg.ex.ECX, (UCHAR**)(&pPortConfig)); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "Port Config = %x", pPortConfig); + + ParseTable("VPIT", (UCHAR*)pCBiosArguments->reg.ex.ECX, (UCHAR**)(&pVESATable)); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "VESA Table = %x", pVESATable); + + ParseTable("LCDTBL", (UCHAR*)pCBiosArguments->reg.ex.ECX, (UCHAR**)(&pLCDTable)); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "LCD Table = %x", pLCDTable); + + ParseTable("PCIR", (UCHAR*)pCBiosArguments->reg.ex.ECX, (UCHAR**)(&PCIDataStruct)); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "PCI Data Struct = %x", PCIDataStruct); + + ParseTable("D1INIT", (UCHAR*)pCBiosArguments->reg.ex.ECX, (UCHAR**)(&Display1VESAModeInitRegs)); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "Display1 VESA Mode Init Regs = %x", Display1VESAModeInitRegs); + + SetDeviceSupport(); +#if 0 + ParseTable("??????", &ExtendRegs); // POST init table + ParseTable("??????", &ExtendRegs2); // POST init table + ParseTable("??????", &DDRII400Tbl); // DDR400 DRAM table + ParseTable("??????", &DDRII533Tbl); // DDR533 DRAM table +#endif + SetVBERerurnStatus(VBEFunctionCallSuccessful, pCBiosArguments); +} + +CI_STATUS CInt10(CBIOS_Extension *pCBIOSExtension) +{ + CI_STATUS CInt10_Status = false; +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter CInt10(EAX = %x, EBX = %x, ECX = %x, EDX = %x, ESI = %x, EDI = %x)==\n", + pCBIOSExtension->pCBiosArguments->reg.ex.EAX, pCBIOSExtension->pCBiosArguments->reg.ex.EBX, + pCBIOSExtension->pCBiosArguments->reg.ex.ECX, pCBIOSExtension->pCBiosArguments->reg.ex.EDX, + pCBIOSExtension->pCBiosArguments->reg.ex.ESI, pCBIOSExtension->pCBiosArguments->reg.ex.EDI); +#endif + + + /* Fill related IO address */ + Relocate_IOAddress = pCBIOSExtension->IOAddress; + + switch(pCBIOSExtension->pCBiosArguments->reg.x.AX) + { + case VBESetMode: + CInt10_Status = VBE_SetMode(pCBIOSExtension); + break; + + case VBESetGetScanLineLength: + CInt10_Status = VBE_SetGetScanLineLength(pCBIOSExtension->pCBiosArguments); + break; + + case OEMFunction: + switch(pCBIOSExtension->pCBiosArguments->reg.x.BX) + { + case QueryBiosInfo: /* 0000 */ + CInt10_Status = OEM_QueryBiosInfo(pCBIOSExtension->pCBiosArguments); + break; + case QueryBiosCaps: /* 0001 */ + CInt10_Status = OEM_QueryBiosCaps(pCBIOSExtension->pCBiosArguments); + break; + case QueryExternalDeviceInfo: /* 0100 */ + CInt10_Status = OEM_QueryExternalDeviceInfo(pCBIOSExtension->pCBiosArguments); + break; + case QueryDisplayPathInfo: /* 0200 */ + CInt10_Status = OEM_QueryDisplayPathInfo(pCBIOSExtension->pCBiosArguments); + break; + case QueryDeviceConnectStatus: /* 0201 */ + CInt10_Status = OEM_QueryDeviceConnectStatus(pCBIOSExtension->pCBiosArguments); + break; + case QuerySupportedMode: /* 0202 */ + CInt10_Status = OEM_QuerySupportedMode(pCBIOSExtension->pCBiosArguments); + break; + case QueryLCDPanelSizeMode: /* 0203 */ + CInt10_Status = OEM_QueryLCDPanelSizeMode(pCBIOSExtension->pCBiosArguments); + break; + case QueryLCDPWMLevel: /* 0301 */ + CInt10_Status = OEM_QueryLCDPWMLevel(pCBIOSExtension->pCBiosArguments); + break; + case QueryTVConfiguration: + break; + case QueryTV2Configuration: + break; + case QueryHDTVConfiguration: + break; + case QueryHDTV2Configuration: + break; + case QueryHDMIConfiguration: + break; + case QueryHDMI2Configuration: + break; + case QueryDisplay2Pitch: + case GetDisplay2MaxPitch: + CInt10_Status = VBE_SetGetScanLineLength(pCBIOSExtension->pCBiosArguments); + break; + + case SetActiveDisplayDevice: /* 8200 */ + CInt10_Status = OEM_SetActiveDisplayDevice(pCBIOSExtension->pCBiosArguments); + break; + case SetVESAModeForDisplay2: + CInt10_Status = OEM_SetVESAModeForDisplay2(pCBIOSExtension); + break; + case SetDevicePowerState: /* 8203 */ + CInt10_Status = OEM_SetDevicePowerState(pCBIOSExtension->pCBiosArguments); + break; + case SetDisplay1RefreshRate: /* 8301 */ + case SetDisplay2RefreshRate: /* 8381 */ + CInt10_Status = OEM_SetRefreshRate(pCBIOSExtension->pCBiosArguments); + break; + case SetLCDPWMLevel: /* 8302 */ + CInt10_Status = OEM_SetLCDPWMLevel(pCBIOSExtension->pCBiosArguments); + break; + case SetTVType: + break; + case SetTV2Type: + break; + case SetTVConnectType: + break; + case SetTV2ConnectType: + break; + case SetHDTVConnectType: + break; + case SetHDTV2ConnectType: + break; + case SetHDMIType: + break; + case SetHDMI2Type: + break; + case SetHDMIOutputSignal: + break; + case SetHDMI2OutputSignal: + break; + case SetDisplay2PitchInPixels: + case SetDisplay2PitchInBytes: + CInt10_Status = VBE_SetGetScanLineLength(pCBIOSExtension->pCBiosArguments); + break; + case SetVideoPOST: + CInt10_Status = OEM_VideoPOST(pCBIOSExtension->pCBiosArguments); + break; + case CINT10DataInit: + CInt10_Status = OEM_CINT10DataInit(pCBIOSExtension->pCBiosArguments); + break; + default: + pCBIOSExtension->pCBiosArguments->reg.x.AX = 0x014F; + break; + } + break; + + default: + break; + } +#if CBIOS_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit CInt10(EAX = %x, EBX = %x, ECX = %x, EDX = %x, ESI = %x, EDI = %x)== \n", + pCBIOSExtension->pCBiosArguments->reg.ex.EAX, pCBIOSExtension->pCBiosArguments->reg.ex.EBX, + pCBIOSExtension->pCBiosArguments->reg.ex.ECX, pCBIOSExtension->pCBiosArguments->reg.ex.EDX, + pCBIOSExtension->pCBiosArguments->reg.ex.ESI, pCBIOSExtension->pCBiosArguments->reg.ex.EDI); +#endif + + return CInt10_Status; +} /* end CInt10() */ + diff --git a/src/CInt10.h b/src/CInt10.h new file mode 100644 index 0000000..9707f6f --- /dev/null +++ b/src/CInt10.h @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +/* CBios Compile Flag */ +#define CBIOS_DEBUG 1 + +/* VBE return status */ +#define VBEFunctionCallSuccessful 0x004F +#define VBEFunctionCallFail 0x014F +#define VBEFunctionCallNotSupported 0x024F +#define VBEFunctionCallInvalid 0x034F + + +/* Function argument */ +#define VBESetMode 0x4F02 +#define VBESetGetScanLineLength 0x4F06 +#define OEMFunction 0x4F14 + +#define QueryBiosInfo 0x0000 +#define QueryBiosCaps 0x0001 +#define QueryExternalDeviceInfo 0x0100 +#define QueryDisplayPathInfo 0x0200 +#define QueryDeviceConnectStatus 0x0201 +#define QuerySupportedMode 0x0202 +#define QueryLCDPanelSizeMode 0x0203 +#define QueryLCDPWMLevel 0x0301 +#define QueryTVConfiguration 0x0400 +#define QueryTV2Configuration 0x0480 +#define QueryHDTVConfiguration 0x0500 +#define QueryHDTV2Configuration 0x0580 +#define QueryHDMIConfiguration 0x0600 +#define QueryHDMI2Configuration 0x0680 +#define QueryDisplay2Pitch 0x0801 +#define GetDisplay2MaxPitch 0x0803 + + +#define SetActiveDisplayDevice 0x8200 +#define SetVESAModeForDisplay2 0x8202 +#define SetDevicePowerState 0x8203 +#define SetDisplay1RefreshRate 0x8301 +#define SetLCDPWMLevel 0x8302 +#define SetDisplay2RefreshRate 0x8381 +#define SetTVType 0x8400 +#define SetTV2Type 0x8480 +#define SetTVConnectType 0x8401 +#define SetTV2ConnectType 0x8481 +#define SetHDTVConnectType 0x8501 +#define SetHDTV2ConnectType 0x8581 +#define SetHDMIType 0x8600 +#define SetHDMI2Type 0x8680 +#define SetHDMIOutputSignal 0x8601 +#define SetHDMI2OutputSignal 0x8681 +#define SetDisplay2PitchInPixels 0x8700 +#define SetDisplay2PitchInBytes 0x8782 + +#define SetVideoPOST 0xF100 +#define CINT10DataInit 0xF101 + +/* definitions only for RRATE_TABLE.Attribute */ +#define DISABLE 0x0001 // mode disable +#define NHS 0x0002 // 1= negative H sync +#define PHS 0 +#define NVS 0x0004 // 1= negative V sync +#define PVS 0 +#define HB 0x0008 // 1= 1-character-wide H border +#define VB 0x0010 // 1= 8-line-wide V border +#define RBK 0x0020 // 1= Reduced Blanking +#define ROT 0x0040 // rotation output format +#define EN_DIT 0x0080 // enable dither for 18-bit panel +#define MSB 0x0100 // MSB panel +#define _2_CH 0x0200 // 2 channel panel +#define SW_PS 0x0400 // SW power sequence + + +#define BIOS_ROM_SIZE 32*1024 + + +typedef enum _CINT10STATUS { + false = 0, + true = 1 +} CI_STATUS; + +typedef struct _CBIOS_ARGUMENTS { + union + { + struct EX + { + unsigned long EAX; + unsigned long EBX; + unsigned long ECX; + unsigned long EDX; + unsigned long ESI; + unsigned long EDI; + }ex; + + struct X + { + unsigned short AX; + unsigned short dummy1; + unsigned short BX; + unsigned short dummy2; + unsigned short CX; + unsigned short dummy3; + unsigned short DX; + unsigned short dummy4; + unsigned short SI; + unsigned short dummy5; + unsigned short DI; + }x; + + struct LH + { + unsigned char AL; + unsigned char AH; + unsigned short dummy6; + unsigned char BL; + unsigned char BH; + unsigned short dummy7; + unsigned char CL; + unsigned char CH; + unsigned short dummy8; + unsigned char DL; + unsigned char DH; + unsigned short dummy9; + }lh; + }reg; + +} CBIOS_ARGUMENTS; + +typedef struct _CBIOS_Extension { + + /* Cbios argument */ + CBIOS_ARGUMENTS *pCBiosArguments; + + /* Extension value */ + unsigned long VideoVirtualAddress; + unsigned short IOAddress; +}CBIOS_Extension; + +extern CI_STATUS CInt10(CBIOS_Extension *pCBIOSExtension); + diff --git a/src/CInt10FunProto.h b/src/CInt10FunProto.h new file mode 100644 index 0000000..922e894 --- /dev/null +++ b/src/CInt10FunProto.h @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +/* internal functions prototype */ +void SetVBERerurnStatus(USHORT VBEReturnStatus, CBIOS_ARGUMENTS *pCBiosArguments); + +void SetTimingRegs(UCHAR ucDisplayPath, MODE_INFO *pModeInfo, RRATE_TABLE *pRRateTable); +void SetHTotal(UCHAR DisplayPath, USHORT Value); +void SetHDisplayEnd(UCHAR DisplayPath, USHORT Value); +void SetHBlankingStart(UCHAR DisplayPath, USHORT Value); +void SetHBlankingEnd(UCHAR DisplayPath, USHORT Value); +void SetHSyncStart(UCHAR DisplayPath, USHORT Value); +void SetHSyncEnd(UCHAR DisplayPath, USHORT Value); +void SetVTotal(UCHAR DisplayPath, USHORT Value); +void SetVDisplayEnd(UCHAR DisplayPath, USHORT Value); +void SetVBlankingStart(UCHAR DisplayPath, USHORT Value); +void SetVBlankingEnd(UCHAR DisplayPath, USHORT Value); +void SetVSyncStart(UCHAR DisplayPath, USHORT Value); +void SetVSyncEnd(UCHAR DisplayPath, USHORT Value); +void SetPixelClock(UCHAR DisplayPath, ULONG Clock); +void SetHSource(UCHAR bDisplayPath, USHORT wValue); +PLL_Info ClockToPLLF9003A(ULONG Clock); +void SetDPLL(UCHAR DisplayPath, PLL_Info PLLInfo); +void SetPolarity(UCHAR DevicePort, UCHAR Value); +void SetFIFO(UCHAR DisplayPath); +void SetPitch(UCHAR DisplayPath, USHORT Value); +USHORT GetPitch(UCHAR DisplayPath); +USHORT GetVDisplayEnd(UCHAR DisplayPath); +void SetColorDepth(UCHAR DisplayPath, UCHAR Value); +void ConfigDigitalPort(UCHAR bDisplayPath); +void LoadTiming(UCHAR DisplayPath, USHORT ModeNum); +void LoadVESATiming(UCHAR bDisplayPath, USHORT wModeNum); +void LoadLCDTiming(UCHAR bDisplayPath, USHORT wModeNum); +void SetScalingFactor(UCHAR bDisplayPath, MODE_INFO *pUserModeInfo, MODE_INFO *pPanelModeInfo); +void SetHorScalingFactor(UCHAR bDisplayPath, USHORT wValue); +void SetVerScalingFactor(UCHAR bDisplayPath, USHORT wValue); +CI_STATUS isLCDFitMode(UCHAR bDeviceIndex, USHORT wModeNum); +CI_STATUS GetModePointerFromVESATable(USHORT wModeNum, UCHAR bRRIndex, MODE_INFO **ppModeInfo, RRATE_TABLE **ppRRateTable); +CI_STATUS GetModePointerFromLCDTable(UCHAR bDeviceIndex, MODE_INFO **ppModeInfo, PANEL_TABLE **ppPanelTable); +CI_STATUS Get_MODE_INFO(USHORT wModeNum, MODE_INFO **ppModeInfo); +CI_STATUS Get_MODE_INFO_From_LCD_Table(UCHAR bDeviceIndex, MODE_INFO **ppModeInfo); +CI_STATUS Get_MODE_INFO_From_VESA_Table(USHORT wModeNum, MODE_INFO **ppModeInfo); +CI_STATUS GetModeColorDepth(USHORT wModeNum, MODE_INFO *pModeInfo, UCHAR *pbColorDepth); + +CI_STATUS GetModePitch(USHORT ModeNum, USHORT *pPitch); +USHORT ReadRegFromHW(REG_OP *pRegOp); +void WriteRegToHW(REG_OP *pRegOp, USHORT value); +void UnLockCR0ToCR7(); +void LockCR0ToCR7(); +CI_STATUS CheckForModeAvailable(USHORT ModeNum); +CI_STATUS CheckForNewDeviceAvailable(UCHAR bDeviceIndex); +void Display1TurnOnTX(); +void Display1TurnOffTX(); +void Display2TurnOnTX(); +void Display2TurnOffTX(); +void TurnOnDigitalPort(UCHAR bDeviceIndex); +void TurnOffDigitalPort(UCHAR bDeviceIndex); +UCHAR GetPortConnectPath(UCHAR PortType); +USHORT TransDevIDtoBit(UCHAR DeviceIndex); +void TurnOnCRTPad(); +void TurnOffCRTPad(); +void TurnOnDVP1Pad(); +void TurnOffDVP1Pad(); +void TurnOnDVP2Pad(); +void TurnOffDVP2Pad(); +void TurnOnDVP12Pad(); +void TurnOffDVP12Pad(); +void TurnOnScaler(UCHAR bDisplayPath); +void TurnOffScaler(UCHAR bDisplayPath); +void TurnOnHorScaler(UCHAR bDisplayPath); +void TurnOffHorScaler(UCHAR bDisplayPath); +void TurnOnVerScaler(UCHAR bDisplayPath); +void TurnOffVerScaler(UCHAR bDisplayPath); + +void Set12BitDVP(); +void Set24BitDVP(); +void TurnOnDAC(); +void TurnOffDAC(); +void SerialLoadTable(UCHAR **ppucDisplay1VESAModeInitRegs, UCHAR ucI2Cport, UCHAR ucI2CAddr); +void SerialLoadRegBits(UCHAR **ppucDisplay1VESAModeInitRegs, UCHAR ucRegGroup, UCHAR ucI2Cport, UCHAR ucI2CAddr); +void SerialLoadReg(UCHAR **ppucDisplay1VESAModeInitRegs, UCHAR ucRegGroup, UCHAR ucI2Cport, UCHAR ucI2CAddr); +void LoadDisplay1VESAModeInitRegs(); +void VESASetBIOSData(USHORT ModeNum); +void DisableDisplayPathAndDevice(UCHAR DisplayPath); +CI_STATUS GetDevicePortConfig(UCHAR bDeviceIndex, PORT_CONFIG **ppPortConfig); +void PowerSequenceOn(); +void PowerSequenceOff(); +void SequencerOn(UCHAR DisplayPath); +void SequencerOff(UCHAR bDisplayPath); +void ControlPwrSeqOn(UCHAR bDeviceIndex); +void ControlPwrSeqOff(UCHAR bDeviceIndex); +void LongWait(); +UCHAR Get_DEV_ID(UCHAR DisplayPath); +void Set_DEV_ID(UCHAR DeviceID, UCHAR DisplayPath); +UCHAR Get_NEW_DEV_ID(UCHAR DisplayPath); +void Set_NEW_DEV_ID(UCHAR DeviceID, UCHAR DisplayPath); +USHORT Get_LCD_H_SIZE(); +USHORT Get_LCD_V_SIZE(); +ULONG Get_LCD_SIZE(); +USHORT Get_LCD2_H_SIZE(); +USHORT Get_LCD2_V_SIZE(); +ULONG Get_LCD2_SIZE(); +UCHAR Get_RRATE_ID(UCHAR DisplayPath); +void Set_RRATE_ID(UCHAR RRateID, UCHAR DisplayPath); +UCHAR Get_LCD_TABLE_INDEX(void); +UCHAR Get_LCD2_TABLE_INDEX(void); +void Set_LCD_TABLE_INDEX(UCHAR bLCDIndex); +USHORT Get_VESA_MODE(UCHAR DisplayPath); +void Set_VESA_MODE(USHORT ModeNum, UCHAR DisplayPath); +void ResetATTR(); +void EnableATTR(); +void SetCRReg(UCHAR bRegIndex, UCHAR bRegValue, UCHAR bMask); +UCHAR GetCRReg(UCHAR bRegIndex); +void SetSRReg(UCHAR bRegIndex, UCHAR bRegValue, UCHAR bMask); +UCHAR GetSRReg(UCHAR bRegIndex); +void SetARReg(UCHAR index,UCHAR value); +UCHAR GetARReg(UCHAR index); +void SetGRReg(UCHAR bRegIndex, UCHAR bRegValue, UCHAR bMask); +void SetMSReg(UCHAR bRegValue); +UCHAR GetIS1Reg(); +void ClearFrameBuffer(UCHAR DisplayPath,ULONG *pFrameBufferBase,MODE_INFO *pModeInfo, UCHAR bColorDepth); +ULONG Difference(ULONG Value1, ULONG Value2); +UCHAR ReadScratch(USHORT IndexMask); +void WriteScratch(USHORT IndexMask, UCHAR Data); +UCHAR AlignDataToLSB(UCHAR bData, UCHAR bMask); +UCHAR AlignDataToMask(UCHAR bData, UCHAR bMask); +void SetDPMS(UCHAR DPMSState, UCHAR DisplayPath); +CI_STATUS DetectMonitor(); +void WaitDisplayPeriod(); +void WaitPowerSequenceDone(); +CI_STATUS CheckForDSTNPanel(UCHAR bDeviceIndex); +USHORT GetVESAMEMSize(); +void SetDeviceSupport(); + diff --git a/src/CInt10Tbl.h b/src/CInt10Tbl.h new file mode 100644 index 0000000..d260474 --- /dev/null +++ b/src/CInt10Tbl.h @@ -0,0 +1,319 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +PORT_CONFIG *pPortConfig; +MODE_INFO *pLCDTable; +MODE_INFO *pVESATable; +void *PCIDataStruct; + +bool bCRTSUPPORT = false; +bool bLCDSUPPORT = false; +bool bDVISUPPORT = false; +bool bTVSUPPORT = false; + +/* common table for all VESA modes on display1 */ +void *Display1VESAModeInitRegs; + +/* table pointers for VBIOS POST */ +void *POSTInItRegs; +void *DDRII400Tbl; +void *DDRII533Tbl; +void *ExtendRegs2; + +/* Display 1 registers table */ +/* Display 1 H total */ +REG_OP HTotal1[] = { + {CR, 0xFF, 0x00,3}, /* [7:0] */ + {CR, BIT0, 0xAC,11}, /* [8] */ + {NR,0x0,0x0,0x0} +}; + +/* Display 1 H DispEnd */ +REG_OP HDispEnd1[] = { + {SR, BIT6+BIT5+BIT4, 0x33,0}, + {CR, 0xFF, 0x01,3}, + {CR, BIT2, 0xAC,11}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 H BnkSt */ +REG_OP HBnkSt1[] = { + {SR, BIT2+BIT1+BIT0, 0x34,0}, + {CR, 0xFF, 0x02,3}, + {CR, BIT4, 0xAC,11}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 H BnkEnd */ +REG_OP HBnkEnd1[] = { + {SR, BIT6+BIT5+BIT4, 0x34,0}, + {CR, 0x1F, 0x03,3}, + {CR, BIT7, 0x05,8}, + {CR, BIT0, 0xAD,9}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 H SyncSt */ +REG_OP HSyncSt1[] = { + {SR, BIT2+BIT1+BIT0, 0x35,0}, + {CR, 0xFF, 0x04,3}, + {CR, BIT6, 0xAC,11}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 H SyncEnd */ +REG_OP HSyncEnd1[] = { + {SR, BIT6+BIT5+BIT4, 0x35,0}, + {CR, 0x1F, 0x05,3}, + {CR, BIT2, 0xAD,8}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 V Total */ +REG_OP VTotal1[] = { + {CR, 0xFF, 0x06,0}, + {CR, BIT0, 0x07,8}, + {CR, BIT5, 0x07,9}, + {CR, BIT0, 0xAE,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 V DispEnd */ +REG_OP VDispEnd1[] = { + {CR, 0xFF, 0x12,0}, + {CR, BIT1, 0x07,8}, + {CR, BIT6, 0x07,9}, + {CR, BIT1, 0xAE,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 V BnkSt */ +REG_OP VBnkSt1[] = { + {CR, 0xFF, 0x15,0}, + {CR, BIT3, 0x07,8}, + {CR, BIT5, 0x09,9}, + {CR, BIT2, 0xAE,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 V BnkEnd */ +REG_OP VBnkEnd1[] = { + {CR, 0xFF, 0x16,0}, + {CR, BIT4, 0xAE,8}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 V SyncSt */ +REG_OP VSyncSt1[] = { + {CR, 0xFF, 0x10,0}, + {CR, BIT2, 0x07,8}, + {CR, BIT7, 0x07,9}, + {CR, BIT3, 0xAE,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 V SyncEnd */ +REG_OP VSyncEnd1[] = { + {CR, BIT3+BIT2+BIT1+BIT0, 0x11,0}, + {CR, BIT6+BIT5, 0xAE,4}, + {NR,0x0,0x0,0x0} +}; + +/* Display 1 Pitch */ +REG_OP Pitch1[] = { + {CR, 0xFF, 0x13,0}, + {CR, 0x3F, 0xB0,8}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 registers table */ + +/* Display 2 H total */ +REG_OP HTotal2[] = { + {CR, 0xFF, 0x23,3}, /* [7:0] */ + {CR, BIT0, 0x29,11}, /* [8] */ + {NR,0x0,0x0,0x0} +}; + +/* Display 2 H DispEnd */ +REG_OP HDispEnd2[] = { + {SR, BIT6+BIT5+BIT4, 0x36,0}, + {CR, 0xFF, 0x24,3}, + {CR, BIT2, 0x29,11}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 H BnkSt */ +REG_OP HBnkSt2[] = { + {SR, BIT2+BIT1+BIT0, 0x37,0}, + {CR, 0xFF, 0x25,3}, + {CR, BIT4, 0x29,11}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 H BnkEnd */ +REG_OP HBnkEnd2[] = { + {SR, BIT6+BIT5+BIT4, 0x37,0}, + {CR, 0x1F, 0x26,3}, + {CR, BIT7, 0x28,8}, + {CR, BIT0, 0x2A,9}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 H SyncSt */ +REG_OP HSyncSt2[] = { + {SR, BIT2+BIT1+BIT0, 0x38,0}, + {CR, 0xFF, 0x27,3}, + {CR, BIT6, 0x29,11}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 H SyncEnd */ +REG_OP HSyncEnd2[] = { + {SR, BIT6+BIT5+BIT4, 0x38,0}, + {CR, 0x1F, 0x28,3}, + {CR, BIT2, 0x2A,8}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 V Total */ +REG_OP VTotal2[] = { + {CR, 0xFF, 0x2B,0}, + {CR, BIT0, 0x31,8}, + {CR, BIT5, 0x31,9}, + {CR, BIT0, 0x32,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 V DispEnd */ +REG_OP VDispEnd2[] = { + {CR, 0xFF, 0x2C,0}, + {CR, BIT1, 0x31,8}, + {CR, BIT6, 0x31,9}, + {CR, BIT1, 0x32,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 V BnkSt */ +REG_OP VBnkSt2[] = { + {CR, 0xFF, 0x2D,0}, + {CR, BIT3, 0x31,8}, + {CR, BIT5, 0x29,9}, + {CR, BIT2, 0x32,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 V VBnkEnd2 */ +REG_OP VBnkEnd2[] = { + {CR, 0xFF, 0x2E,0}, + {CR, BIT4, 0x32,8}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 V SyncSt */ +REG_OP VSyncSt2[] = { + {CR, 0xFF, 0x2F,0}, + {CR, BIT2, 0x31,8}, + {CR, BIT7, 0x31,9}, + {CR, BIT3, 0x32,10}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 V SyncEnd */ +REG_OP VSyncEnd2[] = { + {CR, BIT3+BIT2+BIT1+BIT0, 0x30,0}, + {CR, BIT6+BIT5, 0x32,4}, + {NR,0x0,0x0,0x0} +}; + +/* Display 2 Pitch */ +REG_OP Pitch2[] = { + {CR, 0xFF, 0x3A,0}, + {CR, 0x3F, 0x3B,8}, + {NR,0x0,0x0,0x0} +}; + +/*============================================================================= */ +REG_OP HSource1[] = { + {SR, 0xFF, 0x4B, 0}, + {SR, BIT3+BIT2+BIT1+BIT0, 0x4C, 8}, + {NR,0x0,0x0,0x0} +}; + +REG_OP HSource2[] = { + {SR, 0xFF, 0x4D, 0}, + {SR, BIT3+BIT2+BIT1+BIT0, 0x4E, 8}, + {NR,0x0,0x0,0x0} +}; + +REG_OP HScalingFactor1[] = { + {SR, 0xFF, 0x59, 0}, + {SR, BIT3+BIT2+BIT1+BIT0, 0x5B, 8}, + {NR,0x0,0x0,0x0} +}; + +REG_OP VScalingFactor1[] = { + {SR, 0xFF, 0x5A, 0}, + {SR, BIT6+BIT5+BIT4, 0x5B, 8}, + {NR,0x0,0x0,0x0} +}; + +REG_OP HScalingFactor2[] = { + {SR, 0xFF, 0x51, 0}, + {SR, BIT3+BIT2+BIT1+BIT0, 0x53, 8}, + {NR,0x0,0x0,0x0} +}; + +REG_OP VScalingFactor2[] = { + {SR, 0xFF, 0x52, 0}, + {SR, BIT6+BIT5+BIT4, 0x53, 8}, + {NR,0x0,0x0,0x0} +}; + + +VESA_TABLE CInt10VESATable[] = { + { + {1280, 720, 0x147, 0x148, 0x149, 1}, + {74250, RR60, PHS+PVS, 370, 1390, 40, 30, 725, 5} + }, + { + {1280, 768, 0x144, 0x145, 0x146, 1}, + { 79500, RR60, NHS+PVS, 384, 1344, 128, 30, 771, 7} + }, + { + {1280, 960, 0x135, 0x136, 0x137, 1}, + {108000, RR60, PHS+PVS, 520, 1376, 112, 40, 961, 3} + }, + { + {1366, 768, 0x141, 0x142, 0x143, 1}, + { 85860, RR60, NHS+PVS, 434, 1440, 144, 27, 769, 3} + }, + { + {1400,1050, 0x138, 0x139, 0x13A, 1}, + {121750, RR60, NHS+PVS, 464, 1488, 144, 39, 1053, 4} + }, + { + {0xffff,1050, 0x138, 0x139, 0x13A, 1}, + {121750, RR60, NHS+PVS, 464, 1488, 144, 39, 1053, 4} + } + +}; + + diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..1c3e0cb --- /dev/null +++ b/src/Makefile @@ -0,0 +1,533 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# src/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + +# 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. + + +pkgdatadir = $(datadir)/xf86-video-aip +pkglibdir = $(libdir)/xf86-video-aip +pkgincludedir = $(includedir)/xf86-video-aip +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = i686-pc-linux-gnu +host_triplet = i686-pc-linux-gnu +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(rdc_drv_ladir)" +rdc_drv_laLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(rdc_drv_la_LTLIBRARIES) +rdc_drv_la_LIBADD = +am_rdc_drv_la_OBJECTS = rdc_2dtool.lo rdc_accel.lo rdc_cursor.lo \ + rdc_driver.lo rdc_mode.lo rdc_tool.lo rdc_vgatool.lo \ + rdc_video.lo rdc_extension.lo CInt10.lo +rdc_drv_la_OBJECTS = $(am_rdc_drv_la_OBJECTS) +rdc_drv_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(rdc_drv_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I. -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(rdc_drv_la_SOURCES) +DIST_SOURCES = $(rdc_drv_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = aclocal -I /home/jason/Desktop/Xorg/compiled/1.6.0/share/aclocal +ADMIN_MAN_DIR = $(mandir)/man$(ADMIN_MAN_SUFFIX) +ADMIN_MAN_SUFFIX = 8 +AMTAR = ${SHELL} /home/jason/Desktop/Xorg/driver/TipCode/missing --run tar +APP_MAN_DIR = $(mandir)/man$(APP_MAN_SUFFIX) +APP_MAN_SUFFIX = 1 +AR = ar +AUTOCONF = ${SHELL} /home/jason/Desktop/Xorg/driver/TipCode/missing --run autoconf +AUTOHEADER = ${SHELL} /home/jason/Desktop/Xorg/driver/TipCode/missing --run autoheader +AUTOMAKE = ${SHELL} /home/jason/Desktop/Xorg/driver/TipCode/missing --run automake-1.10 +AWK = gawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXCPP = g++ -E +CXXDEPMODE = depmode=gcc3 +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +DRIVER_MAN_DIR = $(mandir)/man$(DRIVER_MAN_SUFFIX) +DRIVER_MAN_SUFFIX = 4 +DRIVER_NAME = nv +ECHO = echo +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /bin/grep -E +EXEEXT = +F77 = gfortran +FFLAGS = -g -O2 +FILE_MAN_DIR = $(mandir)/man$(FILE_MAN_SUFFIX) +FILE_MAN_SUFFIX = 5 +GREP = /bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LDFLAGS = +LIBOBJS = +LIBS = +LIBTOOL = $(SHELL) $(top_builddir)/libtool +LIB_MAN_DIR = $(mandir)/man$(LIB_MAN_SUFFIX) +LIB_MAN_SUFFIX = 3 +LN_S = ln -s +LTLIBOBJS = +MAINT = +MAKEINFO = ${SHELL} /home/jason/Desktop/Xorg/driver/TipCode/missing --run makeinfo +MISC_MAN_DIR = $(mandir)/man$(MISC_MAN_SUFFIX) +MISC_MAN_SUFFIX = 7 +MKDIR_P = /bin/mkdir -p +OBJEXT = o +PACKAGE = xf86-video-aip +PACKAGE_BUGREPORT = https://bugs.freedesktop.org/enter_bug.cgi?product=xorg +PACKAGE_NAME = xf86-video-aip +PACKAGE_STRING = xf86-video-aip 0.80 +PACKAGE_TARNAME = xf86-video-aip +PACKAGE_VERSION = 0.80 +PATH_SEPARATOR = : +PKG_CONFIG = /usr/bin/pkg-config +RANLIB = ranlib +SED = /bin/sed +SET_MAKE = +SHELL = /bin/sh +STRIP = strip +VERSION = 0.80 +XORG_CFLAGS = -I/home/jason/Desktop/Xorg/compiled/1.6.0//include/xorg -I/home/jason/Desktop/Xorg/compiled/1.6.0//include/pixman-1 -I/home/jason/Desktop/Xorg/compiled/1.6.0//include -I/home/jason/Desktop/Xorg/compiled/1.6.0/include +XORG_LIBS = -L/home/jason/Desktop/Xorg/compiled/1.6.0//lib -lpixman-1 -lpciaccess +abs_builddir = /home/jason/Desktop/Xorg/driver/TipCode/src +abs_srcdir = /home/jason/Desktop/Xorg/driver/TipCode/src +abs_top_builddir = /home/jason/Desktop/Xorg/driver/TipCode +abs_top_srcdir = /home/jason/Desktop/Xorg/driver/TipCode +ac_ct_CC = gcc +ac_ct_CXX = g++ +ac_ct_F77 = gfortran +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +bindir = ${exec_prefix}/bin +build = i686-pc-linux-gnu +build_alias = +build_cpu = i686 +build_os = linux-gnu +build_vendor = pc +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host = i686-pc-linux-gnu +host_alias = +host_cpu = i686 +host_os = linux-gnu +host_vendor = pc +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = $(SHELL) /home/jason/Desktop/Xorg/driver/TipCode/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /bin/mkdir -p +moduledir = ${exec_prefix}/lib/xorg/modules +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /home/jason/Desktop/Xorg/compiled/1.6.0/ +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_builddir = .. +top_srcdir = .. + +# 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. +AM_CFLAGS = -I/home/jason/Desktop/Xorg/compiled/1.6.0//include/xorg -I/home/jason/Desktop/Xorg/compiled/1.6.0//include/pixman-1 -I/home/jason/Desktop/Xorg/compiled/1.6.0//include -I/home/jason/Desktop/Xorg/compiled/1.6.0/include +rdc_drv_la_LTLIBRARIES = rdc_drv.la +rdc_drv_la_LDFLAGS = -module -avoid-version +rdc_drv_ladir = ${exec_prefix}/lib/xorg/modules/drivers +rdc_drv_la_SOURCES = \ + rdc_2dtool.c \ + rdc_accel.c \ + rdc_cursor.c \ + rdc_driver.c \ + rdc_mode.c \ + rdc_tool.c \ + rdc_vgatool.c \ + rdc_video.c \ + rdc_extension.c \ + CInt10.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-rdc_drv_laLTLIBRARIES: $(rdc_drv_la_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(rdc_drv_ladir)" || $(MKDIR_P) "$(DESTDIR)$(rdc_drv_ladir)" + @list='$(rdc_drv_la_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(rdc_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(rdc_drv_ladir)/$$f'"; \ + $(LIBTOOL) --mode=install $(rdc_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(rdc_drv_ladir)/$$f"; \ + else :; fi; \ + done + +uninstall-rdc_drv_laLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(rdc_drv_la_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(rdc_drv_ladir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(rdc_drv_ladir)/$$p"; \ + done + +clean-rdc_drv_laLTLIBRARIES: + -test -z "$(rdc_drv_la_LTLIBRARIES)" || rm -f $(rdc_drv_la_LTLIBRARIES) + @list='$(rdc_drv_la_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +rdc_drv.la: $(rdc_drv_la_OBJECTS) $(rdc_drv_la_DEPENDENCIES) + $(rdc_drv_la_LINK) -rpath $(rdc_drv_ladir) $(rdc_drv_la_OBJECTS) $(rdc_drv_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/CInt10.Plo +include ./$(DEPDIR)/rdc_2dtool.Plo +include ./$(DEPDIR)/rdc_accel.Plo +include ./$(DEPDIR)/rdc_cursor.Plo +include ./$(DEPDIR)/rdc_driver.Plo +include ./$(DEPDIR)/rdc_extension.Plo +include ./$(DEPDIR)/rdc_mode.Plo +include ./$(DEPDIR)/rdc_tool.Plo +include ./$(DEPDIR)/rdc_vgatool.Plo +include ./$(DEPDIR)/rdc_video.Plo + +.c.o: + $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c $< + +.c.obj: + $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: + $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +# source='$<' object='$@' libtool=yes \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(rdc_drv_ladir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-rdc_drv_laLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-rdc_drv_laLTLIBRARIES + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-rdc_drv_laLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-rdc_drv_laLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-rdc_drv_laLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-rdc_drv_laLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..514fd7f --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,43 @@ +# 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. +AM_CFLAGS = @XORG_CFLAGS@ + +rdc_drv_la_LTLIBRARIES = rdc_drv.la +rdc_drv_la_LDFLAGS = -module -avoid-version +rdc_drv_ladir = @moduledir@/drivers + +rdc_drv_la_SOURCES = \ + rdc_2dtool.c \ + rdc_accel.c \ + rdc_cursor.c \ + rdc_driver.c \ + rdc_mode.c \ + rdc_tool.c \ + rdc_vgatool.c \ + rdc_video.c \ + rdc_extension.c \ + CInt10.c + diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..19db917 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,533 @@ +# Makefile.in generated by automake 1.10 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# 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. + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(rdc_drv_ladir)" +rdc_drv_laLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(rdc_drv_la_LTLIBRARIES) +rdc_drv_la_LIBADD = +am_rdc_drv_la_OBJECTS = rdc_2dtool.lo rdc_accel.lo rdc_cursor.lo \ + rdc_driver.lo rdc_mode.lo rdc_tool.lo rdc_vgatool.lo \ + rdc_video.lo rdc_extension.lo CInt10.lo +rdc_drv_la_OBJECTS = $(am_rdc_drv_la_OBJECTS) +rdc_drv_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(rdc_drv_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I. -I$(top_builddir)@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(rdc_drv_la_SOURCES) +DIST_SOURCES = $(rdc_drv_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADMIN_MAN_DIR = @ADMIN_MAN_DIR@ +ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ +AMTAR = @AMTAR@ +APP_MAN_DIR = @APP_MAN_DIR@ +APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ +DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ +DRIVER_NAME = @DRIVER_NAME@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +FILE_MAN_DIR = @FILE_MAN_DIR@ +FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAN_DIR = @LIB_MAN_DIR@ +LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAKEINFO = @MAKEINFO@ +MISC_MAN_DIR = @MISC_MAN_DIR@ +MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +XORG_CFLAGS = @XORG_CFLAGS@ +XORG_LIBS = @XORG_LIBS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +moduledir = @moduledir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# 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. +AM_CFLAGS = @XORG_CFLAGS@ +rdc_drv_la_LTLIBRARIES = rdc_drv.la +rdc_drv_la_LDFLAGS = -module -avoid-version +rdc_drv_ladir = @moduledir@/drivers +rdc_drv_la_SOURCES = \ + rdc_2dtool.c \ + rdc_accel.c \ + rdc_cursor.c \ + rdc_driver.c \ + rdc_mode.c \ + rdc_tool.c \ + rdc_vgatool.c \ + rdc_video.c \ + rdc_extension.c \ + CInt10.c + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-rdc_drv_laLTLIBRARIES: $(rdc_drv_la_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(rdc_drv_ladir)" || $(MKDIR_P) "$(DESTDIR)$(rdc_drv_ladir)" + @list='$(rdc_drv_la_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(rdc_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(rdc_drv_ladir)/$$f'"; \ + $(LIBTOOL) --mode=install $(rdc_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(rdc_drv_ladir)/$$f"; \ + else :; fi; \ + done + +uninstall-rdc_drv_laLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(rdc_drv_la_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(rdc_drv_ladir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(rdc_drv_ladir)/$$p"; \ + done + +clean-rdc_drv_laLTLIBRARIES: + -test -z "$(rdc_drv_la_LTLIBRARIES)" || rm -f $(rdc_drv_la_LTLIBRARIES) + @list='$(rdc_drv_la_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +rdc_drv.la: $(rdc_drv_la_OBJECTS) $(rdc_drv_la_DEPENDENCIES) + $(rdc_drv_la_LINK) -rpath $(rdc_drv_ladir) $(rdc_drv_la_OBJECTS) $(rdc_drv_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/CInt10.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_2dtool.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_accel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_cursor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_driver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_extension.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_mode.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_tool.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_vgatool.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdc_video.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(rdc_drv_ladir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-rdc_drv_laLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-rdc_drv_laLTLIBRARIES + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-rdc_drv_laLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-rdc_drv_laLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-rdc_drv_laLTLIBRARIES install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-rdc_drv_laLTLIBRARIES + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/rdc.h b/src/rdc.h new file mode 100644 index 0000000..05ce1ed --- /dev/null +++ b/src/rdc.h @@ -0,0 +1,320 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + + +#if XSERVER_LIBPCIACCESS +#include <pciaccess.h> +#endif + +#define PCI_DEV_MAP_FLAG_WRITABLE (1U<<0) +#define PCI_DEV_MAP_FLAG_WRITE_COMBINE (1U<<1) +#define PCI_DEV_MAP_FLAG_CACHABLE (1U<<2) + +#if XSERVER_LIBPCIACCESS +#define RDC_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 RDC_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 + +/* Compiler Options */ +#define Accel_2D +#define Accel_2D_DEBUG 0 + +/* #define MMIO_2D */ +#define HWC +#define HWC_DEBUG 0 + +/* Vendor & Device Info */ +#ifndef PCI_VENDOR_RDC +#define PCI_VENDOR_RDC 0x17F3 +#endif + +#ifndef PCI_VENDOR_RDC_M2010_A0 +#define PCI_VENDOR_RDC_M2010_A0 0x25F0 +#endif + +#ifndef PCI_CHIP_M2010 +#define PCI_CHIP_M2010 0x2010 +#endif + +#ifndef PCI_CHIP_M2010_A0 +#define PCI_CHIP_M2010_A0 0x17F3 +#endif + +#ifndef PCI_CHIP_M2011 +#define PCI_CHIP_M2011 0x2011 +#endif + +typedef enum _CHIP_ID { + VGALegacy, + M2010, + M2011 +} CHIP_ID; + +/* RDC REC Info */ +#define RDC_NAME "RDC" +#define RDC_DRIVER_NAME "rdc" +#define RDC_MAJOR_VERSION 0 +#define RDC_MINOR_VERSION 0 +#define RDC_PATCH_VERSION 6 +#define RDC_VERSION \ + ((RDC_MAJOR_VERSION << 20) | (RDC_MINOR_VERSION << 10) | RDC_PATCH_VERSION) + +/* Customized Info */ +#define DEFAULT_VIDEOMEM_SIZE 0x00800000 +#define DEFAULT_MMIO_SIZE 0x00020000 +#define DEFAULT_CMDQ_SIZE 0x00100000 +#define MIN_CMDQ_SIZE 0x00040000 +#define CMD_QUEUE_GUARD_BAND 0x00000020 +#define DEFAULT_HWC_NUM 0x00000002 + +/* Data Type Definition */ +typedef INT32 LONG; +typedef CARD8 UCHAR; +typedef CARD16 USHORT; +typedef CARD32 ULONG; + +/* Verberse level define */ +#define ErrorLevel 0 /* Report Error message */ +#define DefaultLevel 4 /* Driver entry function */ +#define InfoLevel 5 /* Report information */ +#define InternalLevel 6 /* Driver interanl function entry */ + + +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +#define BIOS_ROM_PATH_FILE "//root//RDCVBIOS.ROM" +#define BIOS_ROM_SIZE 32*1024 +#define BIOS_ROM_PHY_BASE 0xC0000 + + + +/* Data Structure Definition */ +typedef struct _RDCRegRec { +/* UCHAR ucScratch[0x1F];*/ + UCHAR ucPLLValue[3]; + UCHAR ucCRA3; + UCHAR ucSR58; +} RDCRegRec, *RDCRegPtr; + +typedef struct _VIDEOMODE { + + int ScreenWidth; + int ScreenHeight; + int bitsPerPixel; + int Bpp; + int ScreenPitch; + +} VIDEOMODE, *PVIDEOMODE; + +typedef struct { + + ULONG ulCMDQSize; + ULONG ulCMDQType; + + ULONG ulCMDQOffsetAddr; + UCHAR *pjCMDQVirtualAddr; + + UCHAR *pjCmdQBasePort; + UCHAR *pjWritePort; + UCHAR *pjReadPort; + UCHAR *pjEngStatePort; + + ULONG ulCMDQMask; + ULONG ulCurCMDQueueLen; + + ULONG ulWritePointer; + ULONG ulReadPointer; + + ULONG ulReadPointer_OK; /* for Eng_DBGChk */ + +} CMDQINFO, *PCMDQINFO; + +typedef struct { + + ULONG fg; + ULONG bg; + UCHAR *pjPatternVirtualAddr; + UCHAR ucXorBitmap[64*64/8]; + UCHAR ucAndBitmap[64*64/8]; + +} MONOHWC, *PMONOHWC; + +typedef struct { + + int HWC_NUM; + int HWC_NUM_Next; + + ULONG ulHWCOffsetAddr; + UCHAR *pjHWCVirtualAddr; + + USHORT cursortype; + USHORT width; + USHORT height; + USHORT xhot; + USHORT yhot; + USHORT offset_x; + USHORT offset_y; + int iScreenOffset_x; + int iScreenOffset_y; + MONOHWC MonoHWC; + +} HWCINFO, *PHWCINFO; + +typedef struct { + ULONG ulHorMaxResolution; + ULONG ulVerMaxResolution; +} MONITORSIZE; + +typedef struct { + Bool EnableHorScaler; + Bool EnableVerScaler; + int ulHorScalingFactor; + int ulVerScalingFactor; +} SCALER; + +typedef struct { + UCHAR ucDeviceID; + UCHAR ucDisplayPath; + MONITORSIZE MonitorSize; + SCALER ScalerConfig; + /* current mode: uce pScrn->currentMode */ +} DEVICEINFO; + +typedef struct { + Bool bOverlayEnable; + int iSrcWidth; + int iSrcHeight; + int iDstLeft; + int iDstTop; + int iDstWidth; + int iDstHeight; +} OVERLAY_STATUS; + + + +typedef struct _RDCRec { + + EntityInfoPtr pEnt; +#if XSERVER_LIBPCIACCESS + struct pci_device *PciInfo; +#else + pciVideoPtr PciInfo; + PCITAG PciTag; +#endif + + + OptionInfoPtr Options; + DisplayModePtr ModePtr; /* duplicate of pScrn->currentMode, delete this one */ + XAAInfoRecPtr AccelInfoPtr; + xf86CursorInfoPtr HWCInfoPtr; + + VIDEOMODE VideoModeInfo; /* duplicate of pScrn->currentMode, delete this one */ + RDCRegRec SavedReg; + CMDQINFO CMDQInfo; + HWCINFO HWCInfo; + OVERLAY_STATUS OverlayStatus; + DEVICEINFO DeviceInfo; + ULONG ulCMDReg; + Bool EnableClip; + + /* adapter information */ + UCHAR jChipType; + + ULONG ENGCaps; + ULONG FBPhysAddr; /* Frame buffer physical address */ + UCHAR *FBVirtualAddr; /* Map of frame buffer */ + unsigned long FbMapSize; + unsigned long AvailableFBsize; + + ULONG MMIOPhysAddr; /* MMIO region physical address */ + UCHAR *MMIOVirtualAddr; /* Map of MMIO region */ + unsigned long MMIOMapSize; + + UCHAR *BIOSVirtualAddr; /* BIOS virtual address */ + ULONG ulROMType; /* 0: no BIOS 1: VBIOS, 2: ROM file */ + + ULONG MemoryBandwidth; /* The unit is MB*/ + + IOADDRESS IODBase; /* Base of PIO memory area */ + IOADDRESS PIOOffset; + IOADDRESS RelocateIO; + + USHORT usSupportDevice; + + Bool noAccel; + Bool noHWC; + Bool MMIO2D; + int DBGSelect; + + CloseScreenProcPtr CloseScreen; +} RDCRec, *RDCRecPtr; + +#define RDCPTR(p) ((RDCRecPtr)((p)->driverPrivate)) +#define MODE_PRIVATE_PTR(p) ((MODE_PRIVATE*)(p->Private)) + +/* Include Files */ +#include "rdc_mode.h" +#include "rdc_vgatool.h" +#include "rdc_2dtool.h" +#include "rdc_cursor.h" +#include "CInt10.h" +#include "rdc_video.h" diff --git a/src/rdc_2dtool.c b/src/rdc_2dtool.c new file mode 100644 index 0000000..16d9e26 --- /dev/null +++ b/src/rdc_2dtool.c @@ -0,0 +1,315 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" + +/* Driver specific headers */ +#include "rdc.h" + +#ifdef Accel_2D + +/* Prototype type declaration */ +Bool bInitCMDQInfo(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +Bool bEnableCMDQ(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +Bool bEnable2D(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +void vDisable2D(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +void vWaitEngIdle(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +UCHAR *pjRequestCMDQ(RDCRecPtr pRDC, ULONG ulDataLen); + +Bool +bInitCMDQInfo(ScrnInfoPtr pScrn, RDCRecPtr pRDC) +{ + + ScreenPtr pScreen; + + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "==Init CMDQ Info== \n"); + + pRDC->CMDQInfo.pjCmdQBasePort = pRDC->MMIOVirtualAddr+ 0x8044; + pRDC->CMDQInfo.pjWritePort = pRDC->MMIOVirtualAddr+ 0x8048; + pRDC->CMDQInfo.pjReadPort = pRDC->MMIOVirtualAddr+ 0x804C; + pRDC->CMDQInfo.pjEngStatePort = pRDC->MMIOVirtualAddr+ 0x804C; + + /* CMDQ mode Init */ + if (!pRDC->MMIO2D) + { + pRDC->CMDQInfo.ulCMDQType = VM_CMD_QUEUE; + + pScreen = screenInfo.screens[pScrn->scrnIndex]; + + pRDC->CMDQInfo.pjCMDQVirtualAddr = pRDC->FBVirtualAddr + pRDC->CMDQInfo.ulCMDQOffsetAddr; + pRDC->CMDQInfo.ulCurCMDQueueLen = pRDC->CMDQInfo.ulCMDQSize - CMD_QUEUE_GUARD_BAND; + pRDC->CMDQInfo.ulCMDQMask = pRDC->CMDQInfo.ulCMDQSize - 1 ; + } + + /* MMIO mode init */ + if (pRDC->MMIO2D) + { + pRDC->CMDQInfo.ulCMDQType = VM_CMD_MMIO; + } + + return (TRUE); +} + +Bool +bEnableCMDQ(ScrnInfoPtr pScrn, RDCRecPtr pRDC) +{ + ULONG ulVMCmdQBasePort = 0; + + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "==Entry Enable CMDQ== \n"); + + vWaitEngIdle(pScrn, pRDC); + + /* set DBG Select Info */ + if (pRDC->DBGSelect) + { + *(ULONG *) (pRDC->MMIOVirtualAddr + 0x804C) = (ULONG) (pRDC->DBGSelect); + } + + /* set CMDQ base */ + switch (pRDC->CMDQInfo.ulCMDQType) + { + case VM_CMD_QUEUE: + ulVMCmdQBasePort = pRDC->CMDQInfo.ulCMDQOffsetAddr >> 3; + + /* set CMDQ Threshold */ + ulVMCmdQBasePort |= 0xF0000000; + + /* set CMDQ Size */ + switch (pRDC->CMDQInfo.ulCMDQSize) + { + case CMD_QUEUE_SIZE_256K: + ulVMCmdQBasePort |= 0x00000000; + break; + + case CMD_QUEUE_SIZE_512K: + ulVMCmdQBasePort |= 0x04000000; + break; + + case CMD_QUEUE_SIZE_1M: + ulVMCmdQBasePort |= 0x08000000; + break; + + case CMD_QUEUE_SIZE_2M: + ulVMCmdQBasePort |= 0x0C000000; + break; + + default: + return(FALSE); + break; + } + + *(ULONG *) (pRDC->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; + pRDC->CMDQInfo.ulWritePointer = *(ULONG *) (pRDC->CMDQInfo.pjWritePort) << 3; + break; + + case VM_CMD_MMIO: + /* set CMDQ Threshold */ + ulVMCmdQBasePort |= 0xF0000000; + ulVMCmdQBasePort |= 0x02000000; /* MMIO mode */ + *(ULONG *) (pRDC->CMDQInfo.pjCmdQBasePort) = ulVMCmdQBasePort; + break; + + default: + return (FALSE); + break; + } + + return (TRUE); +} + +Bool +bEnable2D(ScrnInfoPtr pScrn, RDCRecPtr pRDC) +{ + + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "==Enable 2D== \n"); + + SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x01); /* enable 2D */ + + SetIndexRegMask(CRTC_PORT, 0xA3, ~0x20, 0x20); /* enable flip */ + *(ULONG *)MMIOREG_1ST_FLIP |= 0x80000000; + + if (!bInitCMDQInfo(pScrn, pRDC)) + { + vDisable2D(pScrn, pRDC); + return (FALSE); + } + + if (!bEnableCMDQ(pScrn, pRDC)) + { + vDisable2D(pScrn, pRDC); + return (FALSE); + } + + return (TRUE); +} + +void +vDisable2D(ScrnInfoPtr pScrn, RDCRecPtr pRDC) +{ + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "==Engine Disable 2D== \n"); + + vWaitEngIdle(pScrn, pRDC); + vWaitEngIdle(pScrn, pRDC); + SetIndexRegMask(CRTC_PORT, 0xA4, 0xFE, 0x00); + + SetIndexRegMask(CRTC_PORT, 0xA3, ~0x20, 0x00); /* disable flip */ + *(ULONG *)MMIOREG_1ST_FLIP &= ~0x80000000; +} + + +void +vWaitEngIdle(ScrnInfoPtr pScrn, RDCRecPtr pRDC) +{ + ULONG ulEngState, ulEngState2; + + xf86DrvMsgVerb(0, X_INFO, 10, "==Entry Wait Idle== \n"); + + do /* wait engine idle */ + { + ulEngState = *((volatile ULONG*)(pRDC->MMIOVirtualAddr + 0x804c)); + ulEngState2 = *((volatile ULONG*)(pRDC->MMIOVirtualAddr + 0x8048)); + } while ((ulEngState & 0x80000000) || + ((ulEngState&0x3ffff) != (ulEngState2&0x3ffff))); + + xf86DrvMsgVerb(0, X_INFO, 10, "==Exit Wait Idle== \n"); +} + +/* ULONG ulGetCMDQLength() */ +__inline ULONG ulGetCMDQLength(RDCRecPtr pRDC, ULONG ulWritePointer, ULONG ulCMDQMask) +{ + ULONG ulReadPointer, ulReadPointer2; + + do { + ulReadPointer = *((volatile ULONG *)(pRDC->CMDQInfo.pjReadPort)) & 0x0003FFFF; + ulReadPointer2 = *((volatile ULONG *)(pRDC->CMDQInfo.pjReadPort)) & 0x0003FFFF; + ulReadPointer2 = *((volatile ULONG *)(pRDC->CMDQInfo.pjReadPort)) & 0x0003FFFF; + ulReadPointer2 = *((volatile ULONG *)(pRDC->CMDQInfo.pjReadPort)) & 0x0003FFFF; + ulReadPointer2 = *((volatile ULONG *)(pRDC->CMDQInfo.pjReadPort)) & 0x0003FFFF; + ulReadPointer2 = *((volatile ULONG *)(pRDC->CMDQInfo.pjReadPort)) & 0x0003FFFF; + } while (ulReadPointer != ulReadPointer2); + + return ((ulReadPointer << 3) - ulWritePointer - CMD_QUEUE_GUARD_BAND) & ulCMDQMask; +} + +UCHAR *pjRequestCMDQ( +RDCRecPtr pRDC, ULONG ulDataLen) +{ + UCHAR *pjBuffer; + ULONG i, ulWritePointer, ulCMDQMask, ulCurCMDQLen, ulContinueCMDQLen; + + ulWritePointer = pRDC->CMDQInfo.ulWritePointer; + ulContinueCMDQLen = pRDC->CMDQInfo.ulCMDQSize - ulWritePointer; + ulCMDQMask = pRDC->CMDQInfo.ulCMDQMask; + + if (ulContinueCMDQLen >= ulDataLen) + { + /* Get CMDQ Buffer */ + if (pRDC->CMDQInfo.ulCurCMDQueueLen < ulDataLen) + { + do + { + ulCurCMDQLen = ulGetCMDQLength(pRDC, ulWritePointer, ulCMDQMask); + } while (ulCurCMDQLen < ulDataLen); + + pRDC->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; + } + + pjBuffer = pRDC->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; + pRDC->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; + pRDC->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; + return pjBuffer; + } + else + { + + /* Fill NULL CMD to the last of the CMDQ */ + if (pRDC->CMDQInfo.ulCurCMDQueueLen < ulContinueCMDQLen) + { + do + { + ulCurCMDQLen = ulGetCMDQLength(pRDC, ulWritePointer, ulCMDQMask); + } while (ulCurCMDQLen < ulContinueCMDQLen); + + pRDC->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; + } + + pjBuffer = pRDC->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; + + for (i = 0; i<ulContinueCMDQLen/8; i++, pjBuffer+=8) + { + *(ULONG *)pjBuffer = (ULONG) PKT_NULL_CMD; + *(ULONG *) (pjBuffer+4) = 0; + } + + pRDC->CMDQInfo.ulCurCMDQueueLen -= ulContinueCMDQLen; + pRDC->CMDQInfo.ulWritePointer = ulWritePointer = 0; + + /* Get CMDQ Buffer */ + if (pRDC->CMDQInfo.ulCurCMDQueueLen < ulDataLen) + { + do + { + ulCurCMDQLen = ulGetCMDQLength(pRDC, ulWritePointer, ulCMDQMask); + } while (ulCurCMDQLen < ulDataLen); + + pRDC->CMDQInfo.ulCurCMDQueueLen = ulCurCMDQLen; + } + + pRDC->CMDQInfo.ulCurCMDQueueLen -= ulDataLen; + pjBuffer = pRDC->CMDQInfo.pjCMDQVirtualAddr + ulWritePointer; + pRDC->CMDQInfo.ulWritePointer = (ulWritePointer + ulDataLen) & ulCMDQMask; + return pjBuffer; + } + +} /* end of pjRequestCmdQ() */ + +#endif /* end of Accel_2D */ diff --git a/src/rdc_2dtool.h b/src/rdc_2dtool.h new file mode 100644 index 0000000..1763f2c --- /dev/null +++ b/src/rdc_2dtool.h @@ -0,0 +1,496 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + + +/* Eng Capability Definition */ +#define ENG_CAP_Sync 0x00000001 +#define ENG_CAP_ScreenToScreenCopy 0x00000002 +#define ENG_CAP_SolidFill 0x00000004 +#define ENG_CAP_SolidLine 0x00000008 +#define ENG_CAP_DashedLine 0x00000010 +#define ENG_CAP_Mono8x8PatternFill 0x00000020 +#define ENG_CAP_Color8x8PatternFill 0x00000040 +#define ENG_CAP_CPUToScreenColorExpand 0x00000080 +#define ENG_CAP_ScreenToScreenColorExpand 0x00000100 +#define ENG_CAP_Clipping 0x00000200 +#define ENG_CAP_ALL (ENG_CAP_Sync | ENG_CAP_ScreenToScreenCopy | ENG_CAP_SolidFill | \ + ENG_CAP_SolidLine | ENG_CAP_DashedLine | \ + ENG_CAP_Mono8x8PatternFill | ENG_CAP_Color8x8PatternFill | \ + ENG_CAP_Clipping); + +#define ENG_CAP_VIDEO_DISP 0x00000400 +#define ENG_CAP_VIDEO_POS 0x00000800 +#define ENG_CAP_HWC_MMIO 0x00001000 + +/* CMDQ Definition */ +#define VM_CMD_QUEUE 0 +#define VM_CMD_MMIO 2 + +#define CMD_QUEUE_SIZE_256K 0x00040000 +#define CMD_QUEUE_SIZE_512K 0x00080000 +#define CMD_QUEUE_SIZE_1M 0x00100000 +#define CMD_QUEUE_SIZE_2M 0x00200000 +#define CMD_QUEUE_SIZE_4M 0x00400000 + +/* CMD Type Info */ +#define PKT_NULL_CMD 0x00009561 + +#define PKT_SINGLE_LENGTH 8 +#define PKT_SINGLE_CMD_HEADER 0x00009562 + +typedef struct _PKT_SC +{ + ULONG PKT_SC_dwHeader; + ULONG PKT_SC_dwData[1]; + +} PKT_SC, *PPKT_SC; + +/* Eng Reg. Limitation */ +#define MAX_SRC_X 0x7FF +#define MAX_SRC_Y 0x7FF +#define MAX_DST_X 0x7FF +#define MAX_DST_Y 0x7FF + +#define MASK_SRC_PITCH 0x1FFF +#define MASK_DST_PITCH 0x1FFF +#define MASK_DST_HEIGHT 0x7FF +#define MASK_SRC_X 0xFFF +#define MASK_SRC_Y 0xFFF +#define MASK_DST_X 0xFFF +#define MASK_DST_Y 0xFFF +#define MASK_RECT_WIDTH 0x7FF +#define MASK_RECT_HEIGHT 0x7FF +#define MASK_CLIP 0xFFF +#define MASK_1ST_FLIP_BASE 0x0FFFFFF8 + +#define MASK_LINE_X 0xFFF +#define MASK_LINE_Y 0xFFF +#define MASK_LINE_ERR 0x3FFFFF +#define MASK_LINE_WIDTH 0x7FF +#define MASK_LINE_K1 0x3FFFFF +#define MASK_LINE_K2 0x3FFFFF +#define MASK_M2010LINE_X 0xFFF +#define MASK_M2010LINE_Y 0xFFF + +#define MAX_PATReg_Size 256 + +/* Eng Reg. Definition */ +/* MMIO Reg */ +#define MMIOREG_SRC_BASE (pRDC->MMIOVirtualAddr + 0x8000) +#define MMIOREG_SRC_PITCH (pRDC->MMIOVirtualAddr + 0x8004) +#define MMIOREG_DST_BASE (pRDC->MMIOVirtualAddr + 0x8008) +#define MMIOREG_DST_PITCH (pRDC->MMIOVirtualAddr + 0x800C) +#define MMIOREG_DST_XY (pRDC->MMIOVirtualAddr + 0x8010) +#define MMIOREG_SRC_XY (pRDC->MMIOVirtualAddr + 0x8014) +#define MMIOREG_RECT_XY (pRDC->MMIOVirtualAddr + 0x8018) +#define MMIOREG_FG (pRDC->MMIOVirtualAddr + 0x801C) +#define MMIOREG_BG (pRDC->MMIOVirtualAddr + 0x8020) +#define MMIOREG_FG_SRC (pRDC->MMIOVirtualAddr + 0x8024) +#define MMIOREG_BG_SRC (pRDC->MMIOVirtualAddr + 0x8028) +#define MMIOREG_MONO1 (pRDC->MMIOVirtualAddr + 0x802C) +#define MMIOREG_MONO2 (pRDC->MMIOVirtualAddr + 0x8030) +#define MMIOREG_CLIP1 (pRDC->MMIOVirtualAddr + 0x8034) +#define MMIOREG_CLIP2 (pRDC->MMIOVirtualAddr + 0x8038) +#define MMIOREG_CMD (pRDC->MMIOVirtualAddr + 0x803C) +#define MMIOREG_1ST_FLIP (pRDC->MMIOVirtualAddr + 0x8040) +#define MMIOREG_PAT (pRDC->MMIOVirtualAddr + 0x8100) + +#define MMIOREG_LINE_XY (pRDC->MMIOVirtualAddr + 0x8010) +#define MMIOREG_LINE_Err (pRDC->MMIOVirtualAddr + 0x8014) +#define MMIOREG_LINE_WIDTH (pRDC->MMIOVirtualAddr + 0x8018) +#define MMIOREG_LINE_K1 (pRDC->MMIOVirtualAddr + 0x8024) +#define MMIOREG_LINE_K2 (pRDC->MMIOVirtualAddr + 0x8028) +#define MMIOREG_LINE_STYLE1 (pRDC->MMIOVirtualAddr + 0x802C) +#define MMIOREG_LINE_STYLE2 (pRDC->MMIOVirtualAddr + 0x8030) +#define MMIOREG_LINE_XY2 (pRDC->MMIOVirtualAddr + 0x8014) +#define MMIOREG_LINE_NUMBER (pRDC->MMIOVirtualAddr + 0x8018) + +/* CMDQ Reg */ +#define CMDQREG_SRC_BASE (0x00 << 24) +#define CMDQREG_SRC_PITCH (0x01 << 24) +#define CMDQREG_DST_BASE (0x02 << 24) +#define CMDQREG_DST_PITCH (0x03 << 24) +#define CMDQREG_DST_XY (0x04 << 24) +#define CMDQREG_SRC_XY (0x05 << 24) +#define CMDQREG_RECT_XY (0x06 << 24) +#define CMDQREG_FG (0x07 << 24) +#define CMDQREG_BG (0x08 << 24) +#define CMDQREG_FG_SRC (0x09 << 24) +#define CMDQREG_BG_SRC (0x0A << 24) +#define CMDQREG_MONO1 (0x0B << 24) +#define CMDQREG_MONO2 (0x0C << 24) +#define CMDQREG_CLIP1 (0x0D << 24) +#define CMDQREG_CLIP2 (0x0E << 24) +#define CMDQREG_CMD (0x0F << 24) +#define CMDQREG_PAT (0x40 << 24) + +#define CMDQREG_LINE_XY (0x04 << 24) +#define CMDQREG_LINE_Err (0x05 << 24) +#define CMDQREG_LINE_WIDTH (0x06 << 24) +#define CMDQREG_LINE_K1 (0x09 << 24) +#define CMDQREG_LINE_K2 (0x0A << 24) +#define CMDQREG_LINE_STYLE1 (0x0B << 24) +#define CMDQREG_LINE_STYLE2 (0x0C << 24) +#define CMDQREG_LINE_XY2 (0x05 << 24) +#define CMDQREG_LINE_NUMBER (0x06 << 24) + +/* CMD Reg. Definition */ +#define CMD_BITBLT 0x00000000 +#define CMD_LINEDRAW 0x00000001 +#define CMD_COLOREXP 0x00000002 +#define CMD_ENHCOLOREXP 0x00000003 +#define CMD_TRANSPARENTBLT 0x00000004 +#define CMD_MASK 0x00000007 + +#define CMD_DISABLE_CLIP 0x00000000 +#define CMD_ENABLE_CLIP 0x00000008 + +#define CMD_COLOR_08 0x00000000 +#define CMD_COLOR_16 0x00000010 +#define CMD_COLOR_32 0x00000020 + +#define CMD_SRC_SIQ 0x00000040 + +#define CMD_TRANSPARENT 0x00000080 + +#define CMD_PAT_FGCOLOR 0x00000000 +#define CMD_PAT_MONOMASK 0x00010000 +#define CMD_PAT_PATREG 0x00020000 + +#define CMD_OPAQUE 0x00000000 +#define CMD_FONT_TRANSPARENT 0x00040000 + +#define CMD_X_INC 0x00000000 +#define CMD_X_DEC 0x00200000 + +#define CMD_Y_INC 0x00000000 +#define CMD_Y_DEC 0x00100000 + +#define CMD_NT_LINE 0x00000000 +#define CMD_NORMAL_LINE 0x00400000 + +#define CMD_DRAW_LAST_PIXEL 0x00000000 +#define CMD_NOT_DRAW_LAST_PIXEL 0x00800000 + +#define CMD_DISABLE_LINE_STYLE 0x00000000 +#define CMD_ENABLE_LINE_STYLE 0x40000000 + +#define CMD_RESET_STYLE_COUNTER 0x80000000 +#define CMD_NOT_RESET_STYLE_COUNTER 0x00000000 + +#define BURST_FORCE_CMD 0x80000000 + +/* Line */ +#define LINEPARAM_XM 0x00000001 +#define LINEPARAM_X_DEC 0x00000002 +#define LINEPARAM_Y_DEC 0x00000004 + +typedef struct _LINEPARAM { + USHORT dsLineX; + USHORT dsLineY; + USHORT dsLineWidth; + ULONG dwErrorTerm; + ULONG dwK1Term; + ULONG dwK2Term; + ULONG dwLineAttributes; +} LINEPARAM, *PLINEPARAM; + +typedef struct { + LONG X1; + LONG Y1; + LONG X2; + LONG Y2; +} _LINEInfo; + +/* Macro */ +/* MMIO 2D Macro */ +#define RDCSetupSRCBase_MMIO(base) \ + { \ + do { \ + *(ULONG *)(MMIOREG_SRC_BASE) = (ULONG) (base); \ + } while (*(volatile ULONG *)(MMIOREG_SRC_BASE) != (ULONG) (base)); \ + } +#define RDCSetupSRCPitch_MMIO(pitch) \ + { \ + do { \ + *(ULONG *)(MMIOREG_SRC_PITCH) = (ULONG)(pitch << 16); \ + } while (*(volatile ULONG *)(MMIOREG_SRC_PITCH) != (ULONG)(pitch << 16)); \ + } +#define RDCSetupDSTBase_MMIO(base) \ + { \ + do { \ + *(ULONG *)(MMIOREG_DST_BASE) = (ULONG)(base); \ + } while (*(volatile ULONG *)(MMIOREG_DST_BASE) != (ULONG)(base)); \ + } +#define RDCSetupDSTPitchHeight_MMIO(pitch, height) \ + { \ + ULONG dstpitch; \ + dstpitch = (ULONG)((pitch << 16) + ((height) & MASK_DST_HEIGHT)); \ + do { \ + *(ULONG *)(MMIOREG_DST_PITCH) = dstpitch; \ + } while (*(volatile ULONG *)(MMIOREG_DST_PITCH) != dstpitch); \ + } +#define RDCSetupDSTXY_MMIO(x, y) \ + { \ + ULONG dstxy; \ + dstxy = (ULONG)(((x & MASK_DST_X) << 16) + (y & MASK_DST_Y)); \ + do { \ + *(ULONG *)(MMIOREG_DST_XY) = dstxy; \ + } while (*(volatile ULONG *)(MMIOREG_DST_XY) != dstxy); \ + } +#define RDCSetupSRCXY_MMIO(x, y) \ + { \ + ULONG srcxy; \ + srcxy = (ULONG)(((x & MASK_SRC_X) << 16) + (y & MASK_SRC_Y)); \ + do { \ + *(ULONG *)(MMIOREG_SRC_XY) = srcxy; \ + } while (*(volatile ULONG *)(MMIOREG_SRC_XY) != srcxy); \ + } +#define RDCSetupRECTXY_MMIO(x, y) \ + { \ + ULONG rectxy; \ + rectxy = (ULONG)(((x & MASK_RECT_WIDTH) << 16) + (y & MASK_RECT_WIDTH)); \ + do { \ + *(ULONG *)(MMIOREG_RECT_XY) = rectxy; \ + } while (*(volatile ULONG *)(MMIOREG_RECT_XY) != rectxy); \ + } +#define RDCSetupFG_MMIO(color) \ + { \ + do { \ + *(ULONG *)(MMIOREG_FG) = (ULONG)(color); \ + } while (*(volatile ULONG *)(MMIOREG_FG) != (ULONG)(color)); \ + } +#define RDCSetupBG_MMIO(color) \ + { \ + do { \ + *(ULONG *)(MMIOREG_BG) = (ULONG)(color); \ + } while (*(volatile ULONG *)(MMIOREG_BG) != (ULONG)(color)); \ + } +#define RDCSetupMONO1_MMIO(pat) \ + { \ + do { \ + *(ULONG *)(MMIOREG_MONO1) = (ULONG)(pat); \ + } while (*(volatile ULONG *)(MMIOREG_MONO1) != (ULONG)(pat)); \ + } +#define RDCSetupMONO2_MMIO(pat) \ + { \ + do { \ + *(ULONG *)(MMIOREG_MONO2) = (ULONG)(pat); \ + } while (*(volatile ULONG *)(MMIOREG_MONO2) != (ULONG)(pat)); \ + } +#define RDCSetupCLIP1_MMIO(left, top) \ + { \ + ULONG clip1; \ + clip1 = (ULONG)(((left & MASK_CLIP) << 16) + (top & MASK_CLIP)); \ + do { \ + *(ULONG *)(MMIOREG_CLIP1) = clip1; \ + } while (*(volatile ULONG *)(MMIOREG_CLIP1) != clip1); \ + } +#define RDCSetupCLIP2_MMIO(right, bottom) \ + { \ + ULONG clip2; \ + clip2 = (ULONG)(((right & MASK_CLIP) << 16) + (bottom & MASK_CLIP)); \ + do { \ + *(ULONG *)(MMIOREG_CLIP2) = clip2; \ + } while (*(volatile ULONG *)(MMIOREG_CLIP2) != clip2); \ + } +#define RDCSetupCMDReg_MMIO(reg) \ + { \ + *(ULONG *)(MMIOREG_CMD) = (ULONG)(reg); \ + } +#define RDCSetupPatReg_MMIO(patreg, pat) \ + { \ + do { \ + *(ULONG *)(MMIOREG_PAT + patreg*4) = (ULONG)(pat); \ + } while (*(volatile ULONG *)(MMIOREG_PAT + patreg*4) != (ULONG)(pat)); \ + } + +/* Line CMD */ +#define RDCSetupLineXMErrTerm_MMIO(xm, err) \ + { \ + ULONG lineerr; \ + lineerr = (ULONG)((xm << 24) + (err & MASK_LINE_ERR)); \ + do { \ + *(ULONG *)(MMIOREG_LINE_Err) = lineerr; \ + } while (*(volatile ULONG *)(MMIOREG_LINE_Err) != lineerr); \ + } +#define RDCSetupLineWidth_MMIO(width) \ + { \ + ULONG linewidth; \ + linewidth = (ULONG)((width & MASK_LINE_WIDTH) << 16); \ + do { \ + *(ULONG *)(MMIOREG_LINE_WIDTH) = linewidth; \ + } while (*(volatile ULONG *)(MMIOREG_LINE_WIDTH) != linewidth); \ + } +#define RDCSetupLineK1Term_MMIO(err) \ + { \ + do { \ + *(ULONG *)(MMIOREG_LINE_K1) = (ULONG)(err & MASK_LINE_K1); \ + } while (*(volatile ULONG *)(MMIOREG_LINE_K1) != (ULONG)(err & MASK_LINE_K1)); \ + } +#define RDCSetupLineK2Term_MMIO(err) \ + { \ + do { \ + *(ULONG *)(MMIOREG_LINE_K2) = (ULONG)(err & MASK_LINE_K2); \ + } while (*(volatile ULONG *)(MMIOREG_LINE_K2) != (ULONG)(err & MASK_LINE_K2)); \ + } +#define RDCSetupLineStyle1_MMIO(pat) \ + { \ + do { \ + *(ULONG *)(MMIOREG_LINE_STYLE1) = (ULONG)(pat); \ + } while (*(volatile ULONG *)(MMIOREG_LINE_STYLE1) != (ULONG)(pat)); \ + } +#define RDCSetupLineStyle2_MMIO(pat) \ + { \ + do { \ + *(ULONG *)(MMIOREG_LINE_STYLE2) = (ULONG)(pat); \ + } while (*(volatile ULONG *)(MMIOREG_LINE_STYLE2) != (ULONG)(pat)); \ + } + +#define RDCSetupLineXY_MMIO(x, y) \ + { \ + ULONG linexy; \ + linexy = (ULONG)(((x & MASK_M2010LINE_X) << 16) + (y & MASK_M2010LINE_Y)); \ + do { \ + *(ULONG *)(MMIOREG_LINE_XY) = linexy; \ + } while (*(volatile ULONG *)(MMIOREG_LINE_XY) != linexy); \ + } +#define RDCSetupLineXY2_MMIO(x, y) \ + { \ + ULONG linexy; \ + linexy = (ULONG)(((x & MASK_M2010LINE_X) << 16) + (y & MASK_M2010LINE_Y)); \ + do { \ + *(ULONG *)(MMIOREG_LINE_XY2) = linexy; \ + } while (*(volatile ULONG *)(MMIOREG_LINE_XY2) != linexy); \ + } +#define RDCSetupLineNumber_MMIO(no) \ + { \ + do { \ + *(ULONG *)(MMIOREG_LINE_NUMBER) = (ULONG) no; \ + } while (*(volatile ULONG *)(MMIOREG_LINE_NUMBER) != (ULONG) no); \ + } + +/* CMDQ Mode Macro */ +#define mUpdateWritePointer *(ULONG *) (pRDC->CMDQInfo.pjWritePort) = (pRDC->CMDQInfo.ulWritePointer >>3) + +/* General CMD */ +#define RDCSetupSRCBase(addr, base) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_SRC_BASE); \ + addr->PKT_SC_dwData[0] = (ULONG)(base); \ + } +#define RDCSetupSRCPitch(addr, pitch) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_SRC_PITCH); \ + addr->PKT_SC_dwData[0] = (ULONG)(pitch << 16); \ + } +#define RDCSetupDSTBase(addr, base) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_DST_BASE); \ + addr->PKT_SC_dwData[0] = (ULONG)(base); \ + } +#define RDCSetupDSTPitchHeight(addr, pitch, height) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_DST_PITCH); \ + addr->PKT_SC_dwData[0] = (ULONG)((pitch << 16) + ((height) & MASK_DST_HEIGHT)); \ + } +#define RDCSetupDSTXY(addr, x, y) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_DST_XY); \ + addr->PKT_SC_dwData[0] = (ULONG)(((x & MASK_DST_X) << 16) + (y & MASK_DST_Y)); \ + } +#define RDCSetupSRCXY(addr, x, y) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_SRC_XY); \ + addr->PKT_SC_dwData[0] = (ULONG)(((x & MASK_SRC_X) << 16) + (y & MASK_SRC_Y)); \ + } +#define RDCSetupRECTXY(addr, x, y) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_RECT_XY); \ + addr->PKT_SC_dwData[0] = (ULONG)(((x & MASK_RECT_WIDTH) << 16) + (y & MASK_RECT_WIDTH)); \ + } +#define RDCSetupFG(addr, color) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_FG); \ + addr->PKT_SC_dwData[0] = (ULONG)(color); \ + } +#define RDCSetupBG(addr, color) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_BG); \ + addr->PKT_SC_dwData[0] = (ULONG)(color); \ + } +#define RDCSetupMONO1(addr, pat) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_MONO1); \ + addr->PKT_SC_dwData[0] = (ULONG)(pat); \ + } +#define RDCSetupMONO2(addr, pat) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_MONO2); \ + addr->PKT_SC_dwData[0] = (ULONG)(pat); \ + } +#define RDCSetupCLIP1(addr, left, top) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_CLIP1); \ + addr->PKT_SC_dwData[0] = (ULONG)(((left & MASK_CLIP) << 16) + (top & MASK_CLIP)); \ + } +#define RDCSetupCLIP2(addr, right, bottom) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_CLIP2); \ + addr->PKT_SC_dwData[0] = (ULONG)(((right & MASK_CLIP) << 16) + (bottom & MASK_CLIP)); \ + } +#define RDCSetupCMDReg(addr, reg) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_CMD); \ + addr->PKT_SC_dwData[0] = (ULONG)(reg); \ + } +#define RDCSetupPatReg(addr, patreg, pat) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + (CMDQREG_PAT + (patreg << 24))); \ + addr->PKT_SC_dwData[0] = (ULONG)(pat); \ + } + +/* Line CMD */ +#define RDCSetupLineStyle1(addr, pat) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_LINE_STYLE1); \ + addr->PKT_SC_dwData[0] = (ULONG)(pat); \ + } +#define RDCSetupLineStyle2(addr, pat) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_LINE_STYLE2); \ + addr->PKT_SC_dwData[0] = (ULONG)(pat); \ + } + +#define RDCSetupLineXY(addr, x, y) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_LINE_XY); \ + addr->PKT_SC_dwData[0] = (ULONG)(((x & MASK_M2010LINE_X) << 16) + (y & MASK_M2010LINE_Y)); \ + } +#define RDCSetupLineXY2(addr, x, y) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_LINE_XY2); \ + addr->PKT_SC_dwData[0] = (ULONG)(((x & MASK_M2010LINE_X) << 16) + (y & MASK_M2010LINE_Y)); \ + } +#define RDCSetupLineNumber(addr, no) \ + { \ + addr->PKT_SC_dwHeader = (ULONG)(PKT_SINGLE_CMD_HEADER + CMDQREG_LINE_NUMBER); \ + addr->PKT_SC_dwData[0] = (ULONG)(no); \ + } diff --git a/src/rdc_accel.c b/src/rdc_accel.c new file mode 100644 index 0000000..d78b9ec --- /dev/null +++ b/src/rdc_accel.c @@ -0,0 +1,1471 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" + +/* Driver specific headers */ +#include "rdc.h" + +#ifdef Accel_2D +/* ROP Translation Table */ +int RDCXAACopyROP[16] = +{ + ROP_0, /* GXclear */ + ROP_DSa, /* GXand */ + ROP_SDna, /* GXandReverse */ + ROP_S, /* GXcopy */ + ROP_DSna, /* GXandInverted */ + ROP_D, /* GXnoop */ + ROP_DSx, /* GXxor */ + ROP_DSo, /* GXor */ + ROP_DSon, /* GXnor */ + ROP_DSxn, /* GXequiv */ + ROP_Dn, /* GXinvert*/ + ROP_SDno, /* GXorReverse */ + ROP_Sn, /* GXcopyInverted */ + ROP_DSno, /* GXorInverted */ + ROP_DSan, /* GXnand */ + ROP_1 /* GXset */ +}; + +int RDCXAAPatternROP[16]= +{ + ROP_0, + ROP_DPa, + ROP_PDna, + ROP_P, + ROP_DPna, + ROP_D, + ROP_DPx, + ROP_DPo, + ROP_DPon, + ROP_PDxn, + ROP_Dn, + ROP_PDno, + ROP_Pn, + ROP_DPno, + ROP_DPan, + ROP_1 +}; + +/* extern function */ +extern void vWaitEngIdle(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +extern UCHAR *pjRequestCMDQ(RDCRecPtr pRDC, ULONG ulDataLen); +extern Bool bGetLineTerm(_LINEInfo *LineInfo, LINEPARAM *dsLineParam); + +/* Prototype type declaration */ +Bool RDCAccelInit(ScreenPtr pScreen); +static void RDCSync(ScrnInfoPtr pScrn); +static void RDCSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, + int xdir, int ydir, int rop, + unsigned int planemask, int trans_color); +static void RDCSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, + int y2, int w, int h); +static void RDCSetupForSolidFill(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask); +static void RDCSubsequentSolidFillRect(ScrnInfoPtr pScrn, + int dst_x, int dst_y, int width, int height); +static void RDCSetupForSolidLine(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask); +static void RDCSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, + int x, int y, int len, int dir); +static void RDCSetupForDashedLine(ScrnInfoPtr pScrn, + int fg, int bg, int rop, unsigned int planemask, + int length, UCHAR *pattern); +static void RDCSetupForMonoPatternFill(ScrnInfoPtr pScrn, + int patx, int paty, int fg, int bg, + int rop, unsigned int planemask); +static void RDCSubsequentMonoPatternFill(ScrnInfoPtr pScrn, + int patx, int paty, + int x, int y, int w, int h); +static void RDCSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, + int rop, unsigned int planemask, int trans_col); +static void RDCSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty, + int x, int y, int w, int h); +static void RDCSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask); +static void RDCSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, + int width, int height, int skipleft); +static void RDCSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask); +static void RDCSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, + int x, int y, int width, int height, + int src_x, int src_y, int offset); +static void RDCSetClippingRectangle(ScrnInfoPtr pScrn, + int left, int top, int right, int bottom); +static void RDCDisableClipping(ScrnInfoPtr pScrn); + +static void RDCSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2, int flags); +static void RDCSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2, + int flags, int phase); + +Bool +RDCAccelInit(ScreenPtr pScreen) +{ + XAAInfoRecPtr infoPtr; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCAccelInit()== \n"); +#endif + pRDC->AccelInfoPtr = infoPtr = XAACreateInfoRec(); + if (!infoPtr) + { +#if Accel_2D_DEBUG + xf86DrvMsgVerb(0, X_INFO, ErrorLevel, "==Exit1 RDCAccelInit(), return FALSE== \n"); +#endif + return FALSE; + } + infoPtr->Flags = LINEAR_FRAMEBUFFER | + OFFSCREEN_PIXMAPS | + PIXMAP_CACHE; + + /* Sync */ + if (pRDC->ENGCaps & ENG_CAP_Sync) + infoPtr->Sync = RDCSync; + + /* Screen To Screen copy */ + if (pRDC->ENGCaps & ENG_CAP_ScreenToScreenCopy) + { + infoPtr->SetupForScreenToScreenCopy = RDCSetupForScreenToScreenCopy; + infoPtr->SubsequentScreenToScreenCopy = RDCSubsequentScreenToScreenCopy; + infoPtr->ScreenToScreenCopyFlags = NO_TRANSPARENCY | NO_PLANEMASK; + } + + /* Solid fill */ + if (pRDC->ENGCaps & ENG_CAP_SolidFill) + { + infoPtr->SetupForSolidFill = RDCSetupForSolidFill; + infoPtr->SubsequentSolidFillRect = RDCSubsequentSolidFillRect; + infoPtr->SolidFillFlags = NO_PLANEMASK; + } + + /* Solid Lines */ + if (pRDC->ENGCaps & ENG_CAP_SolidLine) + { + infoPtr->SetupForSolidLine = RDCSetupForSolidLine; + infoPtr->SubsequentSolidTwoPointLine = RDCSubsequentSolidTwoPointLine; + infoPtr->SubsequentSolidHorVertLine = RDCSubsequentSolidHorVertLine; + infoPtr->SolidLineFlags = NO_PLANEMASK; + } + + /* Dashed Lines */ + if (pRDC->ENGCaps & ENG_CAP_DashedLine) + { + infoPtr->SetupForDashedLine = RDCSetupForDashedLine; + infoPtr->SubsequentDashedTwoPointLine = RDCSubsequentDashedTwoPointLine; + infoPtr->DashPatternMaxLength = 64; + infoPtr->DashedLineFlags = NO_PLANEMASK | + LINE_PATTERN_MSBFIRST_LSBJUSTIFIED; + } + + /* 8x8 mono pattern fill */ + if (pRDC->ENGCaps & ENG_CAP_Mono8x8PatternFill) + { + infoPtr->SetupForMono8x8PatternFill = RDCSetupForMonoPatternFill; + infoPtr->SubsequentMono8x8PatternFillRect = RDCSubsequentMonoPatternFill; + infoPtr->Mono8x8PatternFillFlags = NO_PLANEMASK | + NO_TRANSPARENCY | + HARDWARE_PATTERN_SCREEN_ORIGIN | + HARDWARE_PATTERN_PROGRAMMED_BITS | + BIT_ORDER_IN_BYTE_MSBFIRST; + } + + /* 8x8 color pattern fill */ + if (pRDC->ENGCaps & ENG_CAP_Color8x8PatternFill) + { + infoPtr->SetupForColor8x8PatternFill = RDCSetupForColor8x8PatternFill; + infoPtr->SubsequentColor8x8PatternFillRect = RDCSubsequentColor8x8PatternFillRect; + infoPtr->Color8x8PatternFillFlags = NO_PLANEMASK | + NO_TRANSPARENCY | + HARDWARE_PATTERN_SCREEN_ORIGIN; + } + + /* CPU To Screen Color Expand */ + if (pRDC->ENGCaps & ENG_CAP_CPUToScreenColorExpand) + { + infoPtr->SetupForCPUToScreenColorExpandFill = RDCSetupForCPUToScreenColorExpandFill; + infoPtr->SubsequentCPUToScreenColorExpandFill = RDCSubsequentCPUToScreenColorExpandFill; + infoPtr->ColorExpandRange = MAX_PATReg_Size; + infoPtr->ColorExpandBase = MMIOREG_PAT; + infoPtr->CPUToScreenColorExpandFillFlags = NO_PLANEMASK | + BIT_ORDER_IN_BYTE_MSBFIRST; + } + + /* Screen To Screen Color Expand */ + if (pRDC->ENGCaps & ENG_CAP_ScreenToScreenColorExpand) + { + infoPtr->SetupForScreenToScreenColorExpandFill = RDCSetupForScreenToScreenColorExpandFill; + infoPtr->SubsequentScreenToScreenColorExpandFill = RDCSubsequentScreenToScreenColorExpandFill; + infoPtr->ScreenToScreenColorExpandFillFlags = NO_PLANEMASK | + BIT_ORDER_IN_BYTE_MSBFIRST; + } + + /* Clipping */ + if (pRDC->ENGCaps & ENG_CAP_Clipping) + { + infoPtr->SetClippingRectangle = RDCSetClippingRectangle; + infoPtr->DisableClipping = RDCDisableClipping; + infoPtr->ClippingFlags = HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY | + HARDWARE_CLIP_MONO_8x8_FILL | + HARDWARE_CLIP_COLOR_8x8_FILL | + HARDWARE_CLIP_SOLID_LINE | + HARDWARE_CLIP_DASHED_LINE | + HARDWARE_CLIP_SOLID_LINE; + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 RDCAccelInit()== \n"); +#endif + + return(XAAInit(pScreen, infoPtr)); +} /* end of RDCAccelInit */ + + +static void +RDCSync(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCSync()== \n"); +#endif + /* wait engle idle */ + vWaitEngIdle(pScrn, pRDC); +#if Accel_2D_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit RDCSync()== \n"); +#endif +} /* end of RDCSync */ + + +static void RDCSetupForScreenToScreenCopy(ScrnInfoPtr pScrn, + int xdir, int ydir, int rop, + unsigned int planemask, int trans_color) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg = 0; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForScreenToScreenCopy(xdir = %d, ydir = %d, rop = 0x%x, planemask = 0x%x, trans_color = 0x%x)== \n", xdir, ydir, rop, planemask, trans_color); +#endif + /* Modify Reg. Value */ + cmdreg = CMD_BITBLT; + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + + cmdreg |= (RDCXAACopyROP[rop] << 8); + + if (xdir == -1) + { + cmdreg |= CMD_X_DEC; + } + if (ydir == -1) + { + cmdreg |= CMD_Y_DEC; + } + + pRDC->ulCMDReg = cmdreg; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*2); + + RDCSetupSRCPitch(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch); + pSingleCMD++; + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + } + else + { + /* Write to MMIO */ + RDCSetupSRCPitch_MMIO(pRDC->VideoModeInfo.ScreenPitch); + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForScreenToScreenCopy()== \n"); +#endif +} /* end of RDCSetupForScreenToScreenCopy */ + +static void +RDCSubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int x1, int y1, int x2, + int y2, int width, int height) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + int src_x, src_y, dst_x, dst_y; + ULONG srcbase, dstbase, cmdreg; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSubsequentScreenToScreenCopy(x1 = %d, y1 = %d, x2 = %d, y2 = %d, width = %d, height = %d)== \n", x1, y1, x2, y2, width, height); +#endif + /* Modify Reg. Value */ + cmdreg = pRDC->ulCMDReg; + + if (pRDC->EnableClip) + cmdreg |= CMD_ENABLE_CLIP; + else + cmdreg &= ~CMD_ENABLE_CLIP; + + srcbase = pRDC->VideoModeInfo.ScreenPitch*y1; + dstbase = pRDC->VideoModeInfo.ScreenPitch*y2; + + if (cmdreg & CMD_X_DEC) + { + src_x = x1 + width - 1; + dst_x = x2 + width - 1; + } + else + { + src_x = x1; + dst_x = x2; + } + + if (cmdreg & CMD_Y_DEC) + { + src_y = height - 1; + dst_y = height - 1; + } + else + { + src_y = 0; + dst_y = 0; + } + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*6); + + RDCSetupSRCBase(pSingleCMD, srcbase); + pSingleCMD++; + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupDSTXY(pSingleCMD, dst_x, dst_y); + pSingleCMD++; + RDCSetupSRCXY(pSingleCMD, src_x, src_y); + pSingleCMD++; + RDCSetupRECTXY(pSingleCMD, width, height); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, cmdreg); + + /* Update Write Pointer */ + mUpdateWritePointer; + + } + else + { + RDCSetupSRCBase_MMIO(srcbase); + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupDSTXY_MMIO(dst_x, dst_y); + RDCSetupSRCXY_MMIO(src_x, src_y); + RDCSetupRECTXY_MMIO(width, height); + RDCSetupCMDReg_MMIO(cmdreg); + + vWaitEngIdle(pScrn, pRDC); + } +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentScreenToScreenCopy()== \n"); +#endif +} /* end of RDCSubsequentScreenToScreenCopy */ + +static void +RDCSetupForSolidFill(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForSolidFill(color = 0x%x, rop = 0x%x, planemake = 0x%x)== \n", color, rop, planemask); +#endif + /* Modify Reg. Value */ + cmdreg = CMD_BITBLT | CMD_PAT_FGCOLOR; + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + cmdreg |= (RDCXAAPatternROP[rop] << 8); + pRDC->ulCMDReg = cmdreg; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*2); + + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + pSingleCMD++; + RDCSetupFG(pSingleCMD, color); + } + else + { + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + RDCSetupFG_MMIO(color); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForSolidFill()== \n"); +#endif +} /* end of RDCSetupForSolidFill */ + + +static void +RDCSubsequentSolidFillRect(ScrnInfoPtr pScrn, + int dst_x, int dst_y, int width, int height) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG dstbase, cmdreg; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSubsequentSolidFillRect(dst_x = %d, dst_y = %d, width = %d, height = %d)== \n", dst_x, dst_y, width, height); +#endif + /* Modify Reg. Value */ + cmdreg = pRDC->ulCMDReg; + if (pRDC->EnableClip) + cmdreg |= CMD_ENABLE_CLIP; + else + cmdreg &= ~CMD_ENABLE_CLIP; + dstbase = 0; + + if (dst_y >= pScrn->virtualY) + { + dstbase=pRDC->VideoModeInfo.ScreenPitch*dst_y; + dst_y=0; + } + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*4); + + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupDSTXY(pSingleCMD, dst_x, dst_y); + pSingleCMD++; + RDCSetupRECTXY(pSingleCMD, width, height); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, cmdreg); + + /* Update Write Pointer */ + mUpdateWritePointer; + + } + else + { + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupDSTXY_MMIO(dst_x, dst_y); + RDCSetupRECTXY_MMIO(width, height); + RDCSetupCMDReg_MMIO(cmdreg); + + vWaitEngIdle(pScrn, pRDC); + + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentSolidFillRect()== \n"); +#endif +} /* end of RDCSubsequentSolidFillRect */ + +/* Line */ +static void RDCSetupForSolidLine(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==RDCSetupForSolidLine(color = 0x%x, rop = 0x%x, planemask = 0x%x)\n==", color, rop, planemask); +#endif + /* Modify Reg. Value */ + cmdreg = CMD_BITBLT; + + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + cmdreg |= (RDCXAAPatternROP[rop] << 8); + + pRDC->ulCMDReg = cmdreg; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*3); + + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + pSingleCMD++; + RDCSetupFG(pSingleCMD, color); + pSingleCMD++; + RDCSetupBG(pSingleCMD, 0); + + } + else + { + /* Write to MMIO */ + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + RDCSetupFG_MMIO(color); + RDCSetupBG_MMIO(0); + } +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForSolidLine()== \n"); +#endif +} /* end of RDCSetupForSolidLine */ + + +static void RDCSubsequentSolidHorVertLine(ScrnInfoPtr pScrn, + int x, int y, int len, int dir) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG dstbase, cmdreg; + int width, height; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSubsequentSolidHorVertLine(x = %d, y = %d, len = %d, dir = %d)\n==", x, y, len, dir); +#endif + + /* Modify Reg. Value */ + cmdreg = (pRDC->ulCMDReg & (~CMD_MASK)) | CMD_BITBLT; + if (pRDC->EnableClip) + cmdreg |= CMD_ENABLE_CLIP; + else + cmdreg &= ~CMD_ENABLE_CLIP; + dstbase = 0; + + if(dir == DEGREES_0) + { /* horizontal */ + width = len; + height = 1; + } + else + { /* vertical */ + width = 1; + height = len; + } + + if ((y + height) >= pScrn->virtualY) + { + dstbase=pRDC->VideoModeInfo.ScreenPitch*y; + y=0; + } + + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*4); + + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupDSTXY(pSingleCMD, x, y); + pSingleCMD++; + RDCSetupRECTXY(pSingleCMD, width, height); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, cmdreg); + + /* Update Write Pointer */ + mUpdateWritePointer; + + } + else + { + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupDSTXY_MMIO(x, y); + RDCSetupRECTXY_MMIO(width, height); + RDCSetupCMDReg_MMIO(cmdreg); + + vWaitEngIdle(pScrn, pRDC); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentSolidHorVertLine()== \n"); +#endif +} /* end of RDCSubsequentSolidHorVertLine */ + +/* Dash Line */ +static void +RDCSetupForDashedLine(ScrnInfoPtr pScrn, + int fg, int bg, int rop, unsigned int planemask, + int length, UCHAR *pattern) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForDashedLine(fg = 0x%x, bg = 0x%x, rop = 0x%x, planemask = 0x%x, length = %d)\n==", fg, bg, rop, planemask, length); +#endif + /* Modify Reg. Value */ + cmdreg = CMD_LINEDRAW | CMD_RESET_STYLE_COUNTER | CMD_ENABLE_LINE_STYLE; + + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + + cmdreg |= (RDCXAAPatternROP[rop] << 8); + + if(bg == -1) + { + cmdreg |= CMD_TRANSPARENT; + bg = 0; + } + + cmdreg |= (((length-1) & 0x3F) << 24); /* line period */ + pRDC->ulCMDReg = cmdreg; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*5); + + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + pSingleCMD++; + RDCSetupFG(pSingleCMD, fg); + pSingleCMD++; + RDCSetupBG(pSingleCMD, bg); + pSingleCMD++; + RDCSetupLineStyle1(pSingleCMD, *pattern); + pSingleCMD++; + RDCSetupLineStyle2(pSingleCMD, *(pattern+4)); + + } + else + { + /* Write to MMIO */ + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + RDCSetupFG_MMIO(fg); + RDCSetupBG_MMIO(bg); + RDCSetupLineStyle1_MMIO(*pattern); + RDCSetupLineStyle2_MMIO(*(pattern+4)); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForDashedLine()== \n"); +#endif +} + +/* Mono Pattern Fill */ +static void +RDCSetupForMonoPatternFill(ScrnInfoPtr pScrn, + int patx, int paty, int fg, int bg, + int rop, unsigned int planemask) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFill(patx = %d, paty = %d, fg = 0x%x, bg = 0x%x, rop = 0x%x, planemask = 0x%x)\n==", patx, paty, fg, bg, rop, planemask); +#endif + /* Modify Reg. Value */ + cmdreg = CMD_BITBLT | CMD_PAT_MONOMASK; + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + + cmdreg |= (RDCXAAPatternROP[rop] << 8); + pRDC->ulCMDReg = cmdreg; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*5); + + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + pSingleCMD++; + RDCSetupFG(pSingleCMD, fg); + pSingleCMD++; + RDCSetupBG(pSingleCMD, bg); + pSingleCMD++; + RDCSetupMONO1(pSingleCMD, patx); + pSingleCMD++; + RDCSetupMONO2(pSingleCMD, paty); + } + else + { + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + RDCSetupFG_MMIO(fg); + RDCSetupBG_MMIO(bg); + RDCSetupMONO1_MMIO(patx); + RDCSetupMONO2_MMIO(paty); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForMonoPatternFill()== \n"); +#endif +} /* end of RDCSetupForMonoPatternFill */ + + +static void +RDCSubsequentMonoPatternFill(ScrnInfoPtr pScrn, + int patx, int paty, + int dst_x, int dst_y, int width, int height) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG dstbase, cmdreg; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSubsequentMonoPatternFill(patx = %d, paty = %d, dst_x = %d, dst_y = %d, width = %d, height = %d,)\n==", patx, paty, dst_x, dst_y, width, height); +#endif + + /* Modify Reg. Value */ + cmdreg = pRDC->ulCMDReg; + if (pRDC->EnableClip) + cmdreg |= CMD_ENABLE_CLIP; + else + cmdreg &= ~CMD_ENABLE_CLIP; + dstbase = 0; + + if (dst_y >= pScrn->virtualY) + { + dstbase=pRDC->VideoModeInfo.ScreenPitch*dst_y; + dst_y=0; + } + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*4); + + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupDSTXY(pSingleCMD, dst_x, dst_y); + pSingleCMD++; + RDCSetupRECTXY(pSingleCMD, width, height); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, cmdreg); + + /* Update Write Pointer */ + mUpdateWritePointer; + + } + else + { + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupDSTXY_MMIO(dst_x, dst_y); + RDCSetupRECTXY_MMIO(width, height); + RDCSetupCMDReg_MMIO(cmdreg); + + vWaitEngIdle(pScrn, pRDC); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentMonoPatternFill()== \n"); +#endif +} /* end of RDCSubsequentMonoPatternFill */ + +static void +RDCSetupForColor8x8PatternFill(ScrnInfoPtr pScrn, int patx, int paty, + int rop, unsigned int planemask, int trans_col) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg; + CARD32 *pataddr; + ULONG ulPatSize; + int i, j, cpp; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSetupForColor8x8PatternFill(patx = %d, paty = %d, rop = 0x%x, planemask = 0x%x, trans_col = 0x%x)\n==", patx, paty, rop, planemask, trans_col); +#endif + /* Modify Reg. Value */ + cmdreg = CMD_BITBLT | CMD_PAT_PATREG; + + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + + cmdreg |= (RDCXAAPatternROP[rop] << 8); + pRDC->ulCMDReg = cmdreg; + cpp = (pScrn->bitsPerPixel + 1) / 8; + pataddr = (CARD32 *)(pRDC->FBVirtualAddr + + (paty * pRDC->VideoModeInfo.ScreenWidth) + (patx * cpp)); + ulPatSize = 8*8*cpp; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*(1 + ulPatSize/4)); + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + pSingleCMD++; + for (i=0; i<8; i++) + { + for (j=0; j<8*cpp/4; j++) + { + RDCSetupPatReg(pSingleCMD, (i*j + j) , (*(CARD32 *) (pataddr++))); + pSingleCMD++; + } + } + } + else + { + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + for (i=0; i<8; i++) + { + for (j=0; j<8*cpp/4; j++) + { + RDCSetupPatReg_MMIO((i*j + j) , (*(CARD32 *) (pataddr++))); + } + } + + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForColor8x8PatternFill()== \n"); +#endif +} /* end of RDCSetupForColor8x8PatternFill */ + +static void +RDCSubsequentColor8x8PatternFillRect(ScrnInfoPtr pScrn, int patx, int paty, + int dst_x, int dst_y, int width, int height) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG dstbase, cmdreg; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSubsequentColor8x8PatternFillRect(patx = %d, paty = %d, dst_x = %d, dst_y = %d, width = %d, height)\n==", patx, paty, dst_x, dst_y, width, height); +#endif + + /* Modify Reg. Value */ + cmdreg = pRDC->ulCMDReg; + if (pRDC->EnableClip) + cmdreg |= CMD_ENABLE_CLIP; + else + cmdreg &= ~CMD_ENABLE_CLIP; + + dstbase = 0; + + if (dst_y >= pScrn->virtualY) + { + dstbase=pRDC->VideoModeInfo.ScreenPitch*dst_y; + dst_y=0; + } + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*4); + + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupDSTXY(pSingleCMD, dst_x, dst_y); + pSingleCMD++; + RDCSetupRECTXY(pSingleCMD, width, height); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, cmdreg); + + /* Update Write Pointer */ + mUpdateWritePointer; + + } + else + { + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupDSTXY_MMIO(dst_x, dst_y); + RDCSetupRECTXY_MMIO(width, height); + RDCSetupCMDReg_MMIO(cmdreg); + + vWaitEngIdle(pScrn, pRDC); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentColor8x8PatternFillRect()== \n"); +#endif +} /* RDCSubsequentColor8x8PatternFillRect */ + +/* CPU to Screen Expand */ +static void +RDCSetupForCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSetupForCPUToScreenColorExpandFill(fg = 0x%x, bg = ox%x, rop = ox%x, planemask = ox%x)\n==", fg, bg, rop, planemask); +#endif + /* Modify Reg. Value */ + cmdreg = CMD_COLOREXP; + + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + + cmdreg |= (RDCXAAPatternROP[rop] << 8); + + if(bg == -1) + { + cmdreg |= CMD_FONT_TRANSPARENT; + bg = 0; + } + + pRDC->ulCMDReg = cmdreg; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*3); + + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + pSingleCMD++; + RDCSetupFG(pSingleCMD, fg); + pSingleCMD++; + RDCSetupBG(pSingleCMD, bg); + + } + else + { + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + RDCSetupFG_MMIO(fg); + RDCSetupBG_MMIO(bg); + + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForCPUToScreenColorExpandFill()== \n"); +#endif +} + +static void +RDCSubsequentCPUToScreenColorExpandFill(ScrnInfoPtr pScrn, + int dst_x, int dst_y, + int width, int height, int offset) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG dstbase, cmdreg; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSetupForCPUToScreenColorExpandFill(dst_x = %d, dst_y = %d, width = %d, height, offset = %d)\n==", dst_x, dst_y, width, height, offset); +#endif + + /* Modify Reg. Value */ + cmdreg = pRDC->ulCMDReg; + if (pRDC->EnableClip) + cmdreg |= CMD_ENABLE_CLIP; + else + cmdreg &= ~CMD_ENABLE_CLIP; + dstbase = 0; + + if (dst_y >= pScrn->virtualY) + { + dstbase=pRDC->VideoModeInfo.ScreenPitch*dst_y; + dst_y=0; + } + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*5); + + RDCSetupSRCPitch(pSingleCMD, ((width+7)/8)); + pSingleCMD++; + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupDSTXY(pSingleCMD, dst_x, dst_y); + pSingleCMD++; + RDCSetupRECTXY(pSingleCMD, width, height); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, cmdreg); + + /* Update Write Pointer */ + mUpdateWritePointer; + + } + else + { + RDCSetupSRCPitch_MMIO((width+7)/8); + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupDSTXY_MMIO(dst_x, dst_y); + RDCSetupSRCXY_MMIO(0, 0); + + RDCSetupRECTXY_MMIO(width, height); + RDCSetupCMDReg_MMIO(cmdreg); + + vWaitEngIdle(pScrn, pRDC); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentCPUToScreenColorExpandFill()== \n"); +#endif +} + + +/* Screen to Screen Color Expand */ +static void +RDCSetupForScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, + int fg, int bg, + int rop, unsigned int planemask) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG cmdreg; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSetupForScreenToScreenColorExpandFill(fg = 0x%x, bg = ox%x, rop = ox%x, planemask = ox%x)\n==", fg, bg, rop, planemask); +#endif + + /* Modify Reg. Value */ + cmdreg = CMD_ENHCOLOREXP; + switch (pRDC->VideoModeInfo.bitsPerPixel) + { + case 8: + cmdreg |= CMD_COLOR_08; + break; + case 15: + case 16: + cmdreg |= CMD_COLOR_16; + break; + case 24: + case 32: + cmdreg |= CMD_COLOR_32; + break; + } + + cmdreg |= (RDCXAAPatternROP[rop] << 8); + + if(bg == -1) + { + cmdreg |= CMD_FONT_TRANSPARENT; + bg = 0; + } + pRDC->ulCMDReg = cmdreg; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*3); + + RDCSetupDSTPitchHeight(pSingleCMD, pRDC->VideoModeInfo.ScreenPitch, -1); + pSingleCMD++; + RDCSetupFG(pSingleCMD, fg); + pSingleCMD++; + RDCSetupBG(pSingleCMD, bg); + + } + else + { + RDCSetupDSTPitchHeight_MMIO(pRDC->VideoModeInfo.ScreenPitch, -1); + RDCSetupFG_MMIO(fg); + RDCSetupBG_MMIO(bg); + + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetupForScreenToScreenColorExpandFill()== \n"); +#endif +} + + + +static void +RDCSubsequentScreenToScreenColorExpandFill(ScrnInfoPtr pScrn, + int dst_x, int dst_y, int width, int height, + int src_x, int src_y, int offset) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG srcbase, dstbase, cmdreg; + USHORT srcpitch; + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSubsequentScreenToScreenColorExpandFill(dst_x = %d, dst_y = %d, width = %d, height, src_x = %d, src_y = %d, offset = %d)\n==", dst_x, dst_y, width, height, src_x, src_y, offset); +#endif + + /* Modify Reg. Value */ + cmdreg = pRDC->ulCMDReg; + + if (pRDC->EnableClip) + cmdreg |= CMD_ENABLE_CLIP; + else + cmdreg &= ~CMD_ENABLE_CLIP; + + dstbase = 0; + + if (dst_y >= pScrn->virtualY) + { + dstbase=pRDC->VideoModeInfo.ScreenPitch*dst_y; + dst_y=0; + } + + srcbase = pRDC->VideoModeInfo.ScreenPitch*src_y + ((pScrn->bitsPerPixel+1)/8)*src_x; + srcpitch = (pScrn->displayWidth+7)/8; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*6); + + RDCSetupSRCBase(pSingleCMD, srcbase); + pSingleCMD++; + RDCSetupSRCPitch(pSingleCMD,srcpitch); + pSingleCMD++; + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupDSTXY(pSingleCMD, dst_x, dst_y); + pSingleCMD++; + RDCSetupRECTXY(pSingleCMD, width, height); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, cmdreg); + + /* Update Write Pointer */ + mUpdateWritePointer; + + } + else + { + RDCSetupSRCBase_MMIO(srcbase); + RDCSetupSRCPitch_MMIO(srcpitch); + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupDSTXY_MMIO(dst_x, dst_y); + RDCSetupRECTXY_MMIO(width, height); + RDCSetupCMDReg_MMIO(cmdreg); + + vWaitEngIdle(pScrn, pRDC); + + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentScreenToScreenColorExpandFill()== \n"); +#endif +} + + +/* Clipping */ +static void +RDCSetClippingRectangle(ScrnInfoPtr pScrn, + int left, int top, int right, int bottom) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSetClippingRectangle(left = %d, top = %d, right = %d, bottom = %d)\n==", left, top, right, bottom); +#endif + pRDC->EnableClip = TRUE; + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*2); + + RDCSetupCLIP1(pSingleCMD, left, top); + pSingleCMD++; + RDCSetupCLIP2(pSingleCMD, right, bottom); + } + else + { + RDCSetupCLIP1_MMIO(left, top); + RDCSetupCLIP2_MMIO(right, bottom); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetClippingRectangle()== \n"); +#endif +} + +static void +RDCDisableClipping(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCDisableClipping()\n=="); +#endif + pRDC->EnableClip = FALSE; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCDisableClipping()== \n"); +#endif +} + +static void RDCSubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2, int flags) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG dstbase, ulCommand; + ULONG miny, maxy; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSubsequentSolidTwoPointLine(x1 = %d, y1 = %d, x2 = %d, y2 = %d, flags = 0x%x)\n==", x1, y1, x2, y2, flags); +#endif + + /* Modify Reg. Value */ + ulCommand = (pRDC->ulCMDReg & (~CMD_MASK)) | CMD_LINEDRAW | CMD_NORMAL_LINE; + + if(flags & OMIT_LAST) + ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; + else + ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; + + if (pRDC->EnableClip) + ulCommand |= CMD_ENABLE_CLIP; + else + ulCommand &= ~CMD_ENABLE_CLIP; + dstbase = 0; + miny = (y1 > y2) ? y2 : y1; + maxy = (y1 > y2) ? y1 : y2; + + if(maxy >= pScrn->virtualY) + { + dstbase = pRDC->VideoModeInfo.ScreenPitch * miny; + y1 -= miny; + y2 -= miny; + } + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*5); + + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupLineXY(pSingleCMD, x1, y1); + pSingleCMD++; + RDCSetupLineXY2(pSingleCMD, x2, y2); + pSingleCMD++; + RDCSetupLineNumber(pSingleCMD, 0); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, ulCommand); + + /* Update Write Pointer */ + mUpdateWritePointer; + + /* Patch KDE pass abnormal point, ycchen@052507 */ + vWaitEngIdle(pScrn, pRDC); + + } + else + { + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupLineXY_MMIO(x1, y1); + RDCSetupLineXY2_MMIO(x2, y2); + RDCSetupLineNumber_MMIO(0); + RDCSetupCMDReg_MMIO(ulCommand); + + vWaitEngIdle(pScrn, pRDC); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentSolidTwoPointLine()== \n"); +#endif +} /* end of M2010SubsequentSolidTwoPointLine */ + +/* M2010 Dash Line */ +static void +RDCSubsequentDashedTwoPointLine(ScrnInfoPtr pScrn, + int x1, int y1, int x2, int y2, + int flags, int phase) +{ + + RDCRecPtr pRDC = RDCPTR(pScrn); + PKT_SC *pSingleCMD; + ULONG dstbase, ulCommand; + ULONG miny, maxy; +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetupForMonoPatternFillRDCSubsequentDashedTwoPointLine(x1 = %d, y1 = %d, x2 = %d, y2 = %d, flags = 0x%x, phase = %d(0x%x)\n==", x1, y1, x2, y2, phase, phase); +#endif + + /* Modify Reg. Value */ + ulCommand = pRDC->ulCMDReg | CMD_NORMAL_LINE; + + if(flags & OMIT_LAST) + ulCommand |= CMD_NOT_DRAW_LAST_PIXEL; + else + ulCommand &= ~CMD_NOT_DRAW_LAST_PIXEL; + + if (pRDC->EnableClip) + ulCommand |= CMD_ENABLE_CLIP; + else + ulCommand &= ~CMD_ENABLE_CLIP; + dstbase = 0; + miny = (y1 > y2) ? y2 : y1; + maxy = (y1 > y2) ? y1 : y2; + + if(maxy >= pScrn->virtualY) + { + dstbase = pRDC->VideoModeInfo.ScreenPitch * miny; + y1 -= miny; + y2 -= miny; + } + + if (!pRDC->MMIO2D) + { + /* Write to CMDQ */ + pSingleCMD = (PKT_SC *) pjRequestCMDQ(pRDC, PKT_SINGLE_LENGTH*5); + + RDCSetupDSTBase(pSingleCMD, dstbase); + pSingleCMD++; + RDCSetupLineXY(pSingleCMD, x1, y1); + pSingleCMD++; + RDCSetupLineXY2(pSingleCMD, x2, y2); + pSingleCMD++; + RDCSetupLineNumber(pSingleCMD, 0); + pSingleCMD++; + RDCSetupCMDReg(pSingleCMD, ulCommand); + + /* Update Write Pointer */ + mUpdateWritePointer; + + /* Patch KDE pass abnormal point, ycchen@052507 */ + vWaitEngIdle(pScrn, pRDC); + + } + else + { + RDCSetupDSTBase_MMIO(dstbase); + RDCSetupLineXY_MMIO(x1, y1); + RDCSetupLineXY2_MMIO(x2, y2); + RDCSetupLineNumber_MMIO(0); + RDCSetupCMDReg_MMIO(ulCommand); + + vWaitEngIdle(pScrn, pRDC); + } + +#if Accel_2D_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSubsequentDashedTwoPointLine()== \n"); +#endif +} + +#endif /* end of Accel_2D */ diff --git a/src/rdc_cursor.c b/src/rdc_cursor.c new file mode 100644 index 0000000..e11b44b --- /dev/null +++ b/src/rdc_cursor.c @@ -0,0 +1,852 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" +#include "cursorstr.h" + +/* Driver specific headers */ +#include "rdc.h" + +#ifdef HWC +/* Prototype type declaration */ +Bool RDCCursorInit(ScreenPtr pScreen); +Bool bInitHWC(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +static void RDCShowCursor(ScrnInfoPtr pScrn); +void RDCHideCursor(ScrnInfoPtr pScrn); +static void RDCSetCursorPosition(ScrnInfoPtr pScrn, int x, int y); +static void RDCSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); +static void RDCLoadCursorImage(ScrnInfoPtr pScrn, UCHAR *src); +static Bool RDCUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs); +static void RDCLoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCurs); +static Bool RDCUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs); + +static void RDCFireCursor(ScrnInfoPtr pScrn); + +// +// For 32bit data and MMIO control Hardware Cursor +void RDCHideCursor_HQ(ScrnInfoPtr pScrn); +static void RDCShowCursor_HQ(ScrnInfoPtr pScrn); +static void RDCSetCursorColors_HQ(ScrnInfoPtr pScrn, int bg, int fg); +static void RDCLoadCursorImage_HQ(ScrnInfoPtr pScrn, UCHAR *src); +static void RDCLoadCursorARGB_HQ(ScrnInfoPtr pScrn, CursorPtr pCurs); +static void RDCSetCursorPosition_HQ(ScrnInfoPtr pScrn, int x, int y); + + +Bool +RDCCursorInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RDCRecPtr pRDC = RDCPTR(pScrn); + xf86CursorInfoPtr infoPtr; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCCursorInit()== \n"); +#endif + + infoPtr = xf86CreateCursorInfoRec(); + if(!infoPtr) return FALSE; + + pRDC->HWCInfoPtr = infoPtr; + + infoPtr->Flags = HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | + HARDWARE_CURSOR_INVERT_MASK | + HARDWARE_CURSOR_BIT_ORDER_MSBFIRST; + + infoPtr->MaxWidth = MAX_HWC_WIDTH; + infoPtr->MaxHeight = MAX_HWC_HEIGHT; + + infoPtr->UseHWCursor = RDCUseHWCursor; + infoPtr->UseHWCursorARGB = RDCUseHWCursorARGB; + + if (pRDC->ENGCaps & ENG_CAP_HWC_MMIO) + { + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)) = BIT31; + infoPtr->SetCursorPosition = RDCSetCursorPosition_HQ; + infoPtr->SetCursorColors = RDCSetCursorColors_HQ; + infoPtr->LoadCursorImage = RDCLoadCursorImage_HQ; + infoPtr->ShowCursor = RDCShowCursor_HQ; + infoPtr->HideCursor = RDCHideCursor_HQ; + infoPtr->LoadCursorARGB = RDCLoadCursorARGB_HQ; + } + else + { + infoPtr->SetCursorPosition = RDCSetCursorPosition; + infoPtr->SetCursorColors = RDCSetCursorColors; + infoPtr->LoadCursorImage = RDCLoadCursorImage; + infoPtr->ShowCursor = RDCShowCursor; + infoPtr->HideCursor = RDCHideCursor; + infoPtr->LoadCursorARGB = RDCLoadCursorARGB; + } +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCCursorInit()== \n"); +#endif + return(xf86InitCursor(pScreen, infoPtr)); +} + +Bool bInitHWC(ScrnInfoPtr pScrn, RDCRecPtr pRDC) +{ + /* init cursor cache info */ + /* Set HWC_NUM in Options instead */ + /* pRDC->HWCInfo.HWC_NUM = DEFAULT_HWC_NUM; */ + pRDC->HWCInfo.HWC_NUM_Next = 0; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter bInitHWC()== \n"); +#endif + + /* allocate HWC cache */ + pRDC->HWCInfo.pjHWCVirtualAddr = pRDC->FBVirtualAddr + pRDC->HWCInfo.ulHWCOffsetAddr; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "==HWC Virtual Addr = 0x%8x==\n", (ULONG)pRDC->HWCInfo.pjHWCVirtualAddr); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "==HWC Physical Offset = 0x%8x==\n", pRDC->HWCInfo.ulHWCOffsetAddr); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "==Exit2 bInitHWC(), return TRUE== \n"); +#endif + + return (TRUE); +} + + +static void +RDCShowCursor(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + UCHAR jReg; +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCShowCursor()== \n"); +#endif + jReg= 0x02; + if (pRDC->HWCInfo.cursortype ==HWC_COLOR) + jReg |= 0x01; + + SetIndexRegMask(CRTC_PORT, 0xCB, 0xFC, jReg); /* enable mono */ +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCShowCursor()== \n"); +#endif +} + +void +RDCHideCursor(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCHideCursor()== \n"); +#endif + SetIndexRegMask(CRTC_PORT, 0xCB, 0xFC, 0x00); /* disable HWC */ +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCHideCursor()== \n"); +#endif +} + +static void +RDCSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + DisplayModePtr mode = pRDC->ModePtr; + int x_offset, y_offset, y_end; + UCHAR *pjSignature; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 7, "==Enter RDCSetCursorPosition(x = %d, y = %d)== \n", x, y); +#endif + /* Set cursor info to Offscreen */ + pjSignature = (UCHAR *) pRDC->HWCInfo.pjHWCVirtualAddr + + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM_Next + + HWC_SIZE; + + *((ULONG *) (pjSignature + HWC_SIGNATURE_X)) = x; + *((ULONG *) (pjSignature + HWC_SIGNATURE_Y)) = y; + + x_offset = pRDC->HWCInfo.offset_x; + y_offset = pRDC->HWCInfo.offset_y; + + if(x < 0) + { + x_offset = (-x) + pRDC->HWCInfo.offset_x; + x = 0; + } + + if(y < 0) + { + y_offset = (-y) + pRDC->HWCInfo.offset_y; + y = 0; + } + + if ( pRDC->DeviceInfo.ScalerConfig.EnableHorScaler && + ((VENDOR_ID(pRDC->PciInfo) != PCI_VENDOR_RDC) || (DEVICE_ID(pRDC->PciInfo) != PCI_CHIP_M2010_A0))) + { + x = (x * pRDC->DeviceInfo.ScalerConfig.ulHorScalingFactor + 4095) >> 12; + } + + if (pRDC->DeviceInfo.ScalerConfig.EnableVerScaler) + { + y = (y * pRDC->DeviceInfo.ScalerConfig.ulVerScalingFactor + 2047) >> 11; + y_end = y + (((MAX_HWC_HEIGHT - y_offset) * pRDC->DeviceInfo.ScalerConfig.ulVerScalingFactor + 2047) >> 11) - 1; + } + + if(mode->Flags & V_DBLSCAN) + y *= 2; + + /* Set to Reg. */ + SetIndexReg(CRTC_PORT, 0xC2, (UCHAR) (x_offset)); + SetIndexReg(CRTC_PORT, 0xC3, (UCHAR) (y_offset)); + SetIndexReg(CRTC_PORT, 0xC4, (UCHAR) (x & 0xFF)); + SetIndexReg(CRTC_PORT, 0xC5, (UCHAR) ((x >> 8) & 0x0F)); + SetIndexReg(CRTC_PORT, 0xC6, (UCHAR) (y & 0xFF)); + SetIndexReg(CRTC_PORT, 0xC7, (UCHAR) ((y >> 8) & 0x07)); + SetIndexReg(CRTC_PORT, 0xCC, (UCHAR) (y_end & 0xFF)); + SetIndexReg(CRTC_PORT, 0xCD, (UCHAR) ((y_end >> 8) & 0x07)); + + /* Fire HWC */ + RDCFireCursor(pScrn); + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 7, "==Exit RDCSetCursorPosition()== \n"); +#endif +} + + +static void +RDCSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetCursorColors(bg = %x, fg = %x)== \n", bg, fg); +#endif + pRDC->HWCInfo.MonoHWC.fg = (fg & 0x0F) | (((fg>>8) & 0x0F) << 4) | (((fg>>16) & 0x0F) << 8); + pRDC->HWCInfo.MonoHWC.bg = (bg & 0x0F) | (((bg>>8) & 0x0F) << 4) | (((bg>>16) & 0x0F) << 8); +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSetCursorColors()== \n"); +#endif +} + +static void +RDCLoadCursorImage(ScrnInfoPtr pScrn, UCHAR *src) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + int i, j, k; + UCHAR *pjSrcAnd, *pjSrcXor, *pjDstData; + ULONG ulTempDstAnd32[2], ulTempDstXor32[2], ulTempDstData32[2]; + UCHAR jTempSrcAnd32, jTempSrcXor32; + ULONG ulCheckSum = 0; + ULONG ulPatternAddr; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCLoadCursorImage()== \n"); +#endif + /* init cursor info. */ + pRDC->HWCInfo.cursortype = HWC_MONO; + pRDC->HWCInfo.width = (USHORT) MAX_HWC_WIDTH; + pRDC->HWCInfo.height = (USHORT) MAX_HWC_HEIGHT; + pRDC->HWCInfo.offset_x = MAX_HWC_WIDTH - pRDC->HWCInfo.width; + pRDC->HWCInfo.offset_y = MAX_HWC_HEIGHT - pRDC->HWCInfo.height; + + /* copy cursor image to cache */ + pjSrcXor = src; + pjSrcAnd = src + (MAX_HWC_WIDTH*MAX_HWC_HEIGHT/8); + pjDstData = pRDC->HWCInfo.pjHWCVirtualAddr+(HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM_Next; + + for (j = 0; j < MAX_HWC_HEIGHT; j++) + { + for (i = 0; i < (MAX_HWC_WIDTH/8); i++ ) + { + for (k=7; k>0; k-=2) + { + jTempSrcAnd32 = *((UCHAR *) pjSrcAnd); + jTempSrcXor32 = *((UCHAR *) pjSrcXor); + ulTempDstAnd32[0] = ((jTempSrcAnd32 >> k) & 0x01) ? 0x00008000L:0x00L; + ulTempDstXor32[0] = ((jTempSrcXor32 >> k) & 0x01) ? 0x00004000L:0x00L; + ulTempDstData32[0] = ((jTempSrcXor32 >> k) & 0x01) ? pRDC->HWCInfo.MonoHWC.fg:pRDC->HWCInfo.MonoHWC.bg; + ulTempDstAnd32[1] = ((jTempSrcAnd32 >> (k-1)) & 0x01) ? 0x80000000L:0x00L; + ulTempDstXor32[1] = ((jTempSrcXor32 >> (k-1)) & 0x01) ? 0x40000000L:0x00L; + ulTempDstData32[1] = ((jTempSrcXor32 >> (k-1)) & 0x01) ? (pRDC->HWCInfo.MonoHWC.fg << 16):(pRDC->HWCInfo.MonoHWC.bg << 16); + *((ULONG *) pjDstData) = ulTempDstAnd32[0] | ulTempDstXor32[0] | ulTempDstData32[0] | ulTempDstAnd32[1] | ulTempDstXor32[1] | ulTempDstData32[1]; + ulCheckSum += *((ULONG *) pjDstData); + pjDstData += 4; + } + pjSrcAnd ++; + pjSrcXor ++; + } + } + + /* Write Checksum as signature */ + pjDstData = (UCHAR *) pRDC->HWCInfo.pjHWCVirtualAddr + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM_Next + HWC_SIZE; + *((ULONG *) pjDstData) = ulCheckSum; + *((ULONG *) (pjDstData + HWC_SIGNATURE_SizeX)) = pRDC->HWCInfo.width; + *((ULONG *) (pjDstData + HWC_SIGNATURE_SizeY)) = pRDC->HWCInfo.height; + *((ULONG *) (pjDstData + HWC_SIGNATURE_HOTSPOTX)) = 0; + *((ULONG *) (pjDstData + HWC_SIGNATURE_HOTSPOTY)) = 0; + + /* set pattern offset */ + ulPatternAddr = ((pRDC->HWCInfo.ulHWCOffsetAddr+(HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM_Next) >> 3); + + SetIndexReg(CRTC_PORT, 0xC8, (UCHAR) (ulPatternAddr & 0xFF)); + SetIndexReg(CRTC_PORT, 0xC9, (UCHAR) ((ulPatternAddr >> 8) & 0xFF)); + SetIndexReg(CRTC_PORT, 0xCA, (UCHAR) ((ulPatternAddr >> 16) & 0xFF)); + + /* update HWC_NUM_Next */ + pRDC->HWCInfo.HWC_NUM_Next = (pRDC->HWCInfo.HWC_NUM_Next+1) % pRDC->HWCInfo.HWC_NUM; +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCLoadCursorImage()== \n"); +#endif +} + +static Bool +RDCUseHWCursor(ScreenPtr pScreen, CursorPtr pCurs) +{ +#if HWC_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCUseHWCursor(), return TRUE== \n"); +#endif + return TRUE; +} + +static void +RDCLoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr pCurs) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + + UCHAR *pjDstXor, *pjSrcXor; + ULONG i, j, ulSrcWidth, ulSrcHeight; + ULONG ulPerPixelCopy, ulTwoPixelCopy; + LONG lAlphaDstDelta, lLastAlphaDstDelta; + + union + { + ULONG ul; + UCHAR b[4]; + } ulSrcData32[2], ulData32; + union + { + USHORT us; + UCHAR b[2]; + } usData16; + + ULONG ulCheckSum = 0; + ULONG ulPatternAddr; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCLoadCursorARGB()== \n"); +#endif + /* init cursor info. */ + pRDC->HWCInfo.cursortype = HWC_COLOR; + pRDC->HWCInfo.width = pCurs->bits->width; + pRDC->HWCInfo.height = pCurs->bits->height; + pRDC->HWCInfo.offset_x = MAX_HWC_WIDTH - pRDC->HWCInfo.width; + pRDC->HWCInfo.offset_y = MAX_HWC_HEIGHT - pRDC->HWCInfo.height; + + /* copy cursor image to cache */ + ulSrcWidth = pRDC->HWCInfo.width; + ulSrcHeight = pRDC->HWCInfo.height; + + lAlphaDstDelta = MAX_HWC_WIDTH << 1; + lLastAlphaDstDelta = lAlphaDstDelta - (ulSrcWidth << 1); + + pjSrcXor = (UCHAR *) pCurs->bits->argb;; + pjDstXor = (UCHAR *) pRDC->HWCInfo.pjHWCVirtualAddr + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM_Next + + lLastAlphaDstDelta + (MAX_HWC_HEIGHT - ulSrcHeight) * lAlphaDstDelta; + + ulPerPixelCopy = ulSrcWidth & 1; + ulTwoPixelCopy = ulSrcWidth >> 1; + + for (j = 0; j < ulSrcHeight; j++) + { + for (i = 0; i < ulTwoPixelCopy; i++ ) + { + ulSrcData32[0].ul = *((ULONG *) pjSrcXor) & 0xF0F0F0F0; + ulSrcData32[1].ul = *((ULONG *) (pjSrcXor+4)) & 0xF0F0F0F0; + ulData32.b[0] = ulSrcData32[0].b[1] | (ulSrcData32[0].b[0] >> 4); + ulData32.b[1] = ulSrcData32[0].b[3] | (ulSrcData32[0].b[2] >> 4); + ulData32.b[2] = ulSrcData32[1].b[1] | (ulSrcData32[1].b[0] >> 4); + ulData32.b[3] = ulSrcData32[1].b[3] | (ulSrcData32[1].b[2] >> 4); + *((ULONG *) pjDstXor) = ulData32.ul; + ulCheckSum += (ULONG) ulData32.ul; + pjDstXor += 4; + pjSrcXor += 8; + } + + for (i = 0; i < ulPerPixelCopy; i++ ) + { + ulSrcData32[0].ul = *((ULONG *) pjSrcXor) & 0xF0F0F0F0; + usData16.b[0] = ulSrcData32[0].b[1] | (ulSrcData32[0].b[0] >> 4); + usData16.b[1] = ulSrcData32[0].b[3] | (ulSrcData32[0].b[2] >> 4); + *((USHORT *) pjDstXor) = usData16.us; + ulCheckSum += (ULONG) usData16.us; + pjDstXor += 2; + pjSrcXor += 4; + } + + /* Point to next source and dest scans */ + pjDstXor += lLastAlphaDstDelta; + } /* end of for-loop */ + + /* Write Checksum as signature */ + pjDstXor = (UCHAR *) pRDC->HWCInfo.pjHWCVirtualAddr + (HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM_Next + HWC_SIZE; + *((ULONG *) pjDstXor) = ulCheckSum; + *((ULONG *) (pjDstXor + HWC_SIGNATURE_SizeX)) = pRDC->HWCInfo.width; + *((ULONG *) (pjDstXor + HWC_SIGNATURE_SizeY)) = pRDC->HWCInfo.height; + *((ULONG *) (pjDstXor + HWC_SIGNATURE_HOTSPOTX)) = 0; + *((ULONG *) (pjDstXor + HWC_SIGNATURE_HOTSPOTY)) = 0; + + /* set pattern offset */ + ulPatternAddr = ((pRDC->HWCInfo.ulHWCOffsetAddr +(HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM_Next) >> 3); + SetIndexReg(CRTC_PORT, 0xC8, (UCHAR) (ulPatternAddr & 0xFF)); + SetIndexReg(CRTC_PORT, 0xC9, (UCHAR) ((ulPatternAddr >> 8) & 0xFF)); + SetIndexReg(CRTC_PORT, 0xCA, (UCHAR) ((ulPatternAddr >> 16) & 0xFF)); + + /* update HWC_NUM_Next */ + pRDC->HWCInfo.HWC_NUM_Next = (pRDC->HWCInfo.HWC_NUM_Next+1) % pRDC->HWCInfo.HWC_NUM; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCLoadCursorARGB()== \n"); +#endif +} + +static Bool +RDCUseHWCursorARGB(ScreenPtr pScreen, CursorPtr pCurs) +{ +#if HWC_DEBUG + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCUseHWCursorARGB(), return TRUE== \n"); +#endif + return TRUE; +} + +static void +RDCFireCursor(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCFireCursor()== \n"); +#endif + SetIndexRegMask(CRTC_PORT, 0xCB, 0xFF, 0x00); /* dummp write to fire HWC */ +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCFireCursor()== \n"); +#endif +} + +// +// For 32bit data and MMIO control Hardware Cursor +void RDCHideCursor_HQ(ScrnInfoPtr pScrn) +{ + ULONG ulCursorCTRL; + RDCRecPtr pRDC = RDCPTR(pScrn); + + ulCursorCTRL = *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)); + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)) = (ulCursorCTRL& ~BIT1); +} + +static void RDCShowCursor_HQ(ScrnInfoPtr pScrn) +{ + ULONG ulCursorCTRL; + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "==Enter RDCShowCursor_HQ()== \n"); +#endif + + ulCursorCTRL = *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)); + + if (pRDC->HWCInfo.cursortype ==HWC_COLOR) + ulCursorCTRL |= BIT0; + + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)) = (ulCursorCTRL | BIT1); + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "==Cursor MMIO regs = %08x %08x %08x %08x== \n", + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)), + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_OFFSET)), + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_POSITION)), + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_ADDRESS))); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "==Exit RDCShowCursor_HQ()== \n"); +#endif + +} + +static void RDCSetCursorColors_HQ(ScrnInfoPtr pScrn, int bg, int fg) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + + int i, j, k; + UCHAR *pjSrcAnd, *pjSrcXor; + UCHAR jTempSrcAnd, jTempSrcXor; + ULONG ulTempDstXor32, ulTempDstAnd32, ulTempDstData32; + ULONG *pulDstData; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSetCursorColors_HQ(bg = %x, fg = %x)== \n", bg, fg); +#endif + + pRDC->HWCInfo.MonoHWC.fg = fg; + pRDC->HWCInfo.MonoHWC.bg = bg; + + pjSrcXor = pRDC->HWCInfo.MonoHWC.ucXorBitmap; + pjSrcAnd = pRDC->HWCInfo.MonoHWC.ucAndBitmap; + pulDstData = (ULONG*)(pRDC->HWCInfo.MonoHWC.pjPatternVirtualAddr); + + for (j = 0; j < MAX_HWC_HEIGHT; j++) + { + for (i = 0; i < (MAX_HWC_WIDTH/8); i++) + { + jTempSrcXor = *pjSrcXor; + jTempSrcAnd = *pjSrcAnd; + + for (k=7; k>=0; k--) + { + ulTempDstAnd32 = ((jTempSrcAnd >> k) & 0x01) ? 0x80000000L:0x00L; + ulTempDstXor32 = ((jTempSrcXor >> k) & 0x01) ? 0x40000000L:0x00L; + ulTempDstData32 = ((jTempSrcXor >> k) & 0x01) ? fg:bg; + *pulDstData = ulTempDstAnd32|ulTempDstXor32|ulTempDstData32; + pulDstData++; + } + + pjSrcXor++; + pjSrcAnd++; + } + } +} + +static void RDCLoadCursorImage_HQ(ScrnInfoPtr pScrn, UCHAR *src) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + UCHAR *pjSrcAnd, *pjSrcXor; + ULONG ulPatternOffset; + + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCLoadCursorImage_HQ()== \n"); +#endif + /* init cursor info. */ + pRDC->HWCInfo.cursortype = HWC_MONO; + pRDC->HWCInfo.width = (USHORT) MAX_HWC_WIDTH; + pRDC->HWCInfo.height = (USHORT) MAX_HWC_HEIGHT; + pRDC->HWCInfo.offset_x = MAX_HWC_WIDTH - pRDC->HWCInfo.width; + pRDC->HWCInfo.offset_y = MAX_HWC_HEIGHT - pRDC->HWCInfo.height; + + /* copy cursor image to cache */ + pjSrcXor = src; + pjSrcAnd = src + (MAX_HWC_WIDTH*MAX_HWC_HEIGHT/8); + + memcpy(&(pRDC->HWCInfo.MonoHWC.ucXorBitmap),pjSrcXor, sizeof(pRDC->HWCInfo.MonoHWC.ucXorBitmap)); + memcpy(&(pRDC->HWCInfo.MonoHWC.ucAndBitmap),pjSrcAnd, sizeof(pRDC->HWCInfo.MonoHWC.ucAndBitmap)); + + /* set pattern offset */ + ulPatternOffset = pRDC->HWCInfo.ulHWCOffsetAddr+HQ_HWC_SIZE*pRDC->HWCInfo.HWC_NUM_Next; + pRDC->HWCInfo.MonoHWC.pjPatternVirtualAddr = pRDC->FBVirtualAddr + ulPatternOffset; + *((ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_ADDRESS)) = ((ulPatternOffset >> 3) & 0xFFFFFF); + + /* update HWC_NUM_Next */ + pRDC->HWCInfo.HWC_NUM_Next = (pRDC->HWCInfo.HWC_NUM_Next+1) % pRDC->HWCInfo.HWC_NUM; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCLoadCursorImage_HQ()== \n"); +#endif +} + +static void RDCLoadCursorARGB_HQ(ScrnInfoPtr pScrn, CursorPtr pCurs) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + + UCHAR *pjDstXor, *pjSrcXor; + ULONG j, ulSrcWidthInByte, ulSrcHeight; + LONG ulDstCursorPitch; + ULONG ulPatternAddr; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCLoadCursorARGB_HQ()== \n"); +#endif + /* init cursor info. */ + pRDC->HWCInfo.cursortype = HWC_COLOR; + pRDC->HWCInfo.width = pCurs->bits->width; + pRDC->HWCInfo.height = pCurs->bits->height; + pRDC->HWCInfo.xhot = pCurs->bits->xhot; + pRDC->HWCInfo.yhot = pCurs->bits->yhot; + pRDC->HWCInfo.offset_x = MAX_HWC_WIDTH - pRDC->HWCInfo.width; + pRDC->HWCInfo.offset_y = MAX_HWC_HEIGHT - pRDC->HWCInfo.height; + + /* copy cursor image to cache */ + ulSrcWidthInByte = pRDC->HWCInfo.width << 2; + ulSrcHeight = pRDC->HWCInfo.height; + + ulDstCursorPitch = MAX_HWC_WIDTH << 2; + + pjSrcXor = (UCHAR *) pCurs->bits->argb; + pjDstXor = (UCHAR *) pRDC->HWCInfo.pjHWCVirtualAddr + + HQ_HWC_SIZE*pRDC->HWCInfo.HWC_NUM_Next + + (MAX_HWC_HEIGHT - ulSrcHeight) * ulDstCursorPitch + + (ulDstCursorPitch - ulSrcWidthInByte); + + for (j = 0; j < ulSrcHeight; j++) + { + memcpy(pjDstXor,pjSrcXor, ulSrcWidthInByte); + + /* Point to next source and dest scans */ + pjSrcXor += ulSrcWidthInByte; + pjDstXor += ulDstCursorPitch; + } /* end of for-loop */ + + + /* set pattern offset */ + ulPatternAddr = ((pRDC->HWCInfo.ulHWCOffsetAddr +HQ_HWC_SIZE*pRDC->HWCInfo.HWC_NUM_Next) >> 3); + + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_ADDRESS)) = (ulPatternAddr & 0xFFFFFF); + + /* update HWC_NUM_Next */ + pRDC->HWCInfo.HWC_NUM_Next = (pRDC->HWCInfo.HWC_NUM_Next+1) % pRDC->HWCInfo.HWC_NUM; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCLoadCursorARGB()== \n"); +#endif +} + +static void RDCSetCursorPosition_HQ(ScrnInfoPtr pScrn, int x, int y) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + DisplayModePtr mode = pRDC->ModePtr; + HWCINFO *pHWCInfo = &pRDC->HWCInfo; + int x_offset, y_offset, y_end; + int xhot, yhot; + int iOverlayStartX, iOverlayStartY; + int iOverlayEndX, iOverlayEndY; + int iOverlayDispCntX, iOverlayDispCntY; + int iOverlayStartOffsetX, iOverlayStartOffsetY; + int iOverlaySrcWidth, iOverlaySrcHeight; + int iOverlayDstWidth, iOverlayDstHeight; + int iOverlayFetchCnt; + ULONG ulCursorCtrl; + Bool bNeedAdjustFrame = false; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "==Enter RDCSetCursorPosition_HQ(x = %d, y = %d)== \n", x, y); +#endif + + xhot = pRDC->HWCInfo.xhot; + yhot = pRDC->HWCInfo.yhot; + + x_offset = pRDC->HWCInfo.offset_x; + y_offset = pRDC->HWCInfo.offset_y; + + /* limit cursor in screen region */ + if ((x+xhot) >= mode->HDisplay) + { + x = mode->HDisplay - xhot -1; + } + + if ((y+yhot) >= mode->VDisplay) + { + y = mode->VDisplay - yhot -1; + } + + if ((x+xhot) < 0) + { + x = (-xhot); + } + + if ((y+yhot) < 0) + { + y = (-yhot); + } + + + /* adjust cursor position for panning mode */ + if (pRDC->DeviceInfo.ucDeviceID == 1) + { + if (x+xhot >= pHWCInfo->iScreenOffset_x + (int)pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution) + { + pHWCInfo->iScreenOffset_x = x + xhot - ((int)(pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution) - 1); + x = (int)(pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution) - 1 - xhot; + bNeedAdjustFrame = true; + } + else if (x+xhot < pHWCInfo->iScreenOffset_x) + { + pHWCInfo->iScreenOffset_x = x + xhot; + x = -xhot; + bNeedAdjustFrame = true; + } + else + { + x -= pHWCInfo->iScreenOffset_x; + } + + if (y+yhot >= pHWCInfo->iScreenOffset_y + (int)pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution) + { + pHWCInfo->iScreenOffset_y = y + yhot - ((int)pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution - 1); + y = (int)pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution - 1 - yhot; + bNeedAdjustFrame = true; + } + else if (y+yhot < pHWCInfo->iScreenOffset_y) + { + pHWCInfo->iScreenOffset_y = y + yhot; + y = -yhot; + bNeedAdjustFrame = true; + } + else + { + y -= pHWCInfo->iScreenOffset_y; + } + + if (bNeedAdjustFrame) + { + RDCAdjustFrame(pScrn->scrnIndex, pHWCInfo->iScreenOffset_x, pHWCInfo->iScreenOffset_y, 0); + if (pRDC->OverlayStatus.bOverlayEnable) + { + iOverlaySrcWidth = pRDC->OverlayStatus.iSrcWidth; + iOverlaySrcHeight = pRDC->OverlayStatus.iSrcHeight; + + iOverlayDstWidth = pRDC->OverlayStatus.iDstWidth; + iOverlayDstHeight = pRDC->OverlayStatus.iDstHeight; + + iOverlayStartX = pRDC->OverlayStatus.iDstLeft - pHWCInfo->iScreenOffset_x; + iOverlayStartY = pRDC->OverlayStatus.iDstTop - pHWCInfo->iScreenOffset_y; + + iOverlayEndX = iOverlayStartX + iOverlayDstWidth - 1; + iOverlayEndY = iOverlayStartY + iOverlayDstHeight - 1; + + iOverlayStartOffsetX = 0; + iOverlayStartOffsetY = 0; + + if (iOverlayEndX >= pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution) + { + iOverlayEndX = pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution - 1; + } + + if (iOverlayEndY >= pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution) + { + iOverlayEndY = pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution - 1; + } + + iOverlayDispCntX = (iOverlaySrcWidth * (iOverlayEndX - iOverlayStartX + 1) -1) / iOverlayDstWidth; + iOverlayDispCntY = (iOverlaySrcHeight * (iOverlayEndY - iOverlayStartY + 1) -1) / iOverlayDstHeight; + + if (iOverlayStartX < 0) + { + iOverlayStartOffsetX = (iOverlaySrcWidth * (-iOverlayStartX)) / iOverlayDstWidth; + iOverlayStartX = 0; + } + + if (iOverlayStartY < 0) + { + iOverlayStartOffsetY = (iOverlaySrcHeight * (-iOverlayStartY)) / iOverlayDstHeight; + iOverlayStartY = 0; + } + + iOverlayFetchCnt = ((((iOverlaySrcWidth << 1) * (iOverlayEndX - iOverlayStartX + 1)+ iOverlayDstWidth - 1) / iOverlayDstWidth) + 7) >> 3; + + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_START_LOCATION) = (iOverlayStartX << 16) | iOverlayStartY; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_END_LOCATION) = (iOverlayEndX << 16) | iOverlayEndY; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_START_OFFSET) = (iOverlayStartOffsetX << 16) | iOverlayStartOffsetY; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_SRC_DISP_COUNT_ON_SCR) = (iOverlayDispCntY << 16) | iOverlayDispCntX; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FETCH_COUNT) = iOverlayFetchCnt; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_REG_UPDATE_MOD_SELECT) = VDPS_FIRE; + } + else + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "overlay disabled\n"); + } + } + } + + /* adjust cursor position by 1 line */ + y++; + + + if(x < 0) + { + x_offset = (-x) + pRDC->HWCInfo.offset_x; + x = 0; + } + + if(y < 0) + { + y_offset = (-y) + pRDC->HWCInfo.offset_y; + y = 0; + } + + if ( pRDC->DeviceInfo.ScalerConfig.EnableHorScaler) + { + x = (x * pRDC->DeviceInfo.ScalerConfig.ulHorScalingFactor + 4095) >> 12; +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "H scaling factor = %x\n", pRDC->DeviceInfo.ScalerConfig.ulHorScalingFactor); +#endif + + } + + y_end = y + (MAX_HWC_HEIGHT - y_offset); + + if (pRDC->DeviceInfo.ScalerConfig.EnableVerScaler) + { + y = (y * pRDC->DeviceInfo.ScalerConfig.ulVerScalingFactor + 2047) >>11; + y_end = ((y_end * pRDC->DeviceInfo.ScalerConfig.ulVerScalingFactor + 2047) >> 11) - 1; + } + else + { + y_end--; + } + + if(mode->Flags & V_DBLSCAN) + y *= 2; + + /* Set to Reg. */ + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_OFFSET)) = + (x_offset & 0x3F) | ((y_offset & 0x3F) << 8) | ((y_end & 0x7FF) << 16); + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_POSITION)) = + (x & 0xFFF) | ((y & 0x7FF)<< 16); + + /* Fire HWC */ + ulCursorCtrl = *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)); + *((volatile ULONG*)(pRDC->MMIOVirtualAddr + HWC_MMIO_CTRL)) = ulCursorCtrl; + +#if HWC_DEBUG + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "==Exit RDCSetCursorPosition()== \n"); +#endif +} +#endif /* End of HWC */ diff --git a/src/rdc_cursor.h b/src/rdc_cursor.h new file mode 100644 index 0000000..4ab1fad --- /dev/null +++ b/src/rdc_cursor.h @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#define MAX_HWC_WIDTH 64 +#define MAX_HWC_HEIGHT 64 +#define HWC_SIZE (MAX_HWC_WIDTH*MAX_HWC_HEIGHT*2) +#define HQ_HWC_SIZE (MAX_HWC_WIDTH*MAX_HWC_HEIGHT*4) +#define HWC_SIGNATURE_SIZE 32 +#define HWC_ALIGN 32 + +#define HWC_MONO 0 +#define HWC_COLOR 1 + +/* define for signature structure */ +#define HWC_SIGNATURE_CHECKSUM 0x00 +#define HWC_SIGNATURE_SizeX 0x04 +#define HWC_SIGNATURE_SizeY 0x08 +#define HWC_SIGNATURE_X 0x0C +#define HWC_SIGNATURE_Y 0x10 +#define HWC_SIGNATURE_HOTSPOTX 0x14 +#define HWC_SIGNATURE_HOTSPOTY 0x18 + + +#define HWC_MMIO_CTRL 0x580 +#define HWC_MMIO_OFFSET 0x584 +#define HWC_MMIO_POSITION 0x588 +#define HWC_MMIO_ADDRESS 0x58C diff --git a/src/rdc_driver.c b/src/rdc_driver.c new file mode 100644 index 0000000..08ca023 --- /dev/null +++ b/src/rdc_driver.c @@ -0,0 +1,1701 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#define XF86_VERSION_NUMERIC(major,minor,patch,snap,dummy) \ + (((major) * 10000000) + ((minor) * 100000) + ((patch) * 1000) + snap) + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" + +/* Driver specific headers */ +#include "rdc.h" + +/* external reference fucntion */ +#if !XSERVER_LIBPCIACCESS +extern Bool RDCMapMem(ScrnInfoPtr pScrn); +#endif +extern Bool RDCUnmapMem(ScrnInfoPtr pScrn); +extern Bool RDCMapMMIO(ScrnInfoPtr pScrn); +extern void RDCUnmapMMIO(ScrnInfoPtr pScrn); +extern Bool RDCMapVBIOS(ScrnInfoPtr pScrn); +extern Bool RDCUnmapVBIOS(ScrnInfoPtr pScrn); + +extern void vRDCOpenKey(ScrnInfoPtr pScrn); +extern Bool bRDCRegInit(ScrnInfoPtr pScrn); +extern ULONG GetVRAMInfo(ScrnInfoPtr pScrn); +extern Bool RDCFilterModeByBandWidth(ScrnInfoPtr pScrn, DisplayModePtr mode); +extern ULONG RDCGetMemBandWidth(ScrnInfoPtr pScrn); +extern void vRDCLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors, VisualPtr pVisual); +extern void RDCDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags); +extern void vSetStartAddressCRT1(RDCRecPtr pRDC, ULONG base); +extern Bool RDCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); + +extern Bool bInitCMDQInfo(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +extern Bool bEnableCMDQ(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +extern void vDisable2D(ScrnInfoPtr pScrn, RDCRecPtr pRDC); + +extern Bool RDCAccelInit(ScreenPtr pScreen); + +extern Bool RDCCursorInit(ScreenPtr pScreen); +extern DisplayModePtr RDCBuildModePool(ScrnInfoPtr pScrn); +extern void RDCVideoInit(ScreenPtr pScreen); + +/* Mandatory functions */ +static void RDCIdentify(int flags); +const OptionInfoRec *RDCAvailableOptions(int chipid, int busid); +#if XSERVER_LIBPCIACCESS +static Bool rdc_pci_probe (DriverPtr drv, int entity_num, struct pci_device *dev, intptr_t match_data); +#else +static Bool RDCProbe(DriverPtr drv, int flags); +#endif +static Bool RDCPreInit(ScrnInfoPtr pScrn, int flags); +static Bool RDCScreenInit(int Index, ScreenPtr pScreen, int argc, char **argv); +Bool RDCSwitchMode(int scrnIndex, DisplayModePtr mode, int flags); +void RDCAdjustFrame(int scrnIndex, int x, int y, int flags); +static Bool RDCEnterVT(int scrnIndex, int flags); +static void RDCLeaveVT(int scrnIndex, int flags); +static void RDCFreeScreen(int scrnIndex, int flags); +static ModeStatus RDCValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags); + +/* Internally used functions */ +static Bool RDCGetRec(ScrnInfoPtr pScrn); +static void RDCFreeRec(ScrnInfoPtr pScrn); +static Bool RDCSaveScreen(ScreenPtr pScreen, Bool unblack); +static Bool RDCCloseScreen(int scrnIndex, ScreenPtr pScreen); +static void RDCSave(ScrnInfoPtr pScrn); +static void RDCRestore(ScrnInfoPtr pScrn); +static void RDCProbeDDC(ScrnInfoPtr pScrn, int index); +static xf86MonPtr RDCDoDDC(ScrnInfoPtr pScrn, int index); +static void vFillRDCModeInfo (ScrnInfoPtr pScrn); +static Bool RDCModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode); +static void RDCSetHWCaps(RDCRecPtr pRDC); + +#if XSERVER_LIBPCIACCESS +#define RDC_DEVICE_MATCH(d,i) \ + { PCI_VENDOR_RDC, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) } + +static const struct pci_id_match rdc_device_match[] = { + RDC_DEVICE_MATCH (PCI_VENDOR_RDC_M2010_A0, 0 ), + RDC_DEVICE_MATCH (PCI_CHIP_M2010, 0 ), + RDC_DEVICE_MATCH (PCI_CHIP_M2010_A0, 0 ), + RDC_DEVICE_MATCH (PCI_CHIP_M2011, 0 ), + { 0, 0, 0 }, +}; +#endif + +/* + * This is intentionally screen-independent. It indicates the binding + * choice made in the first PreInit. + */ +_X_EXPORT DriverRec RDC = { + RDC_VERSION, + RDC_DRIVER_NAME, + RDCIdentify, +#if XSERVER_LIBPCIACCESS + NULL, +#else + RDCProbe, +#endif + RDCAvailableOptions, + NULL, + 0, + NULL, +#if XSERVER_LIBPCIACCESS + rdc_device_match, + rdc_pci_probe +#endif +}; + + +/* Chipsets */ +static SymTabRec RDCChipsets[] = { + {PCI_CHIP_M2010_A0, "M2010_A0"}, + {PCI_CHIP_M2010, "M2010"}, + {PCI_CHIP_M2011, "M2011"}, + {-1, NULL} +}; + +static PciChipsets RDCPciChipsets[] = { + {PCI_CHIP_M2010, PCI_CHIP_M2010, RES_SHARED_VGA}, + {PCI_CHIP_M2010_A0, PCI_CHIP_M2010_A0, RES_SHARED_VGA}, + {PCI_CHIP_M2011, PCI_CHIP_M2011, RES_SHARED_VGA}, + {-1, -1, RES_UNDEFINED } +}; + +typedef enum { + OPTION_NOACCEL, + OPTION_MMIO2D, + OPTION_SW_CURSOR, + OPTION_HWC_NUM, + OPTION_ENG_CAPS, + OPTION_DBG_SELECT, + OPTION_NO_DDC +} RDCOpts; + +static const OptionInfoRec RDCOptions[] = { + {OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_MMIO2D, "MMIO2D", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_SW_CURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_HWC_NUM, "HWCNumber", OPTV_INTEGER, {0}, FALSE}, + {OPTION_ENG_CAPS, "ENGCaps", OPTV_INTEGER, {0}, FALSE}, + {OPTION_DBG_SELECT, "DBGSelect", OPTV_INTEGER, {0}, FALSE}, + {OPTION_NO_DDC, "NoDDC", OPTV_BOOLEAN, {0}, FALSE}, + {-1, NULL, OPTV_NONE, {0}, FALSE} +}; + +const char *vgahwSymbols[] = { + "vgaHWFreeHWRec", + "vgaHWGetHWRec", + "vgaHWGetIOBase", + "vgaHWGetIndex", + "vgaHWInit", + "vgaHWLock", + "vgaHWMapMem", + "vgaHWProtect", + "vgaHWRestore", + "vgaHWSave", + "vgaHWSaveScreen", + "vgaHWSetMmioFuncs", + "vgaHWUnlock", + "vgaHWUnmapMem", + NULL +}; + +const char *fbSymbols[] = { + "fbPictureInit", + "fbScreenInit", + NULL +}; + +const char *vbeSymbols[] = { + "VBEInit", + "VBEFreeModeInfo", + "VBEFreeVBEInfo", + "VBEGetModeInfo", + "VBEGetModePool", + "VBEGetVBEInfo", + "VBEGetVBEMode", + "VBEPrintModes", + "VBESaveRestore", + "VBESetDisplayStart", + "VBESetGetDACPaletteFormat", + "VBESetGetLogicalScanlineLength", + "VBESetGetPaletteData", + "VBESetModeNames", + "VBESetModeParameters", + "VBESetVBEMode", + "VBEValidateModes", + "vbeDoEDID", + "vbeFree", + NULL +}; + +#ifdef XFree86LOADER +static const char *vbeOptionalSymbols[] = { + "VBEDPMSSet", + "VBEGetPixelClock", + NULL +}; +#endif + +const char *ddcSymbols[] = { + "xf86PrintEDID", + "xf86SetDDCproperties", + NULL +}; + +const char *int10Symbols[] = { + "xf86ExecX86int10", + "xf86InitInt10", + "xf86Int10AllocPages", + "xf86int10Addr", + NULL +}; + +const char *xaaSymbols[] = { + "XAACreateInfoRec", + "XAADestroyInfoRec", + "XAAInit", + "XAACopyROP", + "XAAPatternROP", + NULL +}; + +const char *ramdacSymbols[] = { + "xf86CreateCursorInfoRec", + "xf86DestroyCursorInfoRec", + "xf86InitCursor", + NULL +}; + + +#ifdef XFree86LOADER + +static MODULESETUPPROTO(RDCSetup); + +static XF86ModuleVersionInfo RDCVersRec = { + RDC_DRIVER_NAME, + MODULEVENDORSTRING, + MODINFOSTRING1, + MODINFOSTRING2, + XORG_VERSION_CURRENT, + RDC_MAJOR_VERSION, RDC_MINOR_VERSION, RDC_PATCH_VERSION, + ABI_CLASS_VIDEODRV, +#ifdef PATCH_ABI_VERSION + SET_ABI_VERSION(0, 5), +#else + ABI_VIDEODRV_VERSION, +#endif + MOD_CLASS_VIDEODRV, + {0, 0, 0, 0} +}; + +XF86ModuleData rdcModuleData = { &RDCVersRec, RDCSetup, NULL }; + +static pointer +RDCSetup(pointer module, pointer opts, int *errmaj, int *errmin) +{ + static Bool setupDone = FALSE; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCSetup()== \n"); + + /* This module should be loaded only once, but check to be sure. */ + + if (!setupDone) + { + setupDone = TRUE; + xf86AddDriver(&RDC, module, +#if XSERVER_LIBPCIACCESS + HaveDriverFuncs +#else + 0 +#endif + ); + + /* Tell the loader about symbols from other modules that this module might refer to. */ + /*======================================================== + void LoaderRefSymLists(const char **list0, ...) + This function allows the registration of possibly unresolved symbols with + the loader. When LoaderCheckUnresolved() is run it won't generate + warnings for symbols registered in this way unless they were also registered + as required symbols. The function takes one or more NULL terminated + lists of symbols. The end of the argument list is indicated by a NULL + argument. + ==========================================================*/ + LoaderRefSymLists(vgahwSymbols, + fbSymbols, xaaSymbols, ramdacSymbols, + vbeSymbols, vbeOptionalSymbols, + ddcSymbols, int10Symbols, NULL); + + /* The return value must be non-NULL on success even though there is no TearDownProc. */ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 RDCSetup()== return TRUE\n"); + return (pointer) TRUE; + } + else + { + if (errmaj) + *errmaj = LDR_ONCEONLY; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit2 RDCSetup()== return NULL\n"); + return NULL; + } + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit3 RDCSetup()== \n"); +} + +#endif /* XFree86LOADER */ + +/* + * RDCIdentify -- + * + * Returns the string name for the driver based on the chipset. In this + * case it will always be an RDC, so we can return a static string. + * + */ +static void +RDCIdentify(int flags) +{ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCIdentify()== \n"); + xf86PrintChipsets(RDC_NAME, "Driver for RDC Graphics Chipsets", RDCChipsets); + xf86DrvMsgVerb(1, X_INFO, DefaultLevel, "==Exit RDCIdentify()== \n"); +} + +const OptionInfoRec * +RDCAvailableOptions(int chipid, int busid) +{ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCAvailableOptions()== return RDCOptions\n"); + return RDCOptions; +} + +#if XSERVER_LIBPCIACCESS +/* + * rdc_pci_probe -- + * + * Look through the PCI bus to find cards that are rdc boards. + * Setup the dispatch table for the rest of the driver functions. + * + */ +static Bool rdc_pci_probe (DriverPtr driver, + int entity_num, + struct pci_device *device, + intptr_t match_data) +{ + ScrnInfoPtr pScrn = NULL; + EntityInfoPtr entity; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter rdc_pci_probe== \n"); + + pScrn = xf86ConfigPciEntity (pScrn, 0, entity_num, RDCPciChipsets, + NULL, + NULL, NULL, NULL, NULL); + if (pScrn != NULL) + { + pScrn->driverVersion = RDC_VERSION; + pScrn->driverName = RDC_DRIVER_NAME; + pScrn->name = RDC_NAME; + pScrn->Probe = NULL; + + entity = xf86GetEntityInfo (entity_num); + + switch (DEVICE_ID(device)) { + case PCI_VENDOR_RDC_M2010_A0: + case PCI_CHIP_M2010: + case PCI_CHIP_M2010_A0: + case PCI_CHIP_M2011: + pScrn->PreInit = RDCPreInit; + pScrn->ScreenInit = RDCScreenInit; + pScrn->SwitchMode = RDCSwitchMode; + pScrn->AdjustFrame = RDCAdjustFrame; + pScrn->EnterVT = RDCEnterVT; + pScrn->LeaveVT = RDCLeaveVT; + pScrn->FreeScreen = RDCFreeScreen; + pScrn->ValidMode = RDCValidMode; + break; + + default: + break; + } + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit rdc_pci_probe== \n"); + return pScrn != NULL; +} +#else +/* + * RDCProbe -- + * + * Look through the PCI bus to find cards that are RDC boards. + * Setup the dispatch table for the rest of the driver functions. + * + */ +static Bool +RDCProbe(DriverPtr drv, int flags) +{ + int i, numUsed, numDevSections, *usedChips; + Bool foundScreen = FALSE; + GDevPtr *devSections; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCProbe== \n"); + + /* + * Find the config file Device sections that match this + * driver, and return if there are none. + */ + if ((numDevSections = xf86MatchDevice(RDC_DRIVER_NAME, &devSections)) <= 0) + { + xf86DrvMsgVerb(0, X_INFO, 0, "==Exit1 RDCProbe()== return FALSE\n"); + return FALSE; + } + + /* + * This probing is just checking the PCI data the server already + * collected. + */ + if (xf86GetPciVideoInfo() == NULL) + { + xf86DrvMsgVerb(0, X_INFO, 0, "==Exit2 RDCProbe()== return FALSE\n"); + return FALSE; + } + + numUsed = xf86MatchPciInstances(RDC_NAME, PCI_VENDOR_RDC, + RDCChipsets, RDCPciChipsets, + devSections, numDevSections, + drv, &usedChips); + xf86DrvMsgVerb(0, X_INFO, 5, "numUsed = %d\n", numUsed); + xfree(devSections); + + if (flags & PROBE_DETECT) + { + if (numUsed > 0) + foundScreen = TRUE; + } + else + { + for (i = 0; i < numUsed; i++) + { + ScrnInfoPtr pScrn = NULL; + + /* Allocate new ScrnInfoRec and claim the slot */ + if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], + RDCPciChipsets, 0, 0, 0, 0, 0))) + { + pScrn->driverVersion = RDC_VERSION; + pScrn->driverName = RDC_DRIVER_NAME; + pScrn->name = RDC_NAME; + + pScrn->Probe = RDCProbe; + pScrn->PreInit = RDCPreInit; + pScrn->ScreenInit = RDCScreenInit; + pScrn->SwitchMode = RDCSwitchMode; + pScrn->AdjustFrame = RDCAdjustFrame; + pScrn->EnterVT = RDCEnterVT; + pScrn->LeaveVT = RDCLeaveVT; + pScrn->FreeScreen = RDCFreeScreen; + pScrn->ValidMode = RDCValidMode; + + foundScreen = TRUE; + } /* end of if */ + } /* end of for-loop */ + } /* end of if flags */ + + xfree(usedChips); + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit3 RDCProbe()== return(foundScreen=%X)\n", foundScreen); + return foundScreen; +} +#endif + +/* + * RDCPreInit -- + * + * Do initial setup of the board before we know what resolution we will + * be running at. + * + */ +static Bool +RDCPreInit(ScrnInfoPtr pScrn, int flags) +{ + EntityInfoPtr pEnt; + vgaHWPtr hwp; + int flags24; + rgb defaultWeight = { 0, 0, 0 }; + Gamma zeros = { 0.0, 0.0, 0.0 }; + RDCRecPtr pRDC; + ClockRangePtr clockRanges; + int i; + MessageType from; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCPreInit()==\n"); + /* Suport one adapter only now */ + if (pScrn->numEntities != 1) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit1 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + + if (flags & PROBE_DETECT) + { + RDCProbeDDC(pScrn, pEnt->index); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit2 RDCPreInit()== return TRUE\n"); + return TRUE; + } + + if (pEnt->location.type != BUS_PCI) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit3 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + if (xf86RegisterResources(pEnt->index, 0, ResExclusive)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit4 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + /* The vgahw module should be loaded here when needed */ + if (!xf86LoadSubModule(pScrn, "vgahw")) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit5 RDCPreInit()== return FALSE\n"); + return FALSE; + } + xf86LoaderReqSymLists(vgahwSymbols, NULL); + + /* The fb module should be loaded here when needed */ + if (!xf86LoadSubModule(pScrn, "fb")) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit6 RDCPreInit()== return FALSE\n"); + return FALSE; + } + xf86LoaderReqSymLists(fbSymbols, NULL); + + /* Allocate a vgaHWRec */ + if (!vgaHWGetHWRec(pScrn)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit7 RDCPreInit()== return FALSE\n"); + return FALSE; + } + hwp = VGAHWPTR(pScrn); + + /* Color Depth Check */ + flags24 = Support32bppFb; + if (!xf86SetDepthBpp(pScrn, 0, 0, 0, flags24)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit8 RDCPreInit()== return FALSE\n"); + return FALSE; + } + else + { + switch (pScrn->depth) + { + case 8: + case 16: + case 24: + break; + + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by RDC driver\n", + pScrn->depth); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit9 RDCPreInit()== return FALSE\n"); + return FALSE; + } + } + + xf86PrintDepthBpp(pScrn); + + switch (pScrn->bitsPerPixel) + { + case 8: + case 16: + case 32: + break; + + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Given bpp (%d) is not supported by RDC driver\n", + pScrn->bitsPerPixel); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit10 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + /* fill pScrn misc. */ + pScrn->progClock = TRUE; + pScrn->rgbBits = 6; + pScrn->monitor = pScrn->confScreen->monitor; /* should be initialized before set gamma */ + pScrn->racMemFlags = RAC_FB | RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; + pScrn->racIoFlags = RAC_COLORMAP | RAC_CURSOR | RAC_VIEWPORT; + + /* + * If the driver can do gamma correction, it should call xf86SetGamma() + * here. + */ + if (!xf86SetGamma(pScrn, zeros)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "call xf86SetGamma failed \n"); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit11 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + + if (!xf86SetWeight(pScrn, defaultWeight, defaultWeight)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit12 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + if (!xf86SetDefaultVisual(pScrn, -1)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit13 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + /* Allocate driverPrivate */ + if (!RDCGetRec(pScrn)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "call RDCGetRec failed \n"); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit14 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + /* Fill RDC Info */ + pRDC = RDCPTR(pScrn); + pRDC->pEnt = xf86GetEntityInfo(pScrn->entityList[0]); + pRDC->PciInfo = xf86GetPciInfoForEntity(pRDC->pEnt->index); +#if !XSERVER_LIBPCIACCESS + pRDC->PciTag = pciTag(pRDC->PciInfo->bus, pRDC->PciInfo->device, + pRDC->PciInfo->func); +#endif + + /* Process the options + * pScrn->confScreen, pScrn->display, pScrn->monitor, pScrn->numEntities, + * and pScrn->entityList should be initialized before + */ + xf86CollectOptions(pScrn, NULL); + if (!(pRDC->Options = xalloc(sizeof(RDCOptions)))) + { + RDCFreeRec(pScrn); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit15 RDCPreInit()== return FALSE\n"); + return FALSE; + } + memcpy(pRDC->Options, RDCOptions, sizeof(RDCOptions)); + xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, pRDC->Options); + + /* + * Set the Chipset and ChipRev, allowing config file entries to + * override. + */ + if (pRDC->pEnt->device->chipset && *pRDC->pEnt->device->chipset) + { + pScrn->chipset = pRDC->pEnt->device->chipset; + from = X_CONFIG; + } + else if (pRDC->pEnt->device->chipID >= 0) + { + pScrn->chipset = (char *)xf86TokenToString(RDCChipsets, + pRDC->pEnt->device->chipID); + from = X_CONFIG; + xf86DrvMsgVerb(pScrn->scrnIndex, X_CONFIG, DefaultLevel, "ChipID override: 0x%04X\n", + pRDC->pEnt->device->chipID); + } + else + { + from = X_PROBED; + pScrn->chipset = (char *)xf86TokenToString(RDCChipsets, + DEVICE_ID(pRDC->PciInfo)); + } + + if (pRDC->pEnt->device->chipRev >= 0) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_CONFIG, DefaultLevel, "ChipRev override: %d\n", + pRDC->pEnt->device->chipRev); + } + + xf86DrvMsgVerb(pScrn->scrnIndex, from, DefaultLevel, "Chipset: \"%s\"\n", + (pScrn->chipset != NULL) ? pScrn->chipset : "Unknown rdc"); + + /* Resource Allocation */ +#if XF86_VERSION_CURRENT < XF86_VERSION_NUMERIC(4,2,99,0,0) + pRDC->IODBase = 0; +#else + pRDC->IODBase = pScrn->domainIOBase; +#endif + /* "Patch" the PIOOffset inside vgaHW in order to force + * the vgaHW module to use our relocated i/o ports. + */ +#if XSERVER_LIBPCIACCESS + VGAHWPTR(pScrn)->PIOOffset = pRDC->PIOOffset = pRDC->IODBase + pRDC->PciInfo->regions[2].base_addr - 0x380; + pRDC->RelocateIO = (IOADDRESS)(pRDC->PciInfo->regions[2].base_addr + pRDC->IODBase); +#else + VGAHWPTR(pScrn)->PIOOffset = pRDC->PIOOffset = pRDC->IODBase + pRDC->PciInfo->ioBase[2] - 0x380; + + pRDC->RelocateIO = (IOADDRESS)(pRDC->PciInfo->ioBase[2] + pRDC->IODBase); +#endif + + if (pRDC->pEnt->device->MemBase != 0) + { + pRDC->FBPhysAddr = pRDC->pEnt->device->MemBase; + from = X_CONFIG; + } + else + { + if (RDC_MEMBASE(pRDC->PciInfo, 0) != 0) + { + pRDC->FBPhysAddr = RDC_MEMBASE(pRDC->PciInfo, 0) & 0xFFF00000; + from = X_PROBED; + } + else + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "No valid FB address in PCI config space\n"); + RDCFreeRec(pScrn); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit16 RDCPreInit()== return FALSE\n"); + return FALSE; + } + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "Linear framebuffer at 0x%lX\n", + (unsigned long) pRDC->FBPhysAddr); + + if (pRDC->pEnt->device->IOBase != 0) + { + pRDC->MMIOPhysAddr = pRDC->pEnt->device->IOBase; + from = X_CONFIG; + } + else + { + if (RDC_MEMBASE(pRDC->PciInfo, 1)) + { + pRDC->MMIOPhysAddr = RDC_MEMBASE(pRDC->PciInfo, 1) & 0xFFFF0000; + from = X_PROBED; + } + else + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, + "No valid MMIO address in PCI config space\n"); + RDCFreeRec(pScrn); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit17 RDCPreInit()== return FALSE\n"); + return FALSE; + } + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "IO registers at addr 0x%lX\n", + (unsigned long) pRDC->MMIOPhysAddr); + + pScrn->videoRam = GetVRAMInfo(pScrn) / 1024; + from = X_DEFAULT; + + + if (pRDC->pEnt->device->videoRam) + { + pScrn->videoRam = pRDC->pEnt->device->videoRam; + from = X_CONFIG; + } + + pRDC->FbMapSize = pScrn->videoRam * 1024; + pRDC->AvailableFBsize = pRDC->FbMapSize; + + pRDC->MMIOMapSize = DEFAULT_MMIO_SIZE; + + /* Get Memory Bandwidth */ + pRDC->MemoryBandwidth = RDCGetMemBandWidth(pScrn); + + /* Map resource */ + if (!RDCMapMem(pScrn)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Map FB Memory Failed \n"); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit18 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + if (!RDCMapMMIO(pScrn)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Map Memory Map IO Failed \n"); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit19 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + if (!RDCMapVBIOS(pScrn)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "==Exit RDCPreInit()==Map VBIOS Failed \n"); + return FALSE; + } + + /* init BIOS data */ + { + CBIOS_ARGUMENTS CBiosArguments; + CBIOS_Extension CBiosExtension; + + CBiosExtension.pCBiosArguments = &CBiosArguments; + CBiosExtension.IOAddress = (USHORT)(pRDC->RelocateIO); + CBiosExtension.VideoVirtualAddress = (ULONG)(pRDC->FBVirtualAddr); + + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = CINT10DataInit; + CBiosArguments.reg.ex.ECX = (ULONG)pRDC->BIOSVirtualAddr; + CInt10(&CBiosExtension); + } + + pScrn->memPhysBase = (ULONG)pRDC->FBPhysAddr; + pScrn->fbOffset = 0; + + /* Get Revision */ + pRDC->jChipType = M2010; + + /* Do DDC + * should be done after xf86CollectOptions + */ + pScrn->monitor->DDC = RDCDoDDC(pScrn, pRDC->pEnt->index); + + + /* Built Mode Pool */ + pScrn->modePool = RDCBuildModePool(pScrn); + + if (!pScrn->modePool) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "== No Video BIOS modes for chosen ==\n"); + return FALSE; + } + /* Mode Valid */ + clockRanges = xnfcalloc(sizeof(ClockRange), 1); + clockRanges->next = NULL; + clockRanges->minClock = 9500; + clockRanges->maxClock = 266950; + clockRanges->clockIndex = -1; /* -1 for programmable clocks */ + clockRanges->interlaceAllowed = FALSE; + clockRanges->doubleScanAllowed = FALSE; + +#ifdef FPGA + i = xf86ValidateModes(pScrn, pScrn->monitor->Modes, + pScrn->display->modes, clockRanges, + 0, 320, 1024, 8 * pScrn->bitsPerPixel, + 200, 768, + pScrn->display->virtualX, pScrn->display->virtualY, + pRDC->FbMapSize, LOOKUP_BEST_REFRESH); +#else + i = xf86ValidateModes(pScrn, pScrn->monitor->Modes, + pScrn->display->modes, clockRanges, + 0, 320, 1920, 8 * pScrn->bitsPerPixel, + 200, 1200, + pScrn->display->virtualX, pScrn->display->virtualY, + pRDC->FbMapSize, LOOKUP_BEST_REFRESH); +#endif + + if (i == -1) + { + RDCFreeRec(pScrn); + xf86DrvMsgVerb(0, X_INFO, ErrorLevel, "==Exit20 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + xf86PruneDriverModes(pScrn); + + if (!i || !pScrn->modes) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); + RDCFreeRec(pScrn); + xf86DrvMsgVerb(0, X_INFO, ErrorLevel, "==Exit21 RDCPreInit()== return FALSE\n"); + return FALSE; + } + + xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V); + + pScrn->currentMode = pScrn->modes; + + xf86PrintModes(pScrn); + + xf86SetDpi(pScrn, 0, 0); + + /* Accelaration Check */ + pRDC->noAccel = TRUE; + pRDC->AccelInfoPtr = NULL; + pRDC->CMDQInfo.ulCMDQSize = 0; +#ifdef Accel_2D + if (!xf86ReturnOptValBool(pRDC->Options, OPTION_NOACCEL, FALSE)) + { + if (!xf86LoadSubModule(pScrn, "xaa")) + { + RDCFreeRec(pScrn); + xf86DrvMsgVerb(0, X_INFO, ErrorLevel, "==Exit22 RDCPreInit()== return FALSE\n"); + return FALSE; + } + xf86LoaderReqSymLists(xaaSymbols, NULL); + + pRDC->noAccel = FALSE; + + pRDC->MMIO2D = TRUE; +#ifndef MMIO_2D + if (!xf86ReturnOptValBool(pRDC->Options, OPTION_MMIO2D, FALSE)) + { + pRDC->CMDQInfo.ulCMDQSize = DEFAULT_CMDQ_SIZE; + pRDC->AvailableFBsize = pRDC->AvailableFBsize - pRDC->CMDQInfo.ulCMDQSize; + pRDC->CMDQInfo.ulCMDQOffsetAddr = pRDC->AvailableFBsize; + pRDC->MMIO2D = FALSE; + } +#endif + + pRDC->ENGCaps = ENG_CAP_ALL; + if (!xf86GetOptValInteger(pRDC->Options, OPTION_ENG_CAPS, &pRDC->ENGCaps)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "No ENG Capability options found\n"); + } + + pRDC->DBGSelect = 0; + if (!xf86GetOptValInteger(pRDC->Options, OPTION_DBG_SELECT, &pRDC->DBGSelect)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "No DBG Seleclt options found\n"); + } + } +#endif + + /* Setup HW support capability */ + RDCSetHWCaps(pRDC); + + /* HW Cursor Check */ + pRDC->noHWC = TRUE; + pRDC->HWCInfoPtr = NULL; +#ifdef HWC + if (!xf86ReturnOptValBool(pRDC->Options, OPTION_SW_CURSOR, FALSE)) + { + if (!xf86LoadSubModule(pScrn, "ramdac")) + { + RDCFreeRec(pScrn); + xf86DrvMsgVerb(0, X_INFO, ErrorLevel, "==Exit23 RDCPreInit()== return FALSE\n"); + return FALSE; + } + xf86LoaderReqSymLists(ramdacSymbols, NULL); + + pRDC->noHWC = FALSE; + pRDC->HWCInfo.HWC_NUM = DEFAULT_HWC_NUM; + + if (!xf86GetOptValInteger(pRDC->Options, OPTION_HWC_NUM, &pRDC->HWCInfo.HWC_NUM)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "No HWC_NUM options found\n"); + } + + if (pRDC->ENGCaps & ENG_CAP_HWC_MMIO) + pRDC->AvailableFBsize = + pRDC->AvailableFBsize - (HQ_HWC_SIZE)*pRDC->HWCInfo.HWC_NUM; + else + pRDC->AvailableFBsize = + pRDC->AvailableFBsize - (HWC_SIZE+HWC_SIGNATURE_SIZE)*pRDC->HWCInfo.HWC_NUM; + + pRDC->HWCInfo.ulHWCOffsetAddr = pRDC->AvailableFBsize; + } +#endif + + /* We won't be using the VGA access after the probe */ + xf86SetOperatingState(resVgaIo, pRDC->pEnt->index, ResUnusedOpr); + xf86SetOperatingState(resVgaMem, pRDC->pEnt->index, ResDisableOpr); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit24 RDCPreInit()== return TRUE\n"); + return TRUE; +} + + +static Bool +RDCScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) +{ + ScrnInfoPtr pScrn; + RDCRecPtr pRDC; + vgaHWPtr hwp; + VisualPtr visual; + + /* for FB Manager */ + BoxRec FBMemBox; + int AvailFBSize; + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Enter RDCScreenInit()== \n"); + + pScrn = xf86Screens[pScreen->myNum]; + pRDC = RDCPTR(pScrn); + hwp = VGAHWPTR(pScrn); + + /* AvailFBSize = pRDC->FbMapSize - pRDC->CMDQInfo.ulCMDQSize; */ + AvailFBSize = pRDC->AvailableFBsize; + + FBMemBox.x1 = 0; + FBMemBox.y1 = 0; + FBMemBox.x2 = pScrn->displayWidth; + FBMemBox.y2 = (AvailFBSize / (pScrn->displayWidth * ((pScrn->bitsPerPixel+1)/8))) - 1; + if (FBMemBox.y2 <= 0) + FBMemBox.y2 = 32767; /* because FBMemBox.y2 is a value of short type, so its range is from -32768 ~ 32767*/ + + xf86DrvMsgVerb(scrnIndex, X_INFO, InfoLevel, "AvailFBSize = %d\n", AvailFBSize); + xf86DrvMsgVerb(scrnIndex, X_INFO, InfoLevel, "FBMemBox: x1 = %d, y1 = %d, x2 = %d, y2 = %d\n",FBMemBox.x1, FBMemBox.y1, FBMemBox.x2, FBMemBox.y2); + + if (!xf86InitFBManager(pScreen, &FBMemBox)) + { + xf86DrvMsg(scrnIndex, X_ERROR, "Failed to init memory manager\n"); + return FALSE; + } + + vgaHWGetIOBase(hwp); + + vFillRDCModeInfo (pScrn); + + RDCSave(pScrn); + if (!RDCModeInit(pScrn, pScrn->currentMode)) + { + xf86DrvMsg(scrnIndex, X_ERROR, "Mode Init Failed \n"); + return FALSE; + } + + RDCSaveScreen(pScreen, FALSE); + RDCAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + + miClearVisualTypes(); + + /* Re-implemented Direct Color support, -jens */ + if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth), pScrn->rgbBits, pScrn->defaultVisual)) + { + xf86DrvMsgVerb(scrnIndex, X_INFO, ErrorLevel, "==RDCScreenInit() Set Visual Type Fail== return FALSE\n"); + return FALSE; + } + + if (!miSetPixmapDepths()) + { + RDCSaveScreen(pScreen, SCREEN_SAVER_OFF); + xf86DrvMsgVerb(scrnIndex, X_INFO, ErrorLevel, "==RDCScreenInit() SetPixmapDepth fail== return FALSE\n"); + return FALSE; + } + + switch(pScrn->bitsPerPixel) + { + case 8: + case 16: + case 32: + if (!fbScreenInit(pScreen, pRDC->FBVirtualAddr + pScrn->fbOffset, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, + pScrn->displayWidth, pScrn->bitsPerPixel)) + { + xf86DrvMsgVerb(scrnIndex, X_INFO, ErrorLevel, "==RDCScreenInit() fbScreenInit fail== return FALSE\n"); + return FALSE; + } + break; + + default: + xf86DrvMsgVerb(scrnIndex, X_INFO, ErrorLevel, "==RDCScreenInit() Color Depth not supprt== return FALSE\n"); + return FALSE; + } + + if (pScrn->bitsPerPixel > 8) + { + /* Fixup RGB ordering */ + 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; + } + } + } + + fbPictureInit(pScreen, 0, 0); + + xf86SetBlackWhitePixels(pScreen); + +#ifdef Accel_2D + if (!pRDC->noAccel) + { + if (!RDCAccelInit(pScreen)) + { + xf86DrvMsg(scrnIndex, X_ERROR, "Hardware acceleration initialization failed\n"); + pRDC->noAccel = TRUE; + } + } +#endif /* end of Accel_2D */ + + miInitializeBackingStore(pScreen); + xf86SetBackingStore(pScreen); + xf86SetSilkenMouse(pScreen); + + miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); + + /* Init hardware cursor */ + if (!pRDC->noHWC) + { + if (!RDCCursorInit(pScreen)) + { + xf86DrvMsg(scrnIndex, X_ERROR, "Hardware cursor initialization failed\n"); + pRDC->noHWC = TRUE; + } + } + + if (!miCreateDefColormap(pScreen)) + { + xf86DrvMsgVerb(scrnIndex, X_INFO, ErrorLevel, "==Exit7 RDCScreenInit()== return FALSE\n"); + return FALSE; + } + + if(!xf86HandleColormaps(pScreen, 256, (pScrn->depth == 8) ? 8 : pScrn->rgbBits, + vRDCLoadPalette, NULL, + CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) + { + xf86DrvMsgVerb(scrnIndex, X_INFO, ErrorLevel, "==RDCScreenInit() xf86HandleColormaps fail== return FALSE\n"); + return FALSE; + } + + /* Init DPMS */ + xf86DPMSInit(pScreen, RDCDisplayPowerManagementSet, 0); + + pScreen->SaveScreen = RDCSaveScreen; + pRDC->CloseScreen = pScreen->CloseScreen; + pScreen->CloseScreen = RDCCloseScreen; +#if 0 + /* Remove restart flag file for utility */ + UTRemoveRestartFlag(pBIOSInfo); +#endif + /* Create a extension handler to receive the request of RDCutility. */ + RDCDisplayExtensionInit(pScrn); + + /* Init Video */ + if (pRDC->ENGCaps & ENG_CAP_VIDEO_DISP) + RDCVideoInit(pScreen); + + if (serverGeneration == 1) + xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==RDCScreenInit() Normal Exit==\n"); + return TRUE; +} /* RDCScreenInit */ + +Bool RDCSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RDCRecPtr pRDC = RDCPTR(pScrn); + Bool RetStatus = FALSE; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSwitchMode()== \n"); +#ifdef HWC + pRDC->HWCInfoPtr->HideCursor(pScrn); +#endif + +#ifdef Accel_2D + vDisable2D(pScrn, pRDC); +#endif + + RetStatus = RDCModeInit(pScrn, mode); + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "== RDCSwitchMode() Exit== return %X\n", RetStatus); + return RetStatus; +} + +void +RDCAdjustFrame(int scrnIndex, int x, int y, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RDCRecPtr pRDC = RDCPTR(pScrn); + ULONG base; + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Enter RDCAdjustFrame(x = %d, y = %d)== \n", x, y); + base = y * pRDC->VideoModeInfo.ScreenPitch + x * pRDC->VideoModeInfo.bitsPerPixel / 8; + + + vSetStartAddressCRT1(pRDC, base); + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Exit1 RDCAdjustFrame()== \n"); +} + +/* enter into X Server */ +static Bool +RDCEnterVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RDCRecPtr pRDC = RDCPTR(pScrn); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCEnterVT()== \n"); + if (!RDCModeInit(pScrn, pScrn->currentMode)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit1 RDCEnterVT() RDCModeInit Fail== return FALSE\n"); + return FALSE; + } + + RDCAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit2 RDCEnterVT() Normal Exit== return TRUE\n"); + return TRUE; +} + +/* leave X server */ +static void +RDCLeaveVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + vgaHWPtr hwp = VGAHWPTR(pScrn); + RDCRecPtr pRDC = RDCPTR(pScrn); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCLeaveVT();== \n"); +#ifdef HWC + pRDC->HWCInfoPtr->HideCursor(pScrn); +#endif + +#ifdef Accel_2D + vDisable2D(pScrn, pRDC); +#endif + + RDCRestore(pScrn); + vgaHWLock(hwp); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCLeaveVT() Normal Exit== \n"); +} + +static void +RDCFreeScreen(int scrnIndex, int flags) +{ + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Enter RDCFreeScreen()== \n"); + + RDCFreeRec(xf86Screens[scrnIndex]); + if (xf86LoaderCheckSymbol("vgaHWFreeHWRec")) + vgaHWFreeHWRec(xf86Screens[scrnIndex]); + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Exit1 RDCFreeScreen()== \n"); +} + +static ModeStatus +RDCValidMode(int scrnIndex, DisplayModePtr mode, Bool verbose, int flags) +{ + Bool Flags = MODE_NOMODE; + + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RDCRecPtr pRDC = RDCPTR(pScrn); + CBIOS_ARGUMENTS CBiosArguments; + CBIOS_Extension CBiosExtension; + BYTE bCurrentDeviceIdx; + USHORT wLCDHorSize, wLCDVerSize; + USHORT wVESAModeHorSize, wVESAModeVerSize; + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Enter RDCValidMode() Verbose = %d, Flags = 0x%x==\n", + verbose, flags); + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Mode name=%s, Width=%d, Height=%d, Refresh reate=%f==\n", + mode->name, mode->HDisplay, mode->VDisplay, mode->VRefresh); + + CBiosExtension.pCBiosArguments = &CBiosArguments; + CBiosExtension.IOAddress = (USHORT)(pRDC->RelocateIO); + CBiosExtension.VideoVirtualAddress = (ULONG)(pRDC->FBVirtualAddr); + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = QueryDisplayPathInfo; + CInt10(&CBiosExtension); + bCurrentDeviceIdx = (CBiosArguments.reg.ex.EBX & 0xf0000) >> 16; + +/* + if (bCurrentDeviceIdx == 0x1) // if LCD is active in disp1 + { + if ((wVESAModeHorSize > 1280) || (wVESAModeVerSize > 1024)) + { + return MODE_BAD; + } + } + else + { + if (mode->PrivFlags & LCD_TIMING) + { + return MODE_BAD; + } + } +*/ + if (mode->Flags & V_INTERLACE) + { + if (verbose) + { + xf86DrvMsgVerb(scrnIndex, X_PROBED, InfoLevel, + "==Removing interlaced mode \"%s\"\n==", mode->name); + } + xf86DrvMsgVerb(scrnIndex, X_INFO, ErrorLevel, "== RDCValidMode() Fail, Not Interlace Mode==\n"); + return MODE_NO_INTERLACE; + } + + if ((mode->HDisplay > 1680) || (mode->VDisplay > 1050)) + { + return MODE_BAD; + } + + if ((mode->HDisplay < 640) || (mode->VDisplay < 480)) + { + return MODE_BAD; + } + + if ((mode->HDisplay >= 1280) && + ((pScrn->bitsPerPixel > 16) || (mode->VRefresh > 62.0))) + { + return MODE_BAD; + } + + /* To Do */ + /* 1. Validate Mode by memory bandwidth */ + /* 2. If LCD enable, validate mode by panel size */ + /* 3. If TV enable, validate mode by TV type */ + Flags = RDCFilterModeByBandWidth(pScrn, mode); + + return Flags; +} + + +/* Internal used modules */ +/* + * RDCGetRec and RDCFreeRec -- + * + * Private data for the driver is stored in the screen structure. + * These two functions create and destroy that private data. + * + */ +static Bool +RDCGetRec(ScrnInfoPtr pScrn) +{ + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCGetRec()== \n"); + + if (pScrn->driverPrivate) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==RDCGetRec() driverPrivate is TRUE== return TRUE\n"); + return TRUE; + } + + pScrn->driverPrivate = xnfcalloc(sizeof(RDCRec), 1); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCGetRec()== return TRUE\n"); + return TRUE; +} + +static void +RDCFreeRec(ScrnInfoPtr pScrn) +{ + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCFreeRec()== \n"); + + if (!pScrn) + { + xf86DrvMsgVerb(0, X_INFO, ErrorLevel, "==RDCFreeRec() pScrn is NULL== \n"); + return; + } + + if (!pScrn->driverPrivate) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==RDCFreeRec() driverPrivate is FALSE== \n"); + return; + } + + xfree(pScrn->driverPrivate); + pScrn->driverPrivate = 0; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit3 RDCFreeRec()== \n"); +} + +static Bool +RDCSaveScreen(ScreenPtr pScreen, Bool unblack) +{ + Bool RetStatus; + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Enter RDCSaveScreen(unblack = %d)== \n", unblack); + /* more ref. SiS */ + RetStatus = vgaHWSaveScreen(pScreen, unblack); + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==Exit1 RDCSaveScreen()== return RetStatus\n"); + return RetStatus; +} + +static Bool +RDCCloseScreen(int scrnIndex, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + vgaHWPtr hwp = VGAHWPTR(pScrn); + RDCRecPtr pRDC = RDCPTR(pScrn); + Bool RetStatus; + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Enter RDCCloseScreen(); Screen Index = 0x%x == \n",scrnIndex); + + if (pScrn->vtSema == TRUE) + { +#ifdef HWC + pRDC->HWCInfoPtr->HideCursor(pScrn); +#endif + +#ifdef Accel_2D + vDisable2D(pScrn, pRDC); +#endif + + RDCRestore(pScrn); + vgaHWLock(hwp); + } + + RDCUnmapMem(pScrn); + RDCUnmapMMIO(pScrn); + RDCUnmapVBIOS(pScrn); + + vgaHWUnmapMem(pScrn); + + if(pRDC->AccelInfoPtr) + { + XAADestroyInfoRec(pRDC->AccelInfoPtr); + pRDC->AccelInfoPtr = NULL; + } + + if(pRDC->HWCInfoPtr) + { + xf86DestroyCursorInfoRec(pRDC->HWCInfoPtr); + pRDC->HWCInfoPtr = NULL; + } + + pScrn->vtSema = FALSE; + pScreen->CloseScreen = pRDC->CloseScreen; + RetStatus = (*pScreen->CloseScreen) (scrnIndex, pScreen); + + xf86DrvMsgVerb(scrnIndex, X_INFO, DefaultLevel, "==Exit1 RDCCloseScreen()== return(RetStatus=%X\n", RetStatus); + return RetStatus; +} + +static void +RDCSave(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC; + vgaRegPtr vgaReg; + RDCRegPtr RDCReg; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCSave()== \n"); + pRDC = RDCPTR(pScrn); + vgaReg = &VGAHWPTR(pScrn)->SavedReg; + RDCReg = &pRDC->SavedReg; + + /* do save */ + vgaHWSave(pScrn, vgaReg, VGA_SR_ALL); + + /* Ext. Save */ + vRDCOpenKey(pScrn); + + /* save PLL value */ + GetIndexReg(CRTC_PORT, 0xC0, RDCReg->ucPLLValue[0]); + GetIndexReg(CRTC_PORT, 0xC1, RDCReg->ucPLLValue[1]); + GetIndexReg(CRTC_PORT, 0xCF, RDCReg->ucPLLValue[2]); + + GetIndexReg(CRTC_PORT, 0xA3, RDCReg->ucCRA3); + GetIndexReg(SEQ_PORT, 0x58, RDCReg->ucSR58); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCSave()== \n"); +} + +static void +RDCRestore(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC; + vgaRegPtr vgaReg; + RDCRegPtr RDCReg; + + pRDC = RDCPTR(pScrn); + vgaReg = &VGAHWPTR(pScrn)->SavedReg; + RDCReg = &pRDC->SavedReg; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCRestore()== \n"); + + /* do restore */ + vgaHWProtect(pScrn, TRUE); + vgaHWRestore(pScrn, vgaReg, VGA_SR_ALL); + vgaHWProtect(pScrn, FALSE); + + /* Ext. restore */ + vRDCOpenKey(pScrn); + + /* restore PLL value */ + SetIndexReg(CRTC_PORT, 0xC0, RDCReg->ucPLLValue[0]); + SetIndexReg(CRTC_PORT, 0xC1, RDCReg->ucPLLValue[1]); + SetIndexReg(CRTC_PORT, 0xCF, RDCReg->ucPLLValue[2]); + + SetIndexRegMask(CRTC_PORT, 0xA3, ~0x20, RDCReg->ucCRA3 & 0x20); + + SetIndexRegMask(CRTC_PORT, 0xBB, 0xFF, 0); + + SetIndexReg(SEQ_PORT, 0x58, RDCReg->ucSR58); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit1 RDCRestore()== \n"); +} + +static void +RDCProbeDDC(ScrnInfoPtr pScrn, int index) +{ + vbeInfoPtr pVbe; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCProbeDDC()== \n"); + + if (xf86LoadSubModule(pScrn, "vbe")) + { + pVbe = VBEInit(NULL, index); + ConfiguredMonitor = vbeDoEDID(pVbe, NULL); + vbeFree(pVbe); + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCProbeDDC()== \n"); +} + +static xf86MonPtr +RDCDoDDC(ScrnInfoPtr pScrn, int index) +{ + vbeInfoPtr pVbe; + xf86MonPtr MonInfo = NULL; + RDCRecPtr pRDC = RDCPTR(pScrn); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCDoDDC()== \n"); + /* Honour Option "noDDC" */ + if (xf86ReturnOptValBool(pRDC->Options, OPTION_NO_DDC, FALSE)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit1 RDCDoDDC()== return(MonInfo)\n"); + return MonInfo; + } + + if (xf86LoadSubModule(pScrn, "vbe") && (pVbe = VBEInit(NULL, index))) + { + xf86LoaderReqSymLists(vbeSymbols, NULL); + MonInfo = vbeDoEDID(pVbe, NULL); + xf86PrintEDID(MonInfo); + xf86SetDDCproperties(pScrn, MonInfo); + vbeFree(pVbe); + } + else + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, + "this driver cannot do DDC without VBE\n"); + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit2 RDCDoDDC()== return (MonInfo)\n"); + return MonInfo; +} + +static void +vFillRDCModeInfo (ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter vFillRDCModeInfo()== \n"); + + pRDC = RDCPTR(pScrn); + + pRDC->VideoModeInfo.ScreenWidth = pScrn->virtualX; + pRDC->VideoModeInfo.ScreenHeight = pScrn->virtualY; + pRDC->VideoModeInfo.bitsPerPixel = pScrn->bitsPerPixel; + pRDC->VideoModeInfo.Bpp = (pScrn->bitsPerPixel + 1) / 8; + pRDC->VideoModeInfo.ScreenPitch = pScrn->displayWidth * pRDC->VideoModeInfo.Bpp; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit1 vFillRDCModeInfo()== \n"); +} + +static Bool +RDCModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + vgaHWPtr hwp; + RDCRecPtr pRDC; + CBIOS_Extension CBiosExtension; + CBIOS_ARGUMENTS CBiosArguments; + + hwp = VGAHWPTR(pScrn); + pRDC = RDCPTR(pScrn); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCModeInit()== \n"); + + CBiosExtension.pCBiosArguments = &CBiosArguments; + CBiosExtension.IOAddress = (USHORT)(pRDC->RelocateIO); + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = QueryDisplayPathInfo; + CInt10(&CBiosExtension); + if (((CBiosArguments.reg.ex.EBX >> 22) & 0xF) != 0x1) /* if not LCD */ + { + if (mode->PrivFlags & LCD_TIMING) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==RDCModeInit() Fail== LCD timing is not supported!!\n"); + return FALSE; + } + } + + + vgaHWUnlock(hwp); + + if (!vgaHWInit(pScrn, mode)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==RDCModeInit() vgaHWInit Fail== return FALSE\n"); + return FALSE; + } + + pScrn->vtSema = TRUE; + pRDC->ModePtr = mode; + + if (!RDCSetMode(pScrn, mode)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==RDCModeInit() RDCSetMode Fail== return FALSE\n"); + return FALSE; + } + + /* update display path info */ + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = QueryDisplayPathInfo; + CInt10(&CBiosExtension); + if (CBiosArguments.reg.x.AX == VBEFunctionCallSuccessful) + { + pRDC->DeviceInfo.ucDeviceID = (CBiosArguments.reg.ex.EBX & 0x000F0000) >> 16; + pRDC->DeviceInfo.ucDisplayPath = 1; + pRDC->DeviceInfo.ScalerConfig.EnableHorScaler = ((CBiosArguments.reg.ex.EBX & 0x00200000) ? true : false); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "H scaler enable = %d\n", pRDC->DeviceInfo.ScalerConfig.EnableHorScaler); + pRDC->DeviceInfo.ScalerConfig.EnableVerScaler = ((CBiosArguments.reg.ex.EBX & 0x00100000) ? true : false); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "V scaler enable = %d\n", pRDC->DeviceInfo.ScalerConfig.EnableVerScaler); + } + else + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_ERROR, ErrorLevel, "Query Display Path Info Fail(%04X)\n", CBiosArguments.reg.x.AX); + } + + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = QueryLCDPanelSizeMode; + CBiosArguments.reg.lh.CL = 0; + CInt10(&CBiosExtension); + if (CBiosArguments.reg.x.AX == VBEFunctionCallSuccessful) + { + pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution = CBiosArguments.reg.x.DX; + pRDC->DeviceInfo.ScalerConfig.ulHorScalingFactor = (pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution << 12) / mode->HDisplay; + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "LCD H Size = %d\n", pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "Mode H Size = %d\n", mode->HDisplay); + + pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution = CBiosArguments.reg.ex.EDX >> 16; + pRDC->DeviceInfo.ScalerConfig.ulVerScalingFactor = (pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution << 11) / mode->VDisplay; + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "LCD V Size = %d\n", pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "Mode V Size = %d\n", mode->VDisplay); + } + else + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_ERROR, ErrorLevel, "Query LCD Panel Size Fail(%04X)\n", CBiosArguments.reg.x.AX); + } + + /* reset screen offset */ + pRDC->HWCInfo.iScreenOffset_x = 0; + pRDC->HWCInfo.iScreenOffset_y = 0; + RDCAdjustFrame(pScrn->scrnIndex, 0, 0, 0); + + vgaHWProtect(pScrn, FALSE); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCModeInit()== return TRUE\n"); + return TRUE; +} + +static void RDCSetHWCaps(RDCRecPtr pRDC) +{ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCSetHWCaps() Entry==\n"); + + switch(DEVICE_ID(pRDC->PciInfo)) + { + case PCI_CHIP_M2010_A0: + break; + case PCI_CHIP_M2010: + pRDC->ENGCaps |= ENG_CAP_VIDEO_DISP; + pRDC->ENGCaps |= ENG_CAP_HWC_MMIO; + break; + case PCI_CHIP_M2011: + break; + default: + break; + } + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCSetHWCaps() Exit Caps = 0x%x==\n",pRDC->ENGCaps); +} diff --git a/src/rdc_extension.c b/src/rdc_extension.c new file mode 100644 index 0000000..cba9c61 --- /dev/null +++ b/src/rdc_extension.c @@ -0,0 +1,575 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +/* + * I N C L U D E S + */ +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/ipc.h> +#include <sys/shm.h> + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" + +/* Driver specific headers */ +#include "rdc.h" + +#include "X11/Xproto.h" /* For Xextension */ +#include "extnsionst.h" /* For Xextension */ +#include "dixstruct.h" /* For Xextension */ + +#include "rdc_extension.h" + +//#include <sys/ipc.h> +//#include <sys/shm.h> + +CARD32 *inBufPtr, *outBufPtr ; /* For share memory use */ + +/* Record screen number. */ +int g_ScreenNumber; + + +/* + Query the RDCGFX_API version. +*/ +static int ProcRDCGFXQueryVersion (ClientPtr client) +{ + xRDCGFXQueryVersionReply rep; + register int n; + + REQUEST_SIZE_MATCH(xRDCGFXQueryVersionReply); + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.majorVersion = 2; + rep.minorVersion = 0; + + if(client->swapped) + { + swaps(&rep.sequenceNumber, n); + swapl(&rep.length, n); + swaps(&rep.majorVersion, n); + swaps(&rep.minorVersion, n); + } + + WriteToClient(client, sizeof(xRDCGFXQueryVersionReply), (char *)&rep); + return (client->noClientException); +} + + +/* + Receive and process the request from AP. +*/ +static int ProcRDCGFXCommand(ClientPtr client) +{ + xRDCGFXCommandReq *req = (xRDCGFXCommandReq*)client->requestBuffer; register int n; + int i, ret; + + REQUEST_SIZE_MATCH(*req); + /*if ((SIZEOF(xRDCGFXCommandReq) >> 2) != req->length) { \ + int lengthword = req->length; \ + SendErrToClient(client, FSBadLength, (pointer)&lengthword); \ + return (FSBadLength); \ + }*/ + + /* Get pointer to ExtensionEntry */ + if(!CheckExtension(RDC_GFX_UT_EXTENSION_NAME)) return BadMatch; + + /* Process the request. */ + RDCGFXUtilityProc(req); + + //req->reqType = X_Reply; + //req->length = (CARD16)(sizeof(xRDCGFXCommandReq) - sizeof(xGenericReply)) >> 2; + xGenericReply *reply = client->requestBuffer; + reply->type = X_Reply; + reply->length = 0; +#if 0 + if(client->swapped) + { + swapl(&req->length, n); + swapl(&req->util_cmd_id, n); + swapl(&req->result_header, n); + + for(i = 0; i < req->outBufferSize; i++) + { + swapl(&req->outBuffer[i], n); + } + } +#endif + //WriteToClient(client, sizeof(xRDCGFXCommandReq), (char *)req); + WriteToClient(client, sizeof(xGenericReply), (char *)reply); + return client->noClientException; +} + +static void RDCGFXResetProc(ExtensionEntry* extEntry) +{ +} + +static int ProcRDCGFXDispatch(ClientPtr client) +{ + REQUEST(xReq); + switch(stuff->data) + { + case X_RDCGFXQueryVersion: + return ProcRDCGFXQueryVersion(client); + case X_RDCGFXCommand: + return ProcRDCGFXCommand(client); + } + + return BadRequest; +} + +void RDCDisplayExtensionInit(ScrnInfoPtr pScrn) +{ + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "==Enter RDCDisplayExtensionInit()== \n"); + + // init share memory + int shm_in_id, shm_out_id ; + key_t in_key, out_key ; + char inBufName[32] = "/RDC/GFX/shm/inBuf" ; + char outBufName[32] = "/RDC/GFX/shm/outBuf" ; + + in_key = ftok(inBufName, 4) ; + out_key = ftok(outBufName, 4) ; + shm_in_id = shmget(in_key, 4096, IPC_CREAT) ; + shm_out_id = shmget(out_key, 4096, IPC_CREAT) ; + inBufPtr = (CARD32 *) shmat(shm_in_id, NULL, 0) ; + outBufPtr = (CARD32 *) shmat(shm_out_id, NULL, 0) ; + + if(NULL == CheckExtension(RDC_GFX_UT_EXTENSION_NAME)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 6, "== check point 1== \n"); + /* if extension doesn't exist, add it */ + if (!AddExtension(RDC_GFX_UT_EXTENSION_NAME, 0, 0, + ProcRDCGFXDispatch, + ProcRDCGFXDispatch, + RDCGFXResetProc, + StandardMinorOpcode)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to add RDCGFX extension\n"); + return; + } + } + else + { + /* else if extension exists */ + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "error: RDC GFX Extension Exists!\n"); + } + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "==Exit RDCDisplayExtensionInit()== \n"); +} + +int RDCGFXUtilityProc(xRDCGFXCommandReq* req) +{ + ScrnInfoPtr pScrn = xf86Screens[g_ScreenNumber]; + RDCRecPtr pRDC = RDCPTR(pScrn); + + CBIOS_Extension CBIOSExtension; + CBIOS_ARGUMENTS CBiosArguments; + + CBIOSExtension.pCBiosArguments = &CBiosArguments; + CBIOSExtension.IOAddress = (USHORT)(pRDC->RelocateIO) ; + CBIOSExtension.VideoVirtualAddress = (ULONG)(pRDC->FBVirtualAddr); + /* + STChen[2006.7.11]: In SAMM case, a driver controls a screen. + In the past, we have to move application's window to switch to correct driver. + So I add following step to detect which driver we should use to avoid this problem. + + if (pRDC->pBIOSInfo->SAMM) + { + pScrn = RDCScreenSelection(pScrn, rep->primary_id, rep->secondary_id); + pRDC = RDCPTR(pScrn); + } + */ + + ULONG ulResult; + + switch(req->util_cmd_id) + { + // + // Output devices function group + // + case UT_QUERY_SUPPORT_DEVICE: /* done */ + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "DrvEscape: Query Device Support"); + + if (req->outBufferSize != sizeof(ULONG)) + return UT_FAIL; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = QueryBiosInfo; + if (CInt10(&CBIOSExtension)) + { + ((UTDEVICELIST *) outBufPtr)->MERGE = (USHORT)CBiosArguments.reg.x.SI; + return (UT_SUCCESS); + } + else + { + return(UT_FAIL); + } + break; + + case UT_QUERY_CONNECT_DEVICE: /* done */ + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "DrvEscape: Query Device Connect"); + + if (req->outBufferSize != sizeof(ULONG)) + return UT_FAIL; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = QueryDeviceConnectStatus; + if (CInt10(&CBIOSExtension)) + { + ((UTDEVICELIST *) outBufPtr)->MERGE = (USHORT)CBiosArguments.reg.x.BX; + return (UT_SUCCESS); + } + else + { + return(UT_FAIL); + } + break; + + case UT_SET_DEVICE_ACT: + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "DrvEscape: Set Active Device"); + + if (req->inBufferSize != sizeof(UTDEVICELIST)) + return UT_FAIL; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = SetActiveDisplayDevice; + + switch (inBufPtr[0] & 0xFFFF) + { + case 0x04: /* B_CRT */ + CBiosArguments.reg.lh.CL = 3; /* CRT_ID */ + break; + case 0x01: /* B_LCD */ + CBiosArguments.reg.lh.CL = 1; /* LCD_ID */ + break; + case 0x02: /* B_DVI */ + CBiosArguments.reg.lh.CL = 2; /* DVI_ID */ + break; + case 0x20: /* B_TV */ + CBiosArguments.reg.lh.CL = 6; /* TV_ID */ + break; + default: + CBiosArguments.reg.lh.CL = 0; + break; + } + + if (CInt10(&CBIOSExtension)) + { + return(UT_SUCCESS | UT_MODESET); + } + else + { + return(UT_FAIL); + } + break; + + case UT_QUERY_ACT_DEVICE: + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "DrvEscape: Query active device"); + + if (req->outBufferSize != sizeof(UCHAR) * 2) + return UT_FAIL; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = QueryDisplayPathInfo; + if (CInt10(&CBIOSExtension)) + { + outBufPtr[0] = 0; + switch ((CBiosArguments.reg.ex.EBX & 0x000F0000) >> 16) + { + case 3: /* CRT_ID */ + outBufPtr[0] |= 0x0004; /* B_CRT */ + break; + case 1: /* LCD_ID */ + outBufPtr[0] |= 0x0001; /* B_LCD */ + break; + case 2: /* DVI_ID */ + outBufPtr[0] |= 0x0002; /* B_DVI */ + break; + case 6: /* TV_ID */ + outBufPtr[0] |= 0x0020; /* B_TV */ + break; + default: + break; + } + switch ((CBiosArguments.reg.ex.ECX & 0x000F0000) >> 16) + { + case 3: /* CRT_ID */ + outBufPtr[0] |= 0x0004; /* B_CRT */ + break; + case 1: /* LCD_ID */ + outBufPtr[0] |= 0x0001; /* B_LCD */ + break; + case 2: /* DVI_ID */ + outBufPtr[0] |= 0x0002; /* B_DVI */ + break; + case 6: /* TV_ID */ + outBufPtr[0] |= 0x0020; /* B_TV */ + break; + default: + break; + } + + return (UT_SUCCESS); + } + else + { + return (UT_NOT_IMPLEMENT); + } + break; + + /* Query hardware info function group */ + case UT_QUERY_HW_INFO: + if (req->outBufferSize != sizeof(UTHWINFO)) + return UT_FAIL; + { + UTHWINFO *pUTHWInfo = (UTHWINFO*)outBufPtr; + pUTHWInfo->ulVenderID = (ULONG)VENDOR_ID(pRDC->PciInfo); + pUTHWInfo->ulDeviceID = (ULONG)DEVICE_ID(pRDC->PciInfo); + pUTHWInfo->ulSubSystemID = (ULONG)SUBSYS_ID(pRDC->PciInfo); + pUTHWInfo->ulSubVenderID = (ULONG)SUBVENDOR_ID(pRDC->PciInfo); + pUTHWInfo->ulRevision = (ULONG)CHIP_REVISION(pRDC->PciInfo); + return (UT_SUCCESS); + break; + } + case UT_QUERY_BIOS_VERSION: + if (req->outBufferSize != sizeof(ULONG)) + return UT_FAIL; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = QueryBiosInfo; + if (CInt10(&CBIOSExtension)) + { + outBufPtr[0] = CBiosArguments.reg.ex.EBX; + return(UT_SUCCESS); + } + else + { + return (UT_NOT_IMPLEMENT); + } + break; + + case UT_QUERY_MEM_INFO: + if (req->outBufferSize != sizeof(ULONG)) + return UT_FAIL; + + outBufPtr[0] = pRDC->FbMapSize; + return(UT_SUCCESS); + break; + + case UT_QUERY_CLK_SPEED: + if (req->outBufferSize != sizeof(CLKINFO)) + return UT_FAIL; + { + CLKINFO *pCLKInfo = (CLKINFO*)outBufPtr; + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = QueryBiosInfo; + if (CInt10(&CBIOSExtension)) + { + ULONG ulMCLK; + switch (CBiosArguments.reg.x.CX & 0x000F) + { + case 0: + ulMCLK = 266; + break; + case 1: + ulMCLK = 333; + break; + case 2: + ulMCLK = 400; + break; + case 3: + ulMCLK = 533; + break; + } + pCLKInfo->EngCLK = pCLKInfo->MemCLK = ulMCLK; + return(UT_SUCCESS); + } + else + { + return (UT_NOT_IMPLEMENT); + } + } + break; +#if 0 +/* + case UT_QUERY_SAMM: + { + if (cjOut != sizeof(ULONG)) + return UT_INVALID; + + *(ULONG*)pvOut = ppdev->pMultiMon->bEnableSAMMMode; + + return (UT_SUCCESS); + } + break; + case UT_SET_GAMMA: + { + if ((cjIn != sizeof(GammaTbl)) || + (((pGammaTbl)pvIn)->dwSize != MAX_CLUT_SIZE)) + return UT_INVALID; + + if (!EngDeviceIoControl(ppdev->hDriver, + IOCTL_VIDEO_SET_COLOR_REGISTERS, + ((pGammaTbl)pvIn)->pClut, + ((pGammaTbl)pvIn)->dwSize, + NULL, + 0, + &ulResult)) + { + return UT_SUCCESS; + } + else + return UT_FAIL; + } + break; + case UT_QUERY_GAMMA: + { + if ((cjOut != sizeof(GammaTbl)) || + (((pGammaTbl)pvIn)->dwSize != MAX_CLUT_SIZE)) + return UT_INVALID; + + // + // Get Gamma value from Look up table + // + if (*(ULONG*)pvIn & CRT) + QueryRegistryValue(ppdev, CRTGamma, ((pGammaTbl)pvOut)->pClut, MAX_CLUT_SIZE); + else if (*(ULONG*)pvIn & LCD) + QueryRegistryValue(ppdev, LCDGamma, ((pGammaTbl)pvOut)->pClut, MAX_CLUT_SIZE); + + return UT_SUCCESS; + } + break; +*/ +#endif + case UT_SET_LCD_PWM: + if (req->inBufferSize != sizeof(UCHAR)) + return UT_FAIL; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = SetLCDPWMLevel; + CBiosArguments.reg.lh.CL = *(UCHAR*)req->inBuffer; + if (CInt10(&CBIOSExtension)) + { + return(UT_SUCCESS); + } + break; + + case UT_QUERY_LCD_PWM: + if (req->outBufferSize != sizeof(UCHAR)) + return UT_FAIL; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = QueryLCDPWMLevel; + if (CInt10(&CBIOSExtension)) + { + *(UCHAR*)req->outBuffer = CBiosArguments.reg.lh.BL; + return(UT_SUCCESS); + } + break; + + case UT_QUERY_LCD_SIZE: + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "DrvEscape: Query LCD Size"); + + if (req->outBufferSize != sizeof(LCDINFO)) + return UT_FAIL; + + // If color depth is 32 bpp, set it to 24. + int iDepth = pScrn->depth; + if (iDepth == 32) // 24 and 32 bpp should have same index 2. + iDepth = 24; + + CBiosArguments.reg.x.AX = OEMFunction; + CBiosArguments.reg.x.BX = QueryLCDPanelSizeMode; + CBiosArguments.reg.lh.CL = (iDepth/8) - 1; // Color depth : 0(8 bpp), 1(16 bpp), 2(24/32 bpp) + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "Color depth is %d\n", CBiosArguments.reg.lh.CL); + if (CInt10(&CBIOSExtension)) + { + PLCDINFO pLcdPanelSize; + pLcdPanelSize = (PLCDINFO) outBufPtr; + pLcdPanelSize->wLCDWidth = CBiosArguments.reg.ex.EDX & 0x0000FFFF; + pLcdPanelSize->wLCDHeight = CBiosArguments.reg.ex.EDX >> 16; + return(UT_SUCCESS); + } + break; +#if 0 +/* + case UT_DECODER_JPEG_ENTRY: + { + DBG_GDI((0, "DrvEscape: UT_DECODER_JPEG_ENTRY")); + ulResult = ExtJpegDecoderEntry(pso, cjIn, pvIn, cjOut, pvOut); + return ulResult; + } + break; + case UT_ENCODER_JPEG_ENTRY: + { + DBG_GDI((0, "DrvEscape: UT_ENCODER_JPEG_ENTRY")); + ulResult = ExtJpegEncoderEntry(pso, cjIn, pvIn, cjOut, pvOut); + return ulResult; + } + break; + case UT_GET_USERMODE_DIRECTACCESS: + { + DBG_GDI((0, "DrvEscape: UT_GET_USERMODE_DIRECTACCESS")) ; + ulResult = ExtUserModeDirectAccess(pso, cjIn, pvIn, cjOut, pvOut) ; + return ulResult ; + } + break ; +*/ +#endif + default: + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 4, "RDCGFXUtilityProc: unknown command 0x%x", req->util_cmd_id); + break; + } + + return UT_INVALID; +} + + diff --git a/src/rdc_extension.h b/src/rdc_extension.h new file mode 100644 index 0000000..81144ee --- /dev/null +++ b/src/rdc_extension.h @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +/******************************************************************************/ +/* */ +/* Escape function definite */ +/* */ +/******************************************************************************/ + +// user defined type. +typedef unsigned short WORD; +typedef unsigned long DWORD; + +// Escape return value +#define UT_FAIL 0x0000 +#define UT_SUCCESS 0x0001 +#define UT_MODESET 0x0002 +#define UT_INVALID 0x1FFF +#define UT_NOT_IMPLEMENT 0xFFFF + +// Escape function define +#define UT_QUERY_SUPPORT_DEVICE 0x1001 +#define UT_QUERY_CONNECT_DEVICE 0x1002 +#define UT_SET_DEVICE_ACT 0x1003 +#define UT_QUERY_PRIMARY_DEVICE 0x1004 +#define UT_SET_PRIMARY_DEVICE 0x1005 +#define UT_QUERY_ACT_DEVICE 0x1006 + +#define UT_QUERY_HW_INFO 0x1201 +#define UT_QUERY_BIOS_VERSION 0x1202 +#define UT_QUERY_MEM_INFO 0x1203 +#define UT_QUERY_CLK_SPEED 0x1204 +#define UT_QUERY_SAMM 0x1205 + +#define UT_SET_GAMMA 0x1101 +#define UT_QUERY_GAMMA 0x1102 + +#define UT_SET_LCD_PWM 0x1103 +#define UT_QUERY_LCD_PWM 0x1104 +#define UT_QUERY_LCD_SIZE 0X1105 + + +// Escape jpeg decoder function define +#define UT_DECODER_JPEG_ENTRY 0x2001 + +// Escape jpeg eecoder function define +#define UT_ENCODER_JPEG_ENTRY 0x2101 + +#define UT_GET_USERMODE_DIRECTACCESS 0x2200 + +/* For display Xextension */ +#define RDC_GFX_UT_EXTENSION_NAME "RDCGFX_API" + +#define RDCGFX_PARM_NUM 256 + +#define X_RDCGFXQueryVersion 0 +#define X_RDCGFXCommand 1 + +typedef struct { + BYTE type; /* X_Reply */ + BOOL pad1; + CARD16 sequenceNumber B16; + CARD32 length B32; + CARD16 majorVersion B16; + CARD16 minorVersion B16; + CARD32 pad2 B32; + CARD32 pad3 B32; + CARD32 pad4 B32; + CARD32 pad5 B32; + CARD32 pad6 B32; +} xRDCGFXQueryVersionReply; + +typedef struct { + CARD8 reqType; + CARD8 RDCGFXReqType; + CARD16 length B16; + CARD32 util_cmd_id; + CARD32 *inBuffer; + CARD32 inBufferSize; + CARD32 *outBuffer; + CARD32 outBufferSize; + CARD32 result_header; + CARD32 pad; +} xRDCGFXCommandReq; + +/*============ Request and Reply Structures Definition==================*/ +typedef union +{ + struct + { + WORD LCD ; + WORD DVI ; + WORD CRT ; + WORD HDMI ; + WORD HDTV ; + WORD TV ; + WORD LCD2 ; + WORD DVI2 ; + WORD CRT2 ; + WORD HDMI2 ; + WORD HDTV2 ; + WORD TV2 ; + WORD RESERVE ; + } TABLE ; + WORD MERGE ; +} UTDEVICELIST; + +typedef struct _UTHWINFO +{ + ULONG ulVenderID; + ULONG ulDeviceID; + ULONG ulSubSystemID; + ULONG ulSubVenderID; + ULONG ulRevision; +}UTHWINFO; + +typedef struct _UTBIOSDATA + { + ULONG wData1; + ULONG wData2; + ULONG wData3; + ULONG wDate; +}UTBIOSDATA; + +typedef struct _CLKINFO +{ + ULONG MemCLK; /*(The unit is MHz)*/ + ULONG EngCLK; /*(The unit is MHz)*/ +}CLKINFO; + +typedef struct _VIDEO_CLUTDATA +{ + UCHAR Red; + UCHAR Green; + UCHAR Blue; + UCHAR Unused; +} VIDEO_CLUTDATA, *PVIDEO_CLUTDATA; + +typedef struct +{ + USHORT NumEntries ; // total 256 entries + USHORT FirstEntry ; // start from 0 + union + { + VIDEO_CLUTDATA RgbArray ; + ULONG RgbLong ; + } LookupTable[1] ; +} VIDEO_CLUT, *PVIDEO_CLUT ; + +typedef struct +{ + DWORD device ; // the device + DWORD dwSize; // the size of gamma tbl + PVIDEO_CLUT table ; // the table +} GammaTbl, *pGammaTbl ; + +// LCD info structure. +typedef struct _LCDINFO +{ + WORD wLCDHeight; + WORD wLCDWidth; +} LCDINFO, *PLCDINFO; + diff --git a/src/rdc_mode.c b/src/rdc_mode.c new file mode 100644 index 0000000..7834e68 --- /dev/null +++ b/src/rdc_mode.c @@ -0,0 +1,483 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" + +/* Driver specific headers */ +#include "rdc.h" + +RRateInfo RefreshRateMap[] = { {60.0f, FALSE, 0}, + {50.0f, TRUE, 1}, + {50.0f, FALSE, 3}, + {56.0f, FALSE, 4}, + {24.0f, FALSE, 6}, + {70.0f, FALSE, 7}, + {75.0f, FALSE, 8}, + {80.0f, FALSE, 9}, + {85.0f, FALSE, 10}, + {90.0f, FALSE, 11}, + {100.0f, FALSE, 12}, + {120.0f, FALSE, 13}, + {72.0f, FALSE, 14}, + {65.0f, FALSE, 15}}; + + +/* extern. function */ +extern void vRDCOpenKey(ScrnInfoPtr pScrn); +extern Bool bRDCRegInit(ScrnInfoPtr pScrn); + +#ifdef Accel_2D +extern Bool bEnable2D(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +#endif +#ifdef HWC +extern Bool bInitHWC(ScrnInfoPtr pScrn, RDCRecPtr pRDC); +#endif + +/* Prototype type declaration*/ +Bool RDCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); +USHORT usGetVbeModeNum(ScrnInfoPtr pScrn, DisplayModePtr mode); +float fDifference(float Value1, float Value2); +DisplayModePtr RDCBuildModePool(ScrnInfoPtr pScrn); +Bool BTranslateIndexToRefreshRate(UCHAR ucRRateIndex, float *fRefreshRate); +char* pcConvertResolutionToString(ULONG ulResolution); +DisplayModePtr SearchDisplayModeRecPtr(DisplayModePtr pModePoolHead, CBIOS_ARGUMENTS CBiosArguments); + + +Bool +RDCSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + RDCRecPtr pRDC; + MODE_PRIVATE *pModePrivate; + CBIOS_ARGUMENTS CBiosArguments; + CBIOS_Extension CBiosExtension; + USHORT usVESAMode; + + pRDC = RDCPTR(pScrn); + pModePrivate = MODE_PRIVATE_PTR(mode); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "==Enter RDCSetMode()== \n"); + + vRDCOpenKey(pScrn); + bRDCRegInit(pScrn); + + CBiosExtension.pCBiosArguments = &CBiosArguments; + CBiosExtension.IOAddress = (USHORT)(pRDC->RelocateIO); + CBiosExtension.VideoVirtualAddress = (ULONG)(pRDC->FBVirtualAddr); + + /*CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = SetActiveDisplayDevice; + CBiosArguments.reg.lh.CL = 0x13; + CInt10(&CBiosExtension);*/ + + /*xf86DrvMsg(pScrn->scrnIndex, X_INFO, "==RDCSetMode() Set Refresh Rate = %f== \n",mode->VRefresh);*/ + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = SetDisplay1RefreshRate; + CBiosArguments.reg.lh.CL = pModePrivate->ucRRate_ID; + CInt10(&CBiosExtension); + + usVESAMode = usGetVbeModeNum(pScrn, mode); + /*xf86DrvMsg(pScrn->scrnIndex, X_INFO, "==RDCSetMode() Set VESA Mode 0x%x== \n",uVESAMode);*/ + CBiosArguments.reg.x.AX = VBESetMode; + CBiosArguments.reg.x.BX = (0x4000 | usVESAMode); + CInt10(&CBiosExtension); + + /*xf86DrvMsg(pScrn->scrnIndex, X_INFO, "==RDCSetMode() Set Scan Line pixels== \n");*/ + CBiosArguments.reg.x.AX = VBESetGetScanLineLength; + CBiosArguments.reg.lh.BL = 0x00; + CBiosArguments.reg.x.CX = (USHORT)(pScrn->displayWidth); + CInt10(&CBiosExtension); + + /* + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = SetVESAModeForDisplay2; + CBiosArguments.reg.x.CX = (0x4000 | usVESAMode); + CInt10(&CBiosExtension); + + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = SetDisplay2PitchInPixels; + CBiosArguments.reg.x.CX = (USHORT)(pScrn->displayWidth); + CInt10(&CBiosExtension); + */ + /* post set mode */ + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 7, "==RDCSetMode() Enable 2D== \n"); +#ifdef Accel_2D + if (!pRDC->noAccel) + { + if (!bEnable2D(pScrn, pRDC)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Enable 2D failed\n"); + pRDC->noAccel = TRUE; + } + } +#endif + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 7, "==RDCSetMode() Enable Cursor== \n"); +#ifdef HWC + if (!pRDC->noHWC) + { + if (!bInitHWC(pScrn, pRDC)) + { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Init HWC failed\n"); + pRDC->noHWC = TRUE; + } + } +#endif + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InternalLevel, "==Exit RDCSetMode(), return true== \n"); + return (TRUE); +} + +USHORT usGetVbeModeNum(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + RDCRecPtr pRDC; + MODE_PRIVATE *pModePrivate; + USHORT usVESAModeNum; + UCHAR ucColorDepth = (UCHAR)(pScrn->bitsPerPixel); + + pRDC = RDCPTR(pScrn); + pModePrivate = MODE_PRIVATE_PTR(mode); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter usGetVbeModeNum()== \n"); + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "==Display Width=0x%x, Height=0x%x, Color Depth=0x%x==\n", + mode->HDisplay,mode->VDisplay,pScrn->bitsPerPixel); + + + switch (ucColorDepth) + { + case 8: + usVESAModeNum = pModePrivate->Mode_ID_8bpp; + break; + + case 16: + usVESAModeNum = pModePrivate->Mode_ID_16bpp; + break; + + case 32: + usVESAModeNum = pModePrivate->Mode_ID_32bpp; + break; + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit usGetVbeModeNum() return VESA Mode = 0x%x==\n", usVESAModeNum); + return usVESAModeNum; + +} + +DisplayModePtr RDCBuildModePool(ScrnInfoPtr pScrn) +{ + DisplayModePtr pMode = NULL, pModePoolHead = NULL, pModePoolTail = NULL; + + CBIOS_ARGUMENTS CBiosArguments; + CBIOS_Extension CBiosExtension; + RDCRecPtr pRDC = RDCPTR(pScrn); + MODE_PRIVATE *pModePrivate; + USHORT usSerialNum = 0; + BYTE bCurrentDeviceIdx; + USHORT wLCDHorSize, wLCDVerSize; + USHORT wVESAModeHorSize, wVESAModeVerSize; + BYTE bColorDepth; //0: 8bpp, 1: 16bpp, 2: 32bpp + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Enter RDCBuildModePool()== \n"); + + CBiosExtension.pCBiosArguments = &CBiosArguments; + CBiosExtension.IOAddress = (USHORT)(pRDC->RelocateIO); + CBiosExtension.VideoVirtualAddress = (ULONG)(pRDC->FBVirtualAddr); + + do { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "Mode serial Num 0x%x\n",usSerialNum); + + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = QuerySupportedMode; + CBiosArguments.reg.x.CX = usSerialNum++; + CInt10(&CBiosExtension); + + wVESAModeHorSize = (USHORT)(CBiosArguments.reg.ex.EDX & 0x0000FFFF); + wVESAModeVerSize = (USHORT)(CBiosArguments.reg.ex.EDX >> 16); + + + if (CBiosArguments.reg.x.AX == VBEFunctionCallSuccessful) + { + pMode = SearchDisplayModeRecPtr(pModePoolHead, CBiosArguments); + + if (pMode == NULL) + { + if (pModePoolHead != NULL) + { + pModePoolTail->next = xnfalloc(sizeof(DisplayModeRec)); + pModePoolTail->next->prev = pModePoolTail; + pModePoolTail = pModePoolTail->next; + } + else + { + pModePoolHead = xnfalloc(sizeof(DisplayModeRec)); + pModePoolHead->prev = NULL; + pModePoolTail = pModePoolHead; + } + /* pModePoolTail points to the last mode */ + pModePoolTail->next = NULL; + + pModePoolTail->name = pcConvertResolutionToString(CBiosArguments.reg.ex.EDX); + + pModePoolTail->status = MODE_OK; + pModePoolTail->type = M_T_BUILTIN; + pModePoolTail->Flags = 0; + + /* allocate memory to pModePoolTail->Private */ + pModePoolTail->PrivSize = sizeof(MODE_PRIVATE); + pModePoolTail->Private = xnfalloc(pModePoolTail->PrivSize); + pModePrivate = MODE_PRIVATE_PTR(pModePoolTail); + + /* required timing parameters */ + pModePoolTail->Clock = pModePoolTail->SynthClock = CBiosArguments.reg.ex.EDI; + pModePoolTail->HDisplay = pModePoolTail->CrtcHDisplay = wVESAModeHorSize; + pModePoolTail->VDisplay = pModePoolTail->CrtcVDisplay = wVESAModeVerSize; + BTranslateIndexToRefreshRate(CBiosArguments.reg.lh.CH, &(pModePoolTail->VRefresh)); + + pModePoolTail->PrivFlags = (int)CBiosArguments.reg.x.SI; + pModePrivate->ucRRate_ID = CBiosArguments.reg.lh.CH; + } + else + { + pModePrivate = MODE_PRIVATE_PTR(pMode); + } + + switch (CBiosArguments.reg.lh.CL) + { + case 8: + pModePrivate->Mode_ID_8bpp = CBiosArguments.reg.x.BX; + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "pModePrivate->Mode_ID_8bpp = 0x%x\n",pModePrivate->Mode_ID_8bpp); + break; + case 16: + pModePrivate->Mode_ID_16bpp = CBiosArguments.reg.x.BX; + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "pModePrivate->Mode_ID_16bpp = 0x%x\n",pModePrivate->Mode_ID_16bpp); + break; + case 32: + pModePrivate->Mode_ID_32bpp = CBiosArguments.reg.x.BX; + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 5, "pModePrivate->Mode_ID_32bpp = 0x%x\n",pModePrivate->Mode_ID_32bpp); + break; + } + } + } while (CBiosArguments.reg.x.AX == VBEFunctionCallSuccessful); + + // query LCD panel modes + for (bColorDepth = 0; bColorDepth < 3; bColorDepth++) + { + CBiosArguments.reg.x.AX = 0x4f14; + CBiosArguments.reg.x.BX = QueryLCDPanelSizeMode; + CBiosArguments.reg.x.CX = bColorDepth; + CInt10(&CBiosExtension); + + if (CBiosArguments.reg.x.AX == VBEFunctionCallSuccessful) + { + pMode = SearchDisplayModeRecPtr(pModePoolHead, CBiosArguments); + + if (pMode == NULL) + { + if (pModePoolHead != NULL) + { + pModePoolTail->next = xnfalloc(sizeof(DisplayModeRec)); + pModePoolTail->next->prev = pModePoolTail; + pModePoolTail = pModePoolTail->next; + } + else + { + pModePoolHead = xnfalloc(sizeof(DisplayModeRec)); + pModePoolHead->prev = NULL; + pModePoolTail = pModePoolHead; + } + /* pModePoolTail points to the last mode */ + pModePoolTail->next = NULL; + + pModePoolTail->name = pcConvertResolutionToString(CBiosArguments.reg.ex.EDX); + + pModePoolTail->status = MODE_OK; + pModePoolTail->type = M_T_BUILTIN; + pModePoolTail->Flags = 0; + + /* allocate memory to pModePoolTail->Private */ + pModePoolTail->PrivSize = sizeof(MODE_PRIVATE); + pModePoolTail->Private = xnfalloc(pModePoolTail->PrivSize); + pModePrivate = MODE_PRIVATE_PTR(pModePoolTail); + + /* required timing parameters */ + pModePoolTail->Clock = pModePoolTail->SynthClock = CBiosArguments.reg.ex.EDI; + pModePoolTail->HDisplay = pModePoolTail->CrtcHDisplay = (CBiosArguments.reg.ex.EDX & 0x0000FFFF); + pModePoolTail->VDisplay = pModePoolTail->CrtcVDisplay = (CBiosArguments.reg.ex.EDX >> 16); + BTranslateIndexToRefreshRate(CBiosArguments.reg.lh.CH, &(pModePoolTail->VRefresh)); + + pModePoolTail->PrivFlags = (int)CBiosArguments.reg.x.SI | LCD_TIMING; + pModePrivate->ucRRate_ID = CBiosArguments.reg.lh.CH; + } + else + { + pModePrivate = MODE_PRIVATE_PTR(pMode); + } + + switch (CBiosArguments.reg.lh.CL) + { + case 8: + pModePrivate->Mode_ID_8bpp = CBiosArguments.reg.x.BX; + break; + case 16: + pModePrivate->Mode_ID_16bpp = CBiosArguments.reg.x.BX; + break; + case 32: + pModePrivate->Mode_ID_32bpp = CBiosArguments.reg.x.BX; + break; + } + + } + } + + /* To Do */ + /* Get Mode Support from VGA Bios, if platform has VGA Bios */ + /* Compare Bios mode and driver mode. */ + /* If they have the same mode information, replace driver mode with Bios mode*/ + /* If Bios has new mode, add it to mode pool*/ + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, DefaultLevel, "==Exit RDCBuildModePool()== pModePoolHead = 0x%x\n", pModePoolHead); + return pModePoolHead; +} + +Bool BTranslateIndexToRefreshRate(UCHAR ucRRateIndex, float *fRefreshRate) +{ + int i; + + for (i = 0; i < sizeof(RefreshRateMap)/sizeof(RRateInfo); i++) + { + if (RefreshRateMap[i].ucRRateIndex == ucRRateIndex) + { + *fRefreshRate = RefreshRateMap[i].fRefreshRate; + return (TRUE); + } + } + return (FALSE); +} + +char* pcConvertResolutionToString(ULONG ulResolution) +{ + USHORT usHorResolution = (USHORT)(ulResolution & 0x0000FFFF); + USHORT usVerResolution = (USHORT)(ulResolution >> 16); + USHORT usTemp; + int iIndex, iStringSize, i; + char *pcResolution; + + pcResolution = xnfalloc(10); + + /* compute string size */ + iIndex = 0; + + iStringSize = 1; + usTemp = usHorResolution; + while ((usTemp/10) > 0) + { + iStringSize++; + usTemp /= 10; + } + + usTemp = usHorResolution; + for ( i = 1 ; i <= iStringSize; i++) + { + pcResolution[iIndex+ iStringSize - i] = (usTemp%10) + 0x30; + usTemp /= 10; + } + iIndex += iStringSize; + + pcResolution[iIndex] = 'x'; + iIndex++; + + iStringSize = 1; + usTemp = usVerResolution; + while ((usTemp/10) > 0) + { + iStringSize++; + usTemp /= 10; + } + + usTemp = usVerResolution; + for ( i = 1 ; i <= iStringSize; i++) + { + pcResolution[iIndex+ iStringSize - i] = (usTemp%10) + 0x30; + usTemp /= 10; + } + iIndex += iStringSize; + + pcResolution[iIndex] = '\0'; + + return pcResolution; +} + +DisplayModePtr SearchDisplayModeRecPtr(DisplayModePtr pModePoolHead, CBIOS_ARGUMENTS CBiosArguments) +{ + DisplayModePtr pMode = pModePoolHead; + MODE_PRIVATE *pModePrivate; + + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "==Enter SearchDisplayModeRecPtr(CH = 0x%02X, EDX = 0x%08X, SI = 0x%X, EDI = %d)== \n", CBiosArguments.reg.lh.CH, CBiosArguments.reg.ex.EDX, CBiosArguments.reg.x.SI, CBiosArguments.reg.ex.EDI); + + while(pMode != NULL) + { + pModePrivate = MODE_PRIVATE_PTR(pMode); + + if ((pModePrivate->ucRRate_ID == CBiosArguments.reg.lh.CH) && + (pMode->HDisplay == (int)(CBiosArguments.reg.ex.EDX & 0x0000FFFF)) && + (pMode->VDisplay == (int)(CBiosArguments.reg.ex.EDX >>16)) && + ((pMode->PrivFlags & 0xFFFF) == (int)CBiosArguments.reg.x.SI) && + (pMode->Clock == CBiosArguments.reg.ex.EDI)) + { + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "==Exit1 SearchDisplayModeRecPtr()== \n"); + return pMode; + } + + pMode = pMode->next; + } + xf86DrvMsgVerb(0, X_INFO, InternalLevel, "==Exit2 SearchDisplayModeRecPtr()== \n"); + return NULL; +} diff --git a/src/rdc_mode.h b/src/rdc_mode.h new file mode 100644 index 0000000..f2bbec4 --- /dev/null +++ b/src/rdc_mode.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +/* Mode Limitation */ +#ifdef FPGA +#define MAX_HResolution 1024 +#define MAX_VResolution 768 +#else +#define MAX_HResolution 1920 +#define MAX_VResolution 1200 +#endif + +/* Std. Table Index Definition */ +#define TextModeIndex 0 +#define EGAModeIndex 1 +#define VGAModeIndex 2 +#define HiCModeIndex 3 +#define TrueCModeIndex 4 + +/* DCLK Index */ +#define VCLK25_175 0x00 +#define VCLK28_322 0x01 +#define VCLK31_5 0x02 +#define VCLK36 0x03 +#define VCLK40 0x04 +#define VCLK49_5 0x05 +#define VCLK50 0x06 +#define VCLK56_25 0x07 +#define VCLK65 0x08 +#define VCLK75 0x09 +#define VCLK78_75 0x0A +#define VCLK94_5 0x0B +#define VCLK108 0x0C +#define VCLK135 0x0D +#define VCLK157_5 0x0E +#define VCLK162 0x0F +/* #define VCLK193_25 0x10 */ +#define VCLK154 0x10 + +/* Flags Definition */ +#define Charx8Dot 0x00000001 +#define HalfDCLK 0x00000002 +#define DoubleScanMode 0x00000004 +#define LineCompareOff 0x00000008 +#define SyncPP 0x00000000 +#define SyncPN 0x00000040 +#define SyncNP 0x00000080 +#define SyncNN 0x000000C0 +#define HBorder 0x00000020 +#define VBorder 0x00000010 + +/* DAC Definition */ +#define DAC_NUM_TEXT 64 +#define DAC_NUM_EGA 64 +#define DAC_NUM_VGA 256 + +/* DisplayModePtr->PrivFlags */ +#define LCD_TIMING 0x00010000 + +/* Data Structure decalration for internal use */ +typedef struct { + UCHAR MISC; + UCHAR SEQ[4]; + UCHAR CRTC[25]; + UCHAR AR[20]; + UCHAR GR[9]; + +} VBIOS_STDTABLE_STRUCT, *PVBIOS_STDTABLE_STRUCT; + +typedef struct { + UCHAR ucNS; + UCHAR ucMS; + UCHAR ucRS; +} VBIOS_DCLK_INFO, *PVBIOS_DCLK_INFO; + +typedef struct _RRateInfo{ + float fRefreshRate; + Bool BInterlaced; + UCHAR ucRRateIndex; +}RRateInfo; + +typedef struct _MODE_PRIVATE +{ + USHORT Mode_ID_8bpp; + USHORT Mode_ID_16bpp; + USHORT Mode_ID_32bpp; + UCHAR ucRRate_ID; +} MODE_PRIVATE; + + diff --git a/src/rdc_tool.c b/src/rdc_tool.c new file mode 100644 index 0000000..4ba363a --- /dev/null +++ b/src/rdc_tool.c @@ -0,0 +1,259 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" + +/* Driver specific headers */ +#include "rdc.h" + +/* Prototype type declaration*/ +Bool RDCMapMem(ScrnInfoPtr pScrn); +Bool RDCUnmapMem(ScrnInfoPtr pScrn); +Bool RDCMapMMIO(ScrnInfoPtr pScrn); +void RDCUnmapMMIO(ScrnInfoPtr pScrn); +Bool RDCMapVBIOS(ScrnInfoPtr pScrn); +Bool RDCUnmapVBIOS(ScrnInfoPtr pScrn); + + +// map, unmap frame buffer +Bool +RDCMapMem(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if XSERVER_LIBPCIACCESS + struct pci_device *const device = pRDC->PciInfo; + int err; + + err = pci_device_map_range(device, pRDC->FBPhysAddr, pRDC->FbMapSize, + PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE, + (void **) &pRDC->FBVirtualAddr); + + if (err) + { + xf86DrvMsg (pScrn->scrnIndex, X_ERROR, + "Unable to map frame buffer BAR. %s (%d)\n", + strerror (err), err); + return FALSE; + } +#else + pRDC->FBVirtualAddr = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, + pRDC->PciTag, + pRDC->FBPhysAddr, pRDC->FbMapSize); +#endif + + if (!pRDC->FBVirtualAddr) + return FALSE; + + return TRUE; +} + +Bool +RDCUnmapMem(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if XSERVER_LIBPCIACCESS + pci_device_unmap_range (pRDC->PciInfo, pRDC->FBVirtualAddr, pRDC->FbMapSize); +#else + xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pRDC->FBVirtualAddr, + pRDC->FbMapSize); +#endif + + pRDC->FBVirtualAddr = 0; + + return TRUE; +} + +// map, ummap MMIO +Bool +RDCMapMMIO(ScrnInfoPtr pScrn) +{ + int mmioFlags; + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if !defined(__alpha__) + mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT; +#else + mmioFlags = VIDMEM_MMIO | VIDMEM_READSIDEEFFECT | VIDMEM_SPARSE; +#endif + +#if XSERVER_LIBPCIACCESS + struct pci_device *const device = pRDC->PciInfo; + + pci_device_map_range(device, pRDC->MMIOPhysAddr, pRDC->MMIOMapSize, + PCI_DEV_MAP_FLAG_WRITABLE | PCI_DEV_MAP_FLAG_WRITE_COMBINE, + (void **) &pRDC->MMIOVirtualAddr); +#else + pRDC->MMIOVirtualAddr = xf86MapPciMem(pScrn->scrnIndex, mmioFlags, + pRDC->PciTag, + pRDC->MMIOPhysAddr, pRDC->MMIOMapSize); +#endif + + if (!pRDC->MMIOVirtualAddr) + return FALSE; + + return TRUE; +} + +void +RDCUnmapMMIO(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + +#if XSERVER_LIBPCIACCESS + pci_device_unmap_range (pRDC->PciInfo, pRDC->MMIOVirtualAddr, pRDC->MMIOMapSize); +#else + xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pRDC->MMIOVirtualAddr, + pRDC->MMIOMapSize); +#endif + + pRDC->MMIOVirtualAddr = 0; + +} + +// map, unmap VBIOS +Bool RDCMapVBIOS(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + FILE *fpVBIOS; + int i; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Enter RDCMapVBIOS()==\n"); + pRDC->ulROMType = 0; + + // Map C000 + if (pRDC->ulROMType == 0) + { + pRDC->BIOSVirtualAddr = xf86MapVidMem(pScrn->scrnIndex, VIDMEM_READONLY, BIOS_ROM_PHY_BASE, BIOS_ROM_SIZE); + if (pRDC->BIOSVirtualAddr) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, "pRDC->BIOSVirtualAddr = 0x%08x\n", pRDC->BIOSVirtualAddr); + pRDC->ulROMType = 1; + } + else + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "==BIOS ROM not found()==\n"); + } + } + + // read ROM file + if (pRDC->ulROMType == 0) + { + // open BIOS ROM file + fpVBIOS = fopen(BIOS_ROM_PATH_FILE, "r"); + if (!fpVBIOS) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "BIOS ROM file \"/root/RDCVBIOS.ROM\" not found()==\n"); + } + + // memory allocate + pRDC->BIOSVirtualAddr = xnfalloc(BIOS_ROM_SIZE); + if (!pRDC->BIOSVirtualAddr) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "Read BIOS ROM file: Mem Allocate Fail!!==\n"); + fclose (fpVBIOS); + } + + // set ROM type + if (fpVBIOS && pRDC->BIOSVirtualAddr) + { + pRDC->ulROMType = 2; + for (i = 0; i < BIOS_ROM_SIZE; i++) + { + fscanf(fpVBIOS, "%c", pRDC->BIOSVirtualAddr+i); + } + fclose (fpVBIOS); + } + } + + if (pRDC->ulROMType == 0) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit1 RDCMapVBIOS()== No VBIOS\n"); + return false; // no VBIOS and ROM file + } + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, "pRDC->ulROMType = %d\n", pRDC->ulROMType); + + if ((*(USHORT*)pRDC->BIOSVirtualAddr == 0xAA55) && (*(USHORT*)(pRDC->BIOSVirtualAddr+0x40) == PCI_VENDOR_RDC)) + { + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit RDCMapVBIOS()== return TRUE\n"); + return TRUE; + } + else + { + RDCUnmapVBIOS(pScrn); + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, ErrorLevel, "==Exit2 RDCMapVBIOS()== Not RDC VBIOS\n"); + return false; // not RDC VGA BIOS + } +} + +Bool RDCUnmapVBIOS(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + + if (pRDC->ulROMType == 1) + { + xf86UnMapVidMem(pScrn->scrnIndex, (pointer) pRDC->BIOSVirtualAddr, BIOS_ROM_SIZE); + } + else if (pRDC->ulROMType == 2) + { + xfree(pRDC->BIOSVirtualAddr); + } + pRDC->BIOSVirtualAddr = 0; + + return TRUE; +} + diff --git a/src/rdc_vgatool.c b/src/rdc_vgatool.c new file mode 100644 index 0000000..0d84bad --- /dev/null +++ b/src/rdc_vgatool.c @@ -0,0 +1,321 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" + +/* Driver specific headers */ +#include "rdc.h" + +/* Prototype type declaration*/ +void vRDCOpenKey(ScrnInfoPtr pScrn); +Bool bRDCRegInit(ScrnInfoPtr pScrn); +ULONG GetVRAMInfo(ScrnInfoPtr pScrn); +Bool RDCFilterModeByBandWidth(ScrnInfoPtr pScrn, DisplayModePtr mode); +void vSetStartAddressCRT1(RDCRecPtr pRDC, ULONG base); +void vRDCLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors, VisualPtr pVisual); +void RDCDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags); +ULONG RDCGetMemBandWidth(ScrnInfoPtr pScrn); + + +void +vRDCOpenKey(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + + SetIndexReg(CRTC_PORT,0x80, 0xA8); +} + +Bool +bRDCRegInit(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + + /* Enable MMIO */ + SetIndexRegMask(CRTC_PORT,0xA1, 0xFF, 0x04); + + return (TRUE); +} + +ULONG +GetVRAMInfo(ScrnInfoPtr pScrn) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + UCHAR jReg; + + vRDCOpenKey(pScrn); + + GetIndexRegMask(CRTC_PORT, 0xAA, 0xFF, jReg); + + switch (jReg & 0x07) + { + case 0x00: + return (VIDEOMEM_SIZE_08M); + case 0x01: + return (VIDEOMEM_SIZE_16M); + case 0x02: + return (VIDEOMEM_SIZE_32M); + case 0x03: + return (VIDEOMEM_SIZE_64M); + case 0x04: + return (VIDEOMEM_SIZE_128M); + } + + return (DEFAULT_VIDEOMEM_SIZE); +} + +Bool +RDCFilterModeByBandWidth(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + ULONG RequestMemBandWidth = 0; + RDCRecPtr pRDC = RDCPTR(pScrn); + Bool Flags = MODE_OK; + + RequestMemBandWidth = mode->Clock * ((pScrn->bitsPerPixel + 7) >> 3) / 1000; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, + "==Filter Mode() Memory bandwidth request %u MB==\n", RequestMemBandWidth); + + if (RequestMemBandWidth > pRDC->MemoryBandwidth) + Flags = MODE_MEM; + + return(Flags); +} + +void +vSetStartAddressCRT1(RDCRecPtr pRDC, ULONG base) +{ + /* base is byte aligned, flipping base address is quad-word aligned */ + ULONG uc1stFlippingCmdReg; + + /* clear [27:3] base address of flipping control */ + uc1stFlippingCmdReg = *(ULONG *)MMIOREG_1ST_FLIP & (~MASK_1ST_FLIP_BASE); + + /* combine base with uc1stFlippingCmdReg */ + uc1stFlippingCmdReg |= (base & MASK_1ST_FLIP_BASE); + + *(ULONG *)MMIOREG_1ST_FLIP = uc1stFlippingCmdReg; +} + +ULONG +RDCGetMemBandWidth(ScrnInfoPtr pScrn) +{ + CBIOS_ARGUMENTS CBiosArguments; + CBIOS_Extension CBiosExtension; + RDCRecPtr pRDC = RDCPTR(pScrn); + + ULONG ulDRAMBusWidth, DRAMEfficiency; + ULONG ulMCLK, ulDRAMBandwidth, ActualDRAMBandwidth; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 7, + "==Device ID 0x%x==\n",DEVICE_ID(pRDC->PciInfo)); + + switch(DEVICE_ID(pRDC->PciInfo)) + { + case PCI_CHIP_M2010_A0: + /* Bus width is 16bit, and DRAM utilization is 30% */ + ulDRAMBusWidth = 16; + DRAMEfficiency = 300; + break; + case PCI_CHIP_M2011: + /* Bus width is 32bit, and DRAM utilization is 60% */ + ulDRAMBusWidth = 32; + DRAMEfficiency = 600; + break; + default: + /* Bus width is 16bit, and DRAM utilization is 60% */ + ulDRAMBusWidth = 16; + DRAMEfficiency = 600; + } + + CBiosExtension.pCBiosArguments = &CBiosArguments; + CBiosExtension.IOAddress = (USHORT)(pRDC->RelocateIO); + CBiosExtension.VideoVirtualAddress = (ULONG)(pRDC->FBVirtualAddr); + + vRDCOpenKey(pScrn); + + CBiosExtension.pCBiosArguments->reg.x.AX = 0x4F14; + CBiosExtension.pCBiosArguments->reg.x.BX = 0x0000; + CInt10(&CBiosExtension); + + if ((CBiosExtension.pCBiosArguments->reg.lh.CL & (0x07)) == 0x03) + { + ulMCLK = 266; + } + else + { + ulMCLK = 200; + } + + /* Get Bandwidth */ + /* Use DDRII DRAM, so multiply 2 */ + /* Translate DRAM Bandwidth to byte, so div 8*/ + ulDRAMBandwidth = ulMCLK * ulDRAMBusWidth * 2 / 8; + + ActualDRAMBandwidth = ulDRAMBandwidth * DRAMEfficiency / 1000; + + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, InfoLevel, + "==Get actual memory bandwidth request %u MB==\n", ActualDRAMBandwidth); + + return(ActualDRAMBandwidth); +} + +void +vRDCLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors, + VisualPtr pVisual) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + int i, j, index; + UCHAR DACIndex, DACR, DACG, DACB; + + switch (pScrn->bitsPerPixel) + { + case 15: + for(i=0; i<numColors; i++) + { + index = indices[i]; + for(j=0; j<8; j++) + { + DACIndex = (index * 8) + j; + DACR = colors[index].red << (8- pScrn->rgbBits); + DACG = colors[index].green << (8- pScrn->rgbBits); + DACB = colors[index].blue << (8- pScrn->rgbBits); + + VGA_LOAD_PALETTE_INDEX (DACIndex, DACR, DACG, DACB); + } + } + break; + + case 16: + for(i=0; i<numColors; i++) + { + index = indices[i]; + for(j=0; j<4; j++) + { + DACIndex = (index * 4) + j; + DACR = colors[index/2].red << (8- pScrn->rgbBits); + DACG = colors[index].green << (8- pScrn->rgbBits); + DACB = colors[index/2].blue << (8- pScrn->rgbBits); + + VGA_LOAD_PALETTE_INDEX (DACIndex, DACR, DACG, DACB); + } + } + break; + + case 24: + for(i=0; i<numColors; i++) + { + index = indices[i]; + DACIndex = index; + DACR = colors[index].red; + DACG = colors[index].green; + DACB = colors[index].blue; + + VGA_LOAD_PALETTE_INDEX (DACIndex, DACR, DACG, DACB); + } + break; + + default: + for(i=0; i<numColors; i++) + { + index = indices[i]; + DACIndex = index; + DACR = colors[index].red >> (8 - pScrn->rgbBits); + DACG = colors[index].green >> (8 - pScrn->rgbBits); + DACB = colors[index].blue >> (8 - pScrn->rgbBits); + + VGA_LOAD_PALETTE_INDEX (DACIndex, DACR, DACG, DACB); + } + } /* end of switch */ +} /* end of vRDCLoadPalette */ + +void +RDCDisplayPowerManagementSet(ScrnInfoPtr pScrn, int PowerManagementMode, int flags) +{ + RDCRecPtr pRDC; + UCHAR SEQ01, CRB6; + + pRDC = RDCPTR(pScrn); + SEQ01=CRB6=0; + + vRDCOpenKey(pScrn); + + switch (PowerManagementMode) + { + case DPMSModeOn: + /* Screen: On; HSync: On, VSync: On */ + SEQ01 = 0x00; + CRB6 = 0x00; + break; + + case DPMSModeStandby: + /* Screen: Off; HSync: Off, VSync: On */ + SEQ01 = 0x20; + CRB6 = 0x01; + break; + + case DPMSModeSuspend: + /* Screen: Off; HSync: On, VSync: Off */ + SEQ01 = 0x20; + CRB6 = 0x02; + break; + + case DPMSModeOff: + /* Screen: Off; HSync: Off, VSync: Off */ + SEQ01 = 0x20; + CRB6 = 0x03; + break; + } + + SetIndexRegMask(SEQ_PORT,0x01, 0xDF, SEQ01); + SetIndexRegMask(CRTC_PORT,0xB6, 0xFC, CRB6); +} + diff --git a/src/rdc_vgatool.h b/src/rdc_vgatool.h new file mode 100644 index 0000000..07cf2f7 --- /dev/null +++ b/src/rdc_vgatool.h @@ -0,0 +1,78 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +/* VRAM Size Definition */ +#define VIDEOMEM_SIZE_08M 0x00800000 +#define VIDEOMEM_SIZE_16M 0x01000000 +#define VIDEOMEM_SIZE_32M 0x02000000 +#define VIDEOMEM_SIZE_64M 0x04000000 +#define VIDEOMEM_SIZE_128M 0x08000000 + +#define AR_PORT_WRITE (pRDC->RelocateIO + 0x40) +#define MISC_PORT_WRITE (pRDC->RelocateIO + 0x42) +#define SEQ_PORT (pRDC->RelocateIO + 0x44) +#define DAC_INDEX_WRITE (pRDC->RelocateIO + 0x48) +#define DAC_DATA (pRDC->RelocateIO + 0x49) +#define GR_PORT (pRDC->RelocateIO + 0x4E) +#define CRTC_PORT (pRDC->RelocateIO + 0x54) +#define INPUT_STATUS1_READ (pRDC->RelocateIO + 0x5A) +#define MISC_PORT_READ (pRDC->RelocateIO + 0x4C) + +#define GetReg(base) inb(base) +#define SetReg(base,val) outb(base,val) + +#define GetIndexReg(base,index,val) \ + do { \ + outb(base,index); \ + val = inb(base+1); \ + } while (0) + +#define SetIndexReg(base,index, val) \ + do { \ + outb(base,index); \ + outb(base+1,val); \ + } while (0) + +#define GetIndexRegMask(base,index, and, val) \ + do { \ + outb(base,index); \ + val = (inb(base+1) & and); \ + } while (0) + +#define SetIndexRegMask(base,index, and, val) \ + do { \ + UCHAR __Temp; \ + outb(base,index); \ + __Temp = (inb((base)+1)&(and))|(val); \ + SetIndexReg(base,index,__Temp); \ + } while (0) + +#define VGA_LOAD_PALETTE_INDEX(index, red, green, blue) \ + { \ + UCHAR __junk; \ + SetReg(DAC_INDEX_WRITE,(UCHAR)(index)); \ + __junk = GetReg(SEQ_PORT); \ + SetReg(DAC_DATA,(UCHAR)(red)); \ + __junk = GetReg(SEQ_PORT); \ + SetReg(DAC_DATA,(UCHAR)(green)); \ + __junk = GetReg(SEQ_PORT); \ + SetReg(DAC_DATA,(UCHAR)(blue)); \ + __junk = GetReg(SEQ_PORT); \ + } diff --git a/src/rdc_video.c b/src/rdc_video.c new file mode 100644 index 0000000..3cde151 --- /dev/null +++ b/src/rdc_video.c @@ -0,0 +1,914 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Resources.h" +#include "xf86RAC.h" +#include "xf86cmap.h" +#include "compiler.h" +#include "mibstore.h" +#include "vgaHW.h" +#include "mipointer.h" +#include "micmap.h" + +#include "fb.h" +#include "regionstr.h" +#include "xf86xv.h" +#include <X11/extensions/Xv.h> +#include "vbe.h" + +#include "xf86PciInfo.h" +#include "xf86Pci.h" + +/* framebuffer offscreen manager */ +#include "xf86fbman.h" + +/* include xaa includes */ +#include "xaa.h" +#include "xaarop.h" + +/* H/W cursor support */ +#include "xf86Cursor.h" +#include "cursorstr.h" + +/* FOURCC format support */ +#include "fourcc.h" + +/* Driver specific headers */ +#include "rdc.h" + + +/* Function Declaration */ +static XF86VideoAdaptorPtr RDCSetupImageVideoOverlay(ScreenPtr); +static void RDCStopVideo(ScrnInfoPtr,pointer,Bool); +static int RDCSetPortAttribute(ScrnInfoPtr,Atom,INT32,pointer); +static int RDCGetPortAttribute(ScrnInfoPtr,Atom,INT32*,pointer); +static void RDCQueryBestSize(ScrnInfoPtr,Bool,short,short,short,short,unsigned int*,unsigned int*,pointer); +static int RDCPutImage(ScrnInfoPtr,short,short,short,short,short,short,short,short, + int,unsigned char*,short,short,Bool,RegionPtr,pointer,DrawablePtr); +static int RDCQueryImageAttributesOverlay(ScrnInfoPtr,int,unsigned short*,unsigned short*,int*,int*); +static FBLinearPtr RDCAllocateMemory(ScrnInfoPtr, FBLinearPtr, int); +void RDCUpdateVID(RDCRecPtr, RDCPortPrivPtr, BYTE); +void RDCCopyFOURCC(RDCRecPtr, unsigned char*, RDCPortPrivPtr, unsigned long, + unsigned long, int, short, short); + +/* Overlay windows max size */ +#define IMAGE_MAX_WIDTH 1280 +#define IMAGE_MAX_HEIGHT 1024 + +#define NUM_FORMATS 2 +static XF86VideoFormatRec Formats[NUM_FORMATS] = +{ + {16, TrueColor}, + {24, TrueColor} +}; + +#define NUM_ATTRIBUTES 4 +static XF86AttributeRec Attributes[NUM_ATTRIBUTES] = +{ + {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"}, +}; + +#define NUM_IMAGES 1 +static XF86ImageRec Images[NUM_IMAGES] = +{ + XVIMAGE_YUY2 +}; + +#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) + +static Atom xvBrightness, xvContrast, xvSaturation, xvColorKey; + +static XF86VideoEncodingRec DummyEncoding[1] = +{ + {0,"XV_IMAGE",IMAGE_MAX_WIDTH, IMAGE_MAX_HEIGHT,{1, 1}} +}; + + +void RDCVideoInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RDCRecPtr pRDC = RDCPTR(pScrn); + XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL; + XF86VideoAdaptorPtr overlayAdaptor = NULL; + int num_adaptors; + Bool bTrue = FALSE; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCVideoInit() entry==\n"); + + num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); + xf86DrvMsgVerb(0,X_INFO,4,"==RDCVideoInit() Adaptor number %d==\n",num_adaptors); + + newAdaptors = xalloc((num_adaptors + 1) * sizeof(XF86VideoAdaptorPtr *)); + + if (newAdaptors == NULL) + return; + memcpy(newAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr)); + adaptors = newAdaptors; + + overlayAdaptor = RDCSetupImageVideoOverlay(pScreen); + + if (overlayAdaptor != NULL) + { + xf86DrvMsgVerb(0,X_INFO,DefaultLevel,"==RDCVideoInit() Get Overlay Adapter==\n"); + adaptors[num_adaptors++] = overlayAdaptor; + } + + if (num_adaptors) + { + xf86DrvMsgVerb(0,X_INFO,DefaultLevel,"==RDCVideoInit() Adapter number %d==\n",num_adaptors); + bTrue = xf86XVScreenInit(pScreen, adaptors, num_adaptors); + if (!bTrue) + xf86DrvMsgVerb(0,X_INFO,DefaultLevel,"==RDCVideoInit() XVScreenInit Fail==\n"); + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCVideoInit() Exit==\n"); + xfree(adaptors); +} + + +static XF86VideoAdaptorPtr +RDCSetupImageVideoOverlay(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RDCRecPtr pRDC = RDCPTR(pScrn); + RDCPortPrivPtr pXVPriv = NULL; + XF86VideoAdaptorPtr adapt = NULL; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCSetupImageVideoOverlay() entry==\n"); + + if (!(adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec) + + sizeof(RDCPortPrivRec) + + sizeof(DevUnion)))) + { + xf86DrvMsgVerb(0, X_INFO, 0, "==RDCSetupImageVideoOverlay() allocate fail==\n"); + return NULL; + } + + adapt->type = XvWindowMask | XvInputMask | XvImageMask; + adapt->flags = VIDEO_OVERLAID_IMAGES /*| VIDEO_CLIP_TO_VIEWPORT*/; + adapt->name = "RDC Video Overlay"; + adapt->nEncodings = 1; + adapt->pEncodings = DummyEncoding; + + adapt->nFormats = NUM_FORMATS; + adapt->pFormats = Formats; + adapt->nPorts = 1; + adapt->pPortPrivates = (DevUnion *) (&adapt[1]); + + pXVPriv = (RDCPortPrivPtr)(&adapt->pPortPrivates[1]); + + /* Init Color Key */ + pXVPriv->colorkey = (1 << pScrn->offset.red) | + (1 << pScrn->offset.green) | + (((pScrn->mask.blue >> pScrn->offset.blue) - 1) << pScrn->offset.blue); + + adapt->pPortPrivates[0].ptr = (pointer) (pXVPriv); + + adapt->nAttributes = NUM_ATTRIBUTES; + adapt->pAttributes = Attributes; + + adapt->nImages = NUM_IMAGES; + adapt->pImages = Images; + adapt->PutVideo = NULL; + adapt->PutStill = NULL; + adapt->GetVideo = NULL; + adapt->GetStill = NULL; + adapt->StopVideo = RDCStopVideo; + adapt->SetPortAttribute = RDCSetPortAttribute; + adapt->GetPortAttribute = RDCGetPortAttribute; + adapt->QueryBestSize = RDCQueryBestSize; + adapt->PutImage = RDCPutImage; + adapt->QueryImageAttributes = RDCQueryImageAttributesOverlay; + + /* Setting private data structure */ + pXVPriv->VidhwInfo.dwVidCtl = 0; + pXVPriv->VidhwInfo.dwVideoSrcOffset = 0; + pXVPriv->VidhwInfo.dwFetch = 0; + pXVPriv->VidhwInfo.dwVDisplayCount = 0; + pXVPriv->VidhwInfo.dwVSrcPitch = 0; + pXVPriv->VidhwInfo.dwWinStartXY = 0; + pXVPriv->VidhwInfo.dwWinEndXY = 0; + pXVPriv->VidhwInfo.dwzoomCtl = 0; + pXVPriv->VidhwInfo.dwVIDBuffer[0] = 0; + pXVPriv->VidhwInfo.dwVIDBuffer[1] = 0; + pXVPriv->VidhwInfo.dwVIDBuffer[2] = 0; + pXVPriv->VidhwInfo.dwColorKey = (pXVPriv->colorkey & 0x00FFFFFF) | VDPS_ENABLE_CK; + + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_CTL) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_START_OFFSET) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FETCH_COUNT) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_SRC_DISP_COUNT_ON_SCR) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FB_STRIDE) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_START_LOCATION) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_END_LOCATION) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_ZOOM_CTL) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FB0) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FIRST_COLORKEY) = pXVPriv->VidhwInfo.dwColorKey; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_SECOND_COLORKEY) = pXVPriv->VidhwInfo.dwColorKey; + + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FIFO_THRESHOLD) = VDPS_FIFO_THRESHOLD; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_CHROMA_KEY_LOW) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_CHROMA_KEY_UPPER) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_COLOR_ENHANCE_CTL1) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_COLOR_ENHANCE_CTL2) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_COLOR_ENHANCE_CTL3) = 0; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_COLOR_ENHANCE_CTL4) = 0; + + + /* gotta uninit this someplace */ + REGION_NULL(pScreen, &pXVPriv->clip); + + xvColorKey = MAKE_ATOM("XV_COLORKEY"); + xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); + xvContrast = MAKE_ATOM("XV_CONTRAST"); + xvSaturation = MAKE_ATOM("XV_SATURATION"); + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCSetupImageVideoOverlay() exit==\n"); + return adapt; +} + +static void +RDCStopVideo(ScrnInfoPtr pScrn, pointer data, Bool shutdown) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + RDCPortPrivPtr pXVPriv = (RDCPortPrivPtr)data; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCStopVideo() Entry==\n"); + + pRDC->OverlayStatus.bOverlayEnable = false; + + /* Turn Off overlay engine */ + if (shutdown) + { + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCStopVideo() Stop Overlay==\n"); + while (!(GetReg(INPUT_STATUS1_READ) & 0x08)) + { + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "wait v sync\n"); + } + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_CTL) = 0; + pXVPriv->VidhwInfo.dwVidCtl = 0; + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCStopVideo() Exit==\n"); +} + +static int +RDCSetPortAttribute( + ScrnInfoPtr pScrn, + Atom attribute, + INT32 value, + pointer data) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + RDCPortPrivPtr pXVPriv = (RDCPortPrivPtr)data; + int ReturnValue = Success; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCSetPortAttribute() Entry==\n"); + + if (attribute == xvBrightness) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==SetPort Attribute Brightness %d==\n",value); + pXVPriv->brightness = value; + } + else if (attribute == xvContrast) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==SetPort Attribute Contrast %d==\n",value); + pXVPriv->contrast = value; + } + else if (attribute == xvSaturation) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==SetPort Attribute Saturation %d==\n", value); + pXVPriv->saturation = value; + } + else if (attribute == xvColorKey) + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==SetPort Attribute ColorKey 0x%x==\n", value); + pXVPriv->colorkey = value; + + pXVPriv->VidhwInfo.dwColorKey = (value & 0x00FFFFFF) | VDPS_ENABLE_CK; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FIRST_COLORKEY) = pXVPriv->VidhwInfo.dwColorKey; + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_SECOND_COLORKEY) = pXVPriv->VidhwInfo.dwColorKey; + } + else + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==SetPort Attribute not Support==\n"); + ReturnValue = BadValue; + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCSetPortAttribute() Exit==\n"); + + return ReturnValue; +} + +static int +RDCGetPortAttribute( + ScrnInfoPtr pScrn, + Atom attribute, + INT32 * value, + pointer data) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + RDCPortPrivPtr pXVPriv = (RDCPortPrivPtr)data; + int ReturnValue = Success; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCGetPortAttribute() Entry==\n"); + + if (attribute == xvBrightness) + { + *value = pXVPriv->brightness; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==GetPort Attribute Brightness %d==\n",value); + } + else if (attribute == xvContrast) + { + *value = pXVPriv->contrast; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==GetPort Attribute Contrast %d==\n",value); + } + else if (attribute == xvSaturation) + { + *value = pXVPriv->saturation; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==GetPort Attribute Saturation %d==\n", value); + } + else if (attribute == xvColorKey) + { + *value = pXVPriv->colorkey; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==GetPort Attribute ColorKey 0x%x==\n", value); + } + else + { + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==GetPort Attribute not Support==\n"); + ReturnValue = BadValue; + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCGetPortAttribute() Exit==\n"); + + return ReturnValue; +} + +static void +RDCQueryBestSize(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) +{ + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCQueryBestSize() Entry==\n"); + + *p_w = drw_w; + *p_h = drw_h; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCQueryBestSize() Exit==\n"); +} + + +/* + * 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 +RDCPutImage(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) +{ + RDCRecPtr pRDC = RDCPTR(pScrn); + RDCPortPrivPtr pRDCPortPriv = (RDCPortPrivPtr)data; + unsigned long SrcPitch, DstPitch; + unsigned long DstWidth, DstHeight, ScreenWidth, ScreenHeight, ViewWidth, ViewHeight; + HWCINFO *pHWCInfo = &pRDC->HWCInfo; + OVERLAY_STATUS *pOverlayStatus = &pRDC->OverlayStatus; + int size = 0; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCPutImage() Entry==\n"); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==FOURCC ID 0x%x, Width = 0x%x, Height = 0x%x==\n", id, width, height); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Src position X = %d, Y = %d==\n",src_x, src_y); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Src size width = %d, Height = %d==\n",src_w, src_h); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Dst position X = %d, Y = %d==\n",drw_x, drw_y); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Dst size width = %d, Height = %d==\n",drw_w, drw_h); + + pOverlayStatus->bOverlayEnable = true; + pOverlayStatus->iDstLeft = (int)drw_x; + pOverlayStatus->iDstTop = (int)drw_y; + pOverlayStatus->iDstWidth = (int)drw_w; + pOverlayStatus->iDstHeight = (int)drw_h; + pOverlayStatus->iSrcWidth = (int)src_w; + pOverlayStatus->iSrcHeight = (int)src_h; + + ScreenWidth = pRDC->ModePtr->HDisplay; + ScreenHeight = pRDC->ModePtr->VDisplay; + if (pRDC->DeviceInfo.ucDeviceID == 1) /* if Device == LCD */ + { + ViewWidth = pRDC->DeviceInfo.MonitorSize.ulHorMaxResolution; + ViewHeight = pRDC->DeviceInfo.MonitorSize.ulVerMaxResolution; + } + else + { + ViewWidth = ScreenWidth; + ViewHeight = ScreenHeight; + } + + /* if device == LCD, adjust dst x,y */ + if (pRDC->DeviceInfo.ucDeviceID == 1) + { + if (pScrn->bitsPerPixel == 16) + { + drw_x -= (pHWCInfo->iScreenOffset_x & ~0x3); + } + else if((pScrn->bitsPerPixel == 24) || (pScrn->bitsPerPixel == 32)) + { + drw_x -= (pHWCInfo->iScreenOffset_x & ~0x1); + } + drw_y -= pHWCInfo->iScreenOffset_y; + } + + switch(id) + { + case FOURCC_YV12: + SrcPitch = (width + 3) & ~3; + break; + case FOURCC_YUY2: + SrcPitch = (width << 1); + break; + } + + /* HW only support YUY2, So Destination is always YUY2 */ + DstPitch = (width << 1); + DstPitch = (DstPitch + 7) & ~7; /* Pitch 8 byte alignment */ + size = DstPitch * height; + + pRDCPortPriv->SrcPitch = DstPitch; + + /* Create Off-screen plan for overlay window*/ + if(!(pRDCPortPriv->PackedBuf0 = RDCAllocateMemory(pScrn, pRDCPortPriv->PackedBuf0, + (pScrn->bitsPerPixel == 16) ? size : (size >> 1)))) + return BadAlloc; + + /* Copy src data to desination buffer*/ + RDCCopyFOURCC(pRDC, buf, pRDCPortPriv, SrcPitch, DstPitch, id, width, height); + + /* update cliplist */ + if(!REGION_EQUAL(pScrn->pScreen, &pRDCPortPriv->clip, clipBoxes)) + { + REGION_COPY(pScrn->pScreen, &pRDCPortPriv->clip, clipBoxes); + /* draw these */ + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Color Key 0x%x==\n",pRDCPortPriv->colorkey); + + xf86XVFillKeyHelper(pScrn->pScreen, pRDCPortPriv->colorkey, clipBoxes); + } + + /* Setting active rectangle */ + if(0 == drw_w) + DstWidth = 1; + else + DstWidth = drw_w; + + if(0 == drw_h) + DstHeight = 1; + else + DstHeight = drw_h; + + pRDCPortPriv->rSrc.left = src_x; + pRDCPortPriv->rDst.left = drw_x; + if (drw_x < 0) + { + pRDCPortPriv->rSrc.left += (((-drw_x) * src_w) + (DstWidth >> 1)) / DstWidth; + pRDCPortPriv->rDst.left = 0; + } + + pRDCPortPriv->rSrc.right = src_x + src_w; + pRDCPortPriv->rDst.right = drw_x + drw_w; + if (ViewWidth > ScreenWidth) + { + if ((drw_x + drw_w) > ScreenWidth) + { + pRDCPortPriv->rSrc.right -= (((drw_x + drw_w - ScreenWidth) * src_w) + (DstWidth >> 1)) / DstWidth; + pRDCPortPriv->rDst.right = ScreenWidth; + } + } + else + { + if ((drw_x + drw_w) > ViewWidth) + { + pRDCPortPriv->rSrc.right -= (((drw_x + drw_w - ViewWidth) * src_w) + (DstWidth >> 1)) / DstWidth; + pRDCPortPriv->rDst.right = ViewWidth; + } + } + + pRDCPortPriv->rSrc.top = src_y; + pRDCPortPriv->rDst.top = drw_y; + if (drw_y < 0) + { + pRDCPortPriv->rSrc.top += ((-drw_y) * height + (DstHeight >> 1)) / DstHeight; + pRDCPortPriv->rDst.top = 0; + } + + pRDCPortPriv->rSrc.bottom = src_y + src_h; + pRDCPortPriv->rDst.bottom = drw_y + drw_h; + if (ViewHeight > ScreenHeight) + { + if ((drw_y + drw_h) > ScreenHeight) + { + pRDCPortPriv->rSrc.bottom -= (((drw_y + drw_h - ScreenHeight) * src_h) + (DstHeight >> 1)) / DstHeight; + pRDCPortPriv->rDst.bottom = ScreenHeight; + } + } + else + { + if ((drw_y + drw_h) > ViewHeight) + { + pRDCPortPriv->rSrc.bottom -= (((drw_y + drw_h - ViewHeight) * src_h) + (DstHeight >> 1)) / DstHeight; + pRDCPortPriv->rDst.bottom = ViewHeight; + } + } + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Src left = 0x%x, Src right = 0x%x==\n",pRDCPortPriv->rSrc.left,pRDCPortPriv->rSrc.right); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Src top = 0x%x, Src bottom = 0x%x==\n",pRDCPortPriv->rSrc.top, pRDCPortPriv->rSrc.bottom); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Dst left = 0x%x, Dst right = 0x%x==\n",pRDCPortPriv->rDst.left,pRDCPortPriv->rDst.right); + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Dst top = 0x%x, Dst bottom = 0x%x==\n",pRDCPortPriv->rDst.top, pRDCPortPriv->rDst.bottom); + + RDCUpdateVID(pRDC, pRDCPortPriv, VID_Enable); + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCPutImage() Exit==\n"); + return Success; +} + +static int +RDCQueryImageAttributesOverlay(ScrnInfoPtr pScrn,int id, + unsigned short *w, unsigned short *h, + int *pitches, int *offsets) +{ + int size = 0, chromasize = 0; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCQueryImageAttributesOverlay() Entry; Width = %d, Height = %d==\n", *w, *h); + + if ((!w) || (!h)) + return 0; + + if ((pitches == NULL) || (offsets == NULL)) + return 0; + + if (*w > IMAGE_MAX_WIDTH) + *w = IMAGE_MAX_WIDTH; + if (*h > IMAGE_MAX_HEIGHT) + *h = IMAGE_MAX_HEIGHT; + + *offsets = 0; + + switch (id) + { + case FOURCC_YV12: + /* aligment width and height */ + *w = (*w + 3) & ~3; + *h = (*h + 1) & ~1; + + size = *w; + pitches[0] = size; + + size *= *h; + chromasize = ((*h >> 1) * (*w >> 1)); + offsets[1] = size; + + pitches[1] = pitches[2] = (*w >> 1); + size += chromasize; + + offsets[2] = size; + size += chromasize; + break; + case FOURCC_YUY2: + default: + /* aligment width and height */ + *w = (*w + 1) & ~1; + + size = (*w << 1); + + if (pitches) + pitches[0] = size; + + size *= *h; + break; + } + + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==pitche0 = 0x%x; pitche1 = 0x%x; pitche2 = 0x%x==\n", + pitches[0],pitches[1],pitches[2]); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==offset0 = 0x%x;offset1 = 0x%x;offset2 = 0x%x;==\n", + offsets[0], offsets[1], offsets[2]); + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCQueryImageAttributesOverlay() Exit; Size = %d==\n",size); + + return size; +} + +/******************************************************************* +* Allocate Local video memory for video display * +********************************************************************/ +static FBLinearPtr +RDCAllocateMemory( + ScrnInfoPtr pScrn, + FBLinearPtr PackedBuf, + int size) +{ + ScreenPtr pScreen; + FBLinearPtr newBuf; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCAllocateMemory() Entry==\n"); + xf86DrvMsgVerb(0, X_INFO, 8, "==RDCAllocateMemory() Total size %d==\n",size); + + if(PackedBuf) + { + if(PackedBuf->size >= size) + { + return PackedBuf; + } + + if(xf86ResizeOffscreenLinear(PackedBuf, size)) + { + return PackedBuf; + } + xf86FreeOffscreenLinear(PackedBuf); + } + + pScreen = screenInfo.screens[pScrn->scrnIndex]; + + newBuf = xf86AllocateOffscreenLinear(pScreen, + size, + 8, + NULL, NULL, NULL); + + if(!newBuf) + { + int max_size; + + xf86QueryLargestOffscreenLinear(pScreen, + &max_size, + 8, + PRIORITY_EXTREME); + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==RDCAllocateMemory() Max size %d==\n",max_size); + + if(max_size < size) + return NULL; + + xf86PurgeUnlockedOffscreenAreas(pScreen); + newBuf = xf86AllocateOffscreenLinear(pScreen, + size, + 8, + NULL, NULL, NULL); + } + + xf86DrvMsgVerb(0, X_INFO, 8, "==Buffer size %d==\n",newBuf->size); + xf86DrvMsgVerb(0, X_INFO, 8, "==Buffer offset %d==\n",newBuf->offset); + xf86DrvMsgVerb(0, X_INFO, 8, "==Buffer granularity %d==\n",newBuf->granularity); + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCAllocateMemory() Exit==\n"); + return newBuf; +} + +/***************************************************************** +* Setting Video Display register * +******************************************************************/ +void RDCUpdateVID(RDCRecPtr pRDC, RDCPortPrivPtr pRDCPortPriv, BYTE bEnable) +{ + unsigned long SrcWidth, DstWidth, SrcHeight, DstHeight; + VIDHWINFOPtr pVIDHwInfo = &pRDCPortPriv->VidhwInfo; + OV_RECTLPtr pRSrc = &pRDCPortPriv->rSrc; + OV_RECTLPtr pRDst = &pRDCPortPriv->rDst; + + ULONG dwVidCtl; + ULONG dwVideoSrcOffset; + ULONG dwFetch; // Video engine fetch count + ULONG dwVDisplayCount; // Video engine display count 0x26c,0x27c + ULONG dwVSrcPitch; // Video engine stride + ULONG dwWinStartXY; + ULONG dwWinEndXY; + ULONG dwzoomCtl; + ULONG dwVIDBuffer[3]; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCUpdateVID() Entry==\n"); + + /* Enable or Disable VID */ + if (bEnable) + dwVidCtl = VDPS_ENABLE| + VDPS_SW_FLIP| + VDPS_DISP_REQ_EXPIRE| + VDPS_DISP_PRE_FETCH| + VDPS_DISP1; + else + dwVidCtl = 0; + + SrcWidth = pRSrc->right - pRSrc->left; + SrcHeight = pRSrc->bottom - pRSrc->top; + + DstWidth = pRDst->right - pRDst->left; + DstHeight = pRDst->bottom - pRDst->top; + + /* Color Key Setting */ + + /* Chrome Key Setting */ + + + dwVSrcPitch = pRDCPortPriv->SrcPitch; + dwVIDBuffer[0] = pRDCPortPriv->Packed0Offset; + + dwVDisplayCount = ((pRSrc->bottom - 1) << 16) | (pRSrc->right - 1); + dwVideoSrcOffset = (pRSrc->left << 16) | pRSrc->top; + dwWinStartXY = (pRDst->left << 16) | pRDst->top; + dwWinEndXY = ((pRDst->right - 1) << 16) | (pRDst->bottom - 1); + + dwFetch = (((pRSrc->right - pRSrc->left) << 1) + 7) >> 3; + + if (dwFetch < 4) + dwFetch = 4; + + dwzoomCtl &= 0x0000FFFF; + if (SrcWidth < DstWidth) + { + dwzoomCtl |=((ULONG)(((SrcWidth*0x1000)/DstWidth)&0x0FFF)<<16)| + VDPS_H_ZOOM_ENABLE|VDPS_H_INTERP; + } + + dwzoomCtl &= 0xFFFF0000; + if (SrcHeight < DstHeight) + { + dwzoomCtl |=(ULONG)(((SrcHeight*0x1000)/DstHeight)&0x0FFF)| + VDPS_V_ZOOM_ENABLE|VDPS_V_INTERP; + } + + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Color Key 0x%x==\n",pVIDHwInfo->dwColorKey); + + if (pVIDHwInfo->dwVidCtl != dwVidCtl) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_CTL) = dwVidCtl; + pVIDHwInfo->dwVidCtl = dwVidCtl; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==VID CTRL Setting 0x%x==\n",pVIDHwInfo->dwVidCtl); + } + if (pVIDHwInfo->dwFetch != dwFetch) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FETCH_COUNT) = dwFetch; + pVIDHwInfo->dwFetch = dwFetch; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Fetch count 0x%x==\n",pVIDHwInfo->dwFetch); + } + if (pVIDHwInfo->dwVideoSrcOffset != dwVideoSrcOffset) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_START_OFFSET) = dwVideoSrcOffset; + pVIDHwInfo->dwVideoSrcOffset = dwVideoSrcOffset; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Video Src Offset 0x%x==\n",pVIDHwInfo->dwVideoSrcOffset); + } + if (pVIDHwInfo->dwVDisplayCount != dwVDisplayCount) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_SRC_DISP_COUNT_ON_SCR) = dwVDisplayCount; + pVIDHwInfo->dwVDisplayCount = dwVDisplayCount; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Display count 0x%x==\n",pVIDHwInfo->dwVDisplayCount); + } + if (pVIDHwInfo->dwWinStartXY != dwWinStartXY) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_START_LOCATION) = dwWinStartXY; + pVIDHwInfo->dwWinStartXY = dwWinStartXY; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Start Location 0x%x==\n",pVIDHwInfo->dwWinStartXY); + } + if (pVIDHwInfo->dwWinEndXY != dwWinEndXY) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_END_LOCATION) = dwWinEndXY; + pVIDHwInfo->dwWinEndXY = dwWinEndXY; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==End Location 0x%x==\n",pVIDHwInfo->dwWinEndXY); + } + if (pVIDHwInfo->dwzoomCtl != dwzoomCtl) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_ZOOM_CTL) = dwzoomCtl; + pVIDHwInfo->dwzoomCtl = dwzoomCtl; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Zoom Setting 0x%x==\n",pVIDHwInfo->dwzoomCtl); + } + if (pVIDHwInfo->dwVIDBuffer[0] != dwVIDBuffer[0]) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FB0) = dwVIDBuffer[0]; + pVIDHwInfo->dwVIDBuffer[0] = dwVIDBuffer[0]; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Video Display Buffer 0x%x==\n",pVIDHwInfo->dwVIDBuffer[0]); + } + if (pVIDHwInfo->dwVSrcPitch != dwVSrcPitch) + { + *(ULONG*)(pRDC->MMIOVirtualAddr + VDP_FB_STRIDE) = dwVSrcPitch; + pVIDHwInfo->dwVSrcPitch = dwVSrcPitch; + xf86DrvMsgVerb(0, X_INFO, InfoLevel, "==Buffer stride 0x%x==\n",pVIDHwInfo->dwVSrcPitch); + } + + *(unsigned long*)(pRDC->MMIOVirtualAddr + VDP_REG_UPDATE_MOD_SELECT) = VDPS_FIRE; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCUpdateVID() Exit==\n"); +} + +/***************************************************************** +* We copy video source from system memory to local video memory, * +* and convert source format to YVY2 * +******************************************************************/ +void RDCCopyFOURCC(RDCRecPtr pRDC, unsigned char* pSrcStart, RDCPortPrivPtr pRDCPortPriv, + unsigned long SrcPitch, unsigned long DstPitch, int FourCC, + short width, short height) +{ + unsigned char* pDst = NULL; + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCCopyFOURCC() Entry==\n"); + xf86DrvMsgVerb(0, X_INFO, 8, "==Packed1 Offset 0x%x==\n", pRDCPortPriv->PackedBuf0->offset); + xf86DrvMsgVerb(0, X_INFO, 8, "==Per Pixel Bits 0x%x==\n",pRDC->VideoModeInfo.Bpp); + + pRDCPortPriv->Packed0Offset = + (pRDCPortPriv->PackedBuf0->offset * pRDC->VideoModeInfo.Bpp); + + pDst = pRDC->FBVirtualAddr + pRDCPortPriv->Packed0Offset; + + xf86DrvMsgVerb(0, X_INFO, 8, "==FB Base 0x%x==\n", (unsigned long)((unsigned long*)pRDC->FBVirtualAddr)); + xf86DrvMsgVerb(0, X_INFO, 6, "==Dst Start 0x%x==\n", (unsigned long)((unsigned long*)pDst)); + xf86DrvMsgVerb(0, X_INFO, 6, "==Src Start 0x%x==\n", (unsigned long)((unsigned long*)pSrcStart)); + xf86DrvMsgVerb(0, X_INFO, 6, "==Src Pitch 0x%x==\n", SrcPitch); + xf86DrvMsgVerb(0, X_INFO, 8, "==Dst Pitch 0x%x==\n", DstPitch); + xf86DrvMsgVerb(0, X_INFO, 8, "==Width 0x%x==\n", width); + xf86DrvMsgVerb(0, X_INFO, 8, "==Height 0x%x==\n", height); + + switch (FourCC) + { + case FOURCC_YV12: + { + int i,j; + CARD32 *pDst1 = (CARD32*)pDst; + unsigned long SrcYPitch = SrcPitch; + unsigned long SrcVPitch = SrcPitch >> 1; + unsigned long SrcUPitch = SrcPitch >> 1; + unsigned char* pSrcY = pSrcStart; + unsigned char* pSrcV = pSrcStart + (width * height); + unsigned char* pSrcU = pSrcStart + ((width << 1) * (height << 1)); + + xf86DrvMsgVerb(0, X_INFO, 8, "==Y Start 0x%x==\n", (unsigned long)((unsigned long*)pSrcY)); + xf86DrvMsgVerb(0, X_INFO, 8, "==V Start 0x%x==\n", (unsigned long)((unsigned long*)pSrcV)); + xf86DrvMsgVerb(0, X_INFO, 8, "==U Start 0x%x==\n", (unsigned long)((unsigned long*)pSrcU)); + xf86DrvMsgVerb(0, X_INFO, 8, "==Y Pitch 0x%x==\n", SrcYPitch); + xf86DrvMsgVerb(0, X_INFO, 8, "==V,U Pitch 0x%x==\n", SrcVPitch); + + for(j = 0; j < height; j++) + { + for(i = 0; i < (width >> 1); i++) + { + pDst1[i] = pSrcY[i << 1] | (pSrcY[(i << 1) + 1] << 16) | + (pSrcU[i] << 8) | (pSrcV[i] << 24); + } + + pDst1 += DstPitch; + pSrcY += SrcYPitch; + + if(j & 1) + { + pSrcV += SrcVPitch; + pSrcU += SrcUPitch; + } + } + } + break; + case FOURCC_YUY2: + while(height--) + { + memcpy(pDst, pSrcStart, (width << 1)); + pSrcStart += SrcPitch; + pDst += DstPitch; + } + break; + } + + xf86DrvMsgVerb(0, X_INFO, DefaultLevel, "==RDCCopyFOURCC() Exit==\n"); +} diff --git a/src/rdc_video.h b/src/rdc_video.h new file mode 100644 index 0000000..f6d19cb --- /dev/null +++ b/src/rdc_video.h @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + +#include "xf86.h" + +// VIDEO Register definition VDISP +#define VDP_CTL 0x700 +#define VDP_REG_UPDATE_MOD_SELECT 0x704 +#define VDP_FIFO_THRESHOLD 0x708 +#define VDP_FETCH_COUNT 0x70C +#define VDP_START_OFFSET 0x710 +#define VDP_SRC_DISP_COUNT_ON_SCR 0x714 +#define VDP_START_LOCATION 0x718 +#define VDP_END_LOCATION 0x71C +#define VDP_FIRST_COLORKEY 0x720 +#define VDP_CHROMA_KEY_LOW 0x724 +#define VDP_CHROMA_KEY_UPPER 0x728 +#define VDP_ZOOM_CTL 0x72C +#define VDP_FB0 0x730 +#define VDP_FB1 0x734 +#define VDP_FB2 0x738 +#define VDP_FB_STRIDE 0x73C +#define VDP_COLOR_ENHANCE_CTL1 0x740 +#define VDP_COLOR_ENHANCE_CTL2 0x744 +#define VDP_COLOR_ENHANCE_CTL3 0x748 +#define VDP_COLOR_ENHANCE_CTL4 0x74C +#define VDP_SECOND_COLORKEY 0x750 + +#define VID_Enable 1 +#define VID_Disable 0 + +// VIDEO states +#define VDPS_ENABLE BIT0 +#define VDPS_SW_FLIP 0x00010000 +#define VDPS_HW_FLIP 0 +#define VDPS_DISP_REQ_EXPIRE 0x00000140 +#define VDPS_DISP_PRE_FETCH BIT20 +#define VDPS_DISP1 0x0 +#define VDPS_DISP2 BIT18 +#define VDPS_FIRE BIT7 +#define VDPS_FIFO_THRESHOLD 0x60006000 +#define VDPS_ENABLE_CK BIT30 +#define VDPS_ENABLE_CHK BIT31 +#define VDPS_H_ZOOM_ENABLE BIT31 +#define VDPS_H_INTERP BIT30 +#define VDPS_V_ZOOM_ENABLE BIT15 +#define VDPS_V_INTERP BIT14 + +typedef struct { + // overlay reg + ULONG dwVidCtl; + ULONG dwVideoSrcOffset; + ULONG dwFetch; // Video engine fetch count + ULONG dwVDisplayCount; // Video engine display count 0x26c,0x27c + ULONG dwVSrcPitch; // Video engine stride + ULONG dwWinStartXY; + ULONG dwWinEndXY; + ULONG dwzoomCtl; + ULONG dwColorKey; + ULONG dwVIDBuffer[3]; +} VIDHWINFO, *VIDHWINFOPtr; + +/* + * structure for passing information to UpdateOverlay fn + */ +typedef struct _OV_RECTL +{ + unsigned long left; + unsigned long top; + unsigned long right; + unsigned long bottom; +} OV_RECTL, *OV_RECTLPtr; + + +/* + * Xv port specific struct, each port has it's own struct + */ +typedef struct { + long brightness; + long saturation; + long contrast; + long hue; + RegionRec clip; + CARD32 colorkey; + + VIDHWINFO VidhwInfo; + FBLinearPtr PackedBuf0; + unsigned long Packed0Offset; + + OV_RECTL rDst; + OV_RECTL rSrc; + unsigned long SrcPitch; +} RDCPortPrivRec, *RDCPortPrivPtr; + diff --git a/src/typedef.h b/src/typedef.h new file mode 100644 index 0000000..3bd965b --- /dev/null +++ b/src/typedef.h @@ -0,0 +1,504 @@ +/* + * Copyright (C) 2009 RDC Semiconductor Co.,Ltd + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; 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, see <http://www.gnu.org/licenses/>. + * + * For technical support : + * <jason.lin@rdc.com.tw> + */ + + +#define X_INFO 0 +#define X_WARNING 1 +#define X_ERROR 2 + +/* Verberse level define */ +typedef unsigned char UCHAR; +typedef unsigned short USHORT; +typedef unsigned long ULONG; + +typedef enum _bool +{ + FALSE = 0, + TRUE = 1 +}bool; + +#ifndef ErrorLevel + #define ErrorLevel 0 /* Report Error message */ +#endif + +#ifndef DefaultLevel + #define DefaultLevel 4 /* Driver entry function */ +#endif + +#ifndef InfoLevel + #define InfoLevel 5 /* Report information */ +#endif + +#ifndef InternalLevel + #define InternalLevel 6 /* Driver interanl function entry */ +#endif + +/* Related IO offset */ +#define ATTR_ADDR 0X0040 +#define ATTR_DATA_WRITE 0X0040 +#define ATTR_DATA_READ 0X0041 +#define MISC_WRITE 0X0042 +#define INPUT_STATUS_0_READ 0X0042 +#define RIO_VGA_ENABLE 0X0043 +#define SEQ_INDEX 0X0044 +#define SEQ_DATA 0X0045 +#define PEL_MASK 0X0046 +#define DAC_INDEX_READ 0X0047 +#define FEAT_CTRL_READ 0X004A +#define MISC_READ 0X004C +#define GRAPH_INDEX 0X004E +#define GRAPH_DATA 0X004F + +#define MONO_CRTC_INDEX 0X0034 +#define MONO_CRTC_DATA 0X0035 +#define MONO_INPUT_STATUS1_READ 0X003A + +#define COLOR_CRTC_INDEX 0X0054 +#define COLOR_CRTC_DATA 0X0055 +#define COLOR_INPUT_STATUS1_READ 0X005A + + +#define VBIOSVerNum 0x00000 + + +/* Scratch registers */ + +#define SCRATCH_01 0x81 * 0x100 +#define IDX_SCRATCH_01 SCRATCH_01 + 0xFF +#define IDX_IGA1_DEV_ID SCRATCH_01 + 0x0F +#define IDX_IGA2_DEV_ID SCRATCH_01 + 0xF0 + +#define SCRATCH_02 0x82 * 0x100 +#define IDX_SCRATCH_02 SCRATCH_02 + 0xFF +#define IDX_DISPLAY1_CHANGED SCRATCH_02 + 0x01 +#define IDX_DISPLAY2_CHANGED SCRATCH_02 + 0x02 +#define IDX_PWR_SEQ_ON SCRATCH_02 + 0x04 + +#define SCRATCH_03 0x83 * 0x100 +#define IDX_SCRATCH_03 SCRATCH_03 + 0xFF +#define IDX_IGA2_VESA_MODE SCRATCH_03 + 0xFF + +#define SCRATCH_04 0x84 * 0x100 +#define IDX_SCRATCH_04 SCRATCH_04 + 0xFF +#define IDX_IGA2_VESA_MODE_OVERFLOW SCRATCH_04 + 0x01 +#define IDX_IGA2_RRATE_ID SCRATCH_04 + 0xFE + +#define SCRATCH_05 0x85 * 0x100 +#define IDX_SCRATCH_05 SCRATCH_05 + 0xFF +#define IDX_TV1_TYPE SCRATCH_05 + 0x0F +#define IDX_TV1_CONNECTION_TYPE SCRATCH_05 + 0x30 + +#define SCRATCH_06 0x86 * 0x100 +#define IDX_SCRATCH_06 SCRATCH_06 + 0xFF +#define IDX_TV2_TYPE SCRATCH_06 + 0x0F +#define IDX_TV2_CONNECTION_TYPE SCRATCH_06 + 0x30 + +#define SCRATCH_07 0x87 * 0x100 +#define IDX_SCRATCH_07 SCRATCH_07 + 0xFF +#define IDX_HDTV1_TYPE SCRATCH_07 + 0x07 +#define IDX_HDTV1_CONNECTION_TYPE SCRATCH_07 + 0x08 +#define IDX_HDTV2_TYPE SCRATCH_07 + 0x70 +#define IDX_HDTV2_CONNECTION_TYPE SCRATCH_07 + 0x80 + +#define SCRATCH_08 0x88 * 0x100 +#define IDX_SCRATCH_08 SCRATCH_08 + 0xFF +#define IDX_HDMI1_TYPE SCRATCH_08 + 0x0F +#define IDX_HDMI2_TYPE SCRATCH_08 + 0xF0 + +#define SCRATCH_09 0x89 * 0x100 +#define IDX_SCRATCH_09 SCRATCH_09 + 0xFF +#define IDX_HDMI1_CONNECTION_TYPE SCRATCH_09 + 0x03 +#define IDX_HDMI2_CONNECTION_TYPE SCRATCH_09 + 0x30 + +#define SCRATCH_10 0x8A * 0x100 +#define IDX_SCRATCH_10 SCRATCH_10 + 0xFF +#define IDX_LCD_H_SIZE_OVERFLOW SCRATCH_10 + 0xF0 +#define IDX_LCD_V_SIZE_OVERFLOW SCRATCH_10 + 0x0F + +#define SCRATCH_11 0x8B * 0x100 +#define IDX_SCRATCH_11 SCRATCH_11 + 0xFF +#define IDX_LCD_H_SIZE SCRATCH_11 + 0xFF + +#define SCRATCH_12 0x8C * 0x100 +#define IDX_SCRATCH_12 SCRATCH_12 + 0xFF +#define IDX_LCD_V_SIZE SCRATCH_12 + 0xFF + +#define SCRATCH_13 0x8D * 0x100 +#define IDX_SCRATCH_13 SCRATCH_13 + 0xFF +#define IDX_IGA1_VESA_MODE_OVERFLOW SCRATCH_13 + 0x01 +#define IDX_IGA1_RRATE_ID SCRATCH_13 + 0xFE + +#define SCRATCH_14 0x8E * 0x100 +#define IDX_SCRATCH_14 SCRATCH_14 + 0xFF +#define IDX_IGA1_VGA_MODE SCRATCH_14 + 0xFF +#define IDX_IGA1_VESA_MODE SCRATCH_14 + 0xFF + +#define SCRATCH_15 0x8F * 0x100 +#define IDX_SCRATCH_15 SCRATCH_15 + 0xFF +#define IDX_NEW_IGA1_DEV_ID SCRATCH_15 + 0x0F +#define IDX_NEW_IGA2_DEV_ID SCRATCH_15 + 0xF0 + +#define SCRATCH_16 0x90 * 0x100 +#define IDX_SCRATCH_16 SCRATCH_16 + 0xFF +#define IDX_KEEP_DISPLAY_OFF SCRATCH_16 + 0x80 +#define IDX_DPMS_STATE SCRATCH_16 + 0x40 +#define IDX_LINEAR_MODE SCRATCH_16 + 0x20 + +#define SCRATCH_17 0x91 * 0x100 +#define IDX_SCRATCH_17 SCRATCH_17 + 0xFF +#define IDX_LCD2_H_SIZE_OVERFLOW SCRATCH_10 + 0xF0 +#define IDX_LCD2_V_SIZE_OVERFLOW SCRATCH_10 + 0x0F + +#define SCRATCH_18 0x92 * 0x100 +#define IDX_SCRATCH_18 SCRATCH_18 + 0xFF +#define IDX_LCD2_H_SIZE SCRATCH_18 + 0xFF + +#define SCRATCH_19 0x93 * 0x100 +#define IDX_SCRATCH_19 SCRATCH_19 + 0xFF +#define IDX_LCD2_V_SIZE SCRATCH_19 + 0xFF + +#define SCRATCH_20 0x94 * 0x100 +#define IDX_SCRATCH_20 SCRATCH_20 + 0xFF +#define IDX_LVDS1_TX_ID SCRATCH_20 + 0xF0 +#define IDX_LVDS2_TX_ID SCRATCH_20 + 0x0F + +#define SCRATCH_21 0x95 * 0x100 +#define IDX_SCRATCH_21 SCRATCH_21 + 0xFF +#define IDX_TMDS1_TX_ID SCRATCH_21 + 0xF0 +#define IDX_TMDS2_TX_ID SCRATCH_21 + 0x0F + +#define SCRATCH_22 0x96 * 0x100 +#define IDX_SCRATCH_22 SCRATCH_22 + 0xFF +#define IDX_TV1_ENCODER_ID SCRATCH_22 + 0xF0 +#define IDX_TV2_ENCODER_ID SCRATCH_22 + 0x0F + +#define SCRATCH_23 0x97 * 0x100 +#define IDX_SCRATCH_23 SCRATCH_23 + 0xFF +#define IDX_LCD1_TABLE_INDEX SCRATCH_23 + 0xF0 +#define IDX_LCD2_TABLE_INDEX SCRATCH_23 + 0x0F + +/* For Bit mask using */ +#define BIT0 0x00000001 +#define BIT1 0x00000002 +#define BIT2 0x00000004 +#define BIT3 0x00000008 +#define BIT4 0x00000010 +#define BIT5 0x00000020 +#define BIT6 0x00000040 +#define BIT7 0x00000080 +#define BIT8 0x00000100 +#define BIT9 0x00000200 +#define BIT10 0x00000400 +#define BIT11 0x00000800 +#define BIT12 0x00001000 +#define BIT13 0x00002000 +#define BIT14 0x00004000 +#define BIT15 0x00008000 +#define BIT16 0x00010000 +#define BIT17 0x00020000 +#define BIT18 0x00040000 +#define BIT19 0x00080000 +#define BIT20 0x00100000 +#define BIT21 0x00200000 +#define BIT22 0x00400000 +#define BIT23 0x00800000 +#define BIT24 0x01000000 +#define BIT25 0x02000000 +#define BIT26 0x04000000 +#define BIT27 0x08000000 +#define BIT28 0x10000000 +#define BIT29 0x20000000 +#define BIT30 0x40000000 +#define BIT31 0x80000000 + +/* definition of output ports */ +#define CRT_PORT 0 +#define DVP1 1 +#define DVP2 2 +#define DVP12 3 + +/* definition of RRATE_TABLE.RRate_ID */ +#define RR60 0 +#define RR50I 1 +#define RR59_94I 2 +#define RR50 3 +#define RR56 4 +#define RR59_94 5 +#define RR24 6 +#define RR70 7 +#define RR75 8 +#define RR80 9 +#define RR85 10 +#define RR90 11 +#define RR100 12 +#define RR120 13 +#define RR72 14 +#define RR65 15 + +/* Output Device Index */ +#define LCD_ID 1 +#define DVI_ID 2 +#define CRT_ID 3 +#define HDMI_ID 4 +#define HDTV_ID 5 +#define TV_ID 6 +#define LCD2_ID 8 +#define DVI2_ID 9 +#define CRT2_ID 10 +#define HDMI2_ID 11 +#define HDTV2_ID 12 +#define TV2_ID 13 + +/* Output Device Combination Bit */ +#define B_LCD BIT0 +#define B_DVI BIT1 +#define B_CRT BIT2 +#define B_HDMI BIT3 +#define B_HDTV BIT4 +#define B_TV BIT5 +#define B_LCD2 BIT7 +#define B_DVI2 BIT8 +#define B_CRT2 BIT9 +#define B_HDMI2 BIT10 +#define B_HDTV2 BIT11 +#define B_TV2 BIT12 + + + +/* clock definition */ +#define PLLReferenceClock 14318 +#define MaxFCKVCO9003A 810000 +#define MinFCKVCO9003A 350000 +#define MaxFCKVCO9001A 1600000 +#define MinFCKVCO9001A 833000 + +/* DPMS State */ +#define DPMS__ON 0 +#define DPMS__STANDBY 1 +#define DPMS__SUSPEND 2 +#define DPMS__OFF 3 + + +/* definitions only for PANEL_TABLE.Attribute */ +#define SEQ BIT1 /* sequential output format */ +#define TTL BIT6 /* TTL LCD */ + +/* _PORT_CONFIG.TX_Enc_ID */ +#define NONE 0x00 /* no TX/encoder */ +#define TX_VT1636 0x01 +#define TX_SIL1162 0x02 +#define TX_HW 0x03 /* hardwired TX */ +#define ENC_VT1625 0x04 +#define DSTN 0x05 /* DSTN */ + +/* _PORT_CONFIG.Attribute */ +#define Dev_SUPPORT BIT0 /* Device Support */ +#define TX_DIT BIT1 +#define TX_PS BIT2 +#define DSTN_COLOR BIT3 /* DSTN color */ +#define DSTN_MONO 0 /* DSTN mono */ +#define DSTN_6X4 BIT4 /* DSTN 640x480 */ +#define DSTN_3X2 0 /* DSTN 320x240 */ +#define TX_MSB BIT5 + +/* definitions of display path */ +#define DISP1 1 +#define DISP2 2 + +/* mode numbers */ + +#define MODE_640x480x8 0x101 +#define MODE_800x600x8 0x103 +#define MODE_1024x768x8 0x105 +#define MODE_1280x1024x8 0x107 +#define MODE_640x480x16 0x111 +#define MODE_640x480x32 0x112 +#define MODE_800x600x16 0x114 +#define MODE_800x600x32 0x115 +#define MODE_1024x768x16 0x117 +#define MODE_1024x768x32 0x118 +#define MODE_1280x1024x16 0x11A +#define MODE_1280x1024x32 0x11B + +#define MODE_1600x1200x8 0x120 +#define MODE_1600x1200x16 0x121 +#define MODE_1600x1200x32 0x122 + +#define MODE_320x240x8 0x123 +#define MODE_320x240x16 0x124 +#define MODE_320x240x32 0x125 + +#define MODE_720x480x8 0x126 +#define MODE_720x480x16 0x127 +#define MODE_720x480x32 0x128 + +#define MODE_1360x768x8 0x129 +#define MODE_1360x768x16 0x12A +#define MODE_1360x768x32 0x12B + +#define MODE_848x480x8 0x12C +#define MODE_848x480x16 0x12D +#define MODE_848x480x32 0x12E + +#define MODE_1440x900x8 0x12F +#define MODE_1440x900x16 0x130 +#define MODE_1440x900x32 0x131 + +#define MODE_1152x864x8 0x132 +#define MODE_1152x864x16 0x133 +#define MODE_1152x864x32 0x134 + +#define MODE_1280x960x8 0x135 +#define MODE_1280x960x16 0x136 +#define MODE_1280x960x32 0x137 + +#define MODE_1400x1050x8 0x138 +#define MODE_1400x1050x16 0x139 +#define MODE_1400x1050x32 0x13A + +#define MODE_800x480x8 0x13B +#define MODE_800x480x16 0x13C +#define MODE_800x480x32 0x13D + +#define MODE_1024x600x8 0x13E +#define MODE_1024x600x16 0x13F +#define MODE_1024x600x32 0x140 + +#define MODE_USR_DEF1x8 0x1F1 +#define MODE_USR_DEF1x16 0x1F2 +#define MODE_USR_DEF1x32 0x1F3 + +#define MODE_USR_DEF2x8 0x1F4 +#define MODE_USR_DEF2x16 0x1F5 +#define MODE_USR_DEF2x32 0x1F6 + + +typedef struct _RRATE_TABLE RRATE_TABLE; +typedef struct _MODE_INFO MODE_INFO; +typedef struct _PANEL_TABLE PANEL_TABLE; +typedef struct _PORT_CONFIG PORT_CONFIG; +typedef struct _VESA_TABLE VESA_TABLE; + +struct _RRATE_TABLE { + ULONG Clock; /* in khz */ + UCHAR RRate_ID; + USHORT Attribute; + USHORT H_Blank_Time; + USHORT H_Sync_Start; + USHORT H_Sync_Time; + USHORT V_Blank_Time; + USHORT V_Sync_Start; + USHORT V_Sync_Time; +}__attribute__((packed));; + +struct _MODE_INFO{ + USHORT H_Size; + USHORT V_Size; + USHORT Mode_ID_8bpp; + USHORT Mode_ID_16bpp; + USHORT Mode_ID_32bpp; + UCHAR RRTableCount; +}__attribute__((packed));; + +struct _PANEL_TABLE { + USHORT TD0; + USHORT TD1; + USHORT TD2; + USHORT TD3; + USHORT TD5; + USHORT TD6; + USHORT TD7; + UCHAR PWM_Clock; + USHORT Reserved1; + USHORT Reserved2; + RRATE_TABLE Timing; +}__attribute__((packed));; + +struct _VESA_TABLE { + MODE_INFO ModeInfo; + RRATE_TABLE RRateTable; +}__attribute__((packed));; + +#if 0 +typedef struct _LCD_TABLE { + MODE_INFO ModeInfo; + PANEL_TABLE *pPanelTable; +} LCD_TABLE; +#endif + +typedef struct _REG_OP { + UCHAR RegGroup; + UCHAR RegMask; + UCHAR RegIndex; + UCHAR RegShiftBit; +} REG_OP; + +#if 0 +typedef struct _REG_PACKAGE { + UCHAR RegGroup; + UCHAR RegIndex; + UCHAR RegValue; + UCHAR RegMask; +} REG_PACKAGE; +#else +/* definitions for SerialLoadTable() */ +#define CR 0x00 +#define SR 0x01 +#define GR 0x02 +#define I2C 0x03 +#define NR 0xFF +#define BITS BIT7 +#endif + + +typedef struct _PLL_Info { + UCHAR NS; + UCHAR MS; + UCHAR RS; +}PLL_Info; + +struct _PORT_CONFIG +{ + UCHAR DevID; + UCHAR PortID; + UCHAR TX_Enc_ID; + UCHAR TX_I2C_Port; + UCHAR TX_I2C_Addr; + UCHAR Attribute; +}__attribute__((packed));; + +/* PCI Data Structure */ +#define OFF_VID 0 +#define OFF_DID 2 +#define OFF_PTR_VPD 4 +#define OFF_PCI_DS_LEN 6 +#define OFF_PCI_DS_REV 8 +#define OFF_CLASS_CODE1 9 +#define OFF_CLASS_CODE2 10 +#define OFF_CLASS_CODE3 11 +#define OFF_SIZE_VBIOS 12 +#define OFF_ROM_CODE_REV 14 +#define OFF_PC_AT_COMP 16 +#define OFF_LII 17 +#define OFF_RESERVED 18 + +/* Definition of PCI Data Structure.RESERVED */ + + |