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
|
* 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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue