Patchwork [V9,16/16] acpi-piix4: Add Xen hypercall for sleep state.

login
register
mail settings
Submitter Anthony PERARD
Date Jan. 25, 2011, 2:29 p.m.
Message ID <1295965760-31508-17-git-send-email-anthony.perard@citrix.com>
Download mbox | patch
Permalink /patch/80372/
State New
Headers show

Comments

Anthony PERARD - Jan. 25, 2011, 2:29 p.m.
From: Anthony PERARD <anthony.perard@citrix.com>

Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 hw/acpi_piix4.c |    4 ++++
 hw/xen.h        |    2 ++
 xen-all.c       |    7 +++++++
 xen-stub.c      |    4 ++++
 4 files changed, 17 insertions(+), 0 deletions(-)
Isaku Yamahata - Jan. 26, 2011, 2:49 a.m.
On Tue, Jan 25, 2011 at 02:29:20PM +0000, anthony.perard@citrix.com wrote:
> From: Anthony PERARD <anthony.perard@citrix.com>
> 
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  hw/acpi_piix4.c |    4 ++++
>  hw/xen.h        |    2 ++
>  xen-all.c       |    7 +++++++
>  xen-stub.c      |    4 ++++
>  4 files changed, 17 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
> index 5bbc2b5..ea94bf9 100644
> --- a/hw/acpi_piix4.c
> +++ b/hw/acpi_piix4.c
> @@ -23,6 +23,7 @@
>  #include "acpi.h"
>  #include "sysemu.h"
>  #include "range.h"
> +#include "xen.h"
>  
>  //#define DEBUG
>  
> @@ -181,6 +182,9 @@ static void pm_ioport_write(IORange *ioport, uint64_t addr, unsigned width,
>                      if (s->cmos_s3) {
>                          qemu_irq_raise(s->cmos_s3);
>                      }
> +                    if (xen_enabled()) {
> +                        xen_set_hvm_sleep_state();
> +                    }
>                  default:
>                      break;
>                  }

Why not utilize cmos_s3 callback?
Something like

-       cmos_s3 = qemu_allocate_irqs(pc_cmos_set_s3_resume, rtc_state, 1);
+       cmos_s3 = qemu_allocate_irqs(xen_cmos_set_s3_resume, rtc_state, 1);
        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
                              isa_reserve_irq(9), *cmos_s3, *smi_irq,
                              kvm_enabled());


xen_cmos_set_s3_resume()
	pc_cmos_set_s3_resume()
	xen_set_hvm_sleep_state()


thanks,

> diff --git a/hw/xen.h b/hw/xen.h
> index dd3fb68..8920550 100644
> --- a/hw/xen.h
> +++ b/hw/xen.h
> @@ -44,6 +44,8 @@ int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num);
>  void xen_piix3_set_irq(void *opaque, int irq_num, int level);
>  void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len);
>  
> +void xen_set_hvm_sleep_state(void);
> +
>  int xen_init(int smp_cpus);
>  
>  #if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY)
> diff --git a/xen-all.c b/xen-all.c
> index c2d37d6..86ebfcb 100644
> --- a/xen-all.c
> +++ b/xen-all.c
> @@ -464,6 +464,13 @@ static void xen_main_loop_prepare(XenIOState *state)
>  }
>  
>  
> +/* ACPI */
> +
> +void xen_set_hvm_sleep_state(void)
> +{
> +    xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3);
> +}
> +
>  /* Initialise Xen */
>  
>  static void xen_vm_change_state_handler(void *opaque, int running, int reason)
> diff --git a/xen-stub.c b/xen-stub.c
> index c9f477d..d22f475 100644
> --- a/xen-stub.c
> +++ b/xen-stub.c
> @@ -28,6 +28,10 @@ void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size)
>  {
>  }
>  
> +void xen_set_hvm_sleep_state(void)
> +{
> +}
> +
>  int xen_init(int smp_cpus)
>  {
>      return -ENOSYS;
> -- 
> 1.7.1
> 
>
Anthony PERARD - Jan. 26, 2011, 1:47 p.m.
On Wed, 26 Jan 2011, Isaku Yamahata wrote:

> On Tue, Jan 25, 2011 at 02:29:20PM +0000, anthony.perard@citrix.com wrote:
> > From: Anthony PERARD <anthony.perard@citrix.com>
> >
> > Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> > ---
> >  hw/acpi_piix4.c |    4 ++++
> >  hw/xen.h        |    2 ++
> >  xen-all.c       |    7 +++++++
> >  xen-stub.c      |    4 ++++
> >  4 files changed, 17 insertions(+), 0 deletions(-)
> >
> > diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
> > index 5bbc2b5..ea94bf9 100644
> > --- a/hw/acpi_piix4.c
> > +++ b/hw/acpi_piix4.c
> > @@ -23,6 +23,7 @@
> >  #include "acpi.h"
> >  #include "sysemu.h"
> >  #include "range.h"
> > +#include "xen.h"
> >
> >  //#define DEBUG
> >
> > @@ -181,6 +182,9 @@ static void pm_ioport_write(IORange *ioport, uint64_t addr, unsigned width,
> >                      if (s->cmos_s3) {
> >                          qemu_irq_raise(s->cmos_s3);
> >                      }
> > +                    if (xen_enabled()) {
> > +                        xen_set_hvm_sleep_state();
> > +                    }
> >                  default:
> >                      break;
> >                  }
>
> Why not utilize cmos_s3 callback?
> Something like
>
> -       cmos_s3 = qemu_allocate_irqs(pc_cmos_set_s3_resume, rtc_state, 1);
> +       cmos_s3 = qemu_allocate_irqs(xen_cmos_set_s3_resume, rtc_state, 1);
>         smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
>                               isa_reserve_irq(9), *cmos_s3, *smi_irq,
>                               kvm_enabled());
>
>
> xen_cmos_set_s3_resume()
> 	pc_cmos_set_s3_resume()
> 	xen_set_hvm_sleep_state()
>
>
> thanks,

