| 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
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 > >
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!
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;