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