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