|
@@ -239,9 +239,8 @@ static uint64_t aspeed_timer_get_value(AspeedTimer *t, int reg)
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
-static uint64_t aspeed_timer_read(void *opaque, hwaddr offset, unsigned size)
|
|
|
+static uint64_t aspeed_timer_read_common(AspeedTimerCtrlState *s, hwaddr offset)
|
|
|
{
|
|
|
- AspeedTimerCtrlState *s = opaque;
|
|
|
const int reg = (offset & 0xf) / 4;
|
|
|
uint64_t value;
|
|
|
|
|
@@ -256,10 +255,11 @@ static uint64_t aspeed_timer_read(void *opaque, hwaddr offset, unsigned size)
|
|
|
value = aspeed_timer_get_value(&s->timers[(offset >> 4) - 1], reg);
|
|
|
break;
|
|
|
default:
|
|
|
- value = ASPEED_TIMER_GET_CLASS(s)->read(s, offset);
|
|
|
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
+ __func__, offset);
|
|
|
+ value = 0;
|
|
|
break;
|
|
|
}
|
|
|
- trace_aspeed_timer_read(offset, size, value);
|
|
|
return value;
|
|
|
}
|
|
|
|
|
@@ -431,12 +431,11 @@ static void aspeed_timer_set_ctrl2(AspeedTimerCtrlState *s, uint32_t value)
|
|
|
trace_aspeed_timer_set_ctrl2(value);
|
|
|
}
|
|
|
|
|
|
-static void aspeed_timer_write(void *opaque, hwaddr offset, uint64_t value,
|
|
|
- unsigned size)
|
|
|
+static void aspeed_timer_write_common(AspeedTimerCtrlState *s, hwaddr offset,
|
|
|
+ uint64_t value)
|
|
|
{
|
|
|
const uint32_t tv = (uint32_t)(value & 0xFFFFFFFF);
|
|
|
const int reg = (offset & 0xf) / 4;
|
|
|
- AspeedTimerCtrlState *s = opaque;
|
|
|
|
|
|
switch (offset) {
|
|
|
/* Control Registers */
|
|
@@ -451,11 +450,25 @@ static void aspeed_timer_write(void *opaque, hwaddr offset, uint64_t value,
|
|
|
aspeed_timer_set_value(s, (offset >> TIMER_NR_REGS) - 1, reg, tv);
|
|
|
break;
|
|
|
default:
|
|
|
- ASPEED_TIMER_GET_CLASS(s)->write(s, offset, value);
|
|
|
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
+ __func__, offset);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static uint64_t aspeed_timer_read(void *opaque, hwaddr offset, unsigned size)
|
|
|
+{
|
|
|
+ AspeedTimerCtrlState *s = ASPEED_TIMER(opaque);
|
|
|
+ return ASPEED_TIMER_GET_CLASS(s)->read(s, offset);
|
|
|
+}
|
|
|
+
|
|
|
+static void aspeed_timer_write(void *opaque, hwaddr offset, uint64_t value,
|
|
|
+ unsigned size)
|
|
|
+{
|
|
|
+ AspeedTimerCtrlState *s = ASPEED_TIMER(opaque);
|
|
|
+ ASPEED_TIMER_GET_CLASS(s)->write(s, offset, value);
|
|
|
+}
|
|
|
+
|
|
|
static const MemoryRegionOps aspeed_timer_ops = {
|
|
|
.read = aspeed_timer_read,
|
|
|
.write = aspeed_timer_write,
|
|
@@ -475,12 +488,15 @@ static uint64_t aspeed_2400_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
|
|
|
break;
|
|
|
case 0x38:
|
|
|
case 0x3C:
|
|
|
- default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
__func__, offset);
|
|
|
value = 0;
|
|
|
break;
|
|
|
+ default:
|
|
|
+ value = aspeed_timer_read_common(s, offset);
|
|
|
+ break;
|
|
|
}
|
|
|
+ trace_aspeed_timer_read(offset, value);
|
|
|
return value;
|
|
|
}
|
|
|
|
|
@@ -495,10 +511,12 @@ static void aspeed_2400_timer_write(AspeedTimerCtrlState *s, hwaddr offset,
|
|
|
break;
|
|
|
case 0x38:
|
|
|
case 0x3C:
|
|
|
- default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
__func__, offset);
|
|
|
break;
|
|
|
+ default:
|
|
|
+ aspeed_timer_write_common(s, offset, value);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -514,12 +532,15 @@ static uint64_t aspeed_2500_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
|
|
|
value = s->ctrl3 & BIT(0);
|
|
|
break;
|
|
|
case 0x3C:
|
|
|
- default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
__func__, offset);
|
|
|
value = 0;
|
|
|
break;
|
|
|
+ default:
|
|
|
+ value = aspeed_timer_read_common(s, offset);
|
|
|
+ break;
|
|
|
}
|
|
|
+ trace_aspeed_timer_read(offset, value);
|
|
|
return value;
|
|
|
}
|
|
|
|
|
@@ -548,8 +569,7 @@ static void aspeed_2500_timer_write(AspeedTimerCtrlState *s, hwaddr offset,
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
- __func__, offset);
|
|
|
+ aspeed_timer_write_common(s, offset, value);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -564,12 +584,15 @@ static uint64_t aspeed_2600_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
|
|
|
break;
|
|
|
case 0x38:
|
|
|
case 0x3C:
|
|
|
- default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
__func__, offset);
|
|
|
value = 0;
|
|
|
break;
|
|
|
+ default:
|
|
|
+ value = aspeed_timer_read_common(s, offset);
|
|
|
+ break;
|
|
|
}
|
|
|
+ trace_aspeed_timer_read(offset, value);
|
|
|
return value;
|
|
|
}
|
|
|
|
|
@@ -586,10 +609,12 @@ static void aspeed_2600_timer_write(AspeedTimerCtrlState *s, hwaddr offset,
|
|
|
aspeed_timer_set_ctrl(s, s->ctrl & ~tv);
|
|
|
break;
|
|
|
case 0x38:
|
|
|
- default:
|
|
|
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
|
|
|
__func__, offset);
|
|
|
break;
|
|
|
+ default:
|
|
|
+ aspeed_timer_write_common(s, offset, value);
|
|
|
+ break;
|
|
|
}
|
|
|
}
|
|
|
|