Skip to content

Commit ef2385b

Browse files
jamin-aspeedlegoater
authored andcommitted
hw/timer/aspeed: Refactor Timer Callbacks for SoC-Specific Implementations
The register set have a significant change in AST2700. The TMC00-TMC3C are used for TIMER0 and TMC40-TMC7C are used for TIMER1. In additional, TMC20-TMC3C and TMC60-TMC7C are reserved registers for TIMER0 and TIMER1, respectively. Besides, each TIMER has their own control and interrupt status register. In other words, users are able to set control and interrupt status for TIMER0 in one register. Both aspeed_timer_read and aspeed_timer_write callback functions are not compatible AST2700. Introduce common read and write functions for ASPEED timers. Modify the aspeed_timer_read and aspeed_timer_write functions to delegate to SoC-specific callbacks first. Update the AST2400, AST2500, AST2600 and AST1030 specific read and write functions to call the common implementations for common register accesses. This refactoring improves the organization of call delegation and prepares the codebase for future SoC-specific specializations, such as the AST2700. Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Reviewed-by: Cédric Le Goater <clg@redhat.com> Link: https://lore.kernel.org/r/20250113064455.1660564-2-jamin_lin@aspeedtech.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
1 parent bf8a471 commit ef2385b

File tree

2 files changed

+41
-16
lines changed

2 files changed

+41
-16
lines changed

hw/timer/aspeed_timer.c

Lines changed: 40 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,8 @@ static uint64_t aspeed_timer_get_value(AspeedTimer *t, int reg)
239239
return value;
240240
}
241241

242-
static uint64_t aspeed_timer_read(void *opaque, hwaddr offset, unsigned size)
242+
static uint64_t aspeed_timer_read_common(AspeedTimerCtrlState *s, hwaddr offset)
243243
{
244-
AspeedTimerCtrlState *s = opaque;
245244
const int reg = (offset & 0xf) / 4;
246245
uint64_t value;
247246

@@ -256,10 +255,11 @@ static uint64_t aspeed_timer_read(void *opaque, hwaddr offset, unsigned size)
256255
value = aspeed_timer_get_value(&s->timers[(offset >> 4) - 1], reg);
257256
break;
258257
default:
259-
value = ASPEED_TIMER_GET_CLASS(s)->read(s, offset);
258+
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
259+
__func__, offset);
260+
value = 0;
260261
break;
261262
}
262-
trace_aspeed_timer_read(offset, size, value);
263263
return value;
264264
}
265265

@@ -431,12 +431,11 @@ static void aspeed_timer_set_ctrl2(AspeedTimerCtrlState *s, uint32_t value)
431431
trace_aspeed_timer_set_ctrl2(value);
432432
}
433433

434-
static void aspeed_timer_write(void *opaque, hwaddr offset, uint64_t value,
435-
unsigned size)
434+
static void aspeed_timer_write_common(AspeedTimerCtrlState *s, hwaddr offset,
435+
uint64_t value)
436436
{
437437
const uint32_t tv = (uint32_t)(value & 0xFFFFFFFF);
438438
const int reg = (offset & 0xf) / 4;
439-
AspeedTimerCtrlState *s = opaque;
440439

441440
switch (offset) {
442441
/* Control Registers */
@@ -451,11 +450,25 @@ static void aspeed_timer_write(void *opaque, hwaddr offset, uint64_t value,
451450
aspeed_timer_set_value(s, (offset >> TIMER_NR_REGS) - 1, reg, tv);
452451
break;
453452
default:
454-
ASPEED_TIMER_GET_CLASS(s)->write(s, offset, value);
453+
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
454+
__func__, offset);
455455
break;
456456
}
457457
}
458458

