kdrive: add apm support, fix MTRR unmapping bug
This commit is contained in:
		
							parent
							
								
									b7eb8a35b5
								
							
						
					
					
						commit
						958c0374a6
					
				| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
/*
 | 
			
		||||
 * $XFree86$
 | 
			
		||||
 * $XFree86: xc/programs/Xserver/hw/kdrive/linux/linux.c,v 1.5 2001/03/30 02:15:20 keithp Exp $
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright © 1999 Keith Packard
 | 
			
		||||
 *
 | 
			
		||||
| 
						 | 
				
			
			@ -30,9 +30,11 @@
 | 
			
		|||
#include <sys/stat.h>
 | 
			
		||||
#include <sys/ioctl.h>
 | 
			
		||||
#include <keysym.h>
 | 
			
		||||
#include <linux/apm_bios.h>
 | 
			
		||||
 | 
			
		||||
static int  vtno;
 | 
			
		||||
int  LinuxConsoleFd;
 | 
			
		||||
int  LinuxApmFd = -1;
 | 
			
		||||
static int  activeVT;
 | 
			
		||||
static Bool enabled;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -255,6 +257,65 @@ LinuxSetSwitchMode (int mode)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
LinuxApmBlock (pointer blockData, OSTimePtr pTimeout, pointer pReadmask)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Bool LinuxApmRunning;
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
LinuxApmWakeup (pointer blockData, int result, pointer pReadmask)
 | 
			
		||||
{
 | 
			
		||||
    fd_set  *readmask = (fd_set *) pReadmask;
 | 
			
		||||
 | 
			
		||||
    if (result > 0 && LinuxApmFd >= 0 && FD_ISSET (LinuxApmFd, readmask))
 | 
			
		||||
    {
 | 
			
		||||
	apm_event_t event;
 | 
			
		||||
	Bool	    running = LinuxApmRunning;
 | 
			
		||||
	int	    cmd = APM_IOC_SUSPEND;
 | 
			
		||||
 | 
			
		||||
	while (read (LinuxApmFd, &event, sizeof (event)) == sizeof (event))
 | 
			
		||||
	{
 | 
			
		||||
	    switch (event) {
 | 
			
		||||
	    case APM_SYS_STANDBY:
 | 
			
		||||
	    case APM_USER_STANDBY:
 | 
			
		||||
		running = FALSE;
 | 
			
		||||
		cmd = APM_IOC_STANDBY;
 | 
			
		||||
		break;
 | 
			
		||||
	    case APM_SYS_SUSPEND:
 | 
			
		||||
	    case APM_USER_SUSPEND:
 | 
			
		||||
	    case APM_CRITICAL_SUSPEND:
 | 
			
		||||
		running = FALSE;
 | 
			
		||||
		cmd = APM_IOC_SUSPEND;
 | 
			
		||||
		break;
 | 
			
		||||
	    case APM_NORMAL_RESUME:
 | 
			
		||||
	    case APM_CRITICAL_RESUME:
 | 
			
		||||
	    case APM_STANDBY_RESUME:
 | 
			
		||||
		running = TRUE;
 | 
			
		||||
		break;
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
	if (running && !LinuxApmRunning)
 | 
			
		||||
	{
 | 
			
		||||
	    KdResume ();
 | 
			
		||||
	    LinuxApmRunning = TRUE;
 | 
			
		||||
	}
 | 
			
		||||
	else if (!running && LinuxApmRunning)
 | 
			
		||||
	{
 | 
			
		||||
	    KdSuspend ();
 | 
			
		||||
	    LinuxApmRunning = FALSE;
 | 
			
		||||
	    ioctl (LinuxApmFd, cmd, 0);
 | 
			
		||||
	}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef FNONBLOCK
 | 
			
		||||
#define NOBLOCK FNONBLOCK
 | 
			
		||||
#else
 | 
			
		||||
#define NOBLOCK FNDELAY
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
LinuxEnable (void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -265,6 +326,18 @@ LinuxEnable (void)
 | 
			
		|||
	kdSwitchPending = FALSE;
 | 
			
		||||
	ioctl (LinuxConsoleFd, VT_RELDISP, VT_ACKACQ);
 | 
			
		||||
    }
 | 
			
		||||
    /*
 | 
			
		||||
     * Open the APM driver
 | 
			
		||||
     */
 | 
			
		||||
    LinuxApmFd = open ("/dev/apm_bios", 0);
 | 
			
		||||
    if (LinuxApmFd >= 0)
 | 
			
		||||
    {
 | 
			
		||||
	LinuxApmRunning = TRUE;
 | 
			
		||||
	fcntl (LinuxApmFd, F_SETFL, fcntl (LinuxApmFd, F_GETFL) | NOBLOCK);
 | 
			
		||||
	RegisterBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0);
 | 
			
		||||
	AddEnabledDevice (LinuxApmFd);
 | 
			
		||||
    }
 | 
			
		||||
	
 | 
			
		||||
    /*
 | 
			
		||||
     * now get the VT
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -314,6 +387,13 @@ LinuxDisable (void)
 | 
			
		|||
	ioctl (LinuxConsoleFd, VT_RELDISP, 1);
 | 
			
		||||
    }
 | 
			
		||||
    enabled = FALSE;
 | 
			
		||||
    if (LinuxApmFd >= 0)
 | 
			
		||||
    {
 | 
			
		||||
	RemoveBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0);
 | 
			
		||||
	RemoveEnabledDevice (LinuxApmFd);
 | 
			
		||||
	close (LinuxApmFd);
 | 
			
		||||
	LinuxApmFd = -1;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@
 | 
			
		|||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.c,v 1.6 2001/07/20 19:35:30 keithp Exp $ */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.c,v 1.7 2001/07/24 19:06:03 keithp Exp $ */
 | 
			
		||||
 | 
			
		||||
