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 */
 | 
						|
};
 | 
						|
 |