* Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <e1c05edd04070109394afd3332-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2004-07-19 9:31 ` ole.rohne-vJEk5272eHo
[not found] ` <yzoy8lggx6v.fsf_-_-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: ole.rohne-vJEk5272eHo @ 2004-07-19 9:31 UTC (permalink / raw)
To: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: aman-e31a5gnSYeGubukWoKzokaxOck334EZe,
stefandoesinger-RbZlAiThDcE, emmanuel.thome-/zGXu1G9BXs,
software-v2/BnvaKusE
[-- Attachment #1: Type: text/plain, Size: 415 bytes --]
I've implemented VGA POSTing using a real-mode tunnel from kernel
space. IMO, this has some advantages over user space methods:
1. It works with the aty/radeon_pm.c resume code. I don't see how to
easily achieve this with user space methods.
2. Real mode seems faster than userspace vm86
3. It is the right way. Bringing up the hardware is clearly the
responsibility of the kernel/drivers resume code.
Ole
[-- Attachment #2: patch --]
[-- Type: text/plain, Size: 4204 bytes --]
diff -ru -X dontdiff linux-2.6.7/arch/i386/kernel/acpi/sleep.c linux-2.6.7-p2120/arch/i386/kernel/acpi/sleep.c
--- linux-2.6.7/arch/i386/kernel/acpi/sleep.c 2004-07-06 21:48:04.000000000 +0200
+++ linux-2.6.7-p2120/arch/i386/kernel/acpi/sleep.c 2004-07-19 10:53:48.000000000 +0200
@@ -5,6 +5,7 @@
* Copyright (C) 2001-2003 Pavel Machek <pavel-AlSwsSmVLrQ@public.gmane.org>
*/
+#include <linux/module.h>
#include <linux/acpi.h>
#include <linux/bootmem.h>
#include <asm/smp.h>
@@ -63,6 +64,31 @@
zap_low_mappings();
}
+/*
+ * acpi_vgapost
+ */
+
+extern void do_vgapost_lowlevel (unsigned long);
+
+void acpi_vgapost (unsigned long slot)
+{
+ unsigned long flags, saved_video_flags = acpi_video_flags;
+ acpi_video_flags = (slot & 0xffff) << 16 | 1;
+ /* Map low memory and copy information */
+ init_low_mapping(swapper_pg_dir, USER_PTRS_PER_PGD);
+ memcpy((void *) acpi_wakeup_address, &wakeup_start, &wakeup_end - &wakeup_start);
+ acpi_copy_wakeup_routine(acpi_wakeup_address);
+ /* Tunnel thru real mode */
+ local_irq_save(flags);
+ do_vgapost_lowlevel(acpi_wakeup_address);
+ local_irq_restore(flags);
+ /* Restore mapping etc */
+ zap_low_mappings();
+ acpi_video_flags = saved_video_flags;
+}
+
+EXPORT_SYMBOL (acpi_vgapost);
+
/**
* acpi_reserve_bootmem - do _very_ early ACPI initialisation
*
diff -ru -X dontdiff linux-2.6.7/arch/i386/kernel/acpi/wakeup.S linux-2.6.7-p2120/arch/i386/kernel/acpi/wakeup.S
--- linux-2.6.7/arch/i386/kernel/acpi/wakeup.S 2004-07-05 19:37:21.000000000 +0200
+++ linux-2.6.7-p2120/arch/i386/kernel/acpi/wakeup.S 2004-07-19 11:02:30.000000000 +0200
@@ -43,6 +43,7 @@
testl $1, video_flags - wakeup_code
jz 1f
+ movw video_flags - wakeup_code + 2, %ax
lcall $0xc000,$3
movw %cs, %ax
movw %ax, %ds # Bios might have played with that
@@ -159,6 +160,32 @@
_setbad: jmp setbad
+#
+# Real mode switch - verbatim from reboot.c
+#
+go_real:
+ movl %cr0, %eax
+ andl $0x00000011, %eax
+ orl $0x60000000, %eax
+ movl %eax, %cr0
+ movl %eax, %cr3
+ movl %cr0, %ebx
+ andl $0x60000000, %ebx
+ jz 1f
+ wbinvd
+1: andb $0x10, %al
+ movl %eax, %cr0
+go_real_jmp: .byte 0xea
+go_real_jmp_off: .word 0x0000
+go_real_jmp_seg: .word 0x0000
+#
+# Real mode descriptor table
+#
+ .align 8
+go_real_desc: .quad 0x0000000000000000
+go_real_cseg: .quad 0x00009a000000ffff
+go_real_dseg: .quad 0x000092000000ffff
+
.code32
ALIGN
@@ -284,6 +311,59 @@
call acpi_enter_sleep_state_s4bios
ret
+ENTRY(do_vgapost_lowlevel)
+ # Convert target offset to physical address
+ movl %eax, %ecx
+ subl $__PAGE_OFFSET, %ecx
+ # Fixup GDT pointer
+ movl %ecx, %edx
+ addl $go_real_desc - wakeup_start, %edx
+ movl %edx, go_real_gdt + 2
+ # Fixup 16-bit CS descriptor
+ movl %ecx, %edx
+ movw %dx, go_real_cseg - wakeup_start + 2 (%eax)
+ shrl $16, %edx
+ movb %dl, go_real_cseg - wakeup_start + 4 (%eax)
+ movb %dh, go_real_cseg - wakeup_start + 7 (%eax)
+ # Fixup 16-bit jump
+ movl %ecx, %edx
+ shrl $4, %edx
+ movw %dx, go_real_jmp_seg - wakeup_start (%eax)
+ # Save state and registers
+ call save_processor_state
+ call save_registers
+ # Reload page table with low mapping
+ movl $swapper_pg_dir-__PAGE_OFFSET, %eax
+ movl %eax, %cr3
+ # Load IDTR and GDTR for real mode
+ lidt go_real_idt
+ lgdt go_real_gdt
+ # Load DS & al
+ movl $0x0010, %eax
+ movl %eax, %ss
+ movl %eax, %ds
+ movl %eax, %es
+ movl %eax, %fs
+ movl %eax, %gs
+ # Load CS
+ call $0x0008, $(go_real - wakeup_start)
+ # Phony return code
+ call restore_registers
+ call restore_processor_state
+ ret
+
+ .align 4
+ .word 0
+go_real_idt:
+ .word 0x3ff
+ .long 0
+
+ .align 4
+ .word 0
+go_real_gdt:
+ .word 3*8-1
+ .long 0
+
ALIGN
# saved registers
saved_gdt: .long 0,0
diff -ru -X dontdiff linux-2.6.7/drivers/video/aty/radeon_pm.c linux-2.6.7-p2120/drivers/video/aty/radeon_pm.c
--- linux-2.6.7/drivers/video/aty/radeon_pm.c 2004-07-19 10:56:15.000000000 +0200
+++ linux-2.6.7-p2120/drivers/video/aty/radeon_pm.c 2004-07-19 10:56:34.000000000 +0200
@@ -897,6 +897,10 @@
if (pdev->dev.power_state == 0)
return 0;
+ pci_restore_state (pdev, pdev->saved_config_space);
+
+ acpi_vgapost (pdev->devfn);
+
acquire_console_sem();
/* Wakeup chip */
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <yzoy8lggx6v.fsf_-_-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2004-07-19 17:38 ` Stefan Dösinger
[not found] ` <200407191938.17104.stefandoesinger-RbZlAiThDcE@public.gmane.org>
2004-07-24 13:14 ` Pavel Machek
2004-07-30 9:35 ` Emmanuel Thomé
2 siblings, 1 reply; 9+ messages in thread
From: Stefan Dösinger @ 2004-07-19 17:38 UTC (permalink / raw)
To: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: ole.rohne-vJEk5272eHo, aman-e31a5gnSYeGubukWoKzokaxOck334EZe,
emmanuel.thome-/zGXu1G9BXs, software-v2/BnvaKusE
Hello,
> I've implemented VGA POSTing using a real-mode tunnel from kernel
> space. IMO, this has some advantages over user space methods:
Great!!!!
For some reason, it doesn't work for me(Kernel 2.6.8-rc2). I cleaned up my
source directory and I'll try again with a clean build again. If it doesn't
work I'll try 2.6.7.
Do I need any other patches?
> 1. It works with the aty/radeon_pm.c resume code. I don't see how to
> easily achieve this with user space methods.
Do you have radeonfb and fbcon loaded(or compiled into the kernel)?
> 2. Real mode seems faster than userspace vm86
> 3. It is the right way. Bringing up the hardware is clearly the
> responsibility of the kernel/drivers resume code.
Agreed. Someone wrote that this reset can't be performed by kernel code.
This is really great, and as soon as it works for me I'll upload it to my
website.
Cheers,
Stefan
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <200407191938.17104.stefandoesinger-RbZlAiThDcE@public.gmane.org>
@ 2004-07-19 20:29 ` Aman Gupta
2004-07-19 21:21 ` Herman Sheremetyev
1 sibling, 0 replies; 9+ messages in thread
From: Aman Gupta @ 2004-07-19 20:29 UTC (permalink / raw)
To: stefandoesinger-RbZlAiThDcE
Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
ole.rohne-vJEk5272eHo, aman-e31a5gnSYeGubukWoKzokaxOck334EZe,
emmanuel.thome-/zGXu1G9BXs, software-v2/BnvaKusE
Haven't tried it yet, but I was having problems just doing basic
suspend/resume with 2.6.8-rcX as well. After a resume with an
unpatched kernel I was unable to get the machine to respond to
commands to reboot the VGA bios or spin the harddrive. Something
changed between .7 and .8 but I'm not sure what - its not in the
radeon specific code since I didn't have that loaded in the kernel.
Aman Gupta
On Mon, 19 Jul 2004 19:38:16 +0200, Stefan Dösinger
<stefandoesinger-RbZlAiThDcE@public.gmane.org> wrote:
> Hello,
> > I've implemented VGA POSTing using a real-mode tunnel from kernel
> > space. IMO, this has some advantages over user space methods:
> Great!!!!
> For some reason, it doesn't work for me(Kernel 2.6.8-rc2). I cleaned up my
> source directory and I'll try again with a clean build again. If it doesn't
> work I'll try 2.6.7.
>
> Do I need any other patches?
>
> > 1. It works with the aty/radeon_pm.c resume code. I don't see how to
> > easily achieve this with user space methods.
> Do you have radeonfb and fbcon loaded(or compiled into the kernel)?
>
> > 2. Real mode seems faster than userspace vm86
>
> > 3. It is the right way. Bringing up the hardware is clearly the
> > responsibility of the kernel/drivers resume code.
> Agreed. Someone wrote that this reset can't be performed by kernel code.
>
> This is really great, and as soon as it works for me I'll upload it to my
> website.
>
> Cheers,
> Stefan
>
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_idG21&alloc_id\x10040&op=click
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <200407191938.17104.stefandoesinger-RbZlAiThDcE@public.gmane.org>
2004-07-19 20:29 ` Aman Gupta
@ 2004-07-19 21:21 ` Herman Sheremetyev
[not found] ` <1090272101.2163.228.camel-O4LVqDAXoJg@public.gmane.org>
1 sibling, 1 reply; 9+ messages in thread
From: Herman Sheremetyev @ 2004-07-19 21:21 UTC (permalink / raw)
To: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Just curious but is this any different from the Int 10 hack performed
when you boot with acpi_sleep=s3_bios?
-Herman
On Mon, 2004-07-19 at 13:38, Stefan Dösinger wrote:
> Hello,
> > I've implemented VGA POSTing using a real-mode tunnel from kernel
> > space. IMO, this has some advantages over user space methods:
> Great!!!!
> For some reason, it doesn't work for me(Kernel 2.6.8-rc2). I cleaned up my
> source directory and I'll try again with a clean build again. If it doesn't
> work I'll try 2.6.7.
>
> Do I need any other patches?
>
> > 1. It works with the aty/radeon_pm.c resume code. I don't see how to
> > easily achieve this with user space methods.
> Do you have radeonfb and fbcon loaded(or compiled into the kernel)?
>
> > 2. Real mode seems faster than userspace vm86
>
> > 3. It is the right way. Bringing up the hardware is clearly the
> > responsibility of the kernel/drivers resume code.
> Agreed. Someone wrote that this reset can't be performed by kernel code.
>
> This is really great, and as soon as it works for me I'll upload it to my
> website.
>
> Cheers,
> Stefan
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by BEA Weblogic Workshop
> FREE Java Enterprise J2EE developer tools!
> Get your free copy of BEA WebLogic Workshop 8.1 today.
> http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
> _______________________________________________
> Acpi-devel mailing list
> Acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/acpi-devel
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_idG21&alloc_id\x10040&op=click
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <1090272101.2163.228.camel-O4LVqDAXoJg@public.gmane.org>
@ 2004-07-24 12:51 ` Pavel Machek
0 siblings, 0 replies; 9+ messages in thread
From: Pavel Machek @ 2004-07-24 12:51 UTC (permalink / raw)
To: Herman Sheremetyev; +Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Hi!
> Just curious but is this any different from the Int 10 hack performed
> when you boot with acpi_sleep=s3_bios?
This is after PCI is reinitialized, so has better chance to work.
Pavel
--
When do you have heart between your knees?
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <yzoy8lggx6v.fsf_-_-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2004-07-19 17:38 ` Stefan Dösinger
@ 2004-07-24 13:14 ` Pavel Machek
[not found] ` <20040724131432.GB3004-I/5MKhXcvmPrBKCeMvbIDA@public.gmane.org>
2004-07-30 9:35 ` Emmanuel Thomé
2 siblings, 1 reply; 9+ messages in thread
From: Pavel Machek @ 2004-07-24 13:14 UTC (permalink / raw)
To: ole.rohne-vJEk5272eHo
Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
aman-e31a5gnSYeGubukWoKzokaxOck334EZe,
stefandoesinger-RbZlAiThDcE, emmanuel.thome-/zGXu1G9BXs,
software-v2/BnvaKusE
Hi!
> I've implemented VGA POSTing using a real-mode tunnel from kernel
> space. IMO, this has some advantages over user space methods:
>
> 1. It works with the aty/radeon_pm.c resume code. I don't see how to
> easily achieve this with user space methods.
> 2. Real mode seems faster than userspace vm86
> 3. It is the right way. Bringing up the hardware is clearly the
> responsibility of the kernel/drivers resume code.
Agreed, I like this patch.
Content-Description: patch
> diff -ru -X dontdiff linux-2.6.7/arch/i386/kernel/acpi/sleep.c linux-2.6.7-p2120/arch/i386/kernel/acpi/sleep.c
> --- linux-2.6.7/arch/i386/kernel/acpi/sleep.c 2004-07-06 21:48:04.000000000 +0200
> +++ linux-2.6.7-p2120/arch/i386/kernel/acpi/sleep.c 2004-07-19 10:53:48.000000000 +0200
> @@ -5,6 +5,7 @@
> * Copyright (C) 2001-2003 Pavel Machek <pavel-AlSwsSmVLrQ@public.gmane.org>
> */
>
> +#include <linux/module.h>
> #include <linux/acpi.h>
> #include <linux/bootmem.h>
> #include <asm/smp.h>
> @@ -63,6 +64,31 @@
> zap_low_mappings();
> }
>
> +/*
> + * acpi_vgapost
> + */
If you are adding comment with function name, you should at least
explain what the function does... or not add the comment at all.
> +extern void do_vgapost_lowlevel (unsigned long);
> +
> +void acpi_vgapost (unsigned long slot)
> +{
> + unsigned long flags, saved_video_flags = acpi_video_flags;
Please indent using one tab.
> + acpi_video_flags = (slot & 0xffff) << 16 | 1;
> + /* Map low memory and copy information */
> + init_low_mapping(swapper_pg_dir, USER_PTRS_PER_PGD);
> + memcpy((void *) acpi_wakeup_address, &wakeup_start, &wakeup_end - &wakeup_start);
> + acpi_copy_wakeup_routine(acpi_wakeup_address);
> + /* Tunnel thru real mode */
> + local_irq_save(flags);
> + do_vgapost_lowlevel(acpi_wakeup_address);
> + local_irq_restore(flags);
> + /* Restore mapping etc */
> + zap_low_mappings();
This needs BUG_ON(num_online_cpus() != 1) to avoid bad disaster,
right?
> diff -ru -X dontdiff linux-2.6.7/arch/i386/kernel/acpi/wakeup.S linux-2.6.7-p2120/arch/i386/kernel/acpi/wakeup.S
> --- linux-2.6.7/arch/i386/kernel/acpi/wakeup.S 2004-07-05 19:37:21.000000000 +0200
> +++ linux-2.6.7-p2120/arch/i386/kernel/acpi/wakeup.S 2004-07-19 11:02:30.000000000 +0200
> @@ -43,6 +43,7 @@
>
> testl $1, video_flags - wakeup_code
> jz 1f
> + movw video_flags - wakeup_code + 2, %ax
> lcall $0xc000,$3
> movw %cs, %ax
> movw %ax, %ds # Bios
Are you sure you wanted to touch this code? Zeroing %ax on entry to
BIOS might be good idea, but...
> @@ -159,6 +160,32 @@
>
> _setbad: jmp setbad
>
> +#
> +# Real mode switch - verbatim from reboot.c
> +#
> +go_real:
> + movl %cr0, %eax
> + andl $0x00000011, %eax
> + orl $0x60000000, %eax
> + movl %eax, %cr0
> + movl %eax, %cr3
> + movl %cr0, %ebx
> + andl $0x60000000, %ebx
> + jz 1f
> + wbinvd
> +1: andb $0x10, %al
> + movl %eax, %cr0
> +go_real_jmp: .byte 0xea
> +go_real_jmp_off: .word 0x0000
> +go_real_jmp_seg: .word 0x0000
> +#
> +# Real mode descriptor table
> +#
> + .align 8
> +go_real_desc: .quad 0x0000000000000000
> +go_real_cseg: .quad 0x00009a000000ffff
> +go_real_dseg: .quad 0x000092000000ffff
> +
> .code32
> ALIGN
>
> @@ -284,6 +311,59 @@
> call acpi_enter_sleep_state_s4bios
> ret
>
> +ENTRY(do_vgapost_lowlevel)
> + # Convert target offset to physical address
> + movl %eax, %ecx
> + subl $__PAGE_OFFSET, %ecx
> + # Fixup GDT pointer
> + movl %ecx, %edx
> + addl $go_real_desc - wakeup_start, %edx
> + movl %edx, go_real_gdt + 2
> + # Fixup 16-bit CS descriptor
> + movl %ecx, %edx
> + movw %dx, go_real_cseg - wakeup_start + 2 (%eax)
> + shrl $16, %edx
> + movb %dl, go_real_cseg - wakeup_start + 4 (%eax)
> + movb %dh, go_real_cseg - wakeup_start + 7 (%eax)
> + # Fixup 16-bit jump
> + movl %ecx, %edx
> + shrl $4, %edx
> + movw %dx, go_real_jmp_seg - wakeup_start (%eax)
> + # Save state and registers
> + call save_processor_state
> + call save_registers
> + # Reload page table with low mapping
> + movl $swapper_pg_dir-__PAGE_OFFSET, %eax
> + movl %eax, %cr3
> + # Load IDTR and GDTR for real mode
> + lidt go_real_idt
> + lgdt go_real_gdt
> + # Load DS & al
> + movl $0x0010, %eax
> + movl %eax, %ss
> + movl %eax, %ds
> + movl %eax, %es
> + movl %eax, %fs
> + movl %eax, %gs
> + # Load CS
> + call $0x0008, $(go_real - wakeup_start)
> + # Phony return code
> + call restore_registers
> + call restore_processor_state
> + ret
Ouch, so you call wakeup_start once again?
...that's certainly interesting design. Does that mean that 'phony
return code' is never reached? How do you manage to return from this
routine?
Pavel
--
When do you have heart between your knees?
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <20040724131432.GB3004-I/5MKhXcvmPrBKCeMvbIDA@public.gmane.org>
@ 2004-07-24 15:26 ` ole.rohne-vJEk5272eHo
[not found] ` <yzosmbhpgsn.fsf-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: ole.rohne-vJEk5272eHo @ 2004-07-24 15:26 UTC (permalink / raw)
To: Pavel Machek
Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
aman-e31a5gnSYeGubukWoKzokaxOck334EZe,
stefandoesinger-RbZlAiThDcE, emmanuel.thome-/zGXu1G9BXs,
software-v2/BnvaKusE
Pavel> Agreed, I like this patch.
Cool... Let's see if it's still like that when I've explained how it
works.
Pavel> If you are adding comment with function name, you should at least
Pavel> explain what the function does... or not add the comment at all.
Sure. Ditto for acpi_restore_state from the stock kernel sources that
I started with:-)
Pavel> Please indent using one tab.
Sorry, I must have forgotten to M-x load linux-c-mode
>> (...)
>> + do_vgapost_lowlevel(acpi_wakeup_address);
>> (...)
Pavel> This needs BUG_ON(num_online_cpus() != 1) to avoid bad
Pavel> disaster, right?
Sounds like a good idea.
>> testl $1, video_flags - wakeup_code
>> jz 1f
>> + movw video_flags - wakeup_code + 2, %ax
>> lcall $0xc000,$3
Pavel> Are you sure you wanted to touch this code? Zeroing %ax on entry to
Pavel> BIOS might be good idea, but...
It is absolutely necessary, see below for how I've reused the
real->pmode switch. The VGA BIOS expect the PCI bus/slot/function from
%ax and C passes us that information in the upper 16 bits of
acpi_video_flags.
Pavel> Ouch, so you call wakeup_start once again?
Yes, I didn't want to implement yet another real->pmode switch, it
would have been a blue-print copy of wakeup_start and
acpi_copy_wakeup_routine anyway.
Pavel> ...that's certainly interesting design. Does that mean that
Pavel> 'phony return code' is never reached?
It is never reached and should be deleted. It is just a remnant of an
early test stage.
Pavel> How do you manage to return from this routine?
Precisely like do_suspend_lowlevel_s4bios: calling save_registers and
effectively reusing the tail-end of do_suspend_lowlevel.
Ole
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <yzosmbhpgsn.fsf-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
@ 2004-07-24 15:56 ` Pavel Machek
0 siblings, 0 replies; 9+ messages in thread
From: Pavel Machek @ 2004-07-24 15:56 UTC (permalink / raw)
To: ole.rohne-vJEk5272eHo
Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f,
aman-e31a5gnSYeGubukWoKzokaxOck334EZe,
stefandoesinger-RbZlAiThDcE, emmanuel.thome-/zGXu1G9BXs,
software-v2/BnvaKusE
Hi!
> Pavel> Agreed, I like this patch.
>
> Cool... Let's see if it's still like that when I've explained how it
> works.
:-))))
> Pavel> If you are adding comment with function name, you should at least
> Pavel> explain what the function does... or not add the comment at all.
>
> Sure. Ditto for acpi_restore_state from the stock kernel sources that
> I started with:-)
Okay, I'll fix that.
> >> testl $1, video_flags - wakeup_code
> >> jz 1f
> >> + movw video_flags - wakeup_code + 2, %ax
> >> lcall $0xc000,$3
>
> Pavel> Are you sure you wanted to touch this code? Zeroing %ax on entry to
> Pavel> BIOS might be good idea, but...
>
> It is absolutely necessary, see below for how I've reused the
> real->pmode switch. The VGA BIOS expect the PCI bus/slot/function from
> %ax and C passes us that information in the upper 16 bits of
> acpi_video_flags.
Hmm, that's perhaps why so little BIOSen work with this hack.. Is
there chance that passing this value when acpi_sleep=s3_bios is going
to help?
> Pavel> Ouch, so you call wakeup_start once again?
>
> Yes, I didn't want to implement yet another real->pmode switch, it
> would have been a blue-print copy of wakeup_start and
> acpi_copy_wakeup_routine anyway.
Aha, its actually okay.
> Pavel> How do you manage to return from this routine?
>
> Precisely like do_suspend_lowlevel_s4bios: calling save_registers and
> effectively reusing the tail-end of do_suspend_lowlevel.
Hmm, okay, nice hack but you want it documented at some point. Perhaps
comment just after jump to acpi_wakeup is good idea?
Pavel
--
Horseback riding is like software...
...vgf orggre jura vgf serr.
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=4721&alloc_id=10040&op=click
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: Radeon S3/resume: VGA ROM POST from kernel
[not found] ` <yzoy8lggx6v.fsf_-_-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2004-07-19 17:38 ` Stefan Dösinger
2004-07-24 13:14 ` Pavel Machek
@ 2004-07-30 9:35 ` Emmanuel Thomé
2 siblings, 0 replies; 9+ messages in thread
From: Emmanuel Thomé @ 2004-07-30 9:35 UTC (permalink / raw)
To: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
works for me on a Dell d600, radeon 9000 M9, (on fedora 2 kernel which
has 4G/4G patch, init_low_mapping becomes map_low). This is much better
than the patched X driver.
This has given me the opportunity to see how far the S3 status has
evolved with recent kernels on the Dell D600 hardware. Ole's patch
improves over the previous solution for the graphics resume (cleaner,
faster, and more robust). Also, the USB problems I used to have seem to
have been fixed (given the intense activity on the usb tree, it's
certainly hard to pinpoint). IOW, usability of S3 on the d600 has risen
up a lot ;-))
Many thanks,
E.
On Mon, Jul 19, 2004 at 11:31:36AM +0200, ole.rohne-vJEk5272eHo@public.gmane.org wrote:
> I've implemented VGA POSTing using a real-mode tunnel from kernel
> space. IMO, this has some advantages over user space methods:
>
> 1. It works with the aty/radeon_pm.c resume code. I don't see how to
> easily achieve this with user space methods.
> 2. Real mode seems faster than userspace vm86
> 3. It is the right way. Bringing up the hardware is clearly the
> responsibility of the kernel/drivers resume code.
>
> Ole
>
Content-Description: patch
> diff -ru -X dontdiff linux-2.6.7/arch/i386/kernel/acpi/sleep.c linux-2.6.7-p2120/arch/i386/kernel/acpi/sleep.c
> --- linux-2.6.7/arch/i386/kernel/acpi/sleep.c 2004-07-06 21:48:04.000000000 +0200
> +++ linux-2.6.7-p2120/arch/i386/kernel/acpi/sleep.c 2004-07-19 10:53:48.000000000 +0200
> @@ -5,6 +5,7 @@
> * Copyright (C) 2001-2003 Pavel Machek <pavel-AlSwsSmVLrQ@public.gmane.org>
> */
>
> +#include <linux/module.h>
> #include <linux/acpi.h>
> #include <linux/bootmem.h>
> #include <asm/smp.h>
> @@ -63,6 +64,31 @@
> zap_low_mappings();
> }
>
> +/*
> + * acpi_vgapost
> + */
> +
> +extern void do_vgapost_lowlevel (unsigned long);
> +
> +void acpi_vgapost (unsigned long slot)
> +{
> + unsigned long flags, saved_video_flags = acpi_video_flags;
> + acpi_video_flags = (slot & 0xffff) << 16 | 1;
> + /* Map low memory and copy information */
> + init_low_mapping(swapper_pg_dir, USER_PTRS_PER_PGD);
> + memcpy((void *) acpi_wakeup_address, &wakeup_start, &wakeup_end - &wakeup_start);
> + acpi_copy_wakeup_routine(acpi_wakeup_address);
> + /* Tunnel thru real mode */
> + local_irq_save(flags);
> + do_vgapost_lowlevel(acpi_wakeup_address);
> + local_irq_restore(flags);
> + /* Restore mapping etc */
> + zap_low_mappings();
> + acpi_video_flags = saved_video_flags;
> +}
> +
> +EXPORT_SYMBOL (acpi_vgapost);
> +
> /**
> * acpi_reserve_bootmem - do _very_ early ACPI initialisation
> *
> diff -ru -X dontdiff linux-2.6.7/arch/i386/kernel/acpi/wakeup.S linux-2.6.7-p2120/arch/i386/kernel/acpi/wakeup.S
> --- linux-2.6.7/arch/i386/kernel/acpi/wakeup.S 2004-07-05 19:37:21.000000000 +0200
> +++ linux-2.6.7-p2120/arch/i386/kernel/acpi/wakeup.S 2004-07-19 11:02:30.000000000 +0200
> @@ -43,6 +43,7 @@
>
> testl $1, video_flags - wakeup_code
> jz 1f
> + movw video_flags - wakeup_code + 2, %ax
> lcall $0xc000,$3
> movw %cs, %ax
> movw %ax, %ds # Bios might have played with that
> @@ -159,6 +160,32 @@
>
> _setbad: jmp setbad
>
> +#
> +# Real mode switch - verbatim from reboot.c
> +#
> +go_real:
> + movl %cr0, %eax
> + andl $0x00000011, %eax
> + orl $0x60000000, %eax
> + movl %eax, %cr0
> + movl %eax, %cr3
> + movl %cr0, %ebx
> + andl $0x60000000, %ebx
> + jz 1f
> + wbinvd
> +1: andb $0x10, %al
> + movl %eax, %cr0
> +go_real_jmp: .byte 0xea
> +go_real_jmp_off: .word 0x0000
> +go_real_jmp_seg: .word 0x0000
> +#
> +# Real mode descriptor table
> +#
> + .align 8
> +go_real_desc: .quad 0x0000000000000000
> +go_real_cseg: .quad 0x00009a000000ffff
> +go_real_dseg: .quad 0x000092000000ffff
> +
> .code32
> ALIGN
>
> @@ -284,6 +311,59 @@
> call acpi_enter_sleep_state_s4bios
> ret
>
> +ENTRY(do_vgapost_lowlevel)
> + # Convert target offset to physical address
> + movl %eax, %ecx
> + subl $__PAGE_OFFSET, %ecx
> + # Fixup GDT pointer
> + movl %ecx, %edx
> + addl $go_real_desc - wakeup_start, %edx
> + movl %edx, go_real_gdt + 2
> + # Fixup 16-bit CS descriptor
> + movl %ecx, %edx
> + movw %dx, go_real_cseg - wakeup_start + 2 (%eax)
> + shrl $16, %edx
> + movb %dl, go_real_cseg - wakeup_start + 4 (%eax)
> + movb %dh, go_real_cseg - wakeup_start + 7 (%eax)
> + # Fixup 16-bit jump
> + movl %ecx, %edx
> + shrl $4, %edx
> + movw %dx, go_real_jmp_seg - wakeup_start (%eax)
> + # Save state and registers
> + call save_processor_state
> + call save_registers
> + # Reload page table with low mapping
> + movl $swapper_pg_dir-__PAGE_OFFSET, %eax
> + movl %eax, %cr3
> + # Load IDTR and GDTR for real mode
> + lidt go_real_idt
> + lgdt go_real_gdt
> + # Load DS & al
> + movl $0x0010, %eax
> + movl %eax, %ss
> + movl %eax, %ds
> + movl %eax, %es
> + movl %eax, %fs
> + movl %eax, %gs
> + # Load CS
> + call $0x0008, $(go_real - wakeup_start)
> + # Phony return code
> + call restore_registers
> + call restore_processor_state
> + ret
> +
> + .align 4
> + .word 0
> +go_real_idt:
> + .word 0x3ff
> + .long 0
> +
> + .align 4
> + .word 0
> +go_real_gdt:
> + .word 3*8-1
> + .long 0
> +
> ALIGN
> # saved registers
> saved_gdt: .long 0,0
> diff -ru -X dontdiff linux-2.6.7/drivers/video/aty/radeon_pm.c linux-2.6.7-p2120/drivers/video/aty/radeon_pm.c
> --- linux-2.6.7/drivers/video/aty/radeon_pm.c 2004-07-19 10:56:15.000000000 +0200
> +++ linux-2.6.7-p2120/drivers/video/aty/radeon_pm.c 2004-07-19 10:56:34.000000000 +0200
> @@ -897,6 +897,10 @@
> if (pdev->dev.power_state == 0)
> return 0;
>
> + pci_restore_state (pdev, pdev->saved_config_space);
> +
> + acpi_vgapost (pdev->devfn);
> +
> acquire_console_sem();
>
> /* Wakeup chip */
-------------------------------------------------------
This SF.Net email is sponsored by OSTG. Have you noticed the changes on
Linux.com, ITManagersJournal and NewsForge in the past few weeks? Now,
one more big change to announce. We are now OSTG- Open Source Technology
Group. Come see the changes on the new OSTG site. www.ostg.com
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2004-07-30 9:35 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <e1c05edd04070109394afd3332@mail.gmail.com>
[not found] ` <e1c05edd04070109394afd3332-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2004-07-19 9:31 ` Radeon S3/resume: VGA ROM POST from kernel ole.rohne-vJEk5272eHo
[not found] ` <yzoy8lggx6v.fsf_-_-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2004-07-19 17:38 ` Stefan Dösinger
[not found] ` <200407191938.17104.stefandoesinger-RbZlAiThDcE@public.gmane.org>
2004-07-19 20:29 ` Aman Gupta
2004-07-19 21:21 ` Herman Sheremetyev
[not found] ` <1090272101.2163.228.camel-O4LVqDAXoJg@public.gmane.org>
2004-07-24 12:51 ` Pavel Machek
2004-07-24 13:14 ` Pavel Machek
[not found] ` <20040724131432.GB3004-I/5MKhXcvmPrBKCeMvbIDA@public.gmane.org>
2004-07-24 15:26 ` ole.rohne-vJEk5272eHo
[not found] ` <yzosmbhpgsn.fsf-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>
2004-07-24 15:56 ` Pavel Machek
2004-07-30 9:35 ` Emmanuel Thomé
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox