diff options
Diffstat (limited to 'xorg-server/hw/kdrive/via/via.c')
-rw-r--r-- | xorg-server/hw/kdrive/via/via.c | 435 |
1 files changed, 435 insertions, 0 deletions
diff --git a/xorg-server/hw/kdrive/via/via.c b/xorg-server/hw/kdrive/via/via.c new file mode 100644 index 000000000..b8e1036aa --- /dev/null +++ b/xorg-server/hw/kdrive/via/via.c @@ -0,0 +1,435 @@ +/* + * Copyright © 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 */ +}; + |