PM: Integrate beeping flag with existing acpi_sleep flags
Move "debug during resume from s2ram" into the variable we already use for real-mode flags to simplify code. It also closes nasty trap for the user in acpi_sleep_setup; order of parameters actually mattered there, acpi_sleep=s3_bios,s3_mode doing something different from acpi_sleep=s3_mode,s3_bios. Signed-off-by: Pavel Machek <pavel@suse.cz> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
5a60d6235c
commit
77afcf78a2
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
/* address in low memory of the wakeup routine. */
|
/* address in low memory of the wakeup routine. */
|
||||||
unsigned long acpi_wakeup_address = 0;
|
unsigned long acpi_wakeup_address = 0;
|
||||||
unsigned long acpi_video_flags;
|
unsigned long acpi_realmode_flags;
|
||||||
extern char wakeup_start, wakeup_end;
|
extern char wakeup_start, wakeup_end;
|
||||||
|
|
||||||
extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
|
extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
|
||||||
|
@ -68,9 +68,11 @@ static int __init acpi_sleep_setup(char *str)
|
||||||
{
|
{
|
||||||
while ((str != NULL) && (*str != '\0')) {
|
while ((str != NULL) && (*str != '\0')) {
|
||||||
if (strncmp(str, "s3_bios", 7) == 0)
|
if (strncmp(str, "s3_bios", 7) == 0)
|
||||||
acpi_video_flags = 1;
|
acpi_realmode_flags |= 1;
|
||||||
if (strncmp(str, "s3_mode", 7) == 0)
|
if (strncmp(str, "s3_mode", 7) == 0)
|
||||||
acpi_video_flags |= 2;
|
acpi_realmode_flags |= 2;
|
||||||
|
if (strncmp(str, "s3_beep", 7) == 0)
|
||||||
|
acpi_realmode_flags |= 4;
|
||||||
str = strchr(str, ',');
|
str = strchr(str, ',');
|
||||||
if (str != NULL)
|
if (str != NULL)
|
||||||
str += strspn(str, ", \t");
|
str += strspn(str, ", \t");
|
||||||
|
@ -80,9 +82,11 @@ static int __init acpi_sleep_setup(char *str)
|
||||||
|
|
||||||
__setup("acpi_sleep=", acpi_sleep_setup);
|
__setup("acpi_sleep=", acpi_sleep_setup);
|
||||||
|
|
||||||
|
/* Ouch, we want to delete this. We already have better version in userspace, in
|
||||||
|
s2ram from suspend.sf.net project */
|
||||||
static __init int reset_videomode_after_s3(struct dmi_system_id *d)
|
static __init int reset_videomode_after_s3(struct dmi_system_id *d)
|
||||||
{
|
{
|
||||||
acpi_video_flags |= 2;
|
acpi_realmode_flags |= 2;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ wakeup_code:
|
||||||
movw %ax, %ds # Make ds:0 point to wakeup_start
|
movw %ax, %ds # Make ds:0 point to wakeup_start
|
||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
|
|
||||||
testl $1, beep_flags - wakeup_code
|
testl $4, realmode_flags - wakeup_code
|
||||||
jz 1f
|
jz 1f
|
||||||
BEEP
|
BEEP
|
||||||
1:
|
1:
|
||||||
|
@ -61,7 +61,7 @@ wakeup_code:
|
||||||
cmpl $0x12345678, %eax
|
cmpl $0x12345678, %eax
|
||||||
jne bogus_real_magic
|
jne bogus_real_magic
|
||||||
|
|
||||||
testl $1, video_flags - wakeup_code
|
testl $1, realmode_flags - wakeup_code
|
||||||
jz 1f
|
jz 1f
|
||||||
lcall $0xc000,$3
|
lcall $0xc000,$3
|
||||||
movw %cs, %ax
|
movw %cs, %ax
|
||||||
|
@ -69,7 +69,7 @@ wakeup_code:
|
||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
1:
|
1:
|
||||||
|
|
||||||
testl $2, video_flags - wakeup_code
|
testl $2, realmode_flags - wakeup_code
|
||||||
jz 1f
|
jz 1f
|
||||||
mov video_mode - wakeup_code, %ax
|
mov video_mode - wakeup_code, %ax
|
||||||
call mode_set
|
call mode_set
|
||||||
|
@ -108,11 +108,11 @@ wakeup_code:
|
||||||
cmpl $0x12345678, %eax
|
cmpl $0x12345678, %eax
|
||||||
jne bogus_real_magic
|
jne bogus_real_magic
|
||||||
|
|
||||||
testl $2, beep_flags - wakeup_code
|
testl $8, realmode_flags - wakeup_code
|
||||||
jz 1f
|
jz 1f
|
||||||
BEEP
|
BEEP
|
||||||
1:
|
1:
|
||||||
ljmpl $__KERNEL_CS,$wakeup_pmode_return
|
ljmpl $__KERNEL_CS, $wakeup_pmode_return
|
||||||
|
|
||||||
real_save_gdt: .word 0
|
real_save_gdt: .word 0
|
||||||
.long 0
|
.long 0
|
||||||
|
@ -121,7 +121,7 @@ real_save_cr3: .long 0
|
||||||
real_save_cr4: .long 0
|
real_save_cr4: .long 0
|
||||||
real_magic: .long 0
|
real_magic: .long 0
|
||||||
video_mode: .long 0
|
video_mode: .long 0
|
||||||
video_flags: .long 0
|
realmode_flags: .long 0
|
||||||
beep_flags: .long 0
|
beep_flags: .long 0
|
||||||
real_efer_save_restore: .long 0
|
real_efer_save_restore: .long 0
|
||||||
real_save_efer_edx: .long 0
|
real_save_efer_edx: .long 0
|
||||||
|
@ -285,10 +285,8 @@ ENTRY(acpi_copy_wakeup_routine)
|
||||||
|
|
||||||
movl saved_videomode, %edx
|
movl saved_videomode, %edx
|
||||||
movl %edx, video_mode - wakeup_start (%eax)
|
movl %edx, video_mode - wakeup_start (%eax)
|
||||||
movl acpi_video_flags, %edx
|
movl acpi_realmode_flags, %edx
|
||||||
movl %edx, video_flags - wakeup_start (%eax)
|
movl %edx, realmode_flags - wakeup_start (%eax)
|
||||||
movl s2ram_beep, %edx
|
|
||||||
movl %edx, beep_flags - wakeup_start (%eax)
|
|
||||||
movl $0x12345678, real_magic - wakeup_start (%eax)
|
movl $0x12345678, real_magic - wakeup_start (%eax)
|
||||||
movl $0x12345678, saved_magic
|
movl $0x12345678, saved_magic
|
||||||
popl %ebx
|
popl %ebx
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
|
|
||||||
/* address in low memory of the wakeup routine. */
|
/* address in low memory of the wakeup routine. */
|
||||||
unsigned long acpi_wakeup_address = 0;
|
unsigned long acpi_wakeup_address = 0;
|
||||||
unsigned long acpi_video_flags;
|
unsigned long acpi_realmode_flags;
|
||||||
extern char wakeup_start, wakeup_end;
|
extern char wakeup_start, wakeup_end;
|
||||||
|
|
||||||
extern unsigned long acpi_copy_wakeup_routine(unsigned long);
|
extern unsigned long acpi_copy_wakeup_routine(unsigned long);
|
||||||
|
@ -103,9 +103,11 @@ static int __init acpi_sleep_setup(char *str)
|
||||||
{
|
{
|
||||||
while ((str != NULL) && (*str != '\0')) {
|
while ((str != NULL) && (*str != '\0')) {
|
||||||
if (strncmp(str, "s3_bios", 7) == 0)
|
if (strncmp(str, "s3_bios", 7) == 0)
|
||||||
acpi_video_flags = 1;
|
acpi_realmode_flags |= 1;
|
||||||
if (strncmp(str, "s3_mode", 7) == 0)
|
if (strncmp(str, "s3_mode", 7) == 0)
|
||||||
acpi_video_flags |= 2;
|
acpi_realmode_flags |= 2;
|
||||||
|
if (strncmp(str, "s3_beep", 7) == 0)
|
||||||
|
acpi_realmode_flags |= 4;
|
||||||
str = strchr(str, ',');
|
str = strchr(str, ',');
|
||||||
if (str != NULL)
|
if (str != NULL)
|
||||||
str += strspn(str, ", \t");
|
str += strspn(str, ", \t");
|
||||||
|
|
|
@ -50,7 +50,7 @@ wakeup_code:
|
||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
|
|
||||||
# Data segment must be set up before we can see whether to beep.
|
# Data segment must be set up before we can see whether to beep.
|
||||||
testl $1, beep_flags - wakeup_code
|
testl $4, realmode_flags - wakeup_code
|
||||||
jz 1f
|
jz 1f
|
||||||
BEEP
|
BEEP
|
||||||
1:
|
1:
|
||||||
|
@ -70,7 +70,7 @@ wakeup_code:
|
||||||
testl %eax, %eax
|
testl %eax, %eax
|
||||||
jnz no_longmode
|
jnz no_longmode
|
||||||
|
|
||||||
testl $1, video_flags - wakeup_code
|
testl $1, realmode_flags - wakeup_code
|
||||||
jz 1f
|
jz 1f
|
||||||
lcall $0xc000,$3
|
lcall $0xc000,$3
|
||||||
movw %cs, %ax
|
movw %cs, %ax
|
||||||
|
@ -78,7 +78,7 @@ wakeup_code:
|
||||||
movw %ax, %ss
|
movw %ax, %ss
|
||||||
1:
|
1:
|
||||||
|
|
||||||
testl $2, video_flags - wakeup_code
|
testl $2, realmode_flags - wakeup_code
|
||||||
jz 1f
|
jz 1f
|
||||||
mov video_mode - wakeup_code, %ax
|
mov video_mode - wakeup_code, %ax
|
||||||
call mode_seta
|
call mode_seta
|
||||||
|
@ -251,9 +251,8 @@ gdt_48a:
|
||||||
.long gdta - wakeup_code # gdt base (relocated in later)
|
.long gdta - wakeup_code # gdt base (relocated in later)
|
||||||
|
|
||||||
real_magic: .quad 0
|
real_magic: .quad 0
|
||||||
beep_flags: .quad 0
|
|
||||||
video_mode: .quad 0
|
video_mode: .quad 0
|
||||||
video_flags: .quad 0
|
realmode_flags: .quad 0
|
||||||
|
|
||||||
.code16
|
.code16
|
||||||
bogus_real_magic:
|
bogus_real_magic:
|
||||||
|
@ -367,12 +366,10 @@ ENTRY(acpi_copy_wakeup_routine)
|
||||||
pushq %rax
|
pushq %rax
|
||||||
pushq %rdx
|
pushq %rdx
|
||||||
|
|
||||||
movl s2ram_beep, %edx
|
|
||||||
movl %edx, beep_flags - wakeup_start (,%rdi)
|
|
||||||
movl saved_video_mode, %edx
|
movl saved_video_mode, %edx
|
||||||
movl %edx, video_mode - wakeup_start (,%rdi)
|
movl %edx, video_mode - wakeup_start (,%rdi)
|
||||||
movl acpi_video_flags, %edx
|
movl acpi_realmode_flags, %edx
|
||||||
movl %edx, video_flags - wakeup_start (,%rdi)
|
movl %edx, realmode_flags - wakeup_start (,%rdi)
|
||||||
movq $0x12345678, real_magic - wakeup_start (,%rdi)
|
movq $0x12345678, real_magic - wakeup_start (,%rdi)
|
||||||
movq $0x123456789abcdef0, %rdx
|
movq $0x123456789abcdef0, %rdx
|
||||||
movq %rdx, saved_magic
|
movq %rdx, saved_magic
|
||||||
|
|
|
@ -122,8 +122,7 @@ extern struct acpi_mcfg_allocation *pci_mmcfg_config;
|
||||||
extern int pci_mmcfg_config_num;
|
extern int pci_mmcfg_config_num;
|
||||||
|
|
||||||
extern int sbf_port;
|
extern int sbf_port;
|
||||||
extern unsigned long acpi_video_flags;
|
extern unsigned long acpi_realmode_flags;
|
||||||
extern unsigned long s2ram_beep;
|
|
||||||
|
|
||||||
#else /* !CONFIG_ACPI */
|
#else /* !CONFIG_ACPI */
|
||||||
|
|
||||||
|
|
|
@ -332,27 +332,6 @@ static ssize_t state_store(struct kset *kset, const char *buf, size_t n)
|
||||||
|
|
||||||
power_attr(state);
|
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
|
#ifdef CONFIG_PM_TRACE
|
||||||
int pm_trace_enabled;
|
int pm_trace_enabled;
|
||||||
|
|
||||||
|
@ -378,13 +357,11 @@ power_attr(pm_trace);
|
||||||
static struct attribute * g[] = {
|
static struct attribute * g[] = {
|
||||||
&state_attr.attr,
|
&state_attr.attr,
|
||||||
&pm_trace_attr.attr,
|
&pm_trace_attr.attr,
|
||||||
&s2ram_beep_attr.attr,
|
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
static struct attribute * g[] = {
|
static struct attribute * g[] = {
|
||||||
&state_attr.attr,
|
&state_attr.attr,
|
||||||
&s2ram_beep_attr.attr,
|
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
#endif /* CONFIG_PM_TRACE */
|
#endif /* CONFIG_PM_TRACE */
|
||||||
|
|
|
@ -660,7 +660,7 @@ static ctl_table kern_table[] = {
|
||||||
{
|
{
|
||||||
.ctl_name = KERN_ACPI_VIDEO_FLAGS,
|
.ctl_name = KERN_ACPI_VIDEO_FLAGS,
|
||||||
.procname = "acpi_video_flags",
|
.procname = "acpi_video_flags",
|
||||||
.data = &acpi_video_flags,
|
.data = &acpi_realmode_flags,
|
||||||
.maxlen = sizeof (unsigned long),
|
.maxlen = sizeof (unsigned long),
|
||||||
.mode = 0644,
|
.mode = 0644,
|
||||||
.proc_handler = &proc_doulongvec_minmax,
|
.proc_handler = &proc_doulongvec_minmax,
|
||||||
|
|
Loading…
Reference in New Issue