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
*
@ -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

View File

@ -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;

View File

@ -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)
{

View File

@ -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);

View File

@ -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
}