436 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			436 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * 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 */
 | |
| };
 | |
| 
 |