fastmodel: add interface to update system counter freq
This CL set the cntfrq and system counter frequency at once from python script. This aligns the fastmodel implementation to other part of gem5 CPU. Change-Id: I78c9a7be801112844c03d2669a94d57015136d16 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/40278 Reviewed-by: Gabe Black <gabe.black@gmail.com> Maintainer: Gabe Black <gabe.black@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -41,6 +41,8 @@ CortexA76::initState()
|
||||
{
|
||||
for (auto *tc : threadContexts)
|
||||
tc->setMiscRegNoEffect(ArmISA::MISCREG_CNTFRQ_EL0, params().cntfrq);
|
||||
|
||||
evs_base_cpu->setSysCounterFrq(cluster->params().cntfrq);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -44,6 +44,13 @@ ScxEvsCortexA76<Types>::setClkPeriod(Tick clk_period)
|
||||
clockRateControl->set_mul_div(SimClock::Int::s, clk_period);
|
||||
}
|
||||
|
||||
template <class Types>
|
||||
void
|
||||
ScxEvsCortexA76<Types>::setSysCounterFrq(uint64_t sys_counter_frq)
|
||||
{
|
||||
periphClockRateControl->set_mul_div(sys_counter_frq, 1);
|
||||
}
|
||||
|
||||
template <class Types>
|
||||
void
|
||||
ScxEvsCortexA76<Types>::setCluster(SimObject *cluster)
|
||||
@@ -86,6 +93,7 @@ ScxEvsCortexA76<Types>::ScxEvsCortexA76(
|
||||
}
|
||||
|
||||
clockRateControl.bind(this->clock_rate_s);
|
||||
periphClockRateControl.bind(this->periph_clock_rate_s);
|
||||
}
|
||||
|
||||
template <class Types>
|
||||
|
||||
@@ -63,6 +63,7 @@ class ScxEvsCortexA76 : public Types::Base, public Iris::BaseCpuEvs
|
||||
SC_HAS_PROCESS(ScxEvsCortexA76);
|
||||
|
||||
ClockRateControlInitiatorSocket clockRateControl;
|
||||
ClockRateControlInitiatorSocket periphClockRateControl;
|
||||
|
||||
typedef sc_gem5::TlmTargetBaseWrapper<
|
||||
64, svp_gicv3_comms::gicv3_comms_fw_if,
|
||||
@@ -105,6 +106,8 @@ class ScxEvsCortexA76 : public Types::Base, public Iris::BaseCpuEvs
|
||||
|
||||
void setClkPeriod(Tick clk_period) override;
|
||||
|
||||
void setSysCounterFrq(uint64_t sys_counter_frq) override;
|
||||
|
||||
void setCluster(SimObject *cluster) override;
|
||||
};
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ component CortexA76x1
|
||||
// Clocks.
|
||||
clock1Hz : MasterClock();
|
||||
clockDiv : ClockDivider();
|
||||
clockDivPeriph : ClockDivider(mul=0x01800000);
|
||||
clockDivPeriph : ClockDivider();
|
||||
}
|
||||
|
||||
connection
|
||||
@@ -77,6 +77,13 @@ component CortexA76x1
|
||||
clockDiv.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<ExportedClockRateControl> periph_clock_rate_s
|
||||
{
|
||||
behavior set_mul_div(uint64_t mul, uint64_t div)
|
||||
{
|
||||
clockDivPeriph.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<GICv3Comms> redistributor[1];
|
||||
|
||||
// External ports for CPU-to-GIC signals
|
||||
|
||||
@@ -35,7 +35,7 @@ component CortexA76x2
|
||||
// Clocks.
|
||||
clock1Hz : MasterClock();
|
||||
clockDiv : ClockDivider();
|
||||
clockDivPeriph : ClockDivider(mul=0x01800000);
|
||||
clockDivPeriph : ClockDivider();
|
||||
}
|
||||
|
||||
connection
|
||||
@@ -77,6 +77,13 @@ component CortexA76x2
|
||||
clockDiv.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<ExportedClockRateControl> periph_clock_rate_s
|
||||
{
|
||||
behavior set_mul_div(uint64_t mul, uint64_t div)
|
||||
{
|
||||
clockDivPeriph.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<GICv3Comms> redistributor[2];
|
||||
|
||||
// External ports for CPU-to-GIC signals
|
||||
|
||||
@@ -35,7 +35,7 @@ component CortexA76x3
|
||||
// Clocks.
|
||||
clock1Hz : MasterClock();
|
||||
clockDiv : ClockDivider();
|
||||
clockDivPeriph : ClockDivider(mul=0x01800000);
|
||||
clockDivPeriph : ClockDivider();
|
||||
}
|
||||
|
||||
connection
|
||||
@@ -77,6 +77,13 @@ component CortexA76x3
|
||||
clockDiv.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<ExportedClockRateControl> periph_clock_rate_s
|
||||
{
|
||||
behavior set_mul_div(uint64_t mul, uint64_t div)
|
||||
{
|
||||
clockDivPeriph.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<GICv3Comms> redistributor[3];
|
||||
|
||||
// External ports for CPU-to-GIC signals
|
||||
|
||||
@@ -35,7 +35,7 @@ component CortexA76x4
|
||||
// Clocks.
|
||||
clock1Hz : MasterClock();
|
||||
clockDiv : ClockDivider();
|
||||
clockDivPeriph : ClockDivider(mul=0x01800000);
|
||||
clockDivPeriph : ClockDivider();
|
||||
}
|
||||
|
||||
connection
|
||||
@@ -77,6 +77,13 @@ component CortexA76x4
|
||||
clockDiv.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<ExportedClockRateControl> periph_clock_rate_s
|
||||
{
|
||||
behavior set_mul_div(uint64_t mul, uint64_t div)
|
||||
{
|
||||
clockDivPeriph.rate.set64(mul, div);
|
||||
}
|
||||
}
|
||||
slave port<GICv3Comms> redistributor[4];
|
||||
|
||||
// External ports for CPU-to-GIC signals
|
||||
|
||||
@@ -43,6 +43,13 @@ ScxEvsCortexR52<Types>::setClkPeriod(Tick clk_period)
|
||||
clockRateControl->set_mul_div(SimClock::Int::s, clk_period);
|
||||
}
|
||||
|
||||
template <class Types>
|
||||
void
|
||||
ScxEvsCortexR52<Types>::setSysCounterFrq(uint64_t sys_counter_frq)
|
||||
{
|
||||
panic("Not implemented for R52.");
|
||||
}
|
||||
|
||||
template <class Types>
|
||||
void
|
||||
ScxEvsCortexR52<Types>::setCluster(SimObject *cluster)
|
||||
|
||||
@@ -140,6 +140,8 @@ class ScxEvsCortexR52 : public Types::Base, public Iris::BaseCpuEvs
|
||||
|
||||
void setClkPeriod(Tick clk_period) override;
|
||||
|
||||
void setSysCounterFrq(uint64_t sys_counter_frq) override;
|
||||
|
||||
void setCluster(SimObject *cluster) override;
|
||||
};
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ class BaseCpuEvs
|
||||
public:
|
||||
virtual void sendFunc(PacketPtr pkt) = 0;
|
||||
virtual void setClkPeriod(Tick clk_period) = 0;
|
||||
virtual void setSysCounterFrq(uint64_t sys_counter_frq) = 0;
|
||||
virtual void setCluster(SimObject *cluster) = 0;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user