summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--hw/acpi/tco.c2
-rw-r--r--hw/isa/lpc_ich9.c6
-rw-r--r--include/hw/i386/ich9.h5
-rw-r--r--tests/tco-test.c18
4 files changed, 28 insertions, 3 deletions
diff --git a/hw/acpi/tco.c b/hw/acpi/tco.c
index 1794a54545..7a026c255b 100644
--- a/hw/acpi/tco.c
+++ b/hw/acpi/tco.c
@@ -64,7 +64,7 @@ static void tco_timer_expired(void *opaque)
         tr->tco.sts2 |= TCO_BOOT_STS;
         tr->timeouts_no = 0;
 
-        if (!(gcs & ICH9_CC_GCS_NO_REBOOT)) {
+        if (!lpc->pin_strap.spkr_hi && !(gcs & ICH9_CC_GCS_NO_REBOOT)) {
             watchdog_perform_action();
             tco_timer_stop(tr);
             return;
diff --git a/hw/isa/lpc_ich9.c b/hw/isa/lpc_ich9.c
index 7af24fa8eb..360699f6fd 100644
--- a/hw/isa/lpc_ich9.c
+++ b/hw/isa/lpc_ich9.c
@@ -692,6 +692,11 @@ static const VMStateDescription vmstate_ich9_lpc = {
     }
 };
 
+static Property ich9_lpc_properties[] = {
+    DEFINE_PROP_BOOL("noreboot", ICH9LPCState, pin_strap.spkr_hi, true),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
 static void ich9_lpc_class_init(ObjectClass *klass, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(klass);
@@ -703,6 +708,7 @@ static void ich9_lpc_class_init(ObjectClass *klass, void *data)
     dc->reset = ich9_lpc_reset;
     k->init = ich9_lpc_init;
     dc->vmsd = &vmstate_ich9_lpc;
+    dc->props = ich9_lpc_properties;
     k->config_write = ich9_lpc_config_write;
     dc->desc = "ICH9 LPC bridge";
     k->vendor_id = PCI_VENDOR_ID_INTEL;
diff --git a/include/hw/i386/ich9.h b/include/hw/i386/ich9.h
index ecb3b1038c..b9d2b04b6e 100644
--- a/include/hw/i386/ich9.h
+++ b/include/hw/i386/ich9.h
@@ -46,6 +46,11 @@ typedef struct ICH9LPCState {
     ICH9LPCPMRegs pm;
     uint32_t sci_level; /* track sci level */
 
+    /* 2.24 Pin Straps */
+    struct {
+        bool spkr_hi;
+    } pin_strap;
+
     /* 10.1 Chipset Configuration registers(Memory Space)
      which is pointed by RCBA */
     uint8_t chip_config[ICH9_CC_SIZE];
diff --git a/tests/tco-test.c b/tests/tco-test.c
index 1a2fe3de28..6a48188b9d 100644
--- a/tests/tco-test.c
+++ b/tests/tco-test.c
@@ -42,6 +42,7 @@ enum {
 
 typedef struct {
     const char *args;
+    bool noreboot;
     QPCIDevice *dev;
     void *lpc_base;
     void *tco_io_base;
@@ -53,7 +54,9 @@ static void test_init(TestData *d)
     QTestState *qs;
     char *s;
 
-    s = g_strdup_printf("-machine q35 %s", !d->args ? "" : d->args);
+    s = g_strdup_printf("-machine q35 %s %s",
+                        d->noreboot ? "" : "-global ICH9-LPC.noreboot=false",
+                        !d->args ? "" : d->args);
     qs = qtest_start(s);
     qtest_irq_intercept_in(qs, "ioapic");
     g_free(s);
@@ -135,6 +138,7 @@ static void test_tco_defaults(void)
     TestData d;
 
     d.args = NULL;
+    d.noreboot = true;
     test_init(&d);
     g_assert_cmpint(qpci_io_readw(d.dev, d.tco_io_base + TCO_RLD), ==,
                     TCO_RLD_DEFAULT);
@@ -167,6 +171,7 @@ static void test_tco_timeout(void)
     int ret;
 
     d.args = NULL;
+    d.noreboot = true;
     test_init(&d);
 
     stop_tco(&d);
@@ -210,6 +215,7 @@ static void test_tco_max_timeout(void)
     int ret;
 
     d.args = NULL;
+    d.noreboot = true;
     test_init(&d);
 
     stop_tco(&d);
@@ -253,6 +259,7 @@ static void test_tco_second_timeout_pause(void)
     QDict *ad;
 
     td.args = "-watchdog-action pause";
+    td.noreboot = false;
     test_init(&td);
 
     stop_tco(&td);
@@ -277,6 +284,7 @@ static void test_tco_second_timeout_reset(void)
     QDict *ad;
 
     td.args = "-watchdog-action reset";
+    td.noreboot = false;
     test_init(&td);
 
     stop_tco(&td);
@@ -301,6 +309,7 @@ static void test_tco_second_timeout_shutdown(void)
     QDict *ad;
 
     td.args = "-watchdog-action shutdown";
+    td.noreboot = false;
     test_init(&td);
 
     stop_tco(&td);
@@ -325,6 +334,7 @@ static void test_tco_second_timeout_none(void)
     QDict *ad;
 
     td.args = "-watchdog-action none";
+    td.noreboot = false;
     test_init(&td);
 
     stop_tco(&td);
@@ -349,6 +359,7 @@ static void test_tco_ticks_counter(void)
     uint16_t rld;
 
     d.args = NULL;
+    d.noreboot = true;
     test_init(&d);
 
     stop_tco(&d);
@@ -375,6 +386,7 @@ static void test_tco1_control_bits(void)
     uint16_t val;
 
     d.args = NULL;
+    d.noreboot = true;
     test_init(&d);
 
     val = TCO_LOCK;
@@ -394,6 +406,7 @@ static void test_tco1_status_bits(void)
     int ret;
 
     d.args = NULL;
+    d.noreboot = true;
     test_init(&d);
 
     stop_tco(&d);
@@ -421,7 +434,8 @@ static void test_tco2_status_bits(void)
     uint16_t val;
     int ret;
 
-    d.args = "-watchdog-action none";
+    d.args = NULL;
+    d.noreboot = true;
     test_init(&d);
 
     stop_tco(&d);