]> xenbits.xen.org Git - xenclient/ioemu-pq.git/commitdiff
Add battery-management patch file that was inadvertently missed out.
authorKamala Narasimhan <kamala.narasimhan@citrix.com>
Thu, 14 May 2009 16:07:18 +0000 (12:07 -0400)
committerKamala Narasimhan <kamala.narasimhan@citrix.com>
Thu, 14 May 2009 16:07:18 +0000 (12:07 -0400)
xen-3.4/battery-management [new file with mode: 0644]

diff --git a/xen-3.4/battery-management b/xen-3.4/battery-management
new file mode 100644 (file)
index 0000000..b5e1a99
--- /dev/null
@@ -0,0 +1,272 @@
+diff --git a/hw/battery_mgmt.c b/hw/battery_mgmt.c
+index 3ddeb09..1c83b80 100644
+--- a/hw/battery_mgmt.c
++++ b/hw/battery_mgmt.c
+@@ -29,7 +29,6 @@
+ #include "hw.h"
+ #include "pc.h"
+ #include "qemu-xen.h"
+-#include "qemu-log.h"
+ #include "isa.h" //register_ioport_read declaration
+ #include "battery_mgmt.h"
+@@ -59,6 +58,7 @@
+ static enum POWER_MGMT_MODE power_mgmt_mode = PM_MODE_NONE;
+ static battery_state_info battery_info;
++extern FILE *logfile;
+ int is_battery_pt_feasible(void)
+ {
+@@ -229,15 +229,21 @@ static uint32_t battery_port_2_readb(void *opaque, uint32_t addr)
+ static uint32_t battery_port_3_readb(void *opaque, uint32_t addr)
+ {
+-    if ( power_mgmt_mode == PM_MODE_PT || power_mgmt_mode == PM_MODE_NON_PT ) {
+-        if ( (power_mgmt_mode == PM_MODE_PT) && (is_battery_pt_feasible() == 0) )
+-            return 0x0F;
+-        return 0x1F;
+-    }
++    uint32_t system_state;
+-    return 0x0F;
+-}
++    if ( power_mgmt_mode != PM_MODE_PT && power_mgmt_mode != PM_MODE_NON_PT )
++        return 0x0;
++
++    if ( (power_mgmt_mode == PM_MODE_PT) && (is_battery_pt_feasible() == 0) )
++        return 0x0;
++    system_state = xenstore_read_ac_adapter_state();
++    if ( xenstore_read_lid_state() == 1 )
++        system_state |= 0x4;
++
++    system_state |= 0x2;
++    return system_state;
++}
+ void battery_mgmt_non_pt_mode_init(PCIDevice *device)
+ {
+@@ -290,6 +296,7 @@ void battery_mgmt_init(PCIDevice *device)
+     }
+     register_ioport_read(BATTERY_PORT_3, 1, 1, battery_port_3_readb, device);
++    xenstore_register_for_pm_events();
+ #ifdef BATTERY_MGMT_DEBUG
+     fprintf(logfile, "Power management mode set to - %d\n", power_mgmt_mode);
+diff --git a/hw/battery_mgmt.h b/hw/battery_mgmt.h
+index 4a4ac8e..19129b8 100644
+--- a/hw/battery_mgmt.h
++++ b/hw/battery_mgmt.h
+@@ -42,4 +42,12 @@ typedef struct battery_state_info {
+ void battery_mgmt_init(PCIDevice *device);
++#ifndef CONFIG_NO_BATTERY_MGMT
++int is_battery_pt_feasible(void);
++void battery_mgmt_pt_mode_init(void);
++void get_battery_data_from_xenstore(void);
++void write_battery_data_to_port(void);
++void battery_mgmt_non_pt_mode_init(PCIDevice *device);
++#endif
++
+ #endif
+diff --git a/hw/pc.h b/hw/pc.h
+index 8b71d48..a261c8a 100644
+--- a/hw/pc.h
++++ b/hw/pc.h
+@@ -106,6 +106,10 @@ int acpi_table_add(const char *table_desc);
+ void acpi_php_add(int);
+ void acpi_php_del(int);
++void acpi_ac_adapter_state_changed(void);
++void acpi_power_button_pressed(void);
++void acpi_sleep_button_pressed(void);
++void acpi_lid_state_changed(void);
+ /* hpet.c */
+ extern int no_hpet;
+diff --git a/hw/piix4acpi.c b/hw/piix4acpi.c
+index 7844cb8..c218782 100644
+--- a/hw/piix4acpi.c
++++ b/hw/piix4acpi.c
+@@ -53,6 +53,11 @@
+ /* The bit in GPE0_STS/EN to notify the pci hotplug event */
+ #define ACPI_PHP_GPE_BIT 3
++#define ACPI_PHP_SLOT_NUM NR_PCI_DEV
++#define ACPI_AC_POWER_STATE_BIT 0x1c
++#define ACPI_POWER_BUTTON_BIT 0x1
++#define ACPI_SLEEP_BUTTON_BIT 0x0
++#define ACPI_LID_STATE_BIT 0x17
+ typedef struct AcpiDeviceState AcpiDeviceState;
+ AcpiDeviceState *acpi_device_table;
+@@ -192,8 +197,6 @@ static void acpi_map(PCIDevice *pci_dev, int region_num,
+     battery_mgmt_init(pci_dev);
+ }
+-#ifdef CONFIG_PASSTHROUGH
+-
+ static inline int test_bit(uint8_t *map, int bit)
+ {
+     return ( map[bit / 8] & (1 << (bit % 8)) );
+@@ -210,6 +213,56 @@ static inline void clear_bit(uint8_t *map, int bit)
+ }
+ extern FILE *logfile;
++
++void acpi_ac_adapter_state_changed(void)
++{
++    GPEState *s = &gpe_state;
++
++    if ( !test_bit(&s->gpe0_sts[0], ACPI_AC_POWER_STATE_BIT) &&
++         test_bit(&s->gpe0_en[0], ACPI_AC_POWER_STATE_BIT) ) {
++        set_bit(&s->gpe0_sts[0], ACPI_AC_POWER_STATE_BIT);
++        s->sci_asserted = 1;
++        qemu_irq_raise(sci_irq);
++    }
++}
++
++void acpi_power_button_pressed(void)
++{
++    GPEState *s = &gpe_state;
++    if ( !test_bit(&s->gpe0_sts[0], ACPI_POWER_BUTTON_BIT) &&
++         test_bit(&s->gpe0_en[0], ACPI_POWER_BUTTON_BIT) ) {
++        set_bit(&s->gpe0_sts[0], ACPI_POWER_BUTTON_BIT);
++        s->sci_asserted = 1;
++        qemu_irq_raise(sci_irq);
++    }
++}
++
++void acpi_sleep_button_pressed(void)
++{
++    GPEState *s = &gpe_state;
++
++    if ( !test_bit(&s->gpe0_sts[0], ACPI_SLEEP_BUTTON_BIT) &&
++          test_bit(&s->gpe0_en[0], ACPI_SLEEP_BUTTON_BIT) ) {
++        set_bit(&s->gpe0_sts[0], ACPI_SLEEP_BUTTON_BIT);
++        s->sci_asserted = 1;
++        qemu_irq_raise(sci_irq);
++    }
++}
++
++void acpi_lid_state_changed(void)
++{
++    GPEState *s = &gpe_state;
++
++    if ( !test_bit(&s->gpe0_sts[0], ACPI_LID_STATE_BIT) &&
++         test_bit(&s->gpe0_en[0], ACPI_LID_STATE_BIT) ) {
++        set_bit(&s->gpe0_sts[0], ACPI_LID_STATE_BIT);
++        s->sci_asserted = 1;
++        qemu_irq_raise(sci_irq);
++    }
++}
++
++#ifdef CONFIG_PASSTHROUGH
++
+ static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
+ {
+ #if defined(DEBUG)
+diff --git a/qemu-xen.h b/qemu-xen.h
+index c45bf9f..8c1debd 100644
+--- a/qemu-xen.h
++++ b/qemu-xen.h
+@@ -122,8 +122,12 @@ void xenstore_dm_finished_startup(void);
+ int xenstore_vm_write(int domid, const char *key, const char *val);
+ char *xenstore_vm_read(int domid, const char *key, unsigned int *len);
+ char *xenstore_device_model_read(int domid, const char *key, unsigned int *len);
++int xenstore_extended_power_mgmt_read_int(const char *key, int default_value);
+ char *xenstore_read_battery_data(int battery_status);
+ int xenstore_refresh_battery_status(void);
++void xenstore_register_for_pm_events(void);
++int xenstore_read_ac_adapter_state(void);
++int xenstore_read_lid_state(void);
+ int xenstore_pv_driver_build_blacklisted(uint16_t product_number,
+                                          uint32_t build_nr);
+diff --git a/xenstore.c b/xenstore.c
+index 99b31fd..6f5b073 100644
+--- a/xenstore.c
++++ b/xenstore.c
+@@ -27,6 +27,7 @@
+ #include "hw.h"
+ #include "pci.h"
++#include "pc.h"
+ #include "qemu-timer.h"
+ #include "qemu-xen.h"
+@@ -991,6 +992,25 @@ void xenstore_process_event(void *opaque)
+         goto out;
+     }
++    if (!strcmp(vec[XS_WATCH_TOKEN], "acadapterstatechangeevt")) {
++        acpi_ac_adapter_state_changed();
++        goto out;
++    }
++
++    if (!strcmp(vec[XS_WATCH_TOKEN], "pwrbuttonpressedevt")) {
++        acpi_power_button_pressed();
++        goto out;
++    }
++
++    if (!strcmp(vec[XS_WATCH_TOKEN], "slpbuttonpressedevt")) {
++        acpi_sleep_button_pressed();
++    }
++
++    if (!strcmp(vec[XS_WATCH_TOKEN], "lidstatechangeevt")) {
++        acpi_lid_state_changed();
++        goto out;
++    }
++
+     if (strncmp(vec[XS_WATCH_TOKEN], "hd", 2) ||
+         strlen(vec[XS_WATCH_TOKEN]) != 3)
+         goto out;
+@@ -1373,6 +1393,20 @@ static char *xenstore_extended_power_mgmt_read(const char *key, unsigned int *le
+     return value;
+ }
++int xenstore_extended_power_mgmt_read_int(const char *key, int default_value)
++{
++    int value = default_value;
++    char *buffer;
++
++    buffer = xenstore_extended_power_mgmt_read(key, NULL);
++    if ( buffer == NULL )
++        return value;
++
++    value = strtoull(buffer, NULL, 10);
++    free(buffer);
++    return value;
++}
++
+ static int xenstore_extended_power_mgmt_write(const char *key, const char *value)
+ {
+     int ret;
+@@ -1425,6 +1459,24 @@ int xenstore_refresh_battery_status(void)
+     return xenstore_extended_power_mgmt_event_trigger("refreshbatterystatus", "1");
+ }
++void xenstore_register_for_pm_events(void)
++{
++   xs_watch(xsh, "/pm/events/acadapterstatechanged", "acadapterstatechangeevt");
++   xs_watch(xsh, "/pm/events/lidstatechanged", "lidstatechangeevt");
++   xs_watch(xsh, "/pm/events/powerbuttonpressed", "pwrbuttonpressedevt");
++   xs_watch(xsh, "/pm/events/sleepbuttonpressed", "slpbuttonpressedevt");
++}
++
++int xenstore_read_ac_adapter_state(void)
++{
++    return xenstore_extended_power_mgmt_read_int("ac_adapter", 1);
++}
++
++int xenstore_read_lid_state(void)
++{
++    return xenstore_extended_power_mgmt_read_int("lid_state", 1);
++}
++
+ /*
+  * Create a store entry for a device (e.g., monitor, serial/parallel lines).
+  * The entry is <domain-path><storeString>/tty and the value is the name