xenocara/xserver/hw/kdrive/via/via.c

436 lines
9.4 KiB
C
Raw Normal View History

2006-11-26 11:13:41 -07:00
/*
* Copyright <EFBFBD> 2004 Ralph Thomas
*
* 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 Ralph Thomas not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Ralph Thomas makes no
* representations about the suitability of this software for any purpose. It
* is provided "as is" without express or implied warranty.
*
* RALPH THOMAS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
* EVENT SHALL RALPH THOMAS 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.
*/
/*
** VIA CLE266 driver
** Copyright 2004 (C) Ralph Thomas <ralpht@gmail.com>
**
** http://www.viatech.com.tw/
*/
#include "via.h"
#include "viadraw.h"
/*
** viaCardInit( KdCardInfo* card )
**
** Description:
** Create card specific structures, map chip registers and initialize the
** VESA driver. We make the VESA driver do boring stuff for us, like set
** up a framebuffer and program a mode.
**
** Parameters:
** card Information stucture for the card we want to bring up.
** It should be a VIA card.
**
** Return:
** TRUE Initialization went ok.
** FALSE Initialization failed.
*/
static Bool
viaCardInit( KdCardInfo* card ) {
ViaCardInfo* viac;
viac = (ViaCardInfo*) xalloc( sizeof( ViaCardInfo ) );
if( !viac ) return FALSE;
memset( viac, '\0', sizeof( ViaCardInfo ) );
viaMapReg( card, viac );
if( !vesaInitialize( card, &viac->vesa ) ) {
xfree( viac );
return FALSE;
}
card->driver = viac;
return TRUE;
}
/*
** Bool viaScreenInit( KdScreenInfo* screen )
**
** Description:
** Initialize a single screen, described by the screen parameter.
** This is where fairly low-level screen related things get setup,
** such as video mode and resolution. Currently that all gets
** handed off to the VESA driver.
**
** Parameters:
** screen Information structure for the screen to enable.
**
** Return:
** TRUE Screen was initialized successfully
** FALSE Screen initialization failed
*/
static Bool
viaScreenInit( KdScreenInfo* screen ) {
ViaCardInfo* viac = screen->card->driver;
ViaScreenInfo* vias;
vias = (ViaScreenInfo*) xalloc( sizeof( ViaScreenInfo ) );
if( !vias ) return FALSE;
memset( vias, '\0', sizeof( ViaScreenInfo ) );
if( !vesaScreenInitialize( screen, &vias->vesa ) ) {
xfree( vias );
return FALSE;
}
/*
** XXX: What does this do?
*/
if( !viac->mapBase )
screen->dumb = TRUE;
if( vias->vesa.mapping != VESA_LINEAR )
screen->dumb = TRUE;
screen->driver = vias;
return TRUE;
}
/*
** Bool viaInitScreen( ScreenPtr pScreen )
**
** Description:
** High level screen initialization occurs here. We could register XV
** adaptors, etc, here.
**
** Arguments:
** pScreen X screen information
**
** Return:
** TRUE Initialization was successful,
** FALSE Initialization failed.
*/
static Bool
viaInitScreen( ScreenPtr pScreen ) {
return vesaInitScreen( pScreen );
}
/*
** Bool viaFinishInitScreen
**
** Description:
** Finish up any high-level screen initialization. Per-Screen extension
** initialization can be done here.
**
** Arguments:
** pScreen X screen information
**
** Return:
** TRUE Initialization was successful.
** FALSE Initialization failed.
*/
static Bool
viaFinishInitScreen( ScreenPtr pScreen ) {
return vesaFinishInitScreen( pScreen );
}
/*
** Bool viaCreateResources( ScreenPtr pScreen )
**
** Description:
** Do any screen specific configuration.
**
** Arguments:
** pScreen X screen information
**
** Return:
** TRUE configuration was successful.
** FALSE configuration failed.
*/
static Bool
viaCreateResources( ScreenPtr pScreen ) {
return vesaCreateResources( pScreen );
}
/*
** void viaPreserve( KdCardInfo* card )
**
** Description:
** Save the current state of the chip, so that it can be restored by
** viaRestore at a later time.
**
** Arguments:
** card Information structure for the chip we want to preserve the
** state of.
**
** Return:
** None.
**
** See Also:
** viaRestore
*/
static void
viaPreserve( KdCardInfo* card ) {
vesaPreserve( card );
}
/*
** void viaRestore( KdCardInfo* card )
**
** Description:
** Restore the previous state of the chip, as saved by viaPreserve
** earlier.
**
** Arguments:
** card Information structure for the chip we want to restore the
** state of.
**
** Return:
** None.
**
** See Also:
** viaPreserve
*/
static void viaRestore( KdCardInfo* card ) {
ViaCardInfo* viac = card->driver;
viaResetMMIO( card, viac );
vesaRestore( card );
}
/*
** Bool viaEnable( ScreenPtr pScreen )
**
** Description:
** This is where we set the card up for drawing the specified screen, e.g.:
** set the mode and mmap the framebuffer.
**
** Arguments:
** pScreen X screen information
**
** Return:
** TRUE the screen was enabled
** FALSE the screen could not be enabled
*/
static Bool
viaEnable( ScreenPtr pScreen ) {
KdScreenPriv( pScreen );
ViaCardInfo* viac = pScreenPriv->card->driver;
if( !vesaEnable( pScreen ) ) return FALSE;
viaSetMMIO( pScreenPriv->card, viac );
if( !viac->mapBase ) {
ErrorF( "Could not map CLE266 graphics registers" );
return FALSE;
}
return TRUE;
}
/*
** void viaDisable( ScreenPtr pScreen )
**
** Description:
** Shut down drawing: save some state and unmap the framebuffer.
**
** Arguments:
** pScreen X screen information
**
** Return:
** None.
*/
static void
viaDisable( ScreenPtr pScreen ) {
KdScreenPriv( pScreen );
ViaCardInfo* viac = pScreenPriv->card->driver;
viaResetMMIO( pScreenPriv->card, viac );
vesaDisable( pScreen );
}
/*
** void viaScreenFini( KdScreenInfo* screen )
**
** Description:
** Release memory and resources allocated by viaScreenInit.
**
** Arguments:
** screen Information structure for the screen to release.
**
** Return:
** None.
**
** See Also:
** viaScreenInit
*/
static void
viaScreenFini( KdScreenInfo* screen ) {
ViaScreenInfo* vias = screen->driver;
vesaScreenFini( screen );
xfree( vias );
screen->driver = 0;
}
/*
** void viaCardFini( KdCardInfo* card )
**
** Description:
** Release memory and resources allocated by viaCardInit.
**
** Arguments:
** card Information structure for the chip to release.
**
** Return:
** None.
**
** See Also:
** viaCardInit
*/
static void
viaCardFini( KdCardInfo* card ) {
ViaCardInfo* viac = card->driver;
viaUnmapReg( card, viac );
vesaCardFini( card );
xfree( viac );
}
/*
** void viaSetMMIO( KdCardInfo* card, ViaCardInfo* viac )
**
** Description:
** Map the card's registers, if they're not already
** mapped.
**
** Arguments:
** card generic chip information
** viac VIA-driver specific chip information
**
** Return:
** None.
*/
void viaSetMMIO( KdCardInfo* card, ViaCardInfo* viac ) {
if( !viac->mapBase ) viaMapReg( card, viac );
}
/*
** void viaResetMMIO( KdCardInfo* card, ViaCardInfo* viac )
**
** Description:
** Unmap chip's registers.
**
** Arguments:
** card generic chip information
** viac VIA-driver specific chip information
**
** Return:
** None.
*/
void viaResetMMIO( KdCardInfo* card, ViaCardInfo* viac ) {
viaUnmapReg( card, viac );
}
/*
** Bool viaMapReg( KdCardInfo* card, ViaCardInfo* viac )
**
** Description:
** Map the chip's registers into our address space.
**
** Arguments:
** card the card information
** viac the VIA-driver specific card information
**
** Return:
** TRUE the registers were succesfully mapped
** FALSE the registers could not be mapped
*/
Bool
viaMapReg( KdCardInfo* card, ViaCardInfo* viac ) {
viac->mapBase = (VOL8*) KdMapDevice( VIA_REG_BASE( card ),
VIA_REG_SIZE( card ) );
if( !viac->mapBase ) {
ErrorF( "Couldn't allocate viac->mapBase\n" );
return FALSE;
}
KdSetMappedMode( VIA_REG_BASE( card ), VIA_REG_SIZE( card ),
KD_MAPPED_MODE_REGISTERS );
/*
** Enable extended IO space
*/
VGAOUT8( 0x3C4, 0x10 );
VGAOUT8( 0x3C5, 0x01 );
return TRUE;
}
/*
** void viaUnmapReg( KdCardInfo* card, ViaCardInfo* viac )
**
** Description:
** Unmap the the chip's registers.
**
** Arguments:
** card the card information
** viac the VIA-driver specific card information
**
** Return:
** None.
*/
void
viaUnmapReg( KdCardInfo* card, ViaCardInfo* viac ) {
if( !viac->mapBase ) return;
KdResetMappedMode( VIA_REG_BASE( card ), VIA_REG_SIZE( card ),
KD_MAPPED_MODE_REGISTERS );
KdUnmapDevice( (void*) viac->mapBase, VIA_REG_SIZE( card ) );
viac->mapBase = 0;
}
KdCardFuncs viaFuncs = {
viaCardInit, /* cardinit */
viaScreenInit, /* scrinit */
viaInitScreen, /* initScreen */
viaFinishInitScreen, /* finishInitScreen */
viaCreateResources, /* createRes */
viaPreserve, /* preserve */
viaEnable, /* enable */
vesaDPMS, /* dpms */
viaDisable, /* disable */
viaRestore, /* restore */
viaScreenFini, /* scrfini */
viaCardFini, /* cardfini */
0, /* initCursor */
0, /* enableCursor */
0, /* disableCursor */
0, /* finiCursor */
0, /* recolorCursor */
viaDrawInit, /* initAccel */
viaDrawEnable, /* enableAccel */
viaDrawDisable, /* disableAccel */
viaDrawFini, /* finiAccel */
vesaGetColors, /* getColors */
vesaPutColors, /* putColors */
};