external_slave.hh revision 13784
15450Sgblack@eecs.umich.edu/* 25450Sgblack@eecs.umich.edu * Copyright (c) 2012-2014 ARM Limited 35450Sgblack@eecs.umich.edu * All rights reserved 45450Sgblack@eecs.umich.edu * 57087Snate@binkert.org * The license below extends only to copyright in the software and shall 67087Snate@binkert.org * not be construed as granting a license to any other intellectual 77087Snate@binkert.org * property including but not limited to intellectual property relating 87087Snate@binkert.org * to a hardware implementation of the functionality of the software 97087Snate@binkert.org * licensed hereunder. You may use the software subject to the license 107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated 117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software, 127087Snate@binkert.org * modified or unmodified, in source code or in binary form. 135450Sgblack@eecs.umich.edu * 147087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 157087Snate@binkert.org * modification, are permitted provided that the following conditions are 167087Snate@binkert.org * met: redistributions of source code must retain the above copyright 177087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 187087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 197087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 207087Snate@binkert.org * documentation and/or other materials provided with the distribution; 217087Snate@binkert.org * neither the name of the copyright holders nor the names of its 225450Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 237087Snate@binkert.org * this software without specific prior written permission. 245450Sgblack@eecs.umich.edu * 255450Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 265450Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 275450Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 285450Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 295450Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 305450Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 315450Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 325450Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 335450Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 345450Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 355450Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 365450Sgblack@eecs.umich.edu * 375450Sgblack@eecs.umich.edu * Authors: Andrew Bardsley 385450Sgblack@eecs.umich.edu */ 395450Sgblack@eecs.umich.edu 405450Sgblack@eecs.umich.edu/** 4111793Sbrandon.potter@amd.com * @file 425450Sgblack@eecs.umich.edu * 438852Sandreas.hansson@arm.com * ExternalSlave is a memory object representing a binding from 445450Sgblack@eecs.umich.edu * a gem5 master to a slave port in a system external to gem5. 455450Sgblack@eecs.umich.edu * 465450Sgblack@eecs.umich.edu * During initialisation, a `handler' for the port type specified in the 475450Sgblack@eecs.umich.edu * port's port_type parameter is found from the registered port handlers 485450Sgblack@eecs.umich.edu * provided with registerHandler. Once a handler is found, it is passed the 495450Sgblack@eecs.umich.edu * port_data parameter of the port which can be used to identify the external 508852Sandreas.hansson@arm.com * port which is to be bound to. A port handler will usually construct a 515450Sgblack@eecs.umich.edu * bridge object in the external system to accomodate the port-to-port 525450Sgblack@eecs.umich.edu * mapping but this bridge is not exposed to gem5 other than be the 5314010Sgabeblack@google.com * presentation of the SlavePort which can be bound. 545450Sgblack@eecs.umich.edu * 555450Sgblack@eecs.umich.edu * The external port must provide a gem5 SlavePort interface (with the 565450Sgblack@eecs.umich.edu * exception of getAddrRanges which is provided by the ExternalSlave 578852Sandreas.hansson@arm.com * object). 585450Sgblack@eecs.umich.edu */ 595450Sgblack@eecs.umich.edu 605450Sgblack@eecs.umich.edu#ifndef __MEM_EXTERNAL_SLAVE_HH__ 615450Sgblack@eecs.umich.edu#define __MEM_EXTERNAL_SLAVE_HH__ 625450Sgblack@eecs.umich.edu 635450Sgblack@eecs.umich.edu#include "mem/mem_object.hh" 645450Sgblack@eecs.umich.edu#include "params/ExternalSlave.hh" 655450Sgblack@eecs.umich.edu 665450Sgblack@eecs.umich.educlass ExternalSlave : public MemObject 6714010Sgabeblack@google.com{ 685450Sgblack@eecs.umich.edu public: 695450Sgblack@eecs.umich.edu /** Derive from this class to create an external port interface */ 708852Sandreas.hansson@arm.com class ExternalPort : public SlavePort 718852Sandreas.hansson@arm.com { 728852Sandreas.hansson@arm.com protected: 735450Sgblack@eecs.umich.edu ExternalSlave &owner; 745450Sgblack@eecs.umich.edu 755450Sgblack@eecs.umich.edu public: 765450Sgblack@eecs.umich.edu ExternalPort(const std::string &name_, 775450Sgblack@eecs.umich.edu ExternalSlave &owner_) : 785450Sgblack@eecs.umich.edu SlavePort(name_, &owner_), owner(owner_) 795450Sgblack@eecs.umich.edu { } 805450Sgblack@eecs.umich.edu 815450Sgblack@eecs.umich.edu ~ExternalPort() { } 825450Sgblack@eecs.umich.edu 835450Sgblack@eecs.umich.edu /** Any or all of recv... can be overloaded to provide the port's 845450Sgblack@eecs.umich.edu * functionality */ 855450Sgblack@eecs.umich.edu 865450Sgblack@eecs.umich.edu AddrRangeList getAddrRanges() const; 87 }; 88 89 /* Handlers are specific to *types* of port not specific port 90 * instantiations. A handler will typically build a bridge to the 91 * external port from gem5 and provide gem5 with a SlavePort that can be 92 * bound to for each call to Handler::getExternalPort.*/ 93 class Handler 94 { 95 public: 96 /** Create or find an external port which can be bound. Returns 97 * NULL on failure */ 98 virtual ExternalPort *getExternalPort( 99 const std::string &name, ExternalSlave &owner, 100 const std::string &port_data) = 0; 101 }; 102 103 protected: 104 /** The peer port for the gem5 port "port" */ 105 ExternalPort *externalPort; 106 107 /** Name of the bound port. This will be name() + ".port" */ 108 std::string portName; 109 110 /** Key to select a port handler */ 111 std::string portType; 112 113 /** Handler-specific port configuration */ 114 std::string portData; 115 116 /** The Range of addresses supported by the devices on the external 117 * side of this port */ 118 AddrRangeList addrRanges; 119 120 /** Registered handlers. Handlers are chosen using the port_type 121 * parameter on ExternalSlaves. port_types form a global namespace 122 * across the simulation and so handlers are registered into a global 123 * structure */ 124 static std::map<std::string, Handler *> portHandlers; 125 126 public: 127 ExternalSlave(ExternalSlaveParams *params); 128 129 /** Port interface. Responds only to port "port" */ 130 Port &getPort(const std::string &if_name, 131 PortID idx=InvalidPortID) override; 132 133 /** Register a handler which can provide ports with port_type == 134 * handler_name */ 135 static void registerHandler(const std::string &handler_name, 136 Handler *handler); 137 138 void init(); 139}; 140 141 142#endif //__MEM_EXTERNAL_SLAVE_HH__ 143