110478SAndrew.Bardsley@arm.com/* 210478SAndrew.Bardsley@arm.com * Copyright (c) 2012-2014 ARM Limited 310478SAndrew.Bardsley@arm.com * All rights reserved 410478SAndrew.Bardsley@arm.com * 510478SAndrew.Bardsley@arm.com * The license below extends only to copyright in the software and shall 610478SAndrew.Bardsley@arm.com * not be construed as granting a license to any other intellectual 710478SAndrew.Bardsley@arm.com * property including but not limited to intellectual property relating 810478SAndrew.Bardsley@arm.com * to a hardware implementation of the functionality of the software 910478SAndrew.Bardsley@arm.com * licensed hereunder. You may use the software subject to the license 1010478SAndrew.Bardsley@arm.com * terms below provided that you ensure that this notice is replicated 1110478SAndrew.Bardsley@arm.com * unmodified and in its entirety in all distributions of the software, 1210478SAndrew.Bardsley@arm.com * modified or unmodified, in source code or in binary form. 1310478SAndrew.Bardsley@arm.com * 1410478SAndrew.Bardsley@arm.com * Redistribution and use in source and binary forms, with or without 1510478SAndrew.Bardsley@arm.com * modification, are permitted provided that the following conditions are 1610478SAndrew.Bardsley@arm.com * met: redistributions of source code must retain the above copyright 1710478SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer; 1810478SAndrew.Bardsley@arm.com * redistributions in binary form must reproduce the above copyright 1910478SAndrew.Bardsley@arm.com * notice, this list of conditions and the following disclaimer in the 2010478SAndrew.Bardsley@arm.com * documentation and/or other materials provided with the distribution; 2110478SAndrew.Bardsley@arm.com * neither the name of the copyright holders nor the names of its 2210478SAndrew.Bardsley@arm.com * contributors may be used to endorse or promote products derived from 2310478SAndrew.Bardsley@arm.com * this software without specific prior written permission. 2410478SAndrew.Bardsley@arm.com * 2510478SAndrew.Bardsley@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2610478SAndrew.Bardsley@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2710478SAndrew.Bardsley@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2810478SAndrew.Bardsley@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2910478SAndrew.Bardsley@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3010478SAndrew.Bardsley@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3110478SAndrew.Bardsley@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3210478SAndrew.Bardsley@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3310478SAndrew.Bardsley@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3410478SAndrew.Bardsley@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3510478SAndrew.Bardsley@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3610478SAndrew.Bardsley@arm.com * 3710478SAndrew.Bardsley@arm.com * Authors: Andrew Bardsley 3810478SAndrew.Bardsley@arm.com * Curtis Dunham 3911817SChristian.Menard@tu-dresden.de * Christian Menard 4010478SAndrew.Bardsley@arm.com */ 4110478SAndrew.Bardsley@arm.com 4210478SAndrew.Bardsley@arm.com/** 4310478SAndrew.Bardsley@arm.com * @file 4410478SAndrew.Bardsley@arm.com * 4510478SAndrew.Bardsley@arm.com * ExternalMaster is a memory object representing a binding from 4610478SAndrew.Bardsley@arm.com * a gem5 slave to a master port in a system external to gem5. 4710478SAndrew.Bardsley@arm.com * 4810478SAndrew.Bardsley@arm.com * During initialisation, a `handler' for the port type specified in the 4910478SAndrew.Bardsley@arm.com * port's port_type parameter is found from the registered port handlers 5010478SAndrew.Bardsley@arm.com * provided with registerHandler. Once a handler is found, it is passed the 5110478SAndrew.Bardsley@arm.com * port_data parameter of the port which can be used to identify the external 5210478SAndrew.Bardsley@arm.com * port which is to be bound to. A port handler will usually construct a 5310478SAndrew.Bardsley@arm.com * bridge object in the external system to accomodate the port-to-port 5410478SAndrew.Bardsley@arm.com * mapping but this bridge is not exposed to gem5 other than be the 5510478SAndrew.Bardsley@arm.com * presentation of the MasterPort which can be bound. 5610478SAndrew.Bardsley@arm.com * 5710478SAndrew.Bardsley@arm.com * The external port must provide a gem5 MasterPort interface. 5810478SAndrew.Bardsley@arm.com */ 5910478SAndrew.Bardsley@arm.com 6012492Sodanrc@yahoo.com.br#ifndef __MEM_EXTERNAL_MASTER_HH__ 6112492Sodanrc@yahoo.com.br#define __MEM_EXTERNAL_MASTER_HH__ 6210478SAndrew.Bardsley@arm.com 6313892Sgabeblack@google.com#include "mem/port.hh" 6410478SAndrew.Bardsley@arm.com#include "params/ExternalMaster.hh" 6513892Sgabeblack@google.com#include "sim/sim_object.hh" 6610478SAndrew.Bardsley@arm.com 6713892Sgabeblack@google.comclass ExternalMaster : public SimObject 6810478SAndrew.Bardsley@arm.com{ 6910478SAndrew.Bardsley@arm.com public: 7010478SAndrew.Bardsley@arm.com /** Derive from this class to create an external port interface */ 7113784Sgabeblack@google.com class ExternalPort : public MasterPort 7210478SAndrew.Bardsley@arm.com { 7310478SAndrew.Bardsley@arm.com protected: 7410478SAndrew.Bardsley@arm.com ExternalMaster &owner; 7510478SAndrew.Bardsley@arm.com 7610478SAndrew.Bardsley@arm.com public: 7713784Sgabeblack@google.com ExternalPort(const std::string &name_, 7810478SAndrew.Bardsley@arm.com ExternalMaster &owner_) : 7910478SAndrew.Bardsley@arm.com MasterPort(name_, &owner_), owner(owner_) 8010478SAndrew.Bardsley@arm.com { } 8110478SAndrew.Bardsley@arm.com 8213784Sgabeblack@google.com ~ExternalPort() { } 8310478SAndrew.Bardsley@arm.com 8410478SAndrew.Bardsley@arm.com /** Any or all of recv... can be overloaded to provide the port's 8510478SAndrew.Bardsley@arm.com * functionality */ 8610478SAndrew.Bardsley@arm.com }; 8710478SAndrew.Bardsley@arm.com 8810478SAndrew.Bardsley@arm.com /* Handlers are specific to *types* of port not specific port 8910478SAndrew.Bardsley@arm.com * instantiations. A handler will typically build a bridge to the 9010478SAndrew.Bardsley@arm.com * external port from gem5 and provide gem5 with a MasterPort that can be 9110478SAndrew.Bardsley@arm.com * bound to for each call to Handler::getExternalPort.*/ 9210478SAndrew.Bardsley@arm.com class Handler 9310478SAndrew.Bardsley@arm.com { 9410478SAndrew.Bardsley@arm.com public: 9510478SAndrew.Bardsley@arm.com /** Create or find an external port which can be bound. Returns 9610478SAndrew.Bardsley@arm.com * NULL on failure */ 9713784Sgabeblack@google.com virtual ExternalPort *getExternalPort( 9810478SAndrew.Bardsley@arm.com const std::string &name, ExternalMaster &owner, 9910478SAndrew.Bardsley@arm.com const std::string &port_data) = 0; 10010478SAndrew.Bardsley@arm.com }; 10110478SAndrew.Bardsley@arm.com 10210478SAndrew.Bardsley@arm.com protected: 10310478SAndrew.Bardsley@arm.com /** The peer port for the gem5 port "port" */ 10413784Sgabeblack@google.com ExternalPort *externalPort; 10510478SAndrew.Bardsley@arm.com 10610478SAndrew.Bardsley@arm.com /** Name of the bound port. This will be name() + ".port" */ 10710478SAndrew.Bardsley@arm.com std::string portName; 10810478SAndrew.Bardsley@arm.com 10910478SAndrew.Bardsley@arm.com /** Key to select a port handler */ 11010478SAndrew.Bardsley@arm.com std::string portType; 11110478SAndrew.Bardsley@arm.com 11210478SAndrew.Bardsley@arm.com /** Handler-specific port configuration */ 11310478SAndrew.Bardsley@arm.com std::string portData; 11410478SAndrew.Bardsley@arm.com 11510478SAndrew.Bardsley@arm.com /** Registered handlers. Handlers are chosen using the port_type 11610478SAndrew.Bardsley@arm.com * parameter on ExternalMasters. port_types form a global namespace 11710478SAndrew.Bardsley@arm.com * across the simulation and so handlers are registered into a global 11810478SAndrew.Bardsley@arm.com * structure */ 11910478SAndrew.Bardsley@arm.com static std::map<std::string, Handler *> portHandlers; 12010478SAndrew.Bardsley@arm.com 12110478SAndrew.Bardsley@arm.com public: 12210478SAndrew.Bardsley@arm.com ExternalMaster(ExternalMasterParams *params); 12310478SAndrew.Bardsley@arm.com 12413784Sgabeblack@google.com /** Port interface. Responds only to port "port" */ 12513784Sgabeblack@google.com Port &getPort(const std::string &if_name, 12613784Sgabeblack@google.com PortID idx=InvalidPortID) override; 12710478SAndrew.Bardsley@arm.com 12810478SAndrew.Bardsley@arm.com /** Register a handler which can provide ports with port_type == 12910478SAndrew.Bardsley@arm.com * handler_name */ 13010478SAndrew.Bardsley@arm.com static void registerHandler(const std::string &handler_name, 13110478SAndrew.Bardsley@arm.com Handler *handler); 13210478SAndrew.Bardsley@arm.com 13313799SAndrea.Mondelli@ucf.edu void init() override; 13411817SChristian.Menard@tu-dresden.de 13511817SChristian.Menard@tu-dresden.de const MasterID masterId; 13610478SAndrew.Bardsley@arm.com}; 13710478SAndrew.Bardsley@arm.com 13810478SAndrew.Bardsley@arm.com 13912492Sodanrc@yahoo.com.br#endif //__MEM_EXTERNAL_MASTER_HH__ 140