xbar.cc revision 2548
15245Sgblack@eecs.umich.edu/* 25245Sgblack@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan 35245Sgblack@eecs.umich.edu * All rights reserved. 45245Sgblack@eecs.umich.edu * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 127087Snate@binkert.org * neither the name of the copyright holders nor the names of its 135245Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 147087Snate@binkert.org * this software without specific prior written permission. 157087Snate@binkert.org * 167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225245Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245245Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255245Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265245Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275245Sgblack@eecs.umich.edu */ 285245Sgblack@eecs.umich.edu 295245Sgblack@eecs.umich.edu/** 305245Sgblack@eecs.umich.edu * @file Definition of a bus object. 315245Sgblack@eecs.umich.edu */ 325245Sgblack@eecs.umich.edu 335245Sgblack@eecs.umich.edu 345245Sgblack@eecs.umich.edu#include "base/trace.hh" 355245Sgblack@eecs.umich.edu#include "mem/bus.hh" 365245Sgblack@eecs.umich.edu#include "sim/builder.hh" 375245Sgblack@eecs.umich.edu 385245Sgblack@eecs.umich.edu/** Function called by the port when the bus is recieving a Timing 395245Sgblack@eecs.umich.edu * transaction.*/ 405245Sgblack@eecs.umich.edubool 415245Sgblack@eecs.umich.eduBus::recvTiming(Packet &pkt, int id) 425245Sgblack@eecs.umich.edu{ 435245Sgblack@eecs.umich.edu 445245Sgblack@eecs.umich.edu panic("I need to be implemented, but not right now."); 455245Sgblack@eecs.umich.edu} 465245Sgblack@eecs.umich.edu 478229Snate@binkert.orgPort * 486216Snate@binkert.orgBus::findPort(Addr addr, int id) 495245Sgblack@eecs.umich.edu{ 505245Sgblack@eecs.umich.edu /* An interval tree would be a better way to do this. --ali. */ 515245Sgblack@eecs.umich.edu int dest_id = -1; 527901Shestness@cs.utexas.edu int i = 0; 535245Sgblack@eecs.umich.edu bool found = false; 545245Sgblack@eecs.umich.edu 555245Sgblack@eecs.umich.edu while (i < portList.size() && !found) 565245Sgblack@eecs.umich.edu { 575245Sgblack@eecs.umich.edu if (portList[i].range == addr) { 585245Sgblack@eecs.umich.edu dest_id = portList[i].portId; 595245Sgblack@eecs.umich.edu found = true; 605245Sgblack@eecs.umich.edu } 617912Shestness@cs.utexas.edu i++; 625245Sgblack@eecs.umich.edu } 635245Sgblack@eecs.umich.edu if (dest_id == -1) 645245Sgblack@eecs.umich.edu panic("Unable to find destination for addr: %llx", addr); 655245Sgblack@eecs.umich.edu 668711Sandreas.hansson@arm.com // we shouldn't be sending this back to where it came from 675245Sgblack@eecs.umich.edu assert(dest_id != id); 685245Sgblack@eecs.umich.edu 695245Sgblack@eecs.umich.edu return interfaces[dest_id]; 705245Sgblack@eecs.umich.edu} 715245Sgblack@eecs.umich.edu 725245Sgblack@eecs.umich.edu/** Function called by the port when the bus is recieving a Atomic 735245Sgblack@eecs.umich.edu * transaction.*/ 745245Sgblack@eecs.umich.eduTick 758711Sandreas.hansson@arm.comBus::recvAtomic(Packet &pkt, int id) 765245Sgblack@eecs.umich.edu{ 778711Sandreas.hansson@arm.com return findPort(pkt.addr, id)->sendAtomic(pkt); 785245Sgblack@eecs.umich.edu} 795245Sgblack@eecs.umich.edu 807912Shestness@cs.utexas.edu/** Function called by the port when the bus is recieving a Functional 817912Shestness@cs.utexas.edu * transaction.*/ 825245Sgblack@eecs.umich.eduvoid 835245Sgblack@eecs.umich.eduBus::recvFunctional(Packet &pkt, int id) 847912Shestness@cs.utexas.edu{ 857912Shestness@cs.utexas.edu findPort(pkt.addr, id)->sendFunctional(pkt); 867912Shestness@cs.utexas.edu} 877912Shestness@cs.utexas.edu 887912Shestness@cs.utexas.edu/** Function called by the port when the bus is recieving a status change.*/ 897912Shestness@cs.utexas.eduvoid 907912Shestness@cs.utexas.eduBus::recvStatusChange(Port::Status status, int id) 917912Shestness@cs.utexas.edu{ 927912Shestness@cs.utexas.edu assert(status == Port::RangeChange && 937912Shestness@cs.utexas.edu "The other statuses need to be implemented."); 947912Shestness@cs.utexas.edu 957912Shestness@cs.utexas.edu assert(id < interfaces.size() && id >= 0); 967912Shestness@cs.utexas.edu Port *port = interfaces[id]; 977912Shestness@cs.utexas.edu AddrRangeList ranges; 985245Sgblack@eecs.umich.edu AddrRangeList snoops; 997912Shestness@cs.utexas.edu 1007912Shestness@cs.utexas.edu port->getPeerAddressRanges(ranges, snoops); 1017912Shestness@cs.utexas.edu 1027912Shestness@cs.utexas.edu // not dealing with snooping yet either 1037912Shestness@cs.utexas.edu assert(snoops.size() == 0); 1047912Shestness@cs.utexas.edu // or multiple ranges 1057912Shestness@cs.utexas.edu assert(ranges.size() == 1); 1067912Shestness@cs.utexas.edu 1077912Shestness@cs.utexas.edu DevMap dm; 1087912Shestness@cs.utexas.edu dm.portId = id; 1097912Shestness@cs.utexas.edu dm.range = ranges.front(); 1107912Shestness@cs.utexas.edu 1117912Shestness@cs.utexas.edu DPRINTF(MMU, "Adding range %llx - %llx for id %d\n", dm.range.start, 1127912Shestness@cs.utexas.edu dm.range.end, id); 1137912Shestness@cs.utexas.edu portList.push_back(dm); 1147912Shestness@cs.utexas.edu DPRINTF(MMU, "port list has %d entries\n", portList.size()); 1157912Shestness@cs.utexas.edu} 1167912Shestness@cs.utexas.edu 1177912Shestness@cs.utexas.eduvoid 1185245Sgblack@eecs.umich.eduBus::BusPort::addressRanges(AddrRangeList &resp, AddrRangeList &snoop) 1197912Shestness@cs.utexas.edu{ 1207912Shestness@cs.utexas.edu panic("I'm not implemented.\n"); 1217912Shestness@cs.utexas.edu} 1227912Shestness@cs.utexas.edu 1237912Shestness@cs.utexas.eduBEGIN_DECLARE_SIM_OBJECT_PARAMS(Bus) 1247912Shestness@cs.utexas.edu 1257912Shestness@cs.utexas.edu Param<int> bus_id; 1267912Shestness@cs.utexas.edu 1277912Shestness@cs.utexas.eduEND_DECLARE_SIM_OBJECT_PARAMS(Bus) 1287912Shestness@cs.utexas.edu 1297912Shestness@cs.utexas.eduBEGIN_INIT_SIM_OBJECT_PARAMS(Bus) 1307912Shestness@cs.utexas.edu INIT_PARAM(bus_id, "junk bus id") 1317912Shestness@cs.utexas.eduEND_INIT_SIM_OBJECT_PARAMS(PhysicalMemory) 1327912Shestness@cs.utexas.edu 1337912Shestness@cs.utexas.eduCREATE_SIM_OBJECT(Bus) 1347912Shestness@cs.utexas.edu{ 1357912Shestness@cs.utexas.edu return new Bus(getInstanceName()); 1367912Shestness@cs.utexas.edu} 1377912Shestness@cs.utexas.edu 1387912Shestness@cs.utexas.eduREGISTER_SIM_OBJECT("Bus", Bus) 1397912Shestness@cs.utexas.edu