xserver: Branch 'master'

Alan Coopersmith alanc at kemper.freedesktop.org
Thu Mar 1 03:41:08 EET 2007


 hw/xfree86/os-support/solaris/Makefile.am |    4 
 hw/xfree86/os-support/solaris/sun_apm.c   |  232 ++++++++++++++++++++++++++++++
 2 files changed, 234 insertions(+), 2 deletions(-)

New commits:
diff-tree 90ca76ba28fcd8bed945e33cf9674784fa2eb533 (from 06c3021aec720837bef432656e88ae9b4e35101d)
Author: Jay Cotton <jay.cotton at sun.com>
Date:   Wed Feb 28 17:40:58 2007 -0800

    Add sun_apm.c for Suspend-and-Resume support on Solaris
    
    <http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6205248>

diff --git a/hw/xfree86/os-support/solaris/Makefile.am b/hw/xfree86/os-support/solaris/Makefile.am
index 57ec89e..d01e2e6 100644
--- a/hw/xfree86/os-support/solaris/Makefile.am
+++ b/hw/xfree86/os-support/solaris/Makefile.am
@@ -19,9 +19,9 @@ solaris-$(SOLARIS_INOUT_ARCH).il: solari
 
 noinst_LTLIBRARIES = libsolaris.la
 libsolaris_la_SOURCES = sun_bios.c sun_init.c \
-	sun_mouse.c sun_vid.c sun_bell.c $(AGP_SRC) \
+	sun_mouse.c sun_vid.c sun_bell.c $(AGP_SRC) sun_apm.c \
 	$(srcdir)/../shared/libc_wrapper.c \
-	$(srcdir)/../shared/kmod_noop.c $(srcdir)/../shared/pm_noop.c \
+	$(srcdir)/../shared/kmod_noop.c \
 	$(srcdir)/../shared/posix_tty.c $(srcdir)/../shared/sigiostubs.c \
 	$(srcdir)/../shared/stdPci.c $(srcdir)/../shared/stdResource.c \
 	$(VTSW_SRC)