#include "mach64.h"
 | 
			
		||||
#include <sys/io.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -215,10 +215,10 @@ mach64UnmapReg (KdCardInfo *card, Mach64CardInfo *mach64c)
 | 
			
		|||
{
 | 
			
		||||
    if (mach64c->reg_base)
 | 
			
		||||
    {
 | 
			
		||||
	KdUnmapDevice ((void *) mach64c->reg_base, MACH64_REG_SIZE(card));
 | 
			
		||||
	KdResetMappedMode (MACH64_REG_BASE(card),
 | 
			
		||||
			   MACH64_REG_SIZE(card),
 | 
			
		||||
			   KD_MAPPED_MODE_REGISTERS);
 | 
			
		||||
	KdUnmapDevice ((void *) mach64c->reg_base, MACH64_REG_SIZE(card));
 | 
			
		||||
	mach64c->reg_base = 0;
 | 
			
		||||
	mach64c->reg = 0;
 | 
			
		||||
	mach64c->media_reg = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@
 | 
			
		|||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.17 2001/06/13 19:18:03 keithp Exp $ */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.18 2001/07/20 19:35:29 keithp Exp $ */
 | 
			
		||||
 | 
			
		||||
#include "kdrive.h"
 | 
			
		||||
#ifdef PSEUDO8
 | 
			
		||||
| 
						 | 
				
			
			@ -233,6 +233,45 @@ KdDisableScreens (void)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
KdSuspend (void)
 | 
			
		||||
{
 | 
			
		||||
    KdCardInfo	    *card;
 | 
			
		||||
    KdScreenInfo    *screen;
 | 
			
		||||
 | 
			
		||||
    if (kdEnabled)
 | 
			
		||||
    {
 | 
			
		||||
	for (card = kdCardInfo; card; card = card->next)
 | 
			
		||||
	{
 | 
			
		||||
	    for (screen = card->screenList; screen; screen = screen->next)
 | 
			
		||||
		if (screen->mynum == card->selected && screen->pScreen)
 | 
			
		||||
		    KdDisableScreen (screen->pScreen);
 | 
			
		||||
	    if (card->driver)
 | 
			
		||||
		(*card->cfuncs->restore) (card);
 | 
			
		||||
	}
 | 
			
		||||
	KdDisableInput ();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
KdResume (void)
 | 
			
		||||
{
 | 
			
		||||
    KdCardInfo	    *card;
 | 
			
		||||
    KdScreenInfo    *screen;
 | 
			
		||||
 | 
			
		||||
    if (kdEnabled)
 | 
			
		||||
    {
 | 
			
		||||
	for (card = kdCardInfo; card; card = card->next)
 | 
			
		||||
	{
 | 
			
		||||
	    (*card->cfuncs->preserve) (card);
 | 
			
		||||
	    for (screen = card->screenList; screen; screen = screen->next)
 | 
			
		||||
		if (screen->mynum == card->selected && screen->pScreen)
 | 
			
		||||
		    KdEnableScreen (screen->pScreen);
 | 
			
		||||
	}
 | 
			
		||||
	KdEnableInput ();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Bool
 | 
			
		||||
KdEnableScreen (ScreenPtr pScreen)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@
 | 
			
		|||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.h,v 1.17 2001/07/11 02:58:19 keithp Exp $ */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.h,v 1.18 2001/07/20 19:35:29 keithp Exp $ */
 | 
			
		||||
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include "X.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -465,6 +465,12 @@ KdEnableScreen (ScreenPtr pScreen);
 | 
			
		|||
void
 | 
			
		||||
KdEnableScreens (void);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
KdSuspend (void);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
KdResume (void);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
KdProcessSwitch (void);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@
 | 
			
		|||
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
			
		||||
 * PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/kmap.c,v 1.8 2001/05/23 08:56:08 alanh Exp $ */
 | 
			
		||||
/* $XFree86: xc/programs/Xserver/hw/kdrive/kmap.c,v 1.9 2001/06/29 13:57:45 keithp Exp $ */
 | 
			
		||||
 | 
			
		||||
#include "kdrive.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -135,7 +135,9 @@ KdSetMappedMode (CARD32 addr, CARD32 size, int mode)
 | 
			
		|||
	sentry.size = bound - base;
 | 
			
		||||
	sentry.type = type;
 | 
			
		||||
	
 | 
			
		||||
	ioctl (mtrr, MTRRIOC_ADD_ENTRY, &sentry);
 | 
			
		||||
	if (ioctl (mtrr, MTRRIOC_ADD_ENTRY, &sentry) < 0)
 | 
			
		||||
	    ErrorF ("MTRRIOC_ADD_ENTRY failed 0x%x 0x%x %d (errno %d)\n",
 | 
			
		||||
		    base, bound - base, type, errno);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -154,7 +156,7 @@ KdResetMappedMode (CARD32 addr, CARD32 size, int mode)
 | 
			
		|||
	mtrr = open ("/proc/mtrr", 2);
 | 
			
		||||
    if (mtrr > 0)
 | 
			
		||||
    {
 | 
			
		||||
	base = addr & ~((1<22)-1);
 | 
			
		||||
	base = addr & ~((1<<22)-1);
 | 
			
		||||
	bound = ((addr + size) + ((1<<22) - 1)) & ~((1<<22) - 1);
 | 
			
		||||
	switch (mode) {
 | 
			
		||||
	case KD_MAPPED_MODE_REGISTERS:
 | 
			
		||||
| 
						 | 
				
			
			@ -168,7 +170,9 @@ KdResetMappedMode (CARD32 addr, CARD32 size, int mode)
 | 
			
		|||
	sentry.size = bound - base;
 | 
			
		||||
	sentry.type = type;
 | 
			
		||||
	
 | 
			
		||||
	ioctl (mtrr, MTRRIOC_DEL_ENTRY, &sentry);
 | 
			
		||||
	if (ioctl (mtrr, MTRRIOC_DEL_ENTRY, &sentry) < 0)
 | 
			
		||||
	    ErrorF ("MTRRIOC_DEL_ENTRY failed 0x%x 0x%x %d (errno %d)\n",
 | 
			
		||||
		    base, bound - base, type, errno);
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue