|
@@ -498,6 +498,8 @@ static uint64_t aspeed_2500_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
|
|
|
|
|
|
switch (offset) {
|
|
|
case 0x38:
|
|
|
+ value = s->ctrl3 & BIT(0);
|
|
|
+ break;
|
|
|
case 0x3C:
|
|
|
default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
@@ -511,9 +513,24 @@ static uint64_t aspeed_2500_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
|
|
|
static void aspeed_2500_timer_write(AspeedTimerCtrlState *s, hwaddr offset,
|
|
|
uint64_t value)
|
|
|
{
|
|
|
+ const uint32_t tv = (uint32_t)(value & 0xFFFFFFFF);
|
|
|
+ uint8_t command;
|
|
|
+
|
|
|
switch (offset) {
|
|
|
case 0x38:
|
|
|
+ command = (value >> 1) & 0xFF;
|
|
|
+ if (command == 0xAE) {
|
|
|
+ s->ctrl3 = 0x1;
|
|
|
+ } else if (command == 0xEA) {
|
|
|
+ s->ctrl3 = 0x0;
|
|
|
+ }
|
|
|
+ break;
|
|
|
case 0x3C:
|
|
|
+ if (s->ctrl3 & BIT(0)) {
|
|
|
+ aspeed_timer_set_ctrl(s, s->ctrl & ~tv);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
__func__, offset);
|
|
@@ -574,6 +591,7 @@ static void aspeed_timer_reset(DeviceState *dev)
|
|
|
}
|
|
|
s->ctrl = 0;
|
|
|
s->ctrl2 = 0;
|
|
|
+ s->ctrl3 = 0;
|
|
|
}
|
|
|
|
|
|
static const VMStateDescription vmstate_aspeed_timer = {
|
|
@@ -597,6 +615,7 @@ static const VMStateDescription vmstate_aspeed_timer_state = {
|
|
|
.fields = (VMStateField[]) {
|
|
|
VMSTATE_UINT32(ctrl, AspeedTimerCtrlState),
|
|
|
VMSTATE_UINT32(ctrl2, AspeedTimerCtrlState),
|
|
|
+ VMSTATE_UINT32(ctrl3, AspeedTimerCtrlState),
|
|
|
VMSTATE_STRUCT_ARRAY(timers, AspeedTimerCtrlState,
|
|
|
ASPEED_TIMER_NR_TIMERS, 1, vmstate_aspeed_timer,
|
|
|
AspeedTimer),
|