diff --git a/hw/xfree86/os-support/solaris/sun_apm.c b/hw/xfree86/os-support/solaris/sun_apm.c
new file mode 100644
index 0000000..a9657fd
--- /dev/null
+++ b/hw/xfree86/os-support/solaris/sun_apm.c
@@ -0,0 +1,232 @@
+/* Based on hw/xfree86/os-support/bsd/bsd_apm.c which bore no explicit
+ * copyright notice, so is covered by the following notice:
+ *
+ * Copyright (C) 1994-2003 The XFree86 Project, Inc.  All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the XFree86 Project shall
+ * not be used in advertising or otherwise to promote the sale, use or other
+ * dealings in this Software without prior written authorization from the
+ * XFree86 Project.
+ */
+
+/* Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+#include "os.h"
+#include "xf86.h"
+#include "xf86Priv.h"
+#define XF86_OS_PRIVS
+#include "xf86_OSproc.h"
+#include "xf86_OSlib.h"
+
+#ifndef PLEASE_FIX_THIS
+#define APM_STANDBY_REQ 0xa01
+#define APM_SUSPEND_REQ 0xa02
+#define APM_NORMAL_RESUME 0xa03
+#define APM_CRIT_RESUME 0xa04
+#define APM_BATTERY_LOW 0xa05
+#define APM_POWER_CHANGE 0xa06
+#define APM_UPDATE_TIME 0xa07
+#define APM_CRIT_SUSPEND_REQ 0xa08
+#define APM_USER_STANDBY_REQ 0xa09
+#define APM_USER_SUSPEND_REQ 0xa0a
+#define APM_SYS_STANDBY_RESUME 0xa0b
+#define APM_IOC_NEXTEVENT 0xa0c
+#define APM_IOC_RESUME 0xa0d
+#define APM_IOC_SUSPEND 0xa0e
+#define APM_IOC_STANDBY 0xa0f
+#endif
+
+typedef struct apm_event_info 
+{
+	int	type;
+} apm_event_info;
+
+/*
+ This may be replaced with a better device name
+ very soon...
+*/
+#define APM_DEVICE "/dev/srn"
+#define APM_DEVICE1 "/dev/apm"
+
+static pointer APMihPtr = NULL;
+static void sunCloseAPM(void);
+
+static struct {
+    u_int apmBsd;
+    pmEvent xf86;
+} sunToXF86Array [] = {
+    { APM_STANDBY_REQ, XF86_APM_SYS_STANDBY },
+    { APM_SUSPEND_REQ, XF86_APM_SYS_SUSPEND },
+    { APM_NORMAL_RESUME, XF86_APM_NORMAL_RESUME },
+    { APM_CRIT_RESUME, XF86_APM_CRITICAL_RESUME },
+    { APM_BATTERY_LOW, XF86_APM_LOW_BATTERY },
+    { APM_POWER_CHANGE, XF86_APM_POWER_STATUS_CHANGE },
+    { APM_UPDATE_TIME, XF86_APM_UPDATE_TIME },
+    { APM_CRIT_SUSPEND_REQ, XF86_APM_CRITICAL_SUSPEND },
+    { APM_USER_STANDBY_REQ, XF86_APM_USER_STANDBY },
+    { APM_USER_SUSPEND_REQ, XF86_APM_USER_SUSPEND },
+    { APM_SYS_STANDBY_RESUME, XF86_APM_STANDBY_RESUME },
+#ifdef APM_CAPABILITY_CHANGE
+    { APM_CAPABILITY_CHANGE, XF86_APM_CAPABILITY_CHANGED },
+#endif
+};
+
+#define numApmEvents (sizeof(sunToXF86Array) / sizeof(sunToXF86Array[0]))
+
+static pmEvent
+sunToXF86(int type)
+{
+    int i;
+
+    for (i = 0; i < numApmEvents; i++) {
+	if (type == sunToXF86Array[i].apmBsd) {
+	    return sunToXF86Array[i].xf86;
+	}
+    }
+    return XF86_APM_UNKNOWN;
+}
+
+/*
+ * APM events can be requested direclty from /dev/apm 
+ */
+static int 
+sunPMGetEventFromOS(int fd, pmEvent *events, int num)
+{
+    struct apm_event_info sunEvent;
+    int i;
+
+    for (i = 0; i < num; i++) {
+	
+	if (ioctl(fd, APM_IOC_NEXTEVENT, &sunEvent) < 0) {
+	    if (errno != EAGAIN) {
+		xf86Msg(X_WARNING, "sunPMGetEventFromOS: APM_IOC_NEXTEVENT"
+			" errno = %d\n", errno);
+	    }
+	    break;
+	}
+	events[i] = sunToXF86(sunEvent.type);
+    }
+    xf86Msg(X_WARNING, "Got some events\n");
+    return i;
+}
+
+static pmWait
+sunPMConfirmEventToOs(int fd, pmEvent event)
+{
+    switch (event) {
+/* XXX: NOT CURRENTLY RETURNED FROM OS */
+      case XF86_APM_SYS_STANDBY:
+      case XF86_APM_USER_STANDBY:
+        if (ioctl( fd, APM_IOC_STANDBY, NULL ) == 0)
+            return PM_WAIT;  /* should we stop the Xserver in standby, too? */
+        else
+            return PM_NONE;
+      case XF86_APM_SYS_SUSPEND:
+      case XF86_APM_CRITICAL_SUSPEND:
+      case XF86_APM_USER_SUSPEND:
+	    xf86Msg(X_WARNING, "Got SUSPENDED\n");
+        if (ioctl( fd, APM_IOC_SUSPEND, NULL ) == 0)
+            return PM_CONTINUE;
+        else {
+	    xf86Msg(X_WARNING, "sunPMConfirmEventToOs: APM_IOC_SUSPEND"
+		" errno = %d\n", errno);
+            return PM_FAILED;
+	}
+      case XF86_APM_STANDBY_RESUME:
+      case XF86_APM_NORMAL_RESUME:
+      case XF86_APM_CRITICAL_RESUME:
+      case XF86_APM_STANDBY_FAILED:
+      case XF86_APM_SUSPEND_FAILED:
+	    xf86Msg(X_WARNING, "Got RESUME\n");
+        if (ioctl( fd, APM_IOC_RESUME, NULL ) == 0)
+            return PM_CONTINUE;
+        else {
+	    xf86Msg(X_WARNING, "sunPMConfirmEventToOs: APM_IOC_RESUME"
+		" errno = %d\n", errno);
+            return PM_FAILED;
+	}
+      default:
+	return PM_NONE;
+    }
+}
+
+PMClose
+xf86OSPMOpen(void)
+{
+    int fd;
+
+    if (APMihPtr || !xf86Info.pmFlag) {
+	return NULL;
+    }
+
+    if ((fd = open(APM_DEVICE, O_RDWR)) == -1) {
+    	if ((fd = open(APM_DEVICE1, O_RDWR)) == -1) {
+		return NULL;
+	}
+    }
+    xf86PMGetEventFromOs = sunPMGetEventFromOS;
+    xf86PMConfirmEventToOs = sunPMConfirmEventToOs;
+    APMihPtr = xf86AddInputHandler(fd, xf86HandlePMEvents, NULL);
+    return sunCloseAPM;
+}
+
+static void
+sunCloseAPM(void)
+{
+    int fd;
+
+    if (APMihPtr) {
+	fd = xf86RemoveInputHandler(APMihPtr);
+	close(fd);
+	APMihPtr = NULL;
+    }
+}



More information about the xorg-commit mailing list