smmu_v3_slaveifc.hh revision 14064
14104Ssaidi@eecs.umich.edu/*
24104Ssaidi@eecs.umich.edu * Copyright (c) 2013, 2018-2019 ARM Limited
34104Ssaidi@eecs.umich.edu * All rights reserved
44104Ssaidi@eecs.umich.edu *
54104Ssaidi@eecs.umich.edu * The license below extends only to copyright in the software and shall
64104Ssaidi@eecs.umich.edu * not be construed as granting a license to any other intellectual
74104Ssaidi@eecs.umich.edu * property including but not limited to intellectual property relating
84104Ssaidi@eecs.umich.edu * to a hardware implementation of the functionality of the software
94104Ssaidi@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
104104Ssaidi@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
114104Ssaidi@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
124104Ssaidi@eecs.umich.edu * modified or unmodified, in source code or in binary form.
134104Ssaidi@eecs.umich.edu *
144104Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
154104Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
164104Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
174104Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
184104Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
194104Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
204104Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
214104Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
224104Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
234104Ssaidi@eecs.umich.edu * this software without specific prior written permission.
244104Ssaidi@eecs.umich.edu *
254104Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
264104Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
274104Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
284104Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
294104Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
304104Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
314104Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
324104Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
334104Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
344104Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
354104Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
364104Ssaidi@eecs.umich.edu *
374104Ssaidi@eecs.umich.edu * Authors: Stan Czerniawski
384104Ssaidi@eecs.umich.edu */
394104Ssaidi@eecs.umich.edu
404762Snate@binkert.org#ifndef __DEV_ARM_SMMU_V3_SLAVEIFC_HH__
414104Ssaidi@eecs.umich.edu#define __DEV_ARM_SMMU_V3_SLAVEIFC_HH__
424104Ssaidi@eecs.umich.edu
434104Ssaidi@eecs.umich.edu#include <list>
444104Ssaidi@eecs.umich.edu
454104Ssaidi@eecs.umich.edu#include "dev/arm/smmu_v3_caches.hh"
464104Ssaidi@eecs.umich.edu#include "dev/arm/smmu_v3_defs.hh"
474104Ssaidi@eecs.umich.edu#include "dev/arm/smmu_v3_events.hh"
484104Ssaidi@eecs.umich.edu#include "dev/arm/smmu_v3_ports.hh"
494104Ssaidi@eecs.umich.edu#include "dev/arm/smmu_v3_proc.hh"
504104Ssaidi@eecs.umich.edu#include "mem/mem_object.hh"
514104Ssaidi@eecs.umich.edu#include "params/SMMUv3SlaveInterface.hh"
524104Ssaidi@eecs.umich.edu
534104Ssaidi@eecs.umich.educlass SMMUTranslationProcess;
544104Ssaidi@eecs.umich.educlass SMMUv3;
554104Ssaidi@eecs.umich.educlass SMMUSlavePort;
564104Ssaidi@eecs.umich.edu
574104Ssaidi@eecs.umich.educlass SMMUv3SlaveInterface : public MemObject
584104Ssaidi@eecs.umich.edu{
594104Ssaidi@eecs.umich.edu  protected:
604104Ssaidi@eecs.umich.edu    friend class SMMUTranslationProcess;
614104Ssaidi@eecs.umich.edu
624104Ssaidi@eecs.umich.edu  public:
634104Ssaidi@eecs.umich.edu    SMMUv3 *smmu;
644104Ssaidi@eecs.umich.edu    SMMUTLB* microTLB;
654104Ssaidi@eecs.umich.edu    SMMUTLB* mainTLB;
664104Ssaidi@eecs.umich.edu
674104Ssaidi@eecs.umich.edu    const bool microTLBEnable;
684104Ssaidi@eecs.umich.edu    const bool mainTLBEnable;
694104Ssaidi@eecs.umich.edu
704104Ssaidi@eecs.umich.edu    SMMUSemaphore slavePortSem;
714104Ssaidi@eecs.umich.edu    SMMUSemaphore microTLBSem;
724104Ssaidi@eecs.umich.edu    SMMUSemaphore mainTLBSem;
734104Ssaidi@eecs.umich.edu
744104Ssaidi@eecs.umich.edu    const Cycles microTLBLat;
754104Ssaidi@eecs.umich.edu    const Cycles mainTLBLat;
764104Ssaidi@eecs.umich.edu
774104Ssaidi@eecs.umich.edu    SMMUSlavePort *slavePort;
784104Ssaidi@eecs.umich.edu    SMMUATSSlavePort  atsSlavePort;
794104Ssaidi@eecs.umich.edu    SMMUATSMasterPort atsMasterPort;
804104Ssaidi@eecs.umich.edu
814104Ssaidi@eecs.umich.edu    // in bytes
824104Ssaidi@eecs.umich.edu    const unsigned portWidth;
834104Ssaidi@eecs.umich.edu
844104Ssaidi@eecs.umich.edu    unsigned wrBufSlotsRemaining;
854104Ssaidi@eecs.umich.edu    unsigned xlateSlotsRemaining;
864104Ssaidi@eecs.umich.edu
874104Ssaidi@eecs.umich.edu    const bool prefetchEnable;
884104Ssaidi@eecs.umich.edu    const bool prefetchReserveLastWay;
894104Ssaidi@eecs.umich.edu
904104Ssaidi@eecs.umich.edu    std::list<SMMUTranslationProcess *> duplicateReqs;
914104Ssaidi@eecs.umich.edu    SMMUSignal duplicateReqRemoved;
924104Ssaidi@eecs.umich.edu
934104Ssaidi@eecs.umich.edu    std::list<SMMUTranslationProcess *> dependentReads[SMMU_MAX_TRANS_ID];
944104Ssaidi@eecs.umich.edu    std::list<SMMUTranslationProcess *> dependentWrites[SMMU_MAX_TRANS_ID];
954104Ssaidi@eecs.umich.edu    SMMUSignal dependentReqRemoved;
964104Ssaidi@eecs.umich.edu
974104Ssaidi@eecs.umich.edu    // Receiving translation requests from the master device
984104Ssaidi@eecs.umich.edu    Tick recvAtomic(PacketPtr pkt);
994104Ssaidi@eecs.umich.edu    bool recvTimingReq(PacketPtr pkt);
1004104Ssaidi@eecs.umich.edu    void schedTimingResp(PacketPtr pkt);
1014104Ssaidi@eecs.umich.edu
1024104Ssaidi@eecs.umich.edu    Tick atsSlaveRecvAtomic(PacketPtr pkt);
1034104Ssaidi@eecs.umich.edu    bool atsSlaveRecvTimingReq(PacketPtr pkt);
1044104Ssaidi@eecs.umich.edu    bool atsMasterRecvTimingResp(PacketPtr pkt);
1054104Ssaidi@eecs.umich.edu    void schedAtsTimingResp(PacketPtr pkt);
1064104Ssaidi@eecs.umich.edu
1074104Ssaidi@eecs.umich.edu    void scheduleDeviceRetry();
1084104Ssaidi@eecs.umich.edu    void sendDeviceRetry();
1094104Ssaidi@eecs.umich.edu    void atsSendDeviceRetry();
1104104Ssaidi@eecs.umich.edu
1114104Ssaidi@eecs.umich.edu    bool deviceNeedsRetry;
1124104Ssaidi@eecs.umich.edu    bool atsDeviceNeedsRetry;
1134104Ssaidi@eecs.umich.edu
1144104Ssaidi@eecs.umich.edu    SMMUDeviceRetryEvent sendDeviceRetryEvent;
1154104Ssaidi@eecs.umich.edu    EventWrapper<
1164104Ssaidi@eecs.umich.edu        SMMUv3SlaveInterface,
1174104Ssaidi@eecs.umich.edu        &SMMUv3SlaveInterface::atsSendDeviceRetry> atsSendDeviceRetryEvent;
1184104Ssaidi@eecs.umich.edu
1194104Ssaidi@eecs.umich.edu    Port& getPort(const std::string &name, PortID id);
1204104Ssaidi@eecs.umich.edu
1214104Ssaidi@eecs.umich.edu  public:
1224104Ssaidi@eecs.umich.edu    SMMUv3SlaveInterface(const SMMUv3SlaveInterfaceParams *p);
1234104Ssaidi@eecs.umich.edu
1244104Ssaidi@eecs.umich.edu    ~SMMUv3SlaveInterface()
1254762Snate@binkert.org    {
1264762Snate@binkert.org        delete microTLB;
1274762Snate@binkert.org        delete mainTLB;
1284104Ssaidi@eecs.umich.edu    }
1294762Snate@binkert.org
1304762Snate@binkert.org    const SMMUv3SlaveInterfaceParams *
1314104Ssaidi@eecs.umich.edu    params() const
1324762Snate@binkert.org    {
1334762Snate@binkert.org        return static_cast<const SMMUv3SlaveInterfaceParams *>(_params);
1344104Ssaidi@eecs.umich.edu    }
13511347Sandreas.hansson@arm.com
13611347Sandreas.hansson@arm.com    DrainState drain() override;
1374104Ssaidi@eecs.umich.edu
1384104Ssaidi@eecs.umich.edu    void setSMMU(SMMUv3 *_smmu) { smmu = _smmu; }
1394762Snate@binkert.org    void sendRange();
1404762Snate@binkert.org};
1414104Ssaidi@eecs.umich.edu
14211347Sandreas.hansson@arm.com#endif /* __DEV_ARM_SMMU_V3_SLAVEIFC_HH__ */
1434104Ssaidi@eecs.umich.edu