2006-11-26 13:04:28 -07:00
/*
* Copyright 1995 - 2000 by Robin Cutshaw < robin @ XFree86 . Org >
* Copyright 1998 by Number Nine Visual Technology , Inc .
*
* 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 Robin Cutshaw not be used in
* advertising or publicity pertaining to distribution of the software without
* specific , written prior permission . Robin Cutshaw and Number Nine make no
* representations about the suitability of this software for any purpose . It
* is provided " as is " without express or implied warranty .
*
* ROBIN CUTSHAW AND NUMBER NINE DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE , INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS , IN NO EVENT SHALL ROBIN CUTSHAW OR NUMBER NINE 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 .
*
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "xf86.h"
# include "xf86PciInfo.h"
# include "xf86Pci.h"
# include "i128.h"
# include "i128reg.h"
# include "Ti302X.h"
# include "IBMRGB.h"
2008-10-12 14:32:10 -06:00
# include <unistd.h>
2006-11-26 13:04:28 -07:00
static void I128SavePalette ( I128Ptr pI128 ) ;
static void I128RestorePalette ( I128Ptr pI128 ) ;
void
I128SaveState ( ScrnInfoPtr pScrn )
{
I128Ptr pI128 = I128PTR ( pScrn ) ;
I128RegPtr iR = & pI128 - > RegRec ;
if ( pI128 - > Debug )
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128SaveState start \n " ) ;
if ( pI128 - > Debug ) {
unsigned long tmp1 = inl ( iR - > iobase + 0x1C ) ;
unsigned long tmp2 = inl ( iR - > iobase + 0x20 ) ;
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128SaveState saving, config1/2 = 0x%lx/0x%lx \n " , tmp1 , tmp2 ) ;
I128DumpActiveRegisters ( pScrn ) ;
}
/* iobase is filled in during the device probe (as well as config 1&2)*/
if ( ( pI128 - > io . id & 0x7 ) > 0 ) {
iR - > vga_ctl = inl ( iR - > iobase + 0x30 ) ;
}
iR - > i128_base_g [ INT_VCNT ] = pI128 - > mem . rbase_g [ INT_VCNT ] ; /* 0x0020 */
iR - > i128_base_g [ INT_HCNT ] = pI128 - > mem . rbase_g [ INT_HCNT ] ; /* 0x0024 */
iR - > i128_base_g [ DB_ADR ] = pI128 - > mem . rbase_g [ DB_ADR ] ; /* 0x0028 */
iR - > i128_base_g [ DB_PTCH ] = pI128 - > mem . rbase_g [ DB_PTCH ] ; /* 0x002C */
iR - > i128_base_g [ CRT_HAC ] = pI128 - > mem . rbase_g [ CRT_HAC ] ; /* 0x0030 */
iR - > i128_base_g [ CRT_HBL ] = pI128 - > mem . rbase_g [ CRT_HBL ] ; /* 0x0034 */
iR - > i128_base_g [ CRT_HFP ] = pI128 - > mem . rbase_g [ CRT_HFP ] ; /* 0x0038 */
iR - > i128_base_g [ CRT_HS ] = pI128 - > mem . rbase_g [ CRT_HS ] ; /* 0x003C */
iR - > i128_base_g [ CRT_VAC ] = pI128 - > mem . rbase_g [ CRT_VAC ] ; /* 0x0040 */
iR - > i128_base_g [ CRT_VBL ] = pI128 - > mem . rbase_g [ CRT_VBL ] ; /* 0x0044 */
iR - > i128_base_g [ CRT_VFP ] = pI128 - > mem . rbase_g [ CRT_VFP ] ; /* 0x0048 */
iR - > i128_base_g [ CRT_VS ] = pI128 - > mem . rbase_g [ CRT_VS ] ; /* 0x004C */
iR - > i128_base_g [ CRT_LCNT ] = pI128 - > mem . rbase_g [ CRT_LCNT ] ; /* 0x0050 */
iR - > i128_base_g [ CRT_ZOOM ] = pI128 - > mem . rbase_g [ CRT_ZOOM ] ; /* 0x0054 */
iR - > i128_base_g [ CRT_1CON ] = pI128 - > mem . rbase_g [ CRT_1CON ] ; /* 0x0058 */
iR - > i128_base_g [ CRT_2CON ] = pI128 - > mem . rbase_g [ CRT_2CON ] ; /* 0x005C */
iR - > i128_base_w [ MW0_CTRL ] = pI128 - > mem . rbase_w [ MW0_CTRL ] ; /* 0x0000 */
iR - > i128_base_w [ MW0_SZ ] = pI128 - > mem . rbase_w [ MW0_SZ ] ; /* 0x0008 */
iR - > i128_base_w [ MW0_PGE ] = pI128 - > mem . rbase_w [ MW0_PGE ] ; /* 0x000C */
iR - > i128_base_w [ MW0_ORG ] = pI128 - > mem . rbase_w [ MW0_ORG ] ; /* 0x0010 */
iR - > i128_base_w [ MW0_MSRC ] = pI128 - > mem . rbase_w [ MW0_MSRC ] ; /* 0x0018 */
iR - > i128_base_w [ MW0_WKEY ] = pI128 - > mem . rbase_w [ MW0_WKEY ] ; /* 0x001C */
iR - > i128_base_w [ MW0_KDAT ] = pI128 - > mem . rbase_w [ MW0_KDAT ] ; /* 0x0020 */
iR - > i128_base_w [ MW0_MASK ] = pI128 - > mem . rbase_w [ MW0_MASK ] ; /* 0x0024 */
if ( pI128 - > RamdacType = = TI3025_DAC ) {
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_CURS_CONTROL ; MB ;
iR - > Ti302X [ TI_CURS_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_TRUE_COLOR_CONTROL ; MB ;
iR - > Ti302X [ TI_TRUE_COLOR_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_VGA_SWITCH_CONTROL ; MB ;
iR - > Ti302X [ TI_VGA_SWITCH_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MUX_CONTROL_1 ; MB ;
iR - > Ti302X [ TI_MUX_CONTROL_1 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MUX_CONTROL_2 ; MB ;
iR - > Ti302X [ TI_MUX_CONTROL_2 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_INPUT_CLOCK_SELECT ; MB ;
iR - > Ti302X [ TI_INPUT_CLOCK_SELECT ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_OUTPUT_CLOCK_SELECT ; MB ;
iR - > Ti302X [ TI_OUTPUT_CLOCK_SELECT ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PALETTE_PAGE ; MB ;
iR - > Ti302X [ TI_PALETTE_PAGE ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_GENERAL_CONTROL ; MB ;
iR - > Ti302X [ TI_GENERAL_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MISC_CONTROL ; MB ;
iR - > Ti302X [ TI_MISC_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_AUXILIARY_CONTROL ; MB ;
iR - > Ti302X [ TI_AUXILIARY_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_GENERAL_IO_CONTROL ; MB ;
iR - > Ti302X [ TI_GENERAL_IO_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_GENERAL_IO_DATA ; MB ;
iR - > Ti302X [ TI_GENERAL_IO_DATA ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_DCLK_CONTROL ; MB ;
iR - > Ti302X [ TI_MCLK_DCLK_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_COLOR_KEY_CONTROL ; MB ;
iR - > Ti302X [ TI_COLOR_KEY_CONTROL ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x00 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PIXEL_CLOCK_PLL_DATA ; MB ;
iR - > Ti3025 [ 0 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x01 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PIXEL_CLOCK_PLL_DATA ; MB ;
iR - > Ti3025 [ 1 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x02 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PIXEL_CLOCK_PLL_DATA ; MB ;
iR - > Ti3025 [ 2 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x00 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_PLL_DATA ; MB ;
iR - > Ti3025 [ 3 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x01 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_PLL_DATA ; MB ;
iR - > Ti3025 [ 4 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x02 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_PLL_DATA ; MB ;
iR - > Ti3025 [ 5 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x00 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_LOOP_CLOCK_PLL_DATA ; MB ;
iR - > Ti3025 [ 6 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x01 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_LOOP_CLOCK_PLL_DATA ; MB ;
iR - > Ti3025 [ 7 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x02 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_LOOP_CLOCK_PLL_DATA ; MB ;
iR - > Ti3025 [ 8 ] = pI128 - > mem . rbase_g [ DATA_TI ] ;
} else if ( ( pI128 - > RamdacType = = IBM526_DAC ) | |
( pI128 - > RamdacType = = IBM528_DAC ) | |
( pI128 - > RamdacType = = SILVER_HAMMER_DAC ) ) {
CARD32 i ;
for ( i = 0 ; i < 0x94 ; i + + ) {
pI128 - > mem . rbase_g [ IDXL_I ] = i ; MB ;
iR - > IBMRGB [ i ] = pI128 - > mem . rbase_g [ DATA_I ] ;
}
}
I128SavePalette ( pI128 ) ;
if ( pI128 - > Debug )
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128SaveState complete \n " ) ;
}
void
I128RestoreState ( ScrnInfoPtr pScrn )
{
I128Ptr pI128 = I128PTR ( pScrn ) ;
I128RegPtr iR = & pI128 - > RegRec ;
if ( pI128 - > Debug )
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128RestoreState start \n " ) ;
if ( pI128 - > RamdacType = = TI3025_DAC ) {
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x00 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PIXEL_CLOCK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 0 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x01 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PIXEL_CLOCK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 1 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x02 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PIXEL_CLOCK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 2 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x00 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 3 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x01 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 4 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x02 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 5 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x00 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_LOOP_CLOCK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 6 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x01 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_LOOP_CLOCK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 7 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PLL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = 0x02 ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_LOOP_CLOCK_PLL_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti3025 [ 8 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_CURS_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_CURS_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_TRUE_COLOR_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_TRUE_COLOR_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_VGA_SWITCH_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_VGA_SWITCH_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MUX_CONTROL_1 ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_MUX_CONTROL_1 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MUX_CONTROL_2 ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_MUX_CONTROL_2 ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_INPUT_CLOCK_SELECT ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_INPUT_CLOCK_SELECT ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_OUTPUT_CLOCK_SELECT ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_OUTPUT_CLOCK_SELECT ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_PALETTE_PAGE ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_PALETTE_PAGE ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_GENERAL_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_GENERAL_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MISC_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_MISC_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_AUXILIARY_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_AUXILIARY_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_GENERAL_IO_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_GENERAL_IO_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_GENERAL_IO_DATA ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_GENERAL_IO_DATA ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_MCLK_DCLK_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_MCLK_DCLK_CONTROL ] ; MB ;
pI128 - > mem . rbase_g [ INDEX_TI ] = TI_COLOR_KEY_CONTROL ; MB ;
pI128 - > mem . rbase_g [ DATA_TI ] = iR - > Ti302X [ TI_COLOR_KEY_CONTROL ] ; MB ;
} else if ( ( pI128 - > RamdacType = = IBM526_DAC ) | |
( pI128 - > RamdacType = = IBM528_DAC ) | |
( pI128 - > RamdacType = = SILVER_HAMMER_DAC ) ) {
CARD32 i ;
if ( pI128 - > Debug ) {
unsigned long tmp1 = inl ( iR - > iobase + 0x1C ) ;
unsigned long tmp2 = inl ( iR - > iobase + 0x20 ) ;
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128RestoreState restoring, config1/2 = 0x%lx/0x%lx \n " , tmp1 , tmp2 ) ;
I128DumpActiveRegisters ( pScrn ) ;
}
for ( i = 0 ; i < 0x94 ; i + + ) {
if ( ( i = = IBMRGB_sysclk_vco_div ) | |
( i = = IBMRGB_sysclk_ref_div ) )
continue ;
pI128 - > mem . rbase_g [ IDXL_I ] = i ; MB ;
pI128 - > mem . rbase_g [ DATA_I ] = iR - > IBMRGB [ i ] ; MB ;
}
pI128 - > mem . rbase_g [ IDXL_I ] = IBMRGB_sysclk_ref_div ; MB ;
pI128 - > mem . rbase_g [ DATA_I ] =
iR - > IBMRGB [ IBMRGB_sysclk_ref_div ] ; MB ;
pI128 - > mem . rbase_g [ IDXL_I ] = IBMRGB_sysclk_vco_div ; MB ;
pI128 - > mem . rbase_g [ DATA_I ] =
iR - > IBMRGB [ IBMRGB_sysclk_vco_div ] ; MB ;
usleep ( 50000 ) ;
}
/* iobase is filled in during the device probe (as well as config 1&2)*/
if ( ( ( pI128 - > io . id & 0x7 ) > 0 ) | |
( pI128 - > Chipset = = PCI_CHIP_I128_T2R ) | |
( pI128 - > Chipset = = PCI_CHIP_I128_T2R4 ) ) {
outl ( iR - > iobase + 0x30 , iR - > vga_ctl ) ;
}
I128RestorePalette ( pI128 ) ;
pI128 - > mem . rbase_w [ MW0_CTRL ] = iR - > i128_base_w [ MW0_CTRL ] ; /* 0x0000 */
pI128 - > mem . rbase_w [ MW0_SZ ] = iR - > i128_base_w [ MW0_SZ ] ; /* 0x0008 */
pI128 - > mem . rbase_w [ MW0_PGE ] = iR - > i128_base_w [ MW0_PGE ] ; /* 0x000C */
pI128 - > mem . rbase_w [ MW0_ORG ] = iR - > i128_base_w [ MW0_ORG ] ; /* 0x0010 */
pI128 - > mem . rbase_w [ MW0_MSRC ] = iR - > i128_base_w [ MW0_MSRC ] ; /* 0x0018 */
pI128 - > mem . rbase_w [ MW0_WKEY ] = iR - > i128_base_w [ MW0_WKEY ] ; /* 0x001C */
pI128 - > mem . rbase_w [ MW0_KDAT ] = iR - > i128_base_w [ MW0_KDAT ] ; /* 0x0020 */
pI128 - > mem . rbase_w [ MW0_MASK ] = iR - > i128_base_w [ MW0_MASK ] ; /* 0x0024 */
MB ;
pI128 - > mem . rbase_g [ INT_VCNT ] = iR - > i128_base_g [ INT_VCNT ] ; /* 0x0020 */
pI128 - > mem . rbase_g [ INT_HCNT ] = iR - > i128_base_g [ INT_HCNT ] ; /* 0x0024 */
pI128 - > mem . rbase_g [ DB_ADR ] = iR - > i128_base_g [ DB_ADR ] ; /* 0x0028 */
pI128 - > mem . rbase_g [ DB_PTCH ] = iR - > i128_base_g [ DB_PTCH ] ; /* 0x002C */
pI128 - > mem . rbase_g [ CRT_HAC ] = iR - > i128_base_g [ CRT_HAC ] ; /* 0x0030 */
pI128 - > mem . rbase_g [ CRT_HBL ] = iR - > i128_base_g [ CRT_HBL ] ; /* 0x0034 */
pI128 - > mem . rbase_g [ CRT_HFP ] = iR - > i128_base_g [ CRT_HFP ] ; /* 0x0038 */
pI128 - > mem . rbase_g [ CRT_HS ] = iR - > i128_base_g [ CRT_HS ] ; /* 0x003C */
pI128 - > mem . rbase_g [ CRT_VAC ] = iR - > i128_base_g [ CRT_VAC ] ; /* 0x0040 */
pI128 - > mem . rbase_g [ CRT_VBL ] = iR - > i128_base_g [ CRT_VBL ] ; /* 0x0044 */
pI128 - > mem . rbase_g [ CRT_VFP ] = iR - > i128_base_g [ CRT_VFP ] ; /* 0x0048 */
pI128 - > mem . rbase_g [ CRT_VS ] = iR - > i128_base_g [ CRT_VS ] ; /* 0x004C */
pI128 - > mem . rbase_g [ CRT_LCNT ] = iR - > i128_base_g [ CRT_LCNT ] ; /* 0x0050 */
pI128 - > mem . rbase_g [ CRT_ZOOM ] = iR - > i128_base_g [ CRT_ZOOM ] ; /* 0x0054 */
pI128 - > mem . rbase_g [ CRT_1CON ] = iR - > i128_base_g [ CRT_1CON ] ; /* 0x0058 */
pI128 - > mem . rbase_g [ CRT_2CON ] = iR - > i128_base_g [ CRT_2CON ] ; /* 0x005C */
MB ;
if ( pI128 - > Debug ) {
unsigned long tmp1 = inl ( iR - > iobase + 0x1C ) ;
unsigned long tmp2 = inl ( iR - > iobase + 0x20 ) ;
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128RestoreState resetting config1/2 from 0x%lx/0x%lx to 0x%lx/0x%lx \n " , tmp1 , tmp2 , ( unsigned long ) iR - > config1 , ( unsigned long ) iR - > config2 ) ;
I128DumpActiveRegisters ( pScrn ) ;
}
if ( pI128 - > MemoryType = = I128_MEMORY_SGRAM ) {
outl ( iR - > iobase + 0x24 , iR - > sgram & 0x7FFFFFFF ) ;
outl ( iR - > iobase + 0x24 , iR - > sgram | 0x80000000 ) ;
}
outl ( iR - > iobase + 0x20 , iR - > config2 ) ;
outl ( iR - > iobase + 0x1C , iR - > config1 ) ;
if ( pI128 - > Debug )
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128RestoreState complete \n " ) ;
}
Bool
I128Init ( ScrnInfoPtr pScrn , DisplayModePtr mode )
{
I128Ptr pI128 ;
I128RegPtr iR ;
int pitch_multiplier , iclock ;
Bool ret ;
CARD32 tmp ;
int doubled = 1 ;
if ( mode - > Flags & V_DBLSCAN )
doubled = 2 ;
pI128 = I128PTR ( pScrn ) ;
iR = & pI128 - > RegRec ;
pI128 - > HDisplay = mode - > HDisplay ;
if ( pI128 - > Debug )
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128Init start \n " ) ;
/* config 1 and 2 were saved in Probe()
* we reset here again in case there was a VT switch
*/
outl ( iR - > iobase + 0x1C , pI128 - > io . config1 ) ;
outl ( iR - > iobase + 0x20 , pI128 - > io . config2 ) ;
if ( pI128 - > MemoryType = = I128_MEMORY_SGRAM ) {
outl ( iR - > iobase + 0x24 , pI128 - > io . sgram & 0x7FFFFFFF ) ;
outl ( iR - > iobase + 0x24 , pI128 - > io . sgram | 0x80000000 ) ;
}
if ( pI128 - > bitsPerPixel = = 32 ) pitch_multiplier = 4 ;
else if ( pI128 - > bitsPerPixel = = 16 ) pitch_multiplier = 2 ;
else pitch_multiplier = 1 ;
if ( pI128 - > RamdacType = = TI3025_DAC )
iclock = 4 ;
else if ( pI128 - > RamdacType = = IBM528_DAC )
iclock = 128 / pI128 - > bitsPerPixel ;
else if ( pI128 - > RamdacType = = SILVER_HAMMER_DAC )
iclock = 64 / pI128 - > bitsPerPixel ;
else if ( ( pI128 - > MemoryType = = I128_MEMORY_DRAM ) | |
( pI128 - > MemoryType = = I128_MEMORY_SGRAM ) )
iclock = 32 / pI128 - > bitsPerPixel ; /* IBM526 DAC 32b bus */
else
iclock = 64 / pI128 - > bitsPerPixel ; /* IBM524/526 DAC */
pI128 - > mem . rbase_g [ INT_VCNT ] = 0x00 ;
pI128 - > mem . rbase_g [ INT_HCNT ] = 0x00 ;
pI128 - > mem . rbase_g [ DB_ADR ] = pI128 - > displayOffset ;
pI128 - > mem . rbase_g [ DB_PTCH ] = pI128 - > displayWidth * pitch_multiplier ;
pI128 - > mem . rbase_g [ CRT_HAC ] = mode - > HDisplay / iclock ;
pI128 - > mem . rbase_g [ CRT_HBL ] = ( mode - > HTotal - mode - > HDisplay ) / iclock ;
pI128 - > mem . rbase_g [ CRT_HFP ] = ( mode - > HSyncStart - mode - > HDisplay ) / iclock ;
pI128 - > mem . rbase_g [ CRT_HS ] = ( mode - > HSyncEnd - mode - > HSyncStart ) / iclock ;
pI128 - > mem . rbase_g [ CRT_VAC ] = mode - > VDisplay * doubled ;
pI128 - > mem . rbase_g [ CRT_VBL ] = ( mode - > VTotal - mode - > VDisplay ) * doubled ;
pI128 - > mem . rbase_g [ CRT_VFP ] = ( mode - > VSyncStart - mode - > VDisplay ) * doubled ;
pI128 - > mem . rbase_g [ CRT_VS ] = ( mode - > VSyncEnd - mode - > VSyncStart ) * doubled ;
tmp = 0x00000070 ;
if ( pI128 - > Chipset = = PCI_CHIP_I128_T2R )
tmp | = 0x00000100 ;
if ( pI128 - > Chipset = = PCI_CHIP_I128_T2R4 ) {
if ( pI128 - > FlatPanel )
tmp | = 0x00000100 ; /* Turn on digital flat panel */
else
tmp & = 0xfffffeff ; /* Turn off digital flat panel */
}
if ( pI128 - > DACSyncOnGreen | | ( mode - > Flags & V_CSYNC ) )
tmp | = 0x00000004 ;
pI128 - > mem . rbase_g [ CRT_1CON ] = tmp ;
if ( ( pI128 - > MemoryType = = I128_MEMORY_DRAM ) | |
( pI128 - > MemoryType = = I128_MEMORY_SGRAM ) )
tmp = 0x20000100 ;
else if ( pI128 - > MemoryType = = I128_MEMORY_WRAM )
tmp = 0x00040100 ;
else {
tmp = 0x00040101 ;
if ( pI128 - > MemorySize = = 2048 )
tmp | = 0x00000002 ;
if ( ( pI128 - > displayWidth & ( pI128 - > displayWidth - 1 ) ) | |
( ( pI128 - > displayWidth * pI128 - > bitsPerPixel ) > 32768L ) )
tmp | = 0x01000000 ; /* split transfer */
}
pI128 - > mem . rbase_g [ CRT_2CON ] = tmp ;
if ( mode - > Flags & V_DBLSCAN )
pI128 - > DoubleScan = TRUE ;
else
pI128 - > DoubleScan = FALSE ;
pI128 - > mem . rbase_g [ CRT_ZOOM ] = ( pI128 - > DoubleScan ? 0x00000001 : 0x00000000 ) ;
2012-05-14 14:16:06 -06:00
switch ( pI128 - > bitsPerPixel ) {
# if X_BYTE_ORDER == X_BIG_ENDIAN
case 32 :
pI128 - > mem . rbase_w [ MW0_CTRL ] = 0x00060000 ;
break ;
case 16 :
pI128 - > mem . rbase_w [ MW0_CTRL ] = 0x00020000 ;
break ;
# endif
default :
pI128 - > mem . rbase_w [ MW0_CTRL ] = 0x00000000 ;
break ;
}
2006-11-26 13:04:28 -07:00
switch ( pI128 - > MemorySize ) {
case 2048 :
pI128 - > mem . rbase_w [ MW0_SZ ] = 0x00000009 ;
break ;
case 8192 :
pI128 - > mem . rbase_w [ MW0_SZ ] = 0x0000000B ;
break ;
case 8192 + 4096 :
/* no break */
case 16384 :
pI128 - > mem . rbase_w [ MW0_SZ ] = 0x0000000C ;
break ;
case 16384 + 4096 :
/* no break */
case 16384 + 8192 :
/* no break */
case 16384 + 8192 + 4096 :
/* no break */
case 32768 :
pI128 - > mem . rbase_w [ MW0_SZ ] = 0x0000000D ;
break ;
case 4096 :
/* no break */
default :
pI128 - > mem . rbase_w [ MW0_SZ ] = 0x0000000A ; /* default 4MB */
break ;
}
pI128 - > mem . rbase_w [ MW0_PGE ] = 0x00000000 ;
pI128 - > mem . rbase_w [ MW0_ORG ] = 0x00000000 ;
pI128 - > mem . rbase_w [ MW0_MSRC ] = 0x00000000 ;
pI128 - > mem . rbase_w [ MW0_WKEY ] = 0x00000000 ;
pI128 - > mem . rbase_w [ MW0_KDAT ] = 0x00000000 ;
pI128 - > mem . rbase_w [ MW0_MASK ] = 0xFFFFFFFF ;
MB ;
if ( ( pI128 - > io . id & 0x7 ) > 0 | | pI128 - > Chipset = = PCI_CHIP_I128_T2R
| | pI128 - > Chipset = = PCI_CHIP_I128_T2R4 ) {
pI128 - > io . vga_ctl & = 0x0000FF00 ;
pI128 - > io . vga_ctl | = 0x00000082 ;
if ( pI128 - > FlatPanel & & ( mode - > Flags & V_DBLSCAN ) )
pI128 - > io . vga_ctl | = 0x00000020 ; /* Stretch horizontally */
outl ( iR - > iobase + 0x30 , pI128 - > io . vga_ctl ) ;
if ( pI128 - > Chipset = = PCI_CHIP_I128_T2R4 ) {
outl ( iR - > iobase + 0x24 , 0x211BF030 ) ;
usleep ( 5000 ) ;
outl ( iR - > iobase + 0x24 , 0xA11BF030 ) ;
} else if ( pI128 - > MemoryType = = I128_MEMORY_SGRAM ) {
outl ( iR - > iobase + 0x24 , 0x21089030 ) ;
usleep ( 5000 ) ;
outl ( iR - > iobase + 0x24 , 0xA1089030 ) ;
}
}
ret = pI128 - > ProgramDAC ( pScrn , mode ) ;
pI128 - > InitCursorFlag = TRUE ;
pI128 - > Initialized = 1 ;
if ( pI128 - > Debug )
xf86DrvMsg ( pScrn - > scrnIndex , X_PROBED , " I128Init complete \n " ) ;
return ( ret ) ;
}
static void
I128SavePalette ( I128Ptr pI128 )
{
short i ;
pI128 - > mem . rbase_g [ PEL_MASK ] = 0xff ; MB ;
if ( ! pI128 - > LUTSaved ) {
pI128 - > mem . rbase_g [ RD_ADR ] = 0x00 ; MB ;
for ( i = 0 ; i < 256 ; i + + ) {
pI128 - > lutorig [ i ] . r = pI128 - > mem . rbase_g [ PAL_DAT ] ; MB ;
pI128 - > lutorig [ i ] . g = pI128 - > mem . rbase_g [ PAL_DAT ] ; MB ;
pI128 - > lutorig [ i ] . b = pI128 - > mem . rbase_g [ PAL_DAT ] ; MB ;
}
pI128 - > LUTSaved = TRUE ;
}
}
static void
I128RestorePalette ( I128Ptr pI128 )
{
int i ;
/* restore the LUT */
pI128 - > mem . rbase_g [ PEL_MASK ] = 0xff ; MB ;
pI128 - > mem . rbase_g [ WR_ADR ] = 0x00 ; MB ;
for ( i = 0 ; i < 256 ; i + + ) {
pI128 - > mem . rbase_g [ PAL_DAT ] = pI128 - > lutorig [ i ] . r ; MB ;
pI128 - > mem . rbase_g [ PAL_DAT ] = pI128 - > lutorig [ i ] . g ; MB ;
pI128 - > mem . rbase_g [ PAL_DAT ] = pI128 - > lutorig [ i ] . b ; MB ;
}
}
void
I128LoadPalette ( ScrnInfoPtr pScrn , int numColors , int * indices , LOCO * colors ,
VisualPtr pVisual )
{
I128Ptr pI128 ;
if ( pVisual - > nplanes ! = 8 )
return ;
pI128 = I128PTR ( pScrn ) ;
pI128 - > mem . rbase_g [ PEL_MASK ] = 0xff ; MB ;
while ( numColors - - ) {
pI128 - > mem . rbase_g [ WR_ADR ] = * indices ; MB ;
pI128 - > mem . rbase_g [ PAL_DAT ] = colors [ * indices ] . red ; MB ;
pI128 - > mem . rbase_g [ PAL_DAT ] = colors [ * indices ] . green ; MB ;
pI128 - > mem . rbase_g [ PAL_DAT ] = colors [ * indices ] . blue ; MB ;
indices + + ;
}
}