intel_8254_timer.hh revision 10642:9d3b6e7dd205
13569Sgblack@eecs.umich.edu/* 23569Sgblack@eecs.umich.edu * Copyright (c) 2004, 2005 33569Sgblack@eecs.umich.edu * The Regents of The University of Michigan 43569Sgblack@eecs.umich.edu * All Rights Reserved 53569Sgblack@eecs.umich.edu * 63569Sgblack@eecs.umich.edu * This code is part of the M5 simulator. 73569Sgblack@eecs.umich.edu * 83569Sgblack@eecs.umich.edu * Permission is granted to use, copy, create derivative works and 93569Sgblack@eecs.umich.edu * redistribute this software and such derivative works for any 103569Sgblack@eecs.umich.edu * purpose, so long as the copyright notice above, this grant of 113569Sgblack@eecs.umich.edu * permission, and the disclaimer below appear in all copies made; and 123569Sgblack@eecs.umich.edu * so long as the name of The University of Michigan is not used in 133569Sgblack@eecs.umich.edu * any advertising or publicity pertaining to the use or distribution 143569Sgblack@eecs.umich.edu * of this software without specific, written prior authorization. 153569Sgblack@eecs.umich.edu * 163569Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE 173569Sgblack@eecs.umich.edu * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND 183569Sgblack@eecs.umich.edu * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER 193569Sgblack@eecs.umich.edu * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED 203569Sgblack@eecs.umich.edu * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 213569Sgblack@eecs.umich.edu * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE 223569Sgblack@eecs.umich.edu * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, 233569Sgblack@eecs.umich.edu * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM 243569Sgblack@eecs.umich.edu * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN 253569Sgblack@eecs.umich.edu * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH 263569Sgblack@eecs.umich.edu * DAMAGES. 273569Sgblack@eecs.umich.edu * 283804Ssaidi@eecs.umich.edu * Authors: Ali G. Saidi 293569Sgblack@eecs.umich.edu * Andrew L. Schultz 303569Sgblack@eecs.umich.edu * Miguel J. Serrano 313804Ssaidi@eecs.umich.edu */ 323811Ssaidi@eecs.umich.edu 333569Sgblack@eecs.umich.edu#ifndef __DEV_8254_HH__ 343824Ssaidi@eecs.umich.edu#define __DEV_8254_HH__ 353811Ssaidi@eecs.umich.edu 363811Ssaidi@eecs.umich.edu#include <iostream> 373823Ssaidi@eecs.umich.edu#include <string> 383823Ssaidi@eecs.umich.edu 393823Ssaidi@eecs.umich.edu#include "base/bitunion.hh" 403569Sgblack@eecs.umich.edu#include "base/types.hh" 413569Sgblack@eecs.umich.edu#include "base/trace.hh" 423804Ssaidi@eecs.umich.edu#include "debug/Intel8254Timer.hh" 433804Ssaidi@eecs.umich.edu#include "sim/eventq_impl.hh" 443569Sgblack@eecs.umich.edu#include "sim/serialize.hh" 453569Sgblack@eecs.umich.edu 463569Sgblack@eecs.umich.edu/** Programmable Interval Timer (Intel 8254) */ 473804Ssaidi@eecs.umich.educlass Intel8254Timer : public EventManager 483881Ssaidi@eecs.umich.edu{ 493881Ssaidi@eecs.umich.edu protected: 503804Ssaidi@eecs.umich.edu BitUnion8(CtrlReg) 513804Ssaidi@eecs.umich.edu Bitfield<7, 6> sel; 523804Ssaidi@eecs.umich.edu Bitfield<5, 4> rw; 533804Ssaidi@eecs.umich.edu Bitfield<3, 1> mode; 543569Sgblack@eecs.umich.edu Bitfield<0> bcd; 553804Ssaidi@eecs.umich.edu EndBitUnion(CtrlReg) 563804Ssaidi@eecs.umich.edu 573881Ssaidi@eecs.umich.edu enum SelectVal { 583881Ssaidi@eecs.umich.edu SelectCounter0, 593881Ssaidi@eecs.umich.edu SelectCounter1, 603804Ssaidi@eecs.umich.edu SelectCounter2, 613569Sgblack@eecs.umich.edu ReadBackCommand 623804Ssaidi@eecs.umich.edu }; 633804Ssaidi@eecs.umich.edu 643804Ssaidi@eecs.umich.edu enum ReadWriteVal { 653804Ssaidi@eecs.umich.edu LatchCommand, 663881Ssaidi@eecs.umich.edu LsbOnly, 673804Ssaidi@eecs.umich.edu MsbOnly, 683804Ssaidi@eecs.umich.edu TwoPhase 693804Ssaidi@eecs.umich.edu }; 703804Ssaidi@eecs.umich.edu 713804Ssaidi@eecs.umich.edu enum ModeVal { 723804Ssaidi@eecs.umich.edu InitTc, 733804Ssaidi@eecs.umich.edu OneShot, 743569Sgblack@eecs.umich.edu RateGen, 753569Sgblack@eecs.umich.edu SquareWave, 763804Ssaidi@eecs.umich.edu SoftwareStrobe, 773804Ssaidi@eecs.umich.edu HardwareStrobe 783826Ssaidi@eecs.umich.edu }; 793804Ssaidi@eecs.umich.edu 803569Sgblack@eecs.umich.edu /** Counter element for PIT */ 813569Sgblack@eecs.umich.edu class Counter 823804Ssaidi@eecs.umich.edu { 833826Ssaidi@eecs.umich.edu /** Event for counter interrupt */ 843881Ssaidi@eecs.umich.edu class CounterEvent : public Event 853826Ssaidi@eecs.umich.edu { 863811Ssaidi@eecs.umich.edu private: 873836Ssaidi@eecs.umich.edu /** Pointer back to Counter */ 883881Ssaidi@eecs.umich.edu Counter* counter; 893881Ssaidi@eecs.umich.edu Tick interval; 903881Ssaidi@eecs.umich.edu 913881Ssaidi@eecs.umich.edu public: 923881Ssaidi@eecs.umich.edu CounterEvent(Counter*); 933836Ssaidi@eecs.umich.edu 943881Ssaidi@eecs.umich.edu /** Event process */ 953881Ssaidi@eecs.umich.edu void process(); 963881Ssaidi@eecs.umich.edu 973881Ssaidi@eecs.umich.edu /** Event description */ 983881Ssaidi@eecs.umich.edu virtual const char *description() const; 993881Ssaidi@eecs.umich.edu 1003881Ssaidi@eecs.umich.edu friend class Counter; 1013881Ssaidi@eecs.umich.edu 1023881Ssaidi@eecs.umich.edu void setTo(int clocks); 1033881Ssaidi@eecs.umich.edu 1043881Ssaidi@eecs.umich.edu int clocksLeft(); 1053881Ssaidi@eecs.umich.edu 1063881Ssaidi@eecs.umich.edu Tick getInterval(); 1073881Ssaidi@eecs.umich.edu }; 1083881Ssaidi@eecs.umich.edu 1093881Ssaidi@eecs.umich.edu private: 1103881Ssaidi@eecs.umich.edu std::string _name; 1113881Ssaidi@eecs.umich.edu const std::string &name() const { return _name; } 1123811Ssaidi@eecs.umich.edu 1133826Ssaidi@eecs.umich.edu unsigned int num; 1143826Ssaidi@eecs.umich.edu 1153826Ssaidi@eecs.umich.edu CounterEvent event; 1163826Ssaidi@eecs.umich.edu 1173881Ssaidi@eecs.umich.edu /** True after startup is called. */ 1183881Ssaidi@eecs.umich.edu bool running; 1193881Ssaidi@eecs.umich.edu 1203881Ssaidi@eecs.umich.edu /** Initial count value */ 1213881Ssaidi@eecs.umich.edu uint16_t initial_count; 1223881Ssaidi@eecs.umich.edu 1233881Ssaidi@eecs.umich.edu /** Latched count */ 1243881Ssaidi@eecs.umich.edu uint16_t latched_count; 1253881Ssaidi@eecs.umich.edu 1263881Ssaidi@eecs.umich.edu /** Interrupt period */ 1273881Ssaidi@eecs.umich.edu uint16_t period; 1283881Ssaidi@eecs.umich.edu 1293881Ssaidi@eecs.umich.edu /** When to start ticking */ 1303881Ssaidi@eecs.umich.edu Tick offset; 1313881Ssaidi@eecs.umich.edu 1323881Ssaidi@eecs.umich.edu /** Current mode of operation */ 1333826Ssaidi@eecs.umich.edu uint8_t mode; 1343826Ssaidi@eecs.umich.edu 1353826Ssaidi@eecs.umich.edu /** Output goes high when the counter reaches zero */ 1363826Ssaidi@eecs.umich.edu bool output_high; 1373826Ssaidi@eecs.umich.edu 1383881Ssaidi@eecs.umich.edu /** State of the count latch */ 1393569Sgblack@eecs.umich.edu bool latch_on; 1403569Sgblack@eecs.umich.edu 1413881Ssaidi@eecs.umich.edu /** Set of values for read_byte and write_byte */ 1423804Ssaidi@eecs.umich.edu enum {LSB, MSB}; 1433881Ssaidi@eecs.umich.edu 1443826Ssaidi@eecs.umich.edu /** Determine which byte of a 16-bit count value to read/write */ 1453881Ssaidi@eecs.umich.edu uint8_t read_byte, write_byte; 1463881Ssaidi@eecs.umich.edu 1473881Ssaidi@eecs.umich.edu /** Pointer to container */ 1483881Ssaidi@eecs.umich.edu Intel8254Timer *parent; 1493881Ssaidi@eecs.umich.edu 1503569Sgblack@eecs.umich.edu public: 1513804Ssaidi@eecs.umich.edu Counter(Intel8254Timer *p, const std::string &name, unsigned int num); 1523804Ssaidi@eecs.umich.edu 1533881Ssaidi@eecs.umich.edu /** Latch the current count (if one is not already latched) */ 1543804Ssaidi@eecs.umich.edu void latchCount(); 1553804Ssaidi@eecs.umich.edu 1563804Ssaidi@eecs.umich.edu /** Get the current count for this counter */ 1573804Ssaidi@eecs.umich.edu int currentCount(); 1583804Ssaidi@eecs.umich.edu 1593804Ssaidi@eecs.umich.edu /** Set the read/write mode */ 1603804Ssaidi@eecs.umich.edu void setRW(int rw_val); 1613569Sgblack@eecs.umich.edu 1623569Sgblack@eecs.umich.edu /** Set operational mode */ 1633569Sgblack@eecs.umich.edu void setMode(int mode_val); 1643863Ssaidi@eecs.umich.edu 1653863Ssaidi@eecs.umich.edu /** Set count encoding */ 1663804Ssaidi@eecs.umich.edu void setBCD(int bcd_val); 1673804Ssaidi@eecs.umich.edu 1683804Ssaidi@eecs.umich.edu /** Read a count byte */ 1693804Ssaidi@eecs.umich.edu uint8_t read(); 1703804Ssaidi@eecs.umich.edu 1713804Ssaidi@eecs.umich.edu /** Write a count byte */ 1723804Ssaidi@eecs.umich.edu void write(const uint8_t data); 1733804Ssaidi@eecs.umich.edu 1743804Ssaidi@eecs.umich.edu /** Is the output high? */ 1753569Sgblack@eecs.umich.edu bool outputHigh(); 1763804Ssaidi@eecs.umich.edu 1773804Ssaidi@eecs.umich.edu /** 1783804Ssaidi@eecs.umich.edu * Serialize this object to the given output stream. 1793804Ssaidi@eecs.umich.edu * @param base The base name of the counter object. 1803804Ssaidi@eecs.umich.edu * @param os The stream to serialize to. 1813804Ssaidi@eecs.umich.edu */ 1823804Ssaidi@eecs.umich.edu void serialize(const std::string &base, std::ostream &os); 1833804Ssaidi@eecs.umich.edu 1843804Ssaidi@eecs.umich.edu /** 1853811Ssaidi@eecs.umich.edu * Reconstruct the state of this object from a checkpoint. 1863811Ssaidi@eecs.umich.edu * @param base The base name of the counter object. 1873804Ssaidi@eecs.umich.edu * @param cp The checkpoint use. 1883804Ssaidi@eecs.umich.edu * @param section The section name of this object 1893863Ssaidi@eecs.umich.edu */ 1903804Ssaidi@eecs.umich.edu void unserialize(const std::string &base, Checkpoint *cp, 1913804Ssaidi@eecs.umich.edu const std::string §ion); 1923804Ssaidi@eecs.umich.edu 1933804Ssaidi@eecs.umich.edu /** Start ticking */ 1943804Ssaidi@eecs.umich.edu void startup(); 1953804Ssaidi@eecs.umich.edu }; 1963804Ssaidi@eecs.umich.edu 1973811Ssaidi@eecs.umich.edu protected: 1983804Ssaidi@eecs.umich.edu std::string _name; 1993804Ssaidi@eecs.umich.edu const std::string &name() const { return _name; } 2003804Ssaidi@eecs.umich.edu 2013804Ssaidi@eecs.umich.edu /** PIT has three seperate counters */ 2023804Ssaidi@eecs.umich.edu Counter *counter[3]; 2033826Ssaidi@eecs.umich.edu 2043826Ssaidi@eecs.umich.edu virtual void 2053804Ssaidi@eecs.umich.edu counterInterrupt(unsigned int num) 2063804Ssaidi@eecs.umich.edu { 2073804Ssaidi@eecs.umich.edu DPRINTF(Intel8254Timer, "Timer interrupt from counter %d.\n", num); 2083804Ssaidi@eecs.umich.edu } 2093804Ssaidi@eecs.umich.edu 2103804Ssaidi@eecs.umich.edu public: 2113804Ssaidi@eecs.umich.edu 2123804Ssaidi@eecs.umich.edu virtual 2133804Ssaidi@eecs.umich.edu ~Intel8254Timer() 2143804Ssaidi@eecs.umich.edu {} 2153804Ssaidi@eecs.umich.edu 2163804Ssaidi@eecs.umich.edu Intel8254Timer(EventManager *em, const std::string &name, 2173804Ssaidi@eecs.umich.edu Counter *counter0, Counter *counter1, Counter *counter2); 2183826Ssaidi@eecs.umich.edu 2193826Ssaidi@eecs.umich.edu Intel8254Timer(EventManager *em, const std::string &name); 2203826Ssaidi@eecs.umich.edu 2213863Ssaidi@eecs.umich.edu /** Write control word */ 2223826Ssaidi@eecs.umich.edu void writeControl(const CtrlReg data); 2233826Ssaidi@eecs.umich.edu 2243826Ssaidi@eecs.umich.edu uint8_t 2253826Ssaidi@eecs.umich.edu readCounter(unsigned int num) 2263826Ssaidi@eecs.umich.edu { 2273826Ssaidi@eecs.umich.edu assert(num < 3); 2283826Ssaidi@eecs.umich.edu return counter[num]->read(); 2293826Ssaidi@eecs.umich.edu } 2303826Ssaidi@eecs.umich.edu 2313804Ssaidi@eecs.umich.edu void 2323804Ssaidi@eecs.umich.edu writeCounter(unsigned int num, const uint8_t data) 2333804Ssaidi@eecs.umich.edu { 2343804Ssaidi@eecs.umich.edu assert(num < 3); 2353804Ssaidi@eecs.umich.edu counter[num]->write(data); 2363804Ssaidi@eecs.umich.edu } 2373804Ssaidi@eecs.umich.edu 2383863Ssaidi@eecs.umich.edu bool 2393863Ssaidi@eecs.umich.edu outputHigh(unsigned int num) 2403863Ssaidi@eecs.umich.edu { 2413836Ssaidi@eecs.umich.edu assert(num < 3); 2423836Ssaidi@eecs.umich.edu return counter[num]->outputHigh(); 2433804Ssaidi@eecs.umich.edu } 2443804Ssaidi@eecs.umich.edu 2453863Ssaidi@eecs.umich.edu /** 2463804Ssaidi@eecs.umich.edu * Serialize this object to the given output stream. 2473804Ssaidi@eecs.umich.edu * @param base The base name of the counter object. 2483804Ssaidi@eecs.umich.edu * @param os The stream to serialize to. 2493804Ssaidi@eecs.umich.edu */ 2503804Ssaidi@eecs.umich.edu void serialize(const std::string &base, std::ostream &os); 2513804Ssaidi@eecs.umich.edu 2523804Ssaidi@eecs.umich.edu /** 2533863Ssaidi@eecs.umich.edu * Reconstruct the state of this object from a checkpoint. 2543804Ssaidi@eecs.umich.edu * @param base The base name of the counter object. 2553804Ssaidi@eecs.umich.edu * @param cp The checkpoint use. 2563804Ssaidi@eecs.umich.edu * @param section The section name of this object 2573804Ssaidi@eecs.umich.edu */ 2583804Ssaidi@eecs.umich.edu void unserialize(const std::string &base, Checkpoint *cp, 2593881Ssaidi@eecs.umich.edu const std::string §ion); 2603881Ssaidi@eecs.umich.edu 2613804Ssaidi@eecs.umich.edu /** Start ticking */ 2623804Ssaidi@eecs.umich.edu void startup(); 2633804Ssaidi@eecs.umich.edu}; 2643804Ssaidi@eecs.umich.edu 2653804Ssaidi@eecs.umich.edu#endif // __DEV_8254_HH__ 2663804Ssaidi@eecs.umich.edu