summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dev/arm/RealView.py22
-rw-r--r--src/dev/arm/rv_ctrl.cc25
-rw-r--r--src/dev/arm/rv_ctrl.hh28
3 files changed, 74 insertions, 1 deletions
diff --git a/src/dev/arm/RealView.py b/src/dev/arm/RealView.py
index 9d4dc6aaf..17b3eb51d 100644
--- a/src/dev/arm/RealView.py
+++ b/src/dev/arm/RealView.py
@@ -129,6 +129,22 @@ class RealViewOsc(ClockDomain):
freq = Param.Clock("Default frequency")
+class RealViewTemperatureSensor(SimObject):
+ type = 'RealViewTemperatureSensor'
+ cxx_header = "dev/arm/rv_ctrl.hh"
+
+ parent = Param.RealViewCtrl(Parent.any, "RealView controller")
+
+ system = Param.System(Parent.any, "system")
+
+ # See ARM DUI 0447J (ARM Motherboard Express uATX -- V2M-P1) and
+ # the individual core/logic tile reference manuals for details
+ # about the site/position/dcc/device allocation.
+ site = Param.UInt8("Board Site")
+ position = Param.UInt8("Position in device stack")
+ dcc = Param.UInt8("Daughterboard Configuration Controller")
+ device = Param.UInt8("Device ID")
+
class VExpressMCC(SubSystem):
"""ARM V2M-P1 Motherboard Configuration Controller
@@ -140,11 +156,17 @@ Express (V2M-P1) motherboard. See ARM DUI 0447J for details.
class Osc(RealViewOsc):
site, position, dcc = (0, 0, 0)
+ class Temperature(RealViewTemperatureSensor):
+ site, position, dcc = (0, 0, 0)
+
osc_mcc = Osc(device=0, freq="50MHz")
osc_clcd = Osc(device=1, freq="23.75MHz")
osc_peripheral = Osc(device=2, freq="24MHz")
osc_system_bus = Osc(device=4, freq="24MHz")
+ # See Table 4.19 in ARM DUI 0447J (Motherboard Express uATX TRM).
+ temp_crtl = Temperature(device=0)
+
class CoreTile2A15DCC(SubSystem):
"""ARM CoreTile Express A15x2 Daughterboard Configuration Controller
diff --git a/src/dev/arm/rv_ctrl.cc b/src/dev/arm/rv_ctrl.cc
index 507def0c1..f89f23b59 100644
--- a/src/dev/arm/rv_ctrl.cc
+++ b/src/dev/arm/rv_ctrl.cc
@@ -37,11 +37,14 @@
* Authors: Ali Saidi
*/
+#include "dev/arm/rv_ctrl.hh"
+
#include "base/trace.hh"
#include "debug/RVCTRL.hh"
-#include "dev/arm/rv_ctrl.hh"
#include "mem/packet.hh"
#include "mem/packet_access.hh"
+#include "sim/power/thermal_model.hh"
+#include "sim/system.hh"
#include "sim/voltage_domain.hh"
RealViewCtrl::RealViewCtrl(Params *p)
@@ -293,7 +296,21 @@ RealViewOsc::write(uint32_t freq)
clockPeriod(SimClock::Float::s / freq);
}
+uint32_t
+RealViewTemperatureSensor::read() const
+{
+ // Temperature reported in uC
+ ThermalModel * tm = system->getThermalModel();
+ if (tm) {
+ double t = tm->getTemp();
+ if (t < 0)
+ warn("Temperature below zero!\n");
+ return fmax(0, t) * 1000000;
+ }
+ // Report a dummy 25 degrees temperature
+ return 25000000;
+}
RealViewCtrl *
RealViewCtrlParams::create()
@@ -306,3 +323,9 @@ RealViewOscParams::create()
{
return new RealViewOsc(this);
}
+
+RealViewTemperatureSensor *
+RealViewTemperatureSensorParams::create()
+{
+ return new RealViewTemperatureSensor(this);
+}
diff --git a/src/dev/arm/rv_ctrl.hh b/src/dev/arm/rv_ctrl.hh
index 1a55025a8..b325c4b16 100644
--- a/src/dev/arm/rv_ctrl.hh
+++ b/src/dev/arm/rv_ctrl.hh
@@ -44,6 +44,7 @@
#include "dev/io_device.hh"
#include "params/RealViewCtrl.hh"
#include "params/RealViewOsc.hh"
+#include "params/RealViewTemperatureSensor.hh"
/** @file
* This implements the simple real view registers on a PBXA9
@@ -219,5 +220,32 @@ class RealViewOsc
void clockPeriod(Tick clock_period);
};
+/**
+ * This device implements the temperature sensor used in the
+ * RealView/Versatile Express platform.
+ *
+ * See ARM DUI 0447J (ARM Motherboard Express uATX -- V2M-P1).
+ */
+class RealViewTemperatureSensor
+ : public SimObject, RealViewCtrl::Device
+{
+ public:
+ RealViewTemperatureSensor(RealViewTemperatureSensorParams *p)
+ : SimObject(p),
+ RealViewCtrl::Device(*p->parent, RealViewCtrl::FUNC_TEMP,
+ p->site, p->position, p->dcc, p->device),
+ system(p->system)
+ {}
+ virtual ~RealViewTemperatureSensor() {};
+
+ public: // RealViewCtrl::Device interface
+ uint32_t read() const override;
+ void write(uint32_t temp) override {}
+
+ protected:
+ /** The system this RV device belongs to */
+ System * system;
+};
+
#endif // __DEV_ARM_RV_HH__