intdev.hh revision 8711
15633Sgblack@eecs.umich.edu/* 25633Sgblack@eecs.umich.edu * Copyright (c) 2008 The Regents of The University of Michigan 35633Sgblack@eecs.umich.edu * All rights reserved. 45633Sgblack@eecs.umich.edu * 55633Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 65633Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 75633Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 85633Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 95633Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 105633Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 115633Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 125633Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 135633Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 145633Sgblack@eecs.umich.edu * this software without specific prior written permission. 155633Sgblack@eecs.umich.edu * 165633Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175633Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185633Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195633Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205633Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215633Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225633Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235633Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245633Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255633Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265633Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275633Sgblack@eecs.umich.edu * 285633Sgblack@eecs.umich.edu * Authors: Gabe Black 295633Sgblack@eecs.umich.edu */ 305633Sgblack@eecs.umich.edu 315633Sgblack@eecs.umich.edu#ifndef __DEV_X86_INTDEV_HH__ 325633Sgblack@eecs.umich.edu#define __DEV_X86_INTDEV_HH__ 335633Sgblack@eecs.umich.edu 346216Snate@binkert.org#include <cassert> 358229Snate@binkert.org#include <list> 365651Sgblack@eecs.umich.edu#include <string> 375633Sgblack@eecs.umich.edu 388229Snate@binkert.org#include "arch/x86/intmessage.hh" 395651Sgblack@eecs.umich.edu#include "arch/x86/x86_traits.hh" 405651Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 415651Sgblack@eecs.umich.edu#include "mem/mport.hh" 428229Snate@binkert.org#include "params/X86IntLine.hh" 438229Snate@binkert.org#include "params/X86IntSinkPin.hh" 448229Snate@binkert.org#include "params/X86IntSourcePin.hh" 455633Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 466138Sgblack@eecs.umich.edu 475633Sgblack@eecs.umich.edunamespace X86ISA { 485633Sgblack@eecs.umich.edu 496138Sgblack@eecs.umich.edutypedef std::list<int> ApicList; 506138Sgblack@eecs.umich.edu 515633Sgblack@eecs.umich.educlass IntDev 525633Sgblack@eecs.umich.edu{ 535651Sgblack@eecs.umich.edu protected: 545651Sgblack@eecs.umich.edu class IntPort : public MessagePort 555651Sgblack@eecs.umich.edu { 565651Sgblack@eecs.umich.edu IntDev * device; 575651Sgblack@eecs.umich.edu Tick latency; 585651Sgblack@eecs.umich.edu Addr intAddr; 595651Sgblack@eecs.umich.edu public: 605651Sgblack@eecs.umich.edu IntPort(const std::string &_name, MemObject * _parent, 615651Sgblack@eecs.umich.edu IntDev *dev, Tick _latency) : 625651Sgblack@eecs.umich.edu MessagePort(_name, _parent), device(dev), latency(_latency) 635651Sgblack@eecs.umich.edu { 645651Sgblack@eecs.umich.edu } 655651Sgblack@eecs.umich.edu 668711Sandreas.hansson@arm.com AddrRangeList getAddrRanges() 675651Sgblack@eecs.umich.edu { 688711Sandreas.hansson@arm.com return device->getIntAddrRange(); 695651Sgblack@eecs.umich.edu } 705651Sgblack@eecs.umich.edu 715651Sgblack@eecs.umich.edu Tick recvMessage(PacketPtr pkt) 725651Sgblack@eecs.umich.edu { 735651Sgblack@eecs.umich.edu return device->recvMessage(pkt); 745651Sgblack@eecs.umich.edu } 755651Sgblack@eecs.umich.edu 766064Sgblack@eecs.umich.edu Tick recvResponse(PacketPtr pkt) 776064Sgblack@eecs.umich.edu { 786064Sgblack@eecs.umich.edu return device->recvResponse(pkt); 796064Sgblack@eecs.umich.edu } 806064Sgblack@eecs.umich.edu 816045Sgblack@eecs.umich.edu // This is x86 focused, so if this class becomes generic, this would 826045Sgblack@eecs.umich.edu // need to be moved into a subclass. 836138Sgblack@eecs.umich.edu void sendMessage(ApicList apics, 846138Sgblack@eecs.umich.edu TriggerIntMessage message, bool timing); 855651Sgblack@eecs.umich.edu }; 865651Sgblack@eecs.umich.edu 875651Sgblack@eecs.umich.edu IntPort * intPort; 885651Sgblack@eecs.umich.edu 895633Sgblack@eecs.umich.edu public: 905651Sgblack@eecs.umich.edu IntDev(MemObject * parent, Tick latency = 0) 915651Sgblack@eecs.umich.edu { 925651Sgblack@eecs.umich.edu if (parent != NULL) { 935651Sgblack@eecs.umich.edu intPort = new IntPort(parent->name() + ".int_port", 945651Sgblack@eecs.umich.edu parent, this, latency); 955651Sgblack@eecs.umich.edu } else { 965651Sgblack@eecs.umich.edu intPort = NULL; 975651Sgblack@eecs.umich.edu } 985651Sgblack@eecs.umich.edu } 995651Sgblack@eecs.umich.edu 1005633Sgblack@eecs.umich.edu virtual ~IntDev() 1015633Sgblack@eecs.umich.edu {} 1025651Sgblack@eecs.umich.edu 1037913SBrad.Beckmann@amd.com virtual void init(); 1047913SBrad.Beckmann@amd.com 1055633Sgblack@eecs.umich.edu virtual void 1065651Sgblack@eecs.umich.edu signalInterrupt(int line) 1075651Sgblack@eecs.umich.edu { 1085651Sgblack@eecs.umich.edu panic("signalInterrupt not implemented.\n"); 1095651Sgblack@eecs.umich.edu } 1105651Sgblack@eecs.umich.edu 1115827Sgblack@eecs.umich.edu virtual void 1125827Sgblack@eecs.umich.edu raiseInterruptPin(int number) 1135827Sgblack@eecs.umich.edu { 1145827Sgblack@eecs.umich.edu panic("raiseInterruptPin not implemented.\n"); 1155827Sgblack@eecs.umich.edu } 1165827Sgblack@eecs.umich.edu 1175827Sgblack@eecs.umich.edu virtual void 1185827Sgblack@eecs.umich.edu lowerInterruptPin(int number) 1195827Sgblack@eecs.umich.edu { 1205827Sgblack@eecs.umich.edu panic("lowerInterruptPin not implemented.\n"); 1215827Sgblack@eecs.umich.edu } 1225827Sgblack@eecs.umich.edu 1235651Sgblack@eecs.umich.edu virtual Tick 1245651Sgblack@eecs.umich.edu recvMessage(PacketPtr pkt) 1255651Sgblack@eecs.umich.edu { 1265651Sgblack@eecs.umich.edu panic("recvMessage not implemented.\n"); 1275651Sgblack@eecs.umich.edu return 0; 1285651Sgblack@eecs.umich.edu } 1295651Sgblack@eecs.umich.edu 1306064Sgblack@eecs.umich.edu virtual Tick 1316064Sgblack@eecs.umich.edu recvResponse(PacketPtr pkt) 1326064Sgblack@eecs.umich.edu { 1336064Sgblack@eecs.umich.edu return 0; 1346064Sgblack@eecs.umich.edu } 1356064Sgblack@eecs.umich.edu 1368711Sandreas.hansson@arm.com virtual AddrRangeList 1378711Sandreas.hansson@arm.com getIntAddrRange() 1385651Sgblack@eecs.umich.edu { 1395651Sgblack@eecs.umich.edu panic("intAddrRange not implemented.\n"); 1405651Sgblack@eecs.umich.edu } 1415633Sgblack@eecs.umich.edu}; 1425633Sgblack@eecs.umich.edu 1435827Sgblack@eecs.umich.educlass IntSinkPin : public SimObject 1445633Sgblack@eecs.umich.edu{ 1455827Sgblack@eecs.umich.edu public: 1465633Sgblack@eecs.umich.edu IntDev * device; 1475827Sgblack@eecs.umich.edu int number; 1485633Sgblack@eecs.umich.edu 1495827Sgblack@eecs.umich.edu typedef X86IntSinkPinParams Params; 1505657Sgblack@eecs.umich.edu 1515633Sgblack@eecs.umich.edu const Params * 1525633Sgblack@eecs.umich.edu params() const 1535633Sgblack@eecs.umich.edu { 1545633Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 1555633Sgblack@eecs.umich.edu } 1565633Sgblack@eecs.umich.edu 1575827Sgblack@eecs.umich.edu IntSinkPin(Params *p) : SimObject(p), 1585827Sgblack@eecs.umich.edu device(dynamic_cast<IntDev *>(p->device)), number(p->number) 1595633Sgblack@eecs.umich.edu { 1605633Sgblack@eecs.umich.edu assert(device); 1615633Sgblack@eecs.umich.edu } 1625827Sgblack@eecs.umich.edu}; 1635827Sgblack@eecs.umich.edu 1645827Sgblack@eecs.umich.educlass IntSourcePin : public SimObject 1655827Sgblack@eecs.umich.edu{ 1665827Sgblack@eecs.umich.edu protected: 1675827Sgblack@eecs.umich.edu std::vector<IntSinkPin *> sinks; 1685827Sgblack@eecs.umich.edu 1695827Sgblack@eecs.umich.edu public: 1705827Sgblack@eecs.umich.edu typedef X86IntSourcePinParams Params; 1715827Sgblack@eecs.umich.edu 1725827Sgblack@eecs.umich.edu const Params * 1735827Sgblack@eecs.umich.edu params() const 1745827Sgblack@eecs.umich.edu { 1755827Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 1765827Sgblack@eecs.umich.edu } 1775633Sgblack@eecs.umich.edu 1785633Sgblack@eecs.umich.edu void 1795827Sgblack@eecs.umich.edu addSink(IntSinkPin *sink) 1805633Sgblack@eecs.umich.edu { 1815827Sgblack@eecs.umich.edu sinks.push_back(sink); 1825827Sgblack@eecs.umich.edu } 1835827Sgblack@eecs.umich.edu 1845827Sgblack@eecs.umich.edu void 1855827Sgblack@eecs.umich.edu raise() 1865827Sgblack@eecs.umich.edu { 1875827Sgblack@eecs.umich.edu for (int i = 0; i < sinks.size(); i++) { 1885827Sgblack@eecs.umich.edu const IntSinkPin &pin = *sinks[i]; 1895827Sgblack@eecs.umich.edu pin.device->raiseInterruptPin(pin.number); 1905827Sgblack@eecs.umich.edu } 1915827Sgblack@eecs.umich.edu } 1925827Sgblack@eecs.umich.edu 1935827Sgblack@eecs.umich.edu void 1945827Sgblack@eecs.umich.edu lower() 1955827Sgblack@eecs.umich.edu { 1965827Sgblack@eecs.umich.edu for (int i = 0; i < sinks.size(); i++) { 1975827Sgblack@eecs.umich.edu const IntSinkPin &pin = *sinks[i]; 1985827Sgblack@eecs.umich.edu pin.device->lowerInterruptPin(pin.number); 1995827Sgblack@eecs.umich.edu } 2005827Sgblack@eecs.umich.edu } 2015827Sgblack@eecs.umich.edu 2025827Sgblack@eecs.umich.edu IntSourcePin(Params *p) : SimObject(p) 2035827Sgblack@eecs.umich.edu {} 2045827Sgblack@eecs.umich.edu}; 2055827Sgblack@eecs.umich.edu 2065827Sgblack@eecs.umich.educlass IntLine : public SimObject 2075827Sgblack@eecs.umich.edu{ 2085827Sgblack@eecs.umich.edu protected: 2095827Sgblack@eecs.umich.edu IntSourcePin *source; 2105827Sgblack@eecs.umich.edu IntSinkPin *sink; 2115827Sgblack@eecs.umich.edu 2125827Sgblack@eecs.umich.edu public: 2135827Sgblack@eecs.umich.edu typedef X86IntLineParams Params; 2145827Sgblack@eecs.umich.edu 2155827Sgblack@eecs.umich.edu const Params * 2165827Sgblack@eecs.umich.edu params() const 2175827Sgblack@eecs.umich.edu { 2185827Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 2195827Sgblack@eecs.umich.edu } 2205827Sgblack@eecs.umich.edu 2215827Sgblack@eecs.umich.edu IntLine(Params *p) : SimObject(p), source(p->source), sink(p->sink) 2225827Sgblack@eecs.umich.edu { 2235827Sgblack@eecs.umich.edu source->addSink(sink); 2245633Sgblack@eecs.umich.edu } 2255633Sgblack@eecs.umich.edu}; 2265633Sgblack@eecs.umich.edu 2277811Ssteve.reinhardt@amd.com} // namespace X86ISA 2285633Sgblack@eecs.umich.edu 2295633Sgblack@eecs.umich.edu#endif //__DEV_X86_INTDEV_HH__ 230