io_device.cc revision 10694
16313Sgblack@eecs.umich.edu/*
26313Sgblack@eecs.umich.edu * Copyright (c) 2012 ARM Limited
36313Sgblack@eecs.umich.edu * All rights reserved.
46313Sgblack@eecs.umich.edu *
56313Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
66313Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
76313Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
86313Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
96313Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
106313Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
116313Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
126313Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
136313Sgblack@eecs.umich.edu *
146313Sgblack@eecs.umich.edu * Copyright (c) 2006 The Regents of The University of Michigan
156313Sgblack@eecs.umich.edu * All rights reserved.
166313Sgblack@eecs.umich.edu *
176313Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
186313Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
196313Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
206313Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
216313Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
226313Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
236313Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
246313Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
256313Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
266313Sgblack@eecs.umich.edu * this software without specific prior written permission.
276313Sgblack@eecs.umich.edu *
286313Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
296313Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
306313Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
317678Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
327678Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
336313Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
346330Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
356313Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
367680Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
376313Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
386313Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
396313Sgblack@eecs.umich.edu *
406313Sgblack@eecs.umich.edu * Authors: Ali Saidi
416313Sgblack@eecs.umich.edu *          Nathan Binkert
426678Sgblack@eecs.umich.edu */
436313Sgblack@eecs.umich.edu
446330Sgblack@eecs.umich.edu#include "base/trace.hh"
456330Sgblack@eecs.umich.edu#include "debug/AddrRanges.hh"
466330Sgblack@eecs.umich.edu#include "dev/io_device.hh"
476330Sgblack@eecs.umich.edu#include "sim/system.hh"
486330Sgblack@eecs.umich.edu
496313Sgblack@eecs.umich.eduPioPort::PioPort(PioDevice *dev)
506313Sgblack@eecs.umich.edu    : SimpleTimingPort(dev->name() + ".pio", dev), device(dev)
516313Sgblack@eecs.umich.edu{
526678Sgblack@eecs.umich.edu}
536313Sgblack@eecs.umich.edu
546330Sgblack@eecs.umich.eduTick
556330Sgblack@eecs.umich.eduPioPort::recvAtomic(PacketPtr pkt)
566330Sgblack@eecs.umich.edu{
576330Sgblack@eecs.umich.edu    // @todo: We need to pay for this and not just zero it out
586330Sgblack@eecs.umich.edu    pkt->headerDelay = pkt->payloadDelay = 0;
596330Sgblack@eecs.umich.edu
606330Sgblack@eecs.umich.edu    const Tick delay(pkt->isRead() ? device->read(pkt) : device->write(pkt));
616330Sgblack@eecs.umich.edu    assert(pkt->isResponse() || pkt->isError());
626330Sgblack@eecs.umich.edu    return delay;
636330Sgblack@eecs.umich.edu}
646330Sgblack@eecs.umich.edu
656330Sgblack@eecs.umich.eduAddrRangeList
666330Sgblack@eecs.umich.eduPioPort::getAddrRanges() const
676330Sgblack@eecs.umich.edu{
686330Sgblack@eecs.umich.edu    return device->getAddrRanges();
696330Sgblack@eecs.umich.edu}
706330Sgblack@eecs.umich.edu
716330Sgblack@eecs.umich.eduPioDevice::PioDevice(const Params *p)
726330Sgblack@eecs.umich.edu    : MemObject(p), sys(p->system), pioPort(this)
736330Sgblack@eecs.umich.edu{}
746330Sgblack@eecs.umich.edu
756330Sgblack@eecs.umich.eduPioDevice::~PioDevice()
766330Sgblack@eecs.umich.edu{
776330Sgblack@eecs.umich.edu}
786330Sgblack@eecs.umich.edu
796330Sgblack@eecs.umich.eduvoid
806330Sgblack@eecs.umich.eduPioDevice::init()
816330Sgblack@eecs.umich.edu{
826330Sgblack@eecs.umich.edu    if (!pioPort.isConnected())
836330Sgblack@eecs.umich.edu        panic("Pio port of %s not connected to anything!", name());
846330Sgblack@eecs.umich.edu    pioPort.sendRangeChange();
856330Sgblack@eecs.umich.edu}
866330Sgblack@eecs.umich.edu
876330Sgblack@eecs.umich.eduBaseSlavePort &
886330Sgblack@eecs.umich.eduPioDevice::getSlavePort(const std::string &if_name, PortID idx)
896330Sgblack@eecs.umich.edu{
906330Sgblack@eecs.umich.edu    if (if_name == "pio") {
916330Sgblack@eecs.umich.edu        return pioPort;
926330Sgblack@eecs.umich.edu    }
936330Sgblack@eecs.umich.edu    return MemObject::getSlavePort(if_name, idx);
946330Sgblack@eecs.umich.edu}
956330Sgblack@eecs.umich.edu
966330Sgblack@eecs.umich.eduunsigned int
976330Sgblack@eecs.umich.eduPioDevice::drain(DrainManager *dm)
986330Sgblack@eecs.umich.edu{
996330Sgblack@eecs.umich.edu    unsigned int count;
1006330Sgblack@eecs.umich.edu    count = pioPort.drain(dm);
1016330Sgblack@eecs.umich.edu    if (count)
1026330Sgblack@eecs.umich.edu        setDrainState(Drainable::Draining);
1036330Sgblack@eecs.umich.edu    else
1046330Sgblack@eecs.umich.edu        setDrainState(Drainable::Drained);
1056330Sgblack@eecs.umich.edu    return count;
1066330Sgblack@eecs.umich.edu}
1076330Sgblack@eecs.umich.edu
1086330Sgblack@eecs.umich.eduBasicPioDevice::BasicPioDevice(const Params *p, Addr size)
1096330Sgblack@eecs.umich.edu    : PioDevice(p), pioAddr(p->pio_addr), pioSize(size),
1106330Sgblack@eecs.umich.edu      pioDelay(p->pio_latency)
1116330Sgblack@eecs.umich.edu{}
1126330Sgblack@eecs.umich.edu
1136330Sgblack@eecs.umich.eduAddrRangeList
1146330Sgblack@eecs.umich.eduBasicPioDevice::getAddrRanges() const
1156330Sgblack@eecs.umich.edu{
1166330Sgblack@eecs.umich.edu    assert(pioSize != 0);
1176330Sgblack@eecs.umich.edu    AddrRangeList ranges;
1186330Sgblack@eecs.umich.edu    DPRINTF(AddrRanges, "registering range: %#x-%#x\n", pioAddr, pioSize);
1196330Sgblack@eecs.umich.edu    ranges.push_back(RangeSize(pioAddr, pioSize));
1206330Sgblack@eecs.umich.edu    return ranges;
1216330Sgblack@eecs.umich.edu}
1226330Sgblack@eecs.umich.edu