From: Giacomo Travaglini Date: Tue, 26 May 2020 09:45:36 +0000 (+0100) Subject: dev-arm: Make CNTFRQ a GenericTimer parameter X-Git-Tag: v20.0.0.0~1 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3dd3c1e8937d27c740a81bd6c3ba182ddf18e277;p=gem5.git dev-arm: Make CNTFRQ a GenericTimer parameter This register should be in theory initialized by the highest priviledged software. We do this in gem5 to avoid KVM complications (the gem5 firmware won't run at highest EL) JIRA: https://gem5.atlassian.net/browse/GEM5-611 Change-Id: I62d368105af48584f2fe9671de7c70b484b40c12 Signed-off-by: Giacomo Travaglini Reviewed-by: Ciro Santilli Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/29612 Maintainer: Jason Lowe-Power Tested-by: Bobby R. Bruce --- diff --git a/src/dev/arm/GenericTimer.py b/src/dev/arm/GenericTimer.py index 077b6f65d..ed81b2471 100644 --- a/src/dev/arm/GenericTimer.py +++ b/src/dev/arm/GenericTimer.py @@ -89,6 +89,15 @@ Reference: int_virt = Param.ArmPPI("Virtual timer interrupt") int_hyp = Param.ArmPPI("Hypervisor timer interrupt") + # This value should be in theory initialized by the highest + # priviledged software. We do this in gem5 to avoid KVM + # complications (the gem5 firmware won't run at highest EL) + # + # PLEASE note: change this parameter only if using the gem5 bootloader + # Another real world bootloader might be changing the CNTFRQ register + # value, so this initial value will be discarded + cntfrq = Param.UInt64(0x1800000, "Value for the CNTFRQ timer register") + def generateDeviceTree(self, state): node = FdtNode("timer") diff --git a/src/dev/arm/generic_timer.cc b/src/dev/arm/generic_timer.cc index 7ba0374a4..51a52c723 100644 --- a/src/dev/arm/generic_timer.cc +++ b/src/dev/arm/generic_timer.cc @@ -689,6 +689,42 @@ GenericTimer::readMiscReg(int reg, unsigned cpu) } } +GenericTimer::CoreTimers::CoreTimers(GenericTimer &_parent, + ArmSystem &system, unsigned cpu, + ArmInterruptPin *_irqPhysS, ArmInterruptPin *_irqPhysNS, + ArmInterruptPin *_irqVirt, ArmInterruptPin *_irqHyp) + : parent(_parent), + cntfrq(parent.params()->cntfrq), + threadContext(system.getThreadContext(cpu)), + irqPhysS(_irqPhysS), + irqPhysNS(_irqPhysNS), + irqVirt(_irqVirt), + irqHyp(_irqHyp), + physS(csprintf("%s.phys_s_timer%d", parent.name(), cpu), + system, parent, parent.systemCounter, + _irqPhysS), + // This should really be phys_timerN, but we are stuck with + // arch_timer for backwards compatibility. + physNS(csprintf("%s.arch_timer%d", parent.name(), cpu), + system, parent, parent.systemCounter, + _irqPhysNS), + virt(csprintf("%s.virt_timer%d", parent.name(), cpu), + system, parent, parent.systemCounter, + _irqVirt), + hyp(csprintf("%s.hyp_timer%d", parent.name(), cpu), + system, parent, parent.systemCounter, + _irqHyp), + physEvStream{ + EventFunctionWrapper([this]{ physEventStreamCallback(); }, + csprintf("%s.phys_event_gen%d", parent.name(), cpu)), 0, 0 + }, + virtEvStream{ + EventFunctionWrapper([this]{ virtEventStreamCallback(); }, + csprintf("%s.virt_event_gen%d", parent.name(), cpu)), 0, 0 + } +{ +} + void GenericTimer::CoreTimers::physEventStreamCallback() { diff --git a/src/dev/arm/generic_timer.hh b/src/dev/arm/generic_timer.hh index b74b19a16..75051c32b 100644 --- a/src/dev/arm/generic_timer.hh +++ b/src/dev/arm/generic_timer.hh @@ -293,38 +293,10 @@ class GenericTimer : public SimObject public: CoreTimers(GenericTimer &_parent, ArmSystem &system, unsigned cpu, ArmInterruptPin *_irqPhysS, ArmInterruptPin *_irqPhysNS, - ArmInterruptPin *_irqVirt, ArmInterruptPin *_irqHyp) - : parent(_parent), - threadContext(system.getThreadContext(cpu)), - irqPhysS(_irqPhysS), - irqPhysNS(_irqPhysNS), - irqVirt(_irqVirt), - irqHyp(_irqHyp), - physS(csprintf("%s.phys_s_timer%d", parent.name(), cpu), - system, parent, parent.systemCounter, - _irqPhysS), - // This should really be phys_timerN, but we are stuck with - // arch_timer for backwards compatibility. - physNS(csprintf("%s.arch_timer%d", parent.name(), cpu), - system, parent, parent.systemCounter, - _irqPhysNS), - virt(csprintf("%s.virt_timer%d", parent.name(), cpu), - system, parent, parent.systemCounter, - _irqVirt), - hyp(csprintf("%s.hyp_timer%d", parent.name(), cpu), - system, parent, parent.systemCounter, - _irqHyp), - physEvStream{ - EventFunctionWrapper([this]{ physEventStreamCallback(); }, - csprintf("%s.phys_event_gen%d", parent.name(), cpu)), 0, 0 - }, - virtEvStream{ - EventFunctionWrapper([this]{ virtEventStreamCallback(); }, - csprintf("%s.virt_event_gen%d", parent.name(), cpu)), 0, 0 - } - { - cntfrq = 0x01800000; - } + ArmInterruptPin *_irqVirt, ArmInterruptPin *_irqHyp); + + /// Generic Timer parent reference + GenericTimer &parent; /// System counter frequency as visible from this core uint32_t cntfrq; @@ -335,9 +307,6 @@ class GenericTimer : public SimObject /// Hypervisor control register CNTHCTL cnthctl; - /// Generic Timer parent reference - GenericTimer &parent; - /// Thread (HW) context associated to this PE implementation ThreadContext *threadContext;