intdev.hh revision 9807
15633Sgblack@eecs.umich.edu/* 28922Swilliam.wang@arm.com * Copyright (c) 2012 ARM Limited 38922Swilliam.wang@arm.com * All rights reserved 48922Swilliam.wang@arm.com * 58922Swilliam.wang@arm.com * The license below extends only to copyright in the software and shall 68922Swilliam.wang@arm.com * not be construed as granting a license to any other intellectual 78922Swilliam.wang@arm.com * property including but not limited to intellectual property relating 88922Swilliam.wang@arm.com * to a hardware implementation of the functionality of the software 98922Swilliam.wang@arm.com * licensed hereunder. You may use the software subject to the license 108922Swilliam.wang@arm.com * terms below provided that you ensure that this notice is replicated 118922Swilliam.wang@arm.com * unmodified and in its entirety in all distributions of the software, 128922Swilliam.wang@arm.com * modified or unmodified, in source code or in binary form. 138922Swilliam.wang@arm.com * 145633Sgblack@eecs.umich.edu * Copyright (c) 2008 The Regents of The University of Michigan 155633Sgblack@eecs.umich.edu * All rights reserved. 165633Sgblack@eecs.umich.edu * 175633Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 185633Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 195633Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 205633Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 215633Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 225633Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 235633Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 245633Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 255633Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 265633Sgblack@eecs.umich.edu * this software without specific prior written permission. 275633Sgblack@eecs.umich.edu * 285633Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 295633Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 305633Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 315633Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 325633Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 335633Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 345633Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 355633Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 365633Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 375633Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 385633Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 395633Sgblack@eecs.umich.edu * 405633Sgblack@eecs.umich.edu * Authors: Gabe Black 415633Sgblack@eecs.umich.edu */ 425633Sgblack@eecs.umich.edu 435633Sgblack@eecs.umich.edu#ifndef __DEV_X86_INTDEV_HH__ 445633Sgblack@eecs.umich.edu#define __DEV_X86_INTDEV_HH__ 455633Sgblack@eecs.umich.edu 466216Snate@binkert.org#include <cassert> 478229Snate@binkert.org#include <list> 485651Sgblack@eecs.umich.edu#include <string> 495633Sgblack@eecs.umich.edu 508229Snate@binkert.org#include "arch/x86/intmessage.hh" 515651Sgblack@eecs.umich.edu#include "arch/x86/x86_traits.hh" 525651Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 535651Sgblack@eecs.umich.edu#include "mem/mport.hh" 548229Snate@binkert.org#include "params/X86IntLine.hh" 558229Snate@binkert.org#include "params/X86IntSinkPin.hh" 568229Snate@binkert.org#include "params/X86IntSourcePin.hh" 575633Sgblack@eecs.umich.edu#include "sim/sim_object.hh" 586138Sgblack@eecs.umich.edu 595633Sgblack@eecs.umich.edunamespace X86ISA { 605633Sgblack@eecs.umich.edu 616138Sgblack@eecs.umich.edutypedef std::list<int> ApicList; 626138Sgblack@eecs.umich.edu 639807Sstever@gmail.comclass IntDevice 645633Sgblack@eecs.umich.edu{ 655651Sgblack@eecs.umich.edu protected: 668922Swilliam.wang@arm.com class IntSlavePort : public MessageSlavePort 675651Sgblack@eecs.umich.edu { 689807Sstever@gmail.com IntDevice * device; 699557Sandreas.hansson@arm.com 705651Sgblack@eecs.umich.edu public: 718922Swilliam.wang@arm.com IntSlavePort(const std::string& _name, MemObject* _parent, 729807Sstever@gmail.com IntDevice* dev) : 739557Sandreas.hansson@arm.com MessageSlavePort(_name, _parent), device(dev) 745651Sgblack@eecs.umich.edu { 755651Sgblack@eecs.umich.edu } 765651Sgblack@eecs.umich.edu 779090Sandreas.hansson@arm.com AddrRangeList getAddrRanges() const 785651Sgblack@eecs.umich.edu { 798711Sandreas.hansson@arm.com return device->getIntAddrRange(); 805651Sgblack@eecs.umich.edu } 815651Sgblack@eecs.umich.edu 825651Sgblack@eecs.umich.edu Tick recvMessage(PacketPtr pkt) 835651Sgblack@eecs.umich.edu { 849549Sandreas.hansson@arm.com // @todo someone should pay for this 859549Sandreas.hansson@arm.com pkt->busFirstWordDelay = pkt->busLastWordDelay = 0; 865651Sgblack@eecs.umich.edu return device->recvMessage(pkt); 875651Sgblack@eecs.umich.edu } 888922Swilliam.wang@arm.com }; 898922Swilliam.wang@arm.com 908922Swilliam.wang@arm.com class IntMasterPort : public MessageMasterPort 918922Swilliam.wang@arm.com { 929807Sstever@gmail.com IntDevice* device; 938922Swilliam.wang@arm.com Tick latency; 948922Swilliam.wang@arm.com public: 958922Swilliam.wang@arm.com IntMasterPort(const std::string& _name, MemObject* _parent, 969807Sstever@gmail.com IntDevice* dev, Tick _latency) : 978922Swilliam.wang@arm.com MessageMasterPort(_name, _parent), device(dev), latency(_latency) 988922Swilliam.wang@arm.com { 998922Swilliam.wang@arm.com } 1005651Sgblack@eecs.umich.edu 1016064Sgblack@eecs.umich.edu Tick recvResponse(PacketPtr pkt) 1026064Sgblack@eecs.umich.edu { 1036064Sgblack@eecs.umich.edu return device->recvResponse(pkt); 1046064Sgblack@eecs.umich.edu } 1056064Sgblack@eecs.umich.edu 1066045Sgblack@eecs.umich.edu // This is x86 focused, so if this class becomes generic, this would 1076045Sgblack@eecs.umich.edu // need to be moved into a subclass. 1086138Sgblack@eecs.umich.edu void sendMessage(ApicList apics, 1096138Sgblack@eecs.umich.edu TriggerIntMessage message, bool timing); 1105651Sgblack@eecs.umich.edu }; 1115651Sgblack@eecs.umich.edu 1128922Swilliam.wang@arm.com IntMasterPort intMasterPort; 1135651Sgblack@eecs.umich.edu 1145633Sgblack@eecs.umich.edu public: 1159807Sstever@gmail.com IntDevice(MemObject * parent, Tick latency = 0) : 1168922Swilliam.wang@arm.com intMasterPort(parent->name() + ".int_master", parent, this, latency) 1175651Sgblack@eecs.umich.edu { 1185651Sgblack@eecs.umich.edu } 1195651Sgblack@eecs.umich.edu 1209807Sstever@gmail.com virtual ~IntDevice() 1215633Sgblack@eecs.umich.edu {} 1225651Sgblack@eecs.umich.edu 1237913SBrad.Beckmann@amd.com virtual void init(); 1247913SBrad.Beckmann@amd.com 1255633Sgblack@eecs.umich.edu virtual void 1265651Sgblack@eecs.umich.edu signalInterrupt(int line) 1275651Sgblack@eecs.umich.edu { 1285651Sgblack@eecs.umich.edu panic("signalInterrupt not implemented.\n"); 1295651Sgblack@eecs.umich.edu } 1305651Sgblack@eecs.umich.edu 1315827Sgblack@eecs.umich.edu virtual void 1325827Sgblack@eecs.umich.edu raiseInterruptPin(int number) 1335827Sgblack@eecs.umich.edu { 1345827Sgblack@eecs.umich.edu panic("raiseInterruptPin not implemented.\n"); 1355827Sgblack@eecs.umich.edu } 1365827Sgblack@eecs.umich.edu 1375827Sgblack@eecs.umich.edu virtual void 1385827Sgblack@eecs.umich.edu lowerInterruptPin(int number) 1395827Sgblack@eecs.umich.edu { 1405827Sgblack@eecs.umich.edu panic("lowerInterruptPin not implemented.\n"); 1415827Sgblack@eecs.umich.edu } 1425827Sgblack@eecs.umich.edu 1435651Sgblack@eecs.umich.edu virtual Tick 1445651Sgblack@eecs.umich.edu recvMessage(PacketPtr pkt) 1455651Sgblack@eecs.umich.edu { 1465651Sgblack@eecs.umich.edu panic("recvMessage not implemented.\n"); 1475651Sgblack@eecs.umich.edu return 0; 1485651Sgblack@eecs.umich.edu } 1495651Sgblack@eecs.umich.edu 1506064Sgblack@eecs.umich.edu virtual Tick 1516064Sgblack@eecs.umich.edu recvResponse(PacketPtr pkt) 1526064Sgblack@eecs.umich.edu { 1536064Sgblack@eecs.umich.edu return 0; 1546064Sgblack@eecs.umich.edu } 1556064Sgblack@eecs.umich.edu 1568711Sandreas.hansson@arm.com virtual AddrRangeList 1579090Sandreas.hansson@arm.com getIntAddrRange() const 1585651Sgblack@eecs.umich.edu { 1595651Sgblack@eecs.umich.edu panic("intAddrRange not implemented.\n"); 1605651Sgblack@eecs.umich.edu } 1615633Sgblack@eecs.umich.edu}; 1625633Sgblack@eecs.umich.edu 1635827Sgblack@eecs.umich.educlass IntSinkPin : public SimObject 1645633Sgblack@eecs.umich.edu{ 1655827Sgblack@eecs.umich.edu public: 1669807Sstever@gmail.com IntDevice * device; 1675827Sgblack@eecs.umich.edu int number; 1685633Sgblack@eecs.umich.edu 1695827Sgblack@eecs.umich.edu typedef X86IntSinkPinParams Params; 1705657Sgblack@eecs.umich.edu 1715633Sgblack@eecs.umich.edu const Params * 1725633Sgblack@eecs.umich.edu params() const 1735633Sgblack@eecs.umich.edu { 1745633Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 1755633Sgblack@eecs.umich.edu } 1765633Sgblack@eecs.umich.edu 1775827Sgblack@eecs.umich.edu IntSinkPin(Params *p) : SimObject(p), 1789807Sstever@gmail.com device(dynamic_cast<IntDevice *>(p->device)), number(p->number) 1795633Sgblack@eecs.umich.edu { 1805633Sgblack@eecs.umich.edu assert(device); 1815633Sgblack@eecs.umich.edu } 1825827Sgblack@eecs.umich.edu}; 1835827Sgblack@eecs.umich.edu 1845827Sgblack@eecs.umich.educlass IntSourcePin : public SimObject 1855827Sgblack@eecs.umich.edu{ 1865827Sgblack@eecs.umich.edu protected: 1875827Sgblack@eecs.umich.edu std::vector<IntSinkPin *> sinks; 1885827Sgblack@eecs.umich.edu 1895827Sgblack@eecs.umich.edu public: 1905827Sgblack@eecs.umich.edu typedef X86IntSourcePinParams Params; 1915827Sgblack@eecs.umich.edu 1925827Sgblack@eecs.umich.edu const Params * 1935827Sgblack@eecs.umich.edu params() const 1945827Sgblack@eecs.umich.edu { 1955827Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 1965827Sgblack@eecs.umich.edu } 1975633Sgblack@eecs.umich.edu 1985633Sgblack@eecs.umich.edu void 1995827Sgblack@eecs.umich.edu addSink(IntSinkPin *sink) 2005633Sgblack@eecs.umich.edu { 2015827Sgblack@eecs.umich.edu sinks.push_back(sink); 2025827Sgblack@eecs.umich.edu } 2035827Sgblack@eecs.umich.edu 2045827Sgblack@eecs.umich.edu void 2055827Sgblack@eecs.umich.edu raise() 2065827Sgblack@eecs.umich.edu { 2075827Sgblack@eecs.umich.edu for (int i = 0; i < sinks.size(); i++) { 2085827Sgblack@eecs.umich.edu const IntSinkPin &pin = *sinks[i]; 2095827Sgblack@eecs.umich.edu pin.device->raiseInterruptPin(pin.number); 2105827Sgblack@eecs.umich.edu } 2115827Sgblack@eecs.umich.edu } 2125827Sgblack@eecs.umich.edu 2135827Sgblack@eecs.umich.edu void 2145827Sgblack@eecs.umich.edu lower() 2155827Sgblack@eecs.umich.edu { 2165827Sgblack@eecs.umich.edu for (int i = 0; i < sinks.size(); i++) { 2175827Sgblack@eecs.umich.edu const IntSinkPin &pin = *sinks[i]; 2185827Sgblack@eecs.umich.edu pin.device->lowerInterruptPin(pin.number); 2195827Sgblack@eecs.umich.edu } 2205827Sgblack@eecs.umich.edu } 2215827Sgblack@eecs.umich.edu 2225827Sgblack@eecs.umich.edu IntSourcePin(Params *p) : SimObject(p) 2235827Sgblack@eecs.umich.edu {} 2245827Sgblack@eecs.umich.edu}; 2255827Sgblack@eecs.umich.edu 2265827Sgblack@eecs.umich.educlass IntLine : public SimObject 2275827Sgblack@eecs.umich.edu{ 2285827Sgblack@eecs.umich.edu protected: 2295827Sgblack@eecs.umich.edu IntSourcePin *source; 2305827Sgblack@eecs.umich.edu IntSinkPin *sink; 2315827Sgblack@eecs.umich.edu 2325827Sgblack@eecs.umich.edu public: 2335827Sgblack@eecs.umich.edu typedef X86IntLineParams Params; 2345827Sgblack@eecs.umich.edu 2355827Sgblack@eecs.umich.edu const Params * 2365827Sgblack@eecs.umich.edu params() const 2375827Sgblack@eecs.umich.edu { 2385827Sgblack@eecs.umich.edu return dynamic_cast<const Params *>(_params); 2395827Sgblack@eecs.umich.edu } 2405827Sgblack@eecs.umich.edu 2415827Sgblack@eecs.umich.edu IntLine(Params *p) : SimObject(p), source(p->source), sink(p->sink) 2425827Sgblack@eecs.umich.edu { 2435827Sgblack@eecs.umich.edu source->addSink(sink); 2445633Sgblack@eecs.umich.edu } 2455633Sgblack@eecs.umich.edu}; 2465633Sgblack@eecs.umich.edu 2477811Ssteve.reinhardt@amd.com} // namespace X86ISA 2485633Sgblack@eecs.umich.edu 2495633Sgblack@eecs.umich.edu#endif //__DEV_X86_INTDEV_HH__ 250