15443Sgblack@eecs.umich.edu/* 25443Sgblack@eecs.umich.edu * Copyright (c) 2004, 2005 35443Sgblack@eecs.umich.edu * The Regents of The University of Michigan 45443Sgblack@eecs.umich.edu * All Rights Reserved 55443Sgblack@eecs.umich.edu * 65443Sgblack@eecs.umich.edu * This code is part of the M5 simulator. 75443Sgblack@eecs.umich.edu * 85443Sgblack@eecs.umich.edu * Permission is granted to use, copy, create derivative works and 95443Sgblack@eecs.umich.edu * redistribute this software and such derivative works for any 105443Sgblack@eecs.umich.edu * purpose, so long as the copyright notice above, this grant of 115443Sgblack@eecs.umich.edu * permission, and the disclaimer below appear in all copies made; and 125443Sgblack@eecs.umich.edu * so long as the name of The University of Michigan is not used in 135443Sgblack@eecs.umich.edu * any advertising or publicity pertaining to the use or distribution 145443Sgblack@eecs.umich.edu * of this software without specific, written prior authorization. 155443Sgblack@eecs.umich.edu * 165443Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE 175443Sgblack@eecs.umich.edu * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND 185443Sgblack@eecs.umich.edu * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER 195443Sgblack@eecs.umich.edu * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED 205443Sgblack@eecs.umich.edu * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 215443Sgblack@eecs.umich.edu * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE 225443Sgblack@eecs.umich.edu * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, 235443Sgblack@eecs.umich.edu * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM 245443Sgblack@eecs.umich.edu * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN 255443Sgblack@eecs.umich.edu * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH 265443Sgblack@eecs.umich.edu * DAMAGES. 275443Sgblack@eecs.umich.edu * 285443Sgblack@eecs.umich.edu * Authors: Ali G. Saidi 295443Sgblack@eecs.umich.edu * Andrew L. Schultz 305443Sgblack@eecs.umich.edu * Miguel J. Serrano 315443Sgblack@eecs.umich.edu */ 325443Sgblack@eecs.umich.edu 335443Sgblack@eecs.umich.edu#ifndef __DEV_8254_HH__ 345443Sgblack@eecs.umich.edu#define __DEV_8254_HH__ 355443Sgblack@eecs.umich.edu 368229Snate@binkert.org#include <iostream> 375606Snate@binkert.org#include <string> 385606Snate@binkert.org 395443Sgblack@eecs.umich.edu#include "base/bitunion.hh" 406216Snate@binkert.org#include "base/types.hh" 419356Snilay@cs.wisc.edu#include "base/trace.hh" 428232Snate@binkert.org#include "debug/Intel8254Timer.hh" 439356Snilay@cs.wisc.edu#include "sim/eventq_impl.hh" 445443Sgblack@eecs.umich.edu#include "sim/serialize.hh" 455443Sgblack@eecs.umich.edu 465443Sgblack@eecs.umich.edu/** Programmable Interval Timer (Intel 8254) */ 475606Snate@binkert.orgclass Intel8254Timer : public EventManager 485443Sgblack@eecs.umich.edu{ 495635Sgblack@eecs.umich.edu protected: 505443Sgblack@eecs.umich.edu BitUnion8(CtrlReg) 515443Sgblack@eecs.umich.edu Bitfield<7, 6> sel; 525443Sgblack@eecs.umich.edu Bitfield<5, 4> rw; 535443Sgblack@eecs.umich.edu Bitfield<3, 1> mode; 545443Sgblack@eecs.umich.edu Bitfield<0> bcd; 555443Sgblack@eecs.umich.edu EndBitUnion(CtrlReg) 565443Sgblack@eecs.umich.edu 575443Sgblack@eecs.umich.edu enum SelectVal { 585443Sgblack@eecs.umich.edu SelectCounter0, 595443Sgblack@eecs.umich.edu SelectCounter1, 605443Sgblack@eecs.umich.edu SelectCounter2, 615443Sgblack@eecs.umich.edu ReadBackCommand 625443Sgblack@eecs.umich.edu }; 635443Sgblack@eecs.umich.edu 645443Sgblack@eecs.umich.edu enum ReadWriteVal { 655443Sgblack@eecs.umich.edu LatchCommand, 665443Sgblack@eecs.umich.edu LsbOnly, 675443Sgblack@eecs.umich.edu MsbOnly, 685443Sgblack@eecs.umich.edu TwoPhase 695443Sgblack@eecs.umich.edu }; 705443Sgblack@eecs.umich.edu 715443Sgblack@eecs.umich.edu enum ModeVal { 725443Sgblack@eecs.umich.edu InitTc, 735443Sgblack@eecs.umich.edu OneShot, 745443Sgblack@eecs.umich.edu RateGen, 755443Sgblack@eecs.umich.edu SquareWave, 765443Sgblack@eecs.umich.edu SoftwareStrobe, 775443Sgblack@eecs.umich.edu HardwareStrobe 785443Sgblack@eecs.umich.edu }; 795443Sgblack@eecs.umich.edu 805443Sgblack@eecs.umich.edu /** Counter element for PIT */ 815443Sgblack@eecs.umich.edu class Counter 825443Sgblack@eecs.umich.edu { 835443Sgblack@eecs.umich.edu /** Event for counter interrupt */ 845443Sgblack@eecs.umich.edu class CounterEvent : public Event 855443Sgblack@eecs.umich.edu { 865443Sgblack@eecs.umich.edu private: 875443Sgblack@eecs.umich.edu /** Pointer back to Counter */ 885443Sgblack@eecs.umich.edu Counter* counter; 895443Sgblack@eecs.umich.edu Tick interval; 905443Sgblack@eecs.umich.edu 915443Sgblack@eecs.umich.edu public: 925443Sgblack@eecs.umich.edu CounterEvent(Counter*); 935443Sgblack@eecs.umich.edu 945443Sgblack@eecs.umich.edu /** Event process */ 955642Sgblack@eecs.umich.edu void process(); 965443Sgblack@eecs.umich.edu 975443Sgblack@eecs.umich.edu /** Event description */ 985443Sgblack@eecs.umich.edu virtual const char *description() const; 995443Sgblack@eecs.umich.edu 1005443Sgblack@eecs.umich.edu friend class Counter; 1015444Sgblack@eecs.umich.edu 1025444Sgblack@eecs.umich.edu void setTo(int clocks); 1036067Sgblack@eecs.umich.edu 1046067Sgblack@eecs.umich.edu int clocksLeft(); 10510642Scdirik@micron.com 10610642Scdirik@micron.com Tick getInterval(); 1075443Sgblack@eecs.umich.edu }; 1085443Sgblack@eecs.umich.edu 1095443Sgblack@eecs.umich.edu private: 1105443Sgblack@eecs.umich.edu std::string _name; 1115443Sgblack@eecs.umich.edu const std::string &name() const { return _name; } 1125443Sgblack@eecs.umich.edu 1135642Sgblack@eecs.umich.edu unsigned int num; 1145642Sgblack@eecs.umich.edu 1155443Sgblack@eecs.umich.edu CounterEvent event; 1165443Sgblack@eecs.umich.edu 11710642Scdirik@micron.com /** True after startup is called. */ 11810642Scdirik@micron.com bool running; 11910642Scdirik@micron.com 1206067Sgblack@eecs.umich.edu /** Initial count value */ 1216067Sgblack@eecs.umich.edu uint16_t initial_count; 1225443Sgblack@eecs.umich.edu 1235443Sgblack@eecs.umich.edu /** Latched count */ 1245443Sgblack@eecs.umich.edu uint16_t latched_count; 1255443Sgblack@eecs.umich.edu 1265443Sgblack@eecs.umich.edu /** Interrupt period */ 1275443Sgblack@eecs.umich.edu uint16_t period; 1285443Sgblack@eecs.umich.edu 12910642Scdirik@micron.com /** When to start ticking */ 13010642Scdirik@micron.com Tick offset; 13110642Scdirik@micron.com 1325443Sgblack@eecs.umich.edu /** Current mode of operation */ 1335443Sgblack@eecs.umich.edu uint8_t mode; 1345443Sgblack@eecs.umich.edu 1355443Sgblack@eecs.umich.edu /** Output goes high when the counter reaches zero */ 1365443Sgblack@eecs.umich.edu bool output_high; 1375443Sgblack@eecs.umich.edu 1385443Sgblack@eecs.umich.edu /** State of the count latch */ 1395443Sgblack@eecs.umich.edu bool latch_on; 1405443Sgblack@eecs.umich.edu 1415443Sgblack@eecs.umich.edu /** Set of values for read_byte and write_byte */ 1425443Sgblack@eecs.umich.edu enum {LSB, MSB}; 1435443Sgblack@eecs.umich.edu 1445443Sgblack@eecs.umich.edu /** Determine which byte of a 16-bit count value to read/write */ 1455443Sgblack@eecs.umich.edu uint8_t read_byte, write_byte; 1465443Sgblack@eecs.umich.edu 1475606Snate@binkert.org /** Pointer to container */ 1485606Snate@binkert.org Intel8254Timer *parent; 1495606Snate@binkert.org 1505443Sgblack@eecs.umich.edu public: 1515642Sgblack@eecs.umich.edu Counter(Intel8254Timer *p, const std::string &name, unsigned int num); 1525443Sgblack@eecs.umich.edu 1535443Sgblack@eecs.umich.edu /** Latch the current count (if one is not already latched) */ 1545443Sgblack@eecs.umich.edu void latchCount(); 1555443Sgblack@eecs.umich.edu 1566067Sgblack@eecs.umich.edu /** Get the current count for this counter */ 1576067Sgblack@eecs.umich.edu int currentCount(); 1586067Sgblack@eecs.umich.edu 1595443Sgblack@eecs.umich.edu /** Set the read/write mode */ 1605443Sgblack@eecs.umich.edu void setRW(int rw_val); 1615443Sgblack@eecs.umich.edu 1625443Sgblack@eecs.umich.edu /** Set operational mode */ 1635443Sgblack@eecs.umich.edu void setMode(int mode_val); 1645443Sgblack@eecs.umich.edu 1655443Sgblack@eecs.umich.edu /** Set count encoding */ 1665443Sgblack@eecs.umich.edu void setBCD(int bcd_val); 1675443Sgblack@eecs.umich.edu 1685443Sgblack@eecs.umich.edu /** Read a count byte */ 1695443Sgblack@eecs.umich.edu uint8_t read(); 1705443Sgblack@eecs.umich.edu 1715443Sgblack@eecs.umich.edu /** Write a count byte */ 1725443Sgblack@eecs.umich.edu void write(const uint8_t data); 1735443Sgblack@eecs.umich.edu 1745443Sgblack@eecs.umich.edu /** Is the output high? */ 1755443Sgblack@eecs.umich.edu bool outputHigh(); 1765443Sgblack@eecs.umich.edu 1775443Sgblack@eecs.umich.edu /** 1785443Sgblack@eecs.umich.edu * Serialize this object to the given output stream. 1795443Sgblack@eecs.umich.edu * @param base The base name of the counter object. 1805443Sgblack@eecs.umich.edu * @param os The stream to serialize to. 1815443Sgblack@eecs.umich.edu */ 18210905Sandreas.sandberg@arm.com void serialize(const std::string &base, CheckpointOut &cp) const; 1835443Sgblack@eecs.umich.edu 1845443Sgblack@eecs.umich.edu /** 1855443Sgblack@eecs.umich.edu * Reconstruct the state of this object from a checkpoint. 1865443Sgblack@eecs.umich.edu * @param base The base name of the counter object. 1875443Sgblack@eecs.umich.edu * @param cp The checkpoint use. 1885443Sgblack@eecs.umich.edu * @param section The section name of this object 1895443Sgblack@eecs.umich.edu */ 19010905Sandreas.sandberg@arm.com void unserialize(const std::string &base, CheckpointIn &cp); 19110642Scdirik@micron.com 19210642Scdirik@micron.com /** Start ticking */ 19310642Scdirik@micron.com void startup(); 1945443Sgblack@eecs.umich.edu }; 1955443Sgblack@eecs.umich.edu 1965635Sgblack@eecs.umich.edu protected: 1975443Sgblack@eecs.umich.edu std::string _name; 1985443Sgblack@eecs.umich.edu const std::string &name() const { return _name; } 1995443Sgblack@eecs.umich.edu 2005443Sgblack@eecs.umich.edu /** PIT has three seperate counters */ 2015443Sgblack@eecs.umich.edu Counter *counter[3]; 2025443Sgblack@eecs.umich.edu 2035642Sgblack@eecs.umich.edu virtual void 2045642Sgblack@eecs.umich.edu counterInterrupt(unsigned int num) 2055642Sgblack@eecs.umich.edu { 2065642Sgblack@eecs.umich.edu DPRINTF(Intel8254Timer, "Timer interrupt from counter %d.\n", num); 2075642Sgblack@eecs.umich.edu } 2085642Sgblack@eecs.umich.edu 2095443Sgblack@eecs.umich.edu public: 2105635Sgblack@eecs.umich.edu 2115642Sgblack@eecs.umich.edu virtual 2125642Sgblack@eecs.umich.edu ~Intel8254Timer() 2135642Sgblack@eecs.umich.edu {} 2145642Sgblack@eecs.umich.edu 2155635Sgblack@eecs.umich.edu Intel8254Timer(EventManager *em, const std::string &name, 2165635Sgblack@eecs.umich.edu Counter *counter0, Counter *counter1, Counter *counter2); 2175443Sgblack@eecs.umich.edu 2185606Snate@binkert.org Intel8254Timer(EventManager *em, const std::string &name); 2195443Sgblack@eecs.umich.edu 2205443Sgblack@eecs.umich.edu /** Write control word */ 2215443Sgblack@eecs.umich.edu void writeControl(const CtrlReg data); 2225443Sgblack@eecs.umich.edu 2235635Sgblack@eecs.umich.edu uint8_t 2245635Sgblack@eecs.umich.edu readCounter(unsigned int num) 2255635Sgblack@eecs.umich.edu { 2265635Sgblack@eecs.umich.edu assert(num < 3); 2275635Sgblack@eecs.umich.edu return counter[num]->read(); 2285635Sgblack@eecs.umich.edu } 2295635Sgblack@eecs.umich.edu 2305635Sgblack@eecs.umich.edu void 2315635Sgblack@eecs.umich.edu writeCounter(unsigned int num, const uint8_t data) 2325635Sgblack@eecs.umich.edu { 2335635Sgblack@eecs.umich.edu assert(num < 3); 2345635Sgblack@eecs.umich.edu counter[num]->write(data); 2355635Sgblack@eecs.umich.edu } 2365635Sgblack@eecs.umich.edu 2375635Sgblack@eecs.umich.edu bool 2385635Sgblack@eecs.umich.edu outputHigh(unsigned int num) 2395635Sgblack@eecs.umich.edu { 2405635Sgblack@eecs.umich.edu assert(num < 3); 2415635Sgblack@eecs.umich.edu return counter[num]->outputHigh(); 2425635Sgblack@eecs.umich.edu } 2435635Sgblack@eecs.umich.edu 2445443Sgblack@eecs.umich.edu /** 2455443Sgblack@eecs.umich.edu * Serialize this object to the given output stream. 2465443Sgblack@eecs.umich.edu * @param base The base name of the counter object. 2475443Sgblack@eecs.umich.edu * @param os The stream to serialize to. 2485443Sgblack@eecs.umich.edu */ 24910905Sandreas.sandberg@arm.com void serialize(const std::string &base, CheckpointOut &cp) const; 2505443Sgblack@eecs.umich.edu 2515443Sgblack@eecs.umich.edu /** 2525443Sgblack@eecs.umich.edu * Reconstruct the state of this object from a checkpoint. 2535443Sgblack@eecs.umich.edu * @param base The base name of the counter object. 2545443Sgblack@eecs.umich.edu * @param cp The checkpoint use. 2555443Sgblack@eecs.umich.edu * @param section The section name of this object 2565443Sgblack@eecs.umich.edu */ 25710905Sandreas.sandberg@arm.com void unserialize(const std::string &base, CheckpointIn &cp); 25810642Scdirik@micron.com 25910642Scdirik@micron.com /** Start ticking */ 26010642Scdirik@micron.com void startup(); 2615443Sgblack@eecs.umich.edu}; 2625443Sgblack@eecs.umich.edu 2635443Sgblack@eecs.umich.edu#endif // __DEV_8254_HH__ 264