kdrive: add apm support, fix MTRR unmapping bug

This commit is contained in:
Keith Packard 2001-07-24 21:26:17 +00:00
parent b7eb8a35b5
commit 958c0374a6
5 changed files with 138 additions and 9 deletions

View File

@ -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 * Copyright © 1999 Keith Packard
* *
@ -30,9 +30,11 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <keysym.h> #include <keysym.h>
#include <linux/apm_bios.h>
static int vtno; static int vtno;
int LinuxConsoleFd; int LinuxConsoleFd;
int LinuxApmFd = -1;
static int activeVT; static int activeVT;
static Bool enabled; 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 void
LinuxEnable (void) LinuxEnable (void)
{ {
@ -265,6 +326,18 @@ LinuxEnable (void)
kdSwitchPending = FALSE; kdSwitchPending = FALSE;
ioctl (LinuxConsoleFd, VT_RELDISP, VT_ACKACQ); 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 * now get the VT
*/ */
@ -314,6 +387,13 @@ LinuxDisable (void)
ioctl (LinuxConsoleFd, VT_RELDISP, 1); ioctl (LinuxConsoleFd, VT_RELDISP, 1);
} }
enabled = FALSE; enabled = FALSE;
if (LinuxApmFd >= 0)
{
RemoveBlockAndWakeupHandlers (LinuxApmBlock, LinuxApmWakeup, 0);
RemoveEnabledDevice (LinuxApmFd);
close (LinuxApmFd);
LinuxApmFd = -1;
}
} }
void void

View File

@ -19,7 +19,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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 "mach64.h"
#include <sys/io.h> #include <sys/io.h>
@ -215,10 +215,10 @@ mach64UnmapReg (KdCardInfo *card, Mach64CardInfo *mach64c)
{ {
if (mach64c->reg_base) if (mach64c->reg_base)
{ {
KdUnmapDevice ((void *) mach64c->reg_base, MACH64_REG_SIZE(card));
KdResetMappedMode (MACH64_REG_BASE(card), KdResetMappedMode (MACH64_REG_BASE(card),
MACH64_REG_SIZE(card), MACH64_REG_SIZE(card),
KD_MAPPED_MODE_REGISTERS); KD_MAPPED_MODE_REGISTERS);
KdUnmapDevice ((void *) mach64c->reg_base, MACH64_REG_SIZE(card));
mach64c->reg_base = 0; mach64c->reg_base = 0;
mach64c->reg = 0; mach64c->reg = 0;
mach64c->media_reg = 0; mach64c->media_reg = 0;

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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" #include "kdrive.h"
#ifdef PSEUDO8 #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 Bool
KdEnableScreen (ScreenPtr pScreen) KdEnableScreen (ScreenPtr pScreen)
{ {

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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 <stdio.h>
#include "X.h" #include "X.h"
@ -465,6 +465,12 @@ KdEnableScreen (ScreenPtr pScreen);
void void
KdEnableScreens (void); KdEnableScreens (void);
void
KdSuspend (void);
void
KdResume (void);
void void
KdProcessSwitch (void); KdProcessSwitch (void);

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * 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" #include "kdrive.h"
@ -135,7 +135,9 @@ KdSetMappedMode (CARD32 addr, CARD32 size, int mode)
sentry.size = bound - base; sentry.size = bound - base;
sentry.type = type; 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 #endif
} }
@ -154,7 +156,7 @@ KdResetMappedMode (CARD32 addr, CARD32 size, int mode)
mtrr = open ("/proc/mtrr", 2); mtrr = open ("/proc/mtrr", 2);
if (mtrr > 0) if (mtrr > 0)
{ {
base = addr & ~((1<22)-1); base = addr & ~((1<<22)-1);
bound = ((addr + size) + ((1<<22) - 1)) & ~((1<<22) - 1); bound = ((addr + size) + ((1<<22) - 1)) & ~((1<<22) - 1);
switch (mode) { switch (mode) {
case KD_MAPPED_MODE_REGISTERS: case KD_MAPPED_MODE_REGISTERS:
@ -168,7 +170,9 @@ KdResetMappedMode (CARD32 addr, CARD32 size, int mode)
sentry.size = bound - base; sentry.size = bound - base;
sentry.type = type; 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 #endif
} }