X86: Rework interrupt pins to allow one to many connections.
[gem5.git] / src / dev / intel_8254_timer.hh
index 439432aed429ee4cc47feb495f7fb96a32d25312..bb650d33bb2478872710ca72730249ce8db8bf12 100644 (file)
@@ -44,6 +44,7 @@
 /** Programmable Interval Timer (Intel 8254) */
 class Intel8254Timer : public EventManager
 {
+  protected:
     BitUnion8(CtrlReg)
         Bitfield<7, 6> sel;
         Bitfield<5, 4> rw;
@@ -89,7 +90,7 @@ class Intel8254Timer : public EventManager
             CounterEvent(Counter*);
 
             /** Event process */
-            virtual void process();
+            void process();
 
             /** Event description */
             virtual const char *description() const;
@@ -103,6 +104,8 @@ class Intel8254Timer : public EventManager
         std::string _name;
         const std::string &name() const { return _name; }
 
+        unsigned int num;
+
         CounterEvent event;
 
         /** Current count value */
@@ -133,7 +136,7 @@ class Intel8254Timer : public EventManager
         Intel8254Timer *parent;
 
       public:
-        Counter(Intel8254Timer *p, const std::string &name);
+        Counter(Intel8254Timer *p, const std::string &name, unsigned int num);
 
         /** Latch the current count (if one is not already latched) */
         void latchCount();
@@ -173,24 +176,54 @@ class Intel8254Timer : public EventManager
                          const std::string &section);
     };
 
-  private:
+  protected:
     std::string _name;
     const std::string &name() const { return _name; }
 
     /** PIT has three seperate counters */
     Counter *counter[3];
 
+    virtual void
+    counterInterrupt(unsigned int num)
+    {
+        DPRINTF(Intel8254Timer, "Timer interrupt from counter %d.\n", num);
+    }
+
   public:
-    /** Public way to access individual counters (avoid array accesses) */
-    Counter counter0;
-    Counter counter1;
-    Counter counter2;
+
+    virtual
+    ~Intel8254Timer()
+    {}
+
+    Intel8254Timer(EventManager *em, const std::string &name,
+            Counter *counter0, Counter *counter1, Counter *counter2);
 
     Intel8254Timer(EventManager *em, const std::string &name);
 
     /** Write control word */
     void writeControl(const CtrlReg data);
 
+    uint8_t
+    readCounter(unsigned int num)
+    {
+        assert(num < 3);
+        return counter[num]->read();
+    }
+
+    void
+    writeCounter(unsigned int num, const uint8_t data)
+    {
+        assert(num < 3);
+        counter[num]->write(data);
+    }
+
+    bool
+    outputHigh(unsigned int num)
+    {
+        assert(num < 3);
+        return counter[num]->outputHigh();
+    }
+
     /**
      * Serialize this object to the given output stream.
      * @param base The base name of the counter object.