I will do that and resend the patch. Thanks for this!
Anthony Liguori - Jan. 26, 2011, 11:11 p.m.
On 01/25/2011 08:29 AM, anthony.perard@citrix.com wrote:
> From: Anthony PERARD<anthony.perard@citrix.com>
>
> Signed-off-by: Anthony PERARD<anthony.perard@citrix.com>
> ---
>   hw/acpi_piix4.c |    4 ++++
>   hw/xen.h        |    2 ++
>   xen-all.c       |    7 +++++++
>   xen-stub.c      |    4 ++++
>   4 files changed, 17 insertions(+), 0 deletions(-)
>
> diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
> index 5bbc2b5..ea94bf9 100644
> --- a/hw/acpi_piix4.c
> +++ b/hw/acpi_piix4.c
> @@ -23,6 +23,7 @@
>   #include "acpi.h"
>   #include "sysemu.h"
>   #include "range.h"
> +#include "xen.h"
>
>   //#define DEBUG
>
> @@ -181,6 +182,9 @@ static void pm_ioport_write(IORange *ioport, uint64_t addr, unsigned width,
>                       if (s->cmos_s3) {
>                           qemu_irq_raise(s->cmos_s3);
>                       }
> +                    if (xen_enabled()) {
> +                        xen_set_hvm_sleep_state();
> +                    }
>    

Can't you hook into cmos_s3?

Regards,

Anthony Liguori

Patch

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 5bbc2b5..ea94bf9 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -23,6 +23,7 @@ 
 #include "acpi.h"
 #include "sysemu.h"
 #include "range.h"
+#include "xen.h"
 
 //#define DEBUG
 
@@ -181,6 +182,9 @@  static void pm_ioport_write(IORange *ioport, uint64_t addr, unsigned width,
                     if (s->cmos_s3) {
                         qemu_irq_raise(s->cmos_s3);
                     }
+                    if (xen_enabled()) {
+                        xen_set_hvm_sleep_state();
+                    }
                 default:
                     break;
                 }
diff --git a/hw/xen.h b/hw/xen.h
index dd3fb68..8920550 100644
--- a/hw/xen.h
+++ b/hw/xen.h
@@ -44,6 +44,8 @@  int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num);
 void xen_piix3_set_irq(void *opaque, int irq_num, int level);
 void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int len);
 
+void xen_set_hvm_sleep_state(void);
+
 int xen_init(int smp_cpus);
 
 #if defined(NEED_CPU_H) && !defined(CONFIG_USER_ONLY)
diff --git a/xen-all.c b/xen-all.c
index c2d37d6..86ebfcb 100644
--- a/xen-all.c
+++ b/xen-all.c
@@ -464,6 +464,13 @@  static void xen_main_loop_prepare(XenIOState *state)
 }
 
 
+/* ACPI */
+
+void xen_set_hvm_sleep_state(void)
+{
+    xc_set_hvm_param(xen_xc, xen_domid, HVM_PARAM_ACPI_S_STATE, 3);
+}
+
 /* Initialise Xen */
 
 static void xen_vm_change_state_handler(void *opaque, int running, int reason)
diff --git a/xen-stub.c b/xen-stub.c
index c9f477d..d22f475 100644
--- a/xen-stub.c
+++ b/xen-stub.c
@@ -28,6 +28,10 @@  void xen_ram_alloc(ram_addr_t ram_addr, ram_addr_t size)
 {
 }
 
+void xen_set_hvm_sleep_state(void)
+{
+}
+
 int xen_init(int smp_cpus)
 {
     return -ENOSYS;