aboutsummaryrefslogtreecommitdiff
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);