* 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
[parent not found: <yzoy8lggx6v.fsf_-_-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>]
* 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
[parent not found: <200407191938.17104.stefandoesinger-RbZlAiThDcE@public.gmane.org>]
* 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
[parent not found: <1090272101.2163.228.camel-O4LVqDAXoJg@public.gmane.org>]
* 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
[parent not found: <20040724131432.GB3004-I/5MKhXcvmPrBKCeMvbIDA@public.gmane.org>]
* 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
[parent not found: <yzosmbhpgsn.fsf-bi+AKbBUZKY6gyzm1THtWbp2dZbC/Bob@public.gmane.org>]
* 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