[linux-pm] ACPI problems

Pavel Machek pavel at suse.cz
Wed Jan 28 01:31:26 PST 2009


On Wed 2009-01-28 14:34:55, mohd.adil at tcs.com 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 at tcs.com
>    Website: [2]http://www.tcs.com
>    ____________________________________________
>    Experience certainty. IT Services
>    Business Solutions
>    Outsourcing
>    ____________________________________________
> 
>                         Pavel Machek <pavel at suse.cz>
> 
>                             01/27/2009 23:53 CET
> 
>                                                                         To
> 
>    mohd.adil at tcs.com
> 
>                                                                         cc
> 
>    majordomo at vger.kernel.org, acpi-bugzilla-request at lists.sourceforge.net,
>    linux-pm-devel-request at lists.sourceforge.net, linux-pm at lists.osdl.org
> 
>                                                                        bcc
> 
>                                                                    Subject
> 
>    Re: [linux-pm] ACPI problems
> 
>    On Wed 2009-01-21 15:22:20, mohd.adil at tcs.com 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 = 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);
> }

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html


More information about the linux-pm mailing list