459+
static uint64_t aspeed_timer_read(void *opaque, hwaddr offset, unsigned size)
460+
{
461+
AspeedTimerCtrlState *s = ASPEED_TIMER(opaque);
462+
return ASPEED_TIMER_GET_CLASS(s)->read(s, offset);
463+
}
464+
465+
static void aspeed_timer_write(void *opaque, hwaddr offset, uint64_t value,
466+
unsigned size)
467+
{
468+
AspeedTimerCtrlState *s = ASPEED_TIMER(opaque);
469+
ASPEED_TIMER_GET_CLASS(s)->write(s, offset, value);
470+
}
471+
459472
static const MemoryRegionOps aspeed_timer_ops = {
460473
.read = aspeed_timer_read,
461474
.write = aspeed_timer_write,
@@ -475,12 +488,15 @@ static uint64_t aspeed_2400_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
475488
break;
476489
case 0x38:
477490
case 0x3C:
478-
default:
479491
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
480492
__func__, offset);
481493
value = 0;
482494
break;
495+
default:
496+
value = aspeed_timer_read_common(s, offset);
497+
break;
483498
}
499+
trace_aspeed_timer_read(offset, value);
484500
return value;
485501
}
486502

@@ -495,10 +511,12 @@ static void aspeed_2400_timer_write(AspeedTimerCtrlState *s, hwaddr offset,
495511
break;
496512
case 0x38:
497513
case 0x3C:
498-
default:
499514
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
500515
__func__, offset);
501516
break;
517+
default:
518+
aspeed_timer_write_common(s, offset, value);
519+
break;
502520
}
503521
}
504522

@@ -514,12 +532,15 @@ static uint64_t aspeed_2500_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
514532
value = s->ctrl3 & BIT(0);
515533
break;
516534
case 0x3C:
517-
default:
518535
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
519536
__func__, offset);
520537
value = 0;
521538
break;
539+
default:
540+
value = aspeed_timer_read_common(s, offset);
541+
break;
522542
}
543+
trace_aspeed_timer_read(offset, value);
523544
return value;
524545
}
525546

@@ -548,8 +569,7 @@ static void aspeed_2500_timer_write(AspeedTimerCtrlState *s, hwaddr offset,
548569
break;
549570

550571
default:
551-
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
552-
__func__, offset);
572+
aspeed_timer_write_common(s, offset, value);
553573
break;
554574
}
555575
}
@@ -564,12 +584,15 @@ static uint64_t aspeed_2600_timer_read(AspeedTimerCtrlState *s, hwaddr offset)
564584
break;
565585
case 0x38:
566586
case 0x3C:
567-
default:
568587
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
569588
__func__, offset);
570589
value = 0;
571590
break;
591+
default:
592+
value = aspeed_timer_read_common(s, offset);
593+
break;
572594
}
595+
trace_aspeed_timer_read(offset, value);
573596
return value;
574597
}
575598

@@ -586,10 +609,12 @@ static void aspeed_2600_timer_write(AspeedTimerCtrlState *s, hwaddr offset,
586609
aspeed_timer_set_ctrl(s, s->ctrl & ~tv);
587610
break;
588611
case 0x38:
589-
default:
590612
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
591613
__func__, offset);
592614
break;
615+
default:
616+
aspeed_timer_write_common(s, offset, value);
617+
break;
593618
}
594619
}
595620

hw/timer/trace-events

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ aspeed_timer_ctrl_overflow_interrupt(uint8_t i, bool enable) "Timer %" PRIu8 ":
3131
aspeed_timer_ctrl_pulse_enable(uint8_t i, bool enable) "Timer %" PRIu8 ": %d"
3232
aspeed_timer_set_ctrl2(uint32_t value) "Value: 0x%" PRIx32
3333
aspeed_timer_set_value(int timer, int reg, uint32_t value) "Timer %d register %d: 0x%" PRIx32
34-
aspeed_timer_read(uint64_t offset, unsigned size, uint64_t value) "From 0x%" PRIx64 ": of size %u: 0x%" PRIx64
34+
aspeed_timer_read(uint64_t offset, uint64_t value) "From 0x%" PRIx64 ": 0x%" PRIx64
3535

3636
# armv7m_systick.c
3737
systick_reload(void) "systick reload"

0 commit comments

Comments
 (0)