Hi Pavel,
I have some limitations. I have to make it work on 2.6.14 itself.
Could you please look at the "do_acpi_stuff" in the attached code ? Is there anything else I need to do to access acpi namespace variables?
Mohd. Adil
Tata Consultancy Services
Mailto: mohd.adil@xxxxxxx
Website: http://www.tcs.com
____________________________________________
Experience certainty. IT Services
Business Solutions
Outsourcing
____________________________________________
Pavel Machek <pavel@xxxxxxx>
01/28/2009 10:31 CET |
To |
mohd.adil@xxxxxxx |
cc |
acpi-bugzilla-request@xxxxxxxxxxxxxxxxxxxxx, linux-pm@xxxxxxxxxxxxxx, linux-pm-devel-request@xxxxxxxxxxxxxxxxxxxxx, majordomo@xxxxxxxxxxxxxxx | |
bcc |
||
Subject |
Re: [linux-pm] ACPI problems | |
On Wed 2009-01-28 14:34:55, mohd.adil@xxxxxxx wrote:
> Hi Pavel,
>
> Thanks for the response.
>
> Yes, for the solution we are trying to develop, we do
> not care about the resume. We just put system to S3 and rest is taken
> care by BIOS.
>
> The bug was actually on 2.6.24.
> [1]http://bugzilla.kernel.org/show_bug.cgi?id=9528
You really want to try that on recent kernel.
> I am also attaching the code I have written to
> extract some ACPI variable information. Please have a look.
>
> Mohd. Adil
> Tata Consultancy Services
> Mailto: mohd.adil@xxxxxxx
> Website: [2]http://www.tcs.com
> ____________________________________________
> Experience certainty. IT Services
> Business Solutions
> Outsourcing
> ____________________________________________
>
> Pavel Machek <pavel@xxxxxxx>
>
> 01/27/2009 23:53 CET
>
> To
>
> mohd.adil@xxxxxxx
>
> cc
>
> majordomo@xxxxxxxxxxxxxxx, acpi-bugzilla-request@xxxxxxxxxxxxxxxxxxxxx,
> linux-pm-devel-request@xxxxxxxxxxxxxxxxxxxxx, linux-pm@xxxxxxxxxxxxxx
>
> bcc
>
> Subject
>
> Re: [linux-pm] ACPI problems
>
> On Wed 2009-01-21 15:22:20, mohd.adil@xxxxxxx wrote:
> > Hi
> >
> > This is my first post to the list. Hope I will find a
> > solution.
> Please avoid using html on the lists.
> > I am trying to develop a new functionality using a Sun
> > alonso Quad Core blade (x86_64) architecture.
> >
> > The linux distribution which I am using contains a
> very
> > old acpi driver (02/09/2005 probably acpi version 1 compliant)
> >
> > Further, the BIOS I am using is an AMI BIOS. I am
> fairly
> > certain that it is acpi version 3 compliant.
> Famous last words.
> > Now, I am facing two problems here.
> >
> > 1) I am trying to evaluate some namespace control
> methods
> > which are setup in sytem DSDT.
> >
> > Functions are :
> >
> > [1]\\_SB.PERB (should contain memory location
> > address) and
> >
> > [2]\\_SB.PERL (should contain length)
> >
> > This some information passed to us from BIOS
> which is
> > required for my development.
> >
> > I am using acpi_evaluate_object to evaluate these
> > functions. I dont see any error in executing the evaluate
> >
> > function call. But they evaluate to zero.
> Hmm, this is hard to debug without seeing the source.
> > 2) The second task I have is to put the system into
> S3
> > (suspend to ram) state.
> >
> > While doing that I am experiencing a problem.
> Every
> > time I write
> >
> > echo mem > /sys/power/state
> >
> > System hangs at METHOD_NAME__PTS method. There
> is a
> > related bug in
> >
> > new acpi driver related to this function. But
> since I
> > am using a very old driver this should not have
> > happened.
> Which kernel version?
> > Just for added information : I dont really care
> about
> > resume from the S3 state. I dont have video card.
> You want to suspend but don't care about resume...?!
> Pavel
> --
> (english) [3]http://www.livejournal.com/~pavelmachek
> (cesky, pictures)
> [4]http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
> ForwardSourceID:NT000197CA
> =====-----=====-----=====
> Notice: The information contained in this e-mail
> message and/or attachments to it may contain
> confidential or privileged information. If you are
> not the intended recipient, any dissemination, use,
> review, distribution, printing or copying of the
> information contained in this e-mail message
> and/or attachments to it are strictly prohibited. If
> you have received this communication in error,
> please notify us by reply e-mail or telephone and
> immediately and permanently delete the message
> and any attachments. Thank you
>
> References
>
> 1. http://bugzilla.kernel.org/show_bug.cgi?id=9528
> 2. http://www.tcs.com/
> 3. http://www.livejournal.com/~pavelmachek
> 4. http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
> /* A simple linux kernel module */
>
> /* Include the required headers */
> #include <linux/module.h>
> #include <linux/kernel.h>
> #include <linux/acpi.h>
> #include <linux/slab.h>
> #include <asm/uaccess.h>
> #include <asm/rtc.h>
>
> void do_acpi_stuff( void );
> void print_acpi_buffer (acpi_string);
> void print_acpi_int (acpi_string);
> void print_acpi_string (acpi_string);
> void print_acpi_int2 (acpi_string);
> void print_acpi_integer (acpi_string);
> void print_acpi_string2 (acpi_string);
> void setup_pmem_reboot (void);
> void unsetup_pmem_reboot (void);
> void show_cmos (void);
> void cmos_setsize(void);
>
> MODULE_PARM_DESC(choice, "A short integer");
> MODULE_PARM_DESC(data, "Unsigned Long");
>
> static short choice = 0;
> static long data = "">>
> module_param(choice , short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
> module_param(data , long, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
>
> /* The module initialisation function */
> int init_module(void)
> {
>
> printk(KERN_EMERG "Simple module inserted. Choice = %d, Data = "" \n", choice, data);
>
> /* extracting acpi namespace information */
> switch ( choice ) {
> case 1 : show_cmos();
> break ;
>
> case 2 : setup_pmem_reboot();
> break ;
>
> case 3 : unsetup_pmem_reboot();
> break ;
>
> case 4 : cmos_setsize();
> break ;
>
> case 5 : do_acpi_stuff();
> break ;
>
> default : printk(KERN_EMERG "Invalid choice" );
> break;
> }
>
> return 0;
> }
>
> /* The module cleanup function */
> void cleanup_module()
> {
> printk(KERN_EMERG "Removing simple module.\n");
> }
>
> void setup_pmem_reboot (void)
> {
> int temp = 0;
> outb ( 0xDD, 0x72);
> temp = inb ( 0x73 );
> printk(KERN_EMERG "Pmem_reboot = %d ", temp );
> temp = temp | 0x10 ;
> printk(KERN_EMERG "Pmem_reboot = %d ", temp );
> outb (0xDD, 0x72);
> outb (temp , 0x73 );
> }
> void show_cmos (void)
> {
> unsigned int temp = 0;
> outb ( 0xDD, 0x72);
> temp = inb ( 0x73 );
> printk(KERN_EMERG "Pmem_reboot = %d ", temp );
> outb ( 0xCB, 0x72);
> temp = inb ( 0x73 );
> printk(KERN_EMERG "Size = %d ", temp );
> }
> void unsetup_pmem_reboot (void)
> {
> unsigned int temp = 0;
> outb ( 0xDD, 0x72);
> temp = inb ( 0x73 );
> printk(KERN_EMERG "Pmem_reboot = %d ", temp );
> temp = temp & 0xEF ;
> outb (0xDD, 0x72);
> outb (temp , 0x73 );
> printk(KERN_EMERG "Pmem_reboot = %d ", temp );
> }
> void cmos_setsize(void)
> {
> unsigned int temp = 0;
> outb ( 0xCB, 0x72);
> temp = inb ( 0x73 );
> printk(KERN_EMERG "Size = %d ", temp );
> outb ( 0xCB, 0x72);
> outb ( data, 0x73);
> printk(KERN_EMERG "Size = %d ", temp );
> }
> void do_acpi_stuff( void )
> {
>
> print_acpi_buffer ("\\_SB.PERB");
> print_acpi_integer ("\\_SB.PERL");
> }
> void print_acpi_integer (acpi_string astr) {
>
> acpi_handle s_b = (acpi_handle)0 ;
> acpi_status status ;
> unsigned long dat = 0;
>
> status = acpi_get_handle ( 0, astr, &s_b );
> if (status == AE_OK)
> {
> printk(KERN_EMERG " get_handle success %d, %x : ", status, s_b);
> status = acpi_evaluate_integer ( s_b, astr, NULL, &dat);
> if (status == AE_OK)
> printk(KERN_EMERG " Integer Value = %d " , dat ) ;
> else
> printk(KERN_EMERG " Error evaluation %d " , status);
> }
> else
> printk(KERN_EMERG " get_handle error %d : ", status );
> }
>
> void print_acpi_buffer (acpi_string astr)
> {
>
> acpi_handle s_b = (acpi_handle)0 ;
> acpi_status status ;
> struct acpi_buffer rels = { 0, NULL };
> union acpi_object *out_objs;
> u8 *cp ;
> int i;
>
> out_objs = kmalloc (sizeof(union acpi_object), GFP_KERNEL);
> if ( !out_objs)
> {
> printk(KERN_EMERG " Could Not allocate memory rels pointer , buffer ");
> return;
> }
> status = acpi_get_handle ( 0, astr, &s_b );
> if (status == AE_OK)
> {
> printk(KERN_EMERG " get_handle success %d, %x : ", status, s_b);
>
> memset(out_objs, 0, sizeof(union acpi_object));
> rels.length = 2 * (sizeof(union acpi_object));
> rels.pointer = out_objs;
> status = acpi_evaluate_object(s_b, NULL , NULL, &rels);
> if (status == AE_OK)
> {
> printk(KERN_EMERG " eval_object buffer success.result: %d, %d ", out_objs->type, rels.length );
> cp = (u8 *)(out_objs->buffer.pointer) ;
> for (i = 0; i< out_objs->buffer.length ; i++) {
>
> printk(KERN_EMERG " %X", cp[i]);
> }
>
> }
> else
> {
> printk(KERN_EMERG " error %d : ", status);
> printk(KERN_EMERG " result buffer : %d " , (int)rels.length);
> }
> }
> else
> printk(KERN_EMERG " get_handle error %d : ", status );
>
> kfree (out_objs);
> }
>
> void print_acpi_int (acpi_string astr)
> {
> acpi_handle *s_b;
> acpi_status status ;
> struct acpi_buffer *rels;
> union acpi_object *out_objs;
>
> s_b = kmalloc ( sizeof (acpi_handle), GFP_KERNEL);
> if (!s_b)
> {
> printk(KERN_EMERG " Could Not allocate memory s_b , int ");
> return;
> }
> rels = kmalloc ( sizeof (struct acpi_buffer) , GFP_KERNEL);
> if ( !rels)
> {
> printk(KERN_EMERG " Could Not allocate memory rels , int");
> return;
> }
> rels->pointer = kmalloc ( sizeof(union acpi_object), GFP_KERNEL);
> if ( !rels->pointer)
> {
> printk(KERN_EMERG " Could Not allocate memory rels pointer , int");
> return;
> }
>
> status = acpi_get_handle ( 0, astr, &s_b );
> if (status == AE_OK)
> {
> printk(KERN_EMERG "get_handle success %d, %d : ", status, *s_b);
> rels->length = sizeof(union acpi_object);
> status = acpi_evaluate_object(*s_b, 0, 0, rels);
> out_objs = (union acpi_object *) rels->pointer;
> if (status == AE_OK)
> {
> printk(KERN_EMERG " eval_object int success. result : %d, %d, ", out_objs->type, rels->length );
> printk(KERN_EMERG "Int value = %d", out_objs->integer.value );
> }
> else
> {
> printk(KERN_EMERG " error %d : ", status);
> }
> }
> else
> printk(KERN_EMERG " get_handle error %d : ", status);
>
>
> kfree (rels->pointer);
> kfree (rels);
> kfree (s_b);
> }
--
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
ForwardSourceID:NT000197F6
=====-----=====-----===== Notice: The information contained in this e-mail message and/or attachments to it may contain confidential or privileged information. If you are not the intended recipient, any dissemination, use, review, distribution, printing or copying of the information contained in this e-mail message and/or attachments to it are strictly prohibited. If you have received this communication in error, please notify us by reply e-mail or telephone and immediately and permanently delete the message and any attachments. Thank you
/* A simple linux kernel module */ /* Include the required headers */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/acpi.h> #include <linux/slab.h> #include <asm/uaccess.h> #include <asm/rtc.h> void do_acpi_stuff( void ); void print_acpi_buffer (acpi_string); void print_acpi_int (acpi_string); void print_acpi_string (acpi_string); void print_acpi_int2 (acpi_string); void print_acpi_integer (acpi_string); void print_acpi_string2 (acpi_string); void setup_pmem_reboot (void); void unsetup_pmem_reboot (void); void show_cmos (void); void cmos_setsize(void); MODULE_PARM_DESC(choice, "A short integer"); MODULE_PARM_DESC(data, "Unsigned Long"); static short choice = 0; static long data = 0; module_param(choice , short, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); module_param(data , long, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); /* The module initialisation function */ int init_module(void) { printk(KERN_EMERG "Simple module inserted. Choice = %d, Data = %X \n", choice, data); /* extracting acpi namespace information */ switch ( choice ) { case 1 : show_cmos(); break ; case 2 : setup_pmem_reboot(); break ; case 3 : unsetup_pmem_reboot(); break ; case 4 : cmos_setsize(); break ; case 5 : do_acpi_stuff(); break ; default : printk(KERN_EMERG "Invalid choice" ); break; } return 0; } /* The module cleanup function */ void cleanup_module() { printk(KERN_EMERG "Removing simple module.\n"); } void setup_pmem_reboot (void) { int temp = 0; outb ( 0xDD, 0x72); temp = inb ( 0x73 ); printk(KERN_EMERG "Pmem_reboot = %d ", temp ); temp = temp | 0x10 ; printk(KERN_EMERG "Pmem_reboot = %d ", temp ); outb (0xDD, 0x72); outb (temp , 0x73 ); } void show_cmos (void) { unsigned int temp = 0; outb ( 0xDD, 0x72); temp = inb ( 0x73 ); printk(KERN_EMERG "Pmem_reboot = %d ", temp ); outb ( 0xCB, 0x72); temp = inb ( 0x73 ); printk(KERN_EMERG "Size = %d ", temp ); } void unsetup_pmem_reboot (void) { unsigned int temp = 0; outb ( 0xDD, 0x72); temp = inb ( 0x73 ); printk(KERN_EMERG "Pmem_reboot = %d ", temp ); temp = temp & 0xEF ; outb (0xDD, 0x72); outb (temp , 0x73 ); printk(KERN_EMERG "Pmem_reboot = %d ", temp ); } void cmos_setsize(void) { unsigned int temp = 0; outb ( 0xCB, 0x72); temp = inb ( 0x73 ); printk(KERN_EMERG "Size = %d ", temp ); outb ( 0xCB, 0x72); outb ( data, 0x73); printk(KERN_EMERG "Size = %d ", temp ); } void do_acpi_stuff( void ) { print_acpi_buffer ("\\_SB.PERB"); print_acpi_integer ("\\_SB.PERL"); } void print_acpi_integer (acpi_string astr) { acpi_handle s_b = (acpi_handle)0 ; acpi_status status ; unsigned long dat = 0; status = acpi_get_handle ( 0, astr, &s_b ); if (status == AE_OK) { printk(KERN_EMERG " get_handle success %d, %x : ", status, s_b); status = acpi_evaluate_integer ( s_b, astr, NULL, &dat); if (status == AE_OK) printk(KERN_EMERG " Integer Value = %d " , dat ) ; else printk(KERN_EMERG " Error evaluation %d " , status); } else printk(KERN_EMERG " get_handle error %d : ", status ); } void print_acpi_buffer (acpi_string astr) { acpi_handle s_b = (acpi_handle)0 ; acpi_status status ; struct acpi_buffer rels = { 0, NULL }; union acpi_object *out_objs; u8 *cp ; int i; out_objs = kmalloc (sizeof(union acpi_object), GFP_KERNEL); if ( !out_objs) { printk(KERN_EMERG " Could Not allocate memory rels pointer , buffer "); return; } status = acpi_get_handle ( 0, astr, &s_b ); if (status == AE_OK) { printk(KERN_EMERG " get_handle success %d, %x : ", status, s_b); memset(out_objs, 0, sizeof(union acpi_object)); rels.length = 2 * (sizeof(union acpi_object)); rels.pointer = out_objs; status = acpi_evaluate_object(s_b, NULL , NULL, &rels); if (status == AE_OK) { printk(KERN_EMERG " eval_object buffer success.result: %d, %d ", out_objs->type, rels.length ); cp = (u8 *)(out_objs->buffer.pointer) ; for (i = 0; i< out_objs->buffer.length ; i++) { printk(KERN_EMERG " %X", cp[i]); } } else { printk(KERN_EMERG " error %d : ", status); printk(KERN_EMERG " result buffer : %d " , (int)rels.length); } } else printk(KERN_EMERG " get_handle error %d : ", status ); kfree (out_objs); } void print_acpi_int (acpi_string astr) { acpi_handle *s_b; acpi_status status ; struct acpi_buffer *rels; union acpi_object *out_objs; s_b = kmalloc ( sizeof (acpi_handle), GFP_KERNEL); if (!s_b) { printk(KERN_EMERG " Could Not allocate memory s_b , int "); return; } rels = kmalloc ( sizeof (struct acpi_buffer) , GFP_KERNEL); if ( !rels) { printk(KERN_EMERG " Could Not allocate memory rels , int"); return; } rels->pointer = kmalloc ( sizeof(union acpi_object), GFP_KERNEL); if ( !rels->pointer) { printk(KERN_EMERG " Could Not allocate memory rels pointer , int"); return; } status = acpi_get_handle ( 0, astr, &s_b ); if (status == AE_OK) { printk(KERN_EMERG "get_handle success %d, %d : ", status, *s_b); rels->length = sizeof(union acpi_object); status = acpi_evaluate_object(*s_b, 0, 0, rels); out_objs = (union acpi_object *) rels->pointer; if (status == AE_OK) { printk(KERN_EMERG " eval_object int success. result : %d, %d, ", out_objs->type, rels->length ); printk(KERN_EMERG "Int value = %d", out_objs->integer.value ); } else { printk(KERN_EMERG " error %d : ", status); } } else printk(KERN_EMERG " get_handle error %d : ", status); kfree (rels->pointer); kfree (rels); kfree (s_b); }
_______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm