From: Nigel Cunningham <nigel@nigel.suspend2.net>
To: LKML <linux-kernel@vger.kernel.org>
Cc: pavel@ucw.cz, Rafael Wysocki <rjw@sisk.pl>,
Andrew Morton <akpm@osdl.org>
Subject: [PATCH] Optional Beeping During Resume From Suspend To Ram.
Date: Tue, 19 Jun 2007 21:18:22 +1000 [thread overview]
Message-ID: <200706192118.23706.nigel@nigel.suspend2.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 6179 bytes --]
Hi all
Here's what I have after today's work.
I haven't yet been able to test on x86, but can confirm that it works okay on x86_64. I'm currently working towards testing it on my old Omnibook. My P4 desktop won't resume from suspend to ram at all, and hasn't produced any beeps.
I needed to move the BEEP invocation to after the data segment is reloaded, so that the test could access the variable. That was pretty tricky to find - no oops or anything bad prior, it just didn't beep when expected.
A couple of notes:
- I'd like to put the BEEP macro somewhere that can be shared by x86 32 and 64. If that's a good idea, any suggestions on where? Nothing occurs to me straight off.
- I've just switched from Evo to Kmail. Please let me know if there's any mangling of the patch.
Regards,
Nigel
arch/i386/kernel/acpi/wakeup.S | 29 ++++++++++++++++++++++++++++-
arch/x86_64/kernel/acpi/wakeup.S | 25 +++++++++++++++++++++++++
include/linux/acpi.h | 1 +
kernel/power/main.c | 23 +++++++++++++++++++++++
4 files changed, 77 insertions(+), 1 deletion(-)
diff -ruNp 970-str-beep.patch-old/arch/i386/kernel/acpi/wakeup.S 970-str-beep.patch-new/arch/i386/kernel/acpi/wakeup.S
--- 970-str-beep.patch-old/arch/i386/kernel/acpi/wakeup.S 2007-06-19 12:15:25.000000000 +1000
+++ 970-str-beep.patch-new/arch/i386/kernel/acpi/wakeup.S 2007-06-19 21:14:49.000000000 +1000
@@ -11,7 +11,22 @@
#
# If physical address of wakeup_code is 0x12345, BIOS should call us with
# cs = 0x1234, eip = 0x05
-#
+#
+
+#define BEEP \
+ inb $97, %al; \
+ outb %al, $0x80; \
+ movb $3, %al; \
+ outb %al, $97; \
+ outb %al, $0x80; \
+ movb $-74, %al; \
+ outb %al, $67; \
+ outb %al, $0x80; \
+ movb $-119, %al; \
+ outb %al, $66; \
+ outb %al, $0x80; \
+ movb $15, %al; \
+ outb %al, $66;
ALIGN
.align 4096
@@ -31,6 +46,11 @@ wakeup_code:
movw %cs, %ax
movw %ax, %ds # Make ds:0 point to wakeup_start
movw %ax, %ss
+
+ testl $1, beep_flags - wakeup_code
+ jz 1f
+ BEEP
+1:
mov $(wakeup_stack - wakeup_code), %sp # Private stack is needed for ASUS board
movw $0x0e00 + 'S', %fs:(0x12)
@@ -88,6 +108,10 @@ wakeup_code:
cmpl $0x12345678, %eax
jne bogus_real_magic
+ testl $2, beep_flags - wakeup_code
+ jz 1f
+ BEEP
+1:
ljmpl $__KERNEL_CS,$wakeup_pmode_return
real_save_gdt: .word 0
@@ -98,6 +122,7 @@ real_save_cr4: .long 0
real_magic: .long 0
video_mode: .long 0
video_flags: .long 0
+beep_flags: .long 0
real_efer_save_restore: .long 0
real_save_efer_edx: .long 0
real_save_efer_eax: .long 0
@@ -261,6 +286,8 @@ ENTRY(acpi_copy_wakeup_routine)
movl %edx, video_mode - wakeup_start (%eax)
movl acpi_video_flags, %edx
movl %edx, video_flags - wakeup_start (%eax)
+ movl s2ram_beep, %edx
+ movl %edx, beep_flags - wakeup_start (%eax)
movl $0x12345678, real_magic - wakeup_start (%eax)
movl $0x12345678, saved_magic
ret
diff -ruNp 970-str-beep.patch-old/arch/x86_64/kernel/acpi/wakeup.S 970-str-beep.patch-new/arch/x86_64/kernel/acpi/wakeup.S
--- 970-str-beep.patch-old/arch/x86_64/kernel/acpi/wakeup.S 2007-06-19 12:15:28.000000000 +1000
+++ 970-str-beep.patch-new/arch/x86_64/kernel/acpi/wakeup.S 2007-06-19 21:14:49.000000000 +1000
@@ -16,6 +16,21 @@
# cs = 0x1234, eip = 0x05
#
+#define BEEP \
+ inb $97, %al; \
+ outb %al, $0x80; \
+ movb $3, %al; \
+ outb %al, $97; \
+ outb %al, $0x80; \
+ movb $-74, %al; \
+ outb %al, $67; \
+ outb %al, $0x80; \
+ movb $-119, %al; \
+ outb %al, $66; \
+ outb %al, $0x80; \
+ movb $15, %al; \
+ outb %al, $66;
+
ALIGN
.align 16
@@ -33,6 +48,13 @@ wakeup_code:
movw %cs, %ax
movw %ax, %ds # Make ds:0 point to wakeup_start
movw %ax, %ss
+
+ # Data segment must be set up before we can see whether to beep.
+ testl $1, beep_flags - wakeup_code
+ jz 1f
+ BEEP
+1:
+
# Private stack is needed for ASUS board
mov $(wakeup_stack - wakeup_code), %sp
@@ -229,6 +251,7 @@ gdt_48a:
.long gdta - wakeup_code # gdt base (relocated in later)
real_magic: .quad 0
+beep_flags: .quad 0
video_mode: .quad 0
video_flags: .quad 0
@@ -344,6 +367,8 @@ ENTRY(acpi_copy_wakeup_routine)
pushq %rax
pushq %rdx
+ movl s2ram_beep, %edx
+ movl %edx, beep_flags - wakeup_start (,%rdi)
movl saved_video_mode, %edx
movl %edx, video_mode - wakeup_start (,%rdi)
movl acpi_video_flags, %edx
diff -ruNp 970-str-beep.patch-old/include/linux/acpi.h 970-str-beep.patch-new/include/linux/acpi.h
--- 970-str-beep.patch-old/include/linux/acpi.h 2007-06-19 21:15:08.000000000 +1000
+++ 970-str-beep.patch-new/include/linux/acpi.h 2007-06-19 21:14:49.000000000 +1000
@@ -123,6 +123,7 @@ extern int pci_mmcfg_config_num;
extern int sbf_port;
extern unsigned long acpi_video_flags;
+extern unsigned long s2ram_beep;
#else /* !CONFIG_ACPI */
diff -ruNp 970-str-beep.patch-old/kernel/power/main.c 970-str-beep.patch-new/kernel/power/main.c
--- 970-str-beep.patch-old/kernel/power/main.c 2007-06-19 12:15:55.000000000 +1000
+++ 970-str-beep.patch-new/kernel/power/main.c 2007-06-19 21:14:49.000000000 +1000
@@ -308,6 +308,27 @@ static ssize_t state_store(struct kset *
power_attr(state);
+unsigned long s2ram_beep = 0;
+
+static ssize_t s2ram_beep_show(struct kset *kset, char *buf)
+{
+ return sprintf(buf, "%d\n", s2ram_beep);
+}
+
+static ssize_t
+s2ram_beep_store(struct kset *kset, const char *buf, size_t n)
+{
+ int val;
+
+ if (sscanf(buf, "%d", &val) > 0) {
+ s2ram_beep = val;
+ return n;
+ }
+ return -EINVAL;
+}
+
+power_attr(s2ram_beep);
+
#ifdef CONFIG_PM_TRACE
int pm_trace_enabled;
@@ -333,11 +354,13 @@ power_attr(pm_trace);
static struct attribute * g[] = {
&state_attr.attr,
&pm_trace_attr.attr,
+ &s2ram_beep_attr.attr,
NULL,
};
#else
static struct attribute * g[] = {
&state_attr.attr,
+ &s2ram_beep_attr.attr,
NULL,
};
#endif /* CONFIG_PM_TRACE */
--
Nigel, Michelle and Alisdair Cunningham
5 Mitchell Street
Cobden 3266
Victoria, Australia
[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]
next reply other threads:[~2007-06-19 11:18 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-19 11:18 Nigel Cunningham [this message]
2007-06-19 21:33 ` [PATCH] Optional Beeping During Resume From Suspend To Ram Rafael J. Wysocki
2007-06-20 22:09 ` Rafael J. Wysocki
2007-06-20 22:24 ` Nigel Cunningham
2007-06-21 21:20 ` Rafael J. Wysocki
2007-06-28 14:25 ` Pavel Machek
2007-06-28 22:27 ` Nigel Cunningham
2007-06-29 18:03 ` Stefan Seyfried
2007-06-29 22:35 ` Pavel Machek
2007-06-30 10:15 ` Rafael J. Wysocki
2007-06-30 10:11 ` Pavel Machek
2007-06-30 20:30 ` Rafael J. Wysocki
2007-07-04 21:29 ` Pavel Machek
2007-07-04 21:50 ` Rafael J. Wysocki
2007-07-04 22:46 ` Pavel Machek
2007-07-05 19:03 ` Rafael J. Wysocki
2007-07-05 22:32 ` Pavel Machek
2007-07-04 22:34 ` Nigel Cunningham
2007-07-04 22:48 ` Pavel Machek
2007-07-04 22:56 ` Nigel Cunningham
2007-07-04 23:01 ` Pavel Machek
2007-07-04 23:10 ` Nigel Cunningham
2007-07-04 23:25 ` Pavel Machek
2007-07-05 18:43 ` Rafael J. Wysocki
2007-07-05 22:37 ` Pavel Machek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200706192118.23706.nigel@nigel.suspend2.net \
--to=nigel@nigel.suspend2.net \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pavel@ucw.cz \
--cc=rjw@sisk.pl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.