X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fdev%2Fx86%2Fi8254.hh;h=084da8ed7523a3b383cf58c26ed7a44d6860c0dd;hb=aa72c284e23566495e4dac4d2d85325751fb1bb8;hp=e295f5105cd0f33a646ebafe3812ed73de7945c7;hpb=c69d48f007d2521fdbea52a0a7a95cfc4a547174;p=gem5.git diff --git a/src/dev/x86/i8254.hh b/src/dev/x86/i8254.hh index e295f5105..084da8ed7 100644 --- a/src/dev/x86/i8254.hh +++ b/src/dev/x86/i8254.hh @@ -32,14 +32,13 @@ #define __DEV_X86_I8254_HH__ #include "dev/intel_8254_timer.hh" +#include "dev/intpin.hh" #include "dev/io_device.hh" #include "params/I8254.hh" namespace X86ISA { -class IntSourcePin; - class I8254 : public BasicPioDevice { protected: @@ -61,30 +60,42 @@ class I8254 : public BasicPioDevice {} }; - + X86Intel8254Timer pit; - IntSourcePin *intPin; - + std::vector *> intPin; + void counterInterrupt(unsigned int num); public: typedef I8254Params Params; + Port & + getPort(const std::string &if_name, PortID idx=InvalidPortID) override + { + if (if_name == "int_pin") + return *intPin.at(idx); + else + return BasicPioDevice::getPort(if_name, idx); + } + const Params * params() const { return dynamic_cast(_params); } - I8254(Params *p) : BasicPioDevice(p), latency(p->pio_latency), - pit(p->name, this), intPin(p->int_pin) + I8254(Params *p) : BasicPioDevice(p, 4), latency(p->pio_latency), + pit(p->name, this) { - pioSize = 4; + for (int i = 0; i < p->port_int_pin_connection_count; i++) { + intPin.push_back(new IntSourcePin(csprintf( + "%s.int_pin[%d]", name(), i), i, this)); + } } - Tick read(PacketPtr pkt); + Tick read(PacketPtr pkt) override; - Tick write(PacketPtr pkt); + Tick write(PacketPtr pkt) override; bool outputHigh(unsigned int num) @@ -109,6 +120,12 @@ class I8254 : public BasicPioDevice { pit.writeControl(val); } + + void serialize(CheckpointOut &cp) const override; + void unserialize(CheckpointIn &cp) override; + + void startup() override; + }; } // namespace X86ISA