Date: Mon, 11 Jun 2001 03:30:48 +0100 (BST) From: spadger@best.com To: FreeBSD-gnats-submit@freebsd.org Subject: bin/28026: Rage 128 Suspend issues Message-ID: <20010611023048.5B8A03E96@CRWdog.demon.co.uk>
next in thread | raw e-mail | index | archive | help
>Number: 28026
>Category: bin
>Synopsis: Graphics mode suspend causes weird hang on laptop with Rage card
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: change-request
>Submitter-Id: current-users
>Arrival-Date: Sun Jun 10 19:40:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator: Andy Sparrow
>Release: FreeBSD 4.3-RELEASE i386
>Organization:
>Environment:
System: FreeBSD omni.geek4food.org 4.3-RELEASE FreeBSD 4.3-RELEASE #52: Sat Jun 9 23:31:24 BST 2001 root@omni.geek4food.org:/usr/src/sys/compile/o6k i386
Omnibook 6000, Compaq Armada, multiple machines with Rage
Mobility chipset (maybe others), believed most (all?)
versions of FreeBSD 4.x with XFree86 3.3.x (at least
4.[23]-STABLE, 4.3-RELEASE with 3.3.6)
>Description:
On machines that support suspend-to-ram or suspend-to-disk
(not as extensively tested), it has been observed that
suspending (via either the 'apm' binary or closing the lid,
pressing suspend button etc.) whilst in graphics mode (e.g.
running an X server, either XF86_SVGA or XF86_Mach64) will
put the machine in a strange state, where the display is
very dim (but still barely visible), but machine will not
respond to keyboard, power button or network, and the
machine is still using mucho power (e.g. gets v.hot in
bag).
The only recourse then is to reset, with the attendant loss
of uptime and filesystem checks. Sometimes, it can be harder
to find a paperclip than you think...
Switching to a text mode VT first avoids this problem, the
machine will suspend and resume as expected.
>How-To-Repeat:
On such a machine as described (laptop with APM enabled
and Rage Mobility chipset), suspend the machine, either
via hardware or via 'apm', whilst running X.
>Fix:
It is possible to hack around the problem by calling a
binary (e.g. from 'rc.suspend') that switches to text mode
first, before issuing the suspend call.
This obviously leaves two files that need to be maintained,
particularly when cvsup'ing regularly it is inevitable that
this extra step will be overlooked sooner or later.
Also, a better way to address this issue (if not in the X
server itself), seems to be in the 'apm' binary, which
should DTRT.
I attach for your consideration some example patches to
'apm' and its Makefile, and some (commented-out) options
with descriptive commands for 'etc/defaults/make.conf'
(intended to be activated in '/etc/make.conf', naturally).
In this way, it is as unobtrusive as possible on machine/systems
that don't need this, yet fixes the problems for machines
that do.
Thanks.
*** usr.sbin/apm/apm.c.orig Tue Apr 17 23:53:48 2001
--- usr.sbin/apm/apm.c Mon Apr 30 23:55:31 2001
***************
*** 36,41 ****
--- 36,47 ----
#define APMDEV "/dev/apm"
+ #ifdef WANT_TEXTMODE_SUSPEND
+ #define VGADEV "/dev/vga"
+ #include <sys/wait.h>
+ #include <machine/console.h>
+ #endif
+
#define xh(a) (((a) & 0xff00) >> 8)
#define xl(a) ((a) & 0xff)
#define APMERR(a) xh(a)
***************
*** 126,131 ****
--- 132,168 ----
err(1, "ioctl(APMIO_STANDBY)");
}
+ #ifdef WANT_TEXTMODE_SUSPEND
+ void
+ apm_wrapper(int fd, void (*fptr)(int))
+ {
+ int myfd, vt, status;
+
+ myfd = open(VGADEV, O_RDONLY);
+ if(myfd < 0)
+ err(1, "open %s", VGADEV);
+ if(ioctl(myfd, VT_GETACTIVE, &vt) < 0)
+ err(1, "ioctl VT_GETACTIVE");
+ if(ioctl(myfd, VT_ACTIVATE, 1) < 0)
+ err(1, "ioctl VT_ACTIVATE");
+
+ switch(fork()) {
+ case -1:
+ err(1, "fork");
+ case 0:
+ fptr (fd);
+ break;
+ default:
+ wait(&status);
+ if(!WIFEXITED(status) || WEXITSTATUS(status))
+ errx(1, "apm -z failed");
+ }
+ sleep(2);
+ if(ioctl(myfd, VT_ACTIVATE, vt) < 0)
+ err(1, "ioctl VT_ACTIVATE");
+ }
+ #endif
+
void
apm_getinfo(int fd, apm_info_t aip)
{
***************
*** 483,492 ****
--- 520,535 ----
apm_haltcpu(fd, haltcpu);
if (delta)
apm_set_timer(fd, delta);
+ #ifdef WANT_TEXTMODE_SUSPEND
+ if (sleep || standby) {
+ apm_wrapper( fd, (sleep?apm_suspend:apm_standby) );
+ }
+ #else
if (sleep)
apm_suspend(fd);
else if (standby)
apm_standby(fd);
+ #endif
else if (delta == 0) {
struct apm_info info;
*** usr.sbin/apm/Makefile.orig Wed Apr 18 00:45:22 2001
--- usr.sbin/apm/Makefile Wed Apr 18 01:05:41 2001
***************
*** 5,8 ****
--- 5,20 ----
MAN8= apm.8
MLINKS= apm.8 apmconf.8 apm.8 zzz.8
+
+ .if defined(WANT_TEXTMODE_SUSPEND)
+ CFLAGS+= -DWANT_TEXTMODE_SUSPEND
+ .endif
+
+ .if defined(NOSUID) || !defined(ALLOW_USER_SUSPEND)
+ BINMODE=555
+ .else
+ BINMODE=4555
+ BINOWN= root
+ .endif
+
.include <bsd.prog.mk>
*** etc/defaults/make.conf.orig Thu Apr 19 15:16:43 2001
--- etc/defaults/make.conf Thu Apr 19 15:24:49 2001
***************
*** 140,145 ****
--- 140,159 ----
#NOMANCOMPRESS= true
#
#
+ # Some machines (e.g. laptops) with certain graphics devices (notably
+ # ATI Rage Mobility) react badly to being suspended when in graphics
+ # mode (e.g. in X) and lock the machine entirely. If you suffer from
+ # this, try uncommenting the following:
+ #
+ #WANT_TEXTMODE_SUSPEND= true
+ #
+ #
+ # If you uncomment the above, you might want/need to uncomment the
+ # following to permit suspends by users. (Makes apm(8) SUID root).
+ #
+ #ALLOW_USER_SUSPEND= true
+ #
+ #
# If you want the "compat" shared libraries installed as part of your normal
# builds, uncomment these:
#
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010611023048.5B8A03E96>
