smmu_v3_transl.hh revision 14039:4991b2a345a1
110008Snilay@cs.wisc.edu/*
210008Snilay@cs.wisc.edu * Copyright (c) 2013, 2018-2019 ARM Limited
310008Snilay@cs.wisc.edu * All rights reserved
410008Snilay@cs.wisc.edu *
510008Snilay@cs.wisc.edu * The license below extends only to copyright in the software and shall
610008Snilay@cs.wisc.edu * not be construed as granting a license to any other intellectual
710008Snilay@cs.wisc.edu * property including but not limited to intellectual property relating
810008Snilay@cs.wisc.edu * to a hardware implementation of the functionality of the software
910008Snilay@cs.wisc.edu * licensed hereunder.  You may use the software subject to the license
1010008Snilay@cs.wisc.edu * terms below provided that you ensure that this notice is replicated
1110008Snilay@cs.wisc.edu * unmodified and in its entirety in all distributions of the software,
1210008Snilay@cs.wisc.edu * modified or unmodified, in source code or in binary form.
1310008Snilay@cs.wisc.edu *
1410008Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without
1510008Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are
1610008Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright
1710008Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer;
1810008Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright
1910008Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the
2010008Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution;
2110008Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its
2210008Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from
2310008Snilay@cs.wisc.edu * this software without specific prior written permission.
2410008Snilay@cs.wisc.edu *
2510008Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610008Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710008Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810008Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910008Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010008Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110008Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210008Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310008Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410008Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510008Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610008Snilay@cs.wisc.edu *
3710008Snilay@cs.wisc.edu * Authors: Stan Czerniawski
3810008Snilay@cs.wisc.edu */
3910008Snilay@cs.wisc.edu
4010008Snilay@cs.wisc.edu#ifndef __DEV_ARM_SMMU_V3_TRANSL_HH__
4110008Snilay@cs.wisc.edu#define __DEV_ARM_SMMU_V3_TRANSL_HH__
4210008Snilay@cs.wisc.edu
4310008Snilay@cs.wisc.edu#include "dev/arm/smmu_v3_proc.hh"
4410008Snilay@cs.wisc.edu#include "dev/arm/smmu_v3_ptops.hh"
4510008Snilay@cs.wisc.edu#include "dev/arm/smmu_v3_slaveifc.hh"
4610008Snilay@cs.wisc.edu#include "mem/packet.hh"
4710008Snilay@cs.wisc.edu
4810008Snilay@cs.wisc.edustruct SMMUTranslRequest
4910008Snilay@cs.wisc.edu{
5010008Snilay@cs.wisc.edu    Addr     addr;
5110008Snilay@cs.wisc.edu    unsigned size;
5210008Snilay@cs.wisc.edu    uint32_t sid;  // streamId
5310008Snilay@cs.wisc.edu    uint32_t ssid; // substreamId
5410008Snilay@cs.wisc.edu    bool     isWrite;
5510008Snilay@cs.wisc.edu    bool     isPrefetch;
5610008Snilay@cs.wisc.edu    bool     isAtsRequest;
5710008Snilay@cs.wisc.edu
5810008Snilay@cs.wisc.edu    PacketPtr pkt;
5910116Snilay@cs.wisc.edu
6010008Snilay@cs.wisc.edu    static SMMUTranslRequest fromPacket(PacketPtr pkt, bool ats = false);
6110008Snilay@cs.wisc.edu    static SMMUTranslRequest prefetch(Addr addr, uint32_t sid, uint32_t ssid);
6210008Snilay@cs.wisc.edu};
6310008Snilay@cs.wisc.edu
6410008Snilay@cs.wisc.educlass SMMUTranslationProcess : public SMMUProcess
6510008Snilay@cs.wisc.edu{
6610008Snilay@cs.wisc.edu  private:
6710008Snilay@cs.wisc.edu    struct TranslContext
6810008Snilay@cs.wisc.edu    {
6910008Snilay@cs.wisc.edu        bool stage1Enable;
7010008Snilay@cs.wisc.edu        bool stage2Enable;
7110008Snilay@cs.wisc.edu        Addr ttb0, ttb1, httb;
7210008Snilay@cs.wisc.edu        uint16_t asid;
7310008Snilay@cs.wisc.edu        uint16_t vmid;
7410008Snilay@cs.wisc.edu        uint8_t stage1TranslGranule;
7510008Snilay@cs.wisc.edu        uint8_t stage2TranslGranule;
7610008Snilay@cs.wisc.edu    };
7710008Snilay@cs.wisc.edu
7810008Snilay@cs.wisc.edu    enum FaultType
7910008Snilay@cs.wisc.edu    {
8010008Snilay@cs.wisc.edu        FAULT_NONE,
8110008Snilay@cs.wisc.edu        FAULT_TRANSLATION, // F_TRANSLATION
8210008Snilay@cs.wisc.edu        FAULT_PERMISSION,  // F_PERMISSION
8310008Snilay@cs.wisc.edu    };
8410008Snilay@cs.wisc.edu
8510008Snilay@cs.wisc.edu    struct TranslResult
8610008Snilay@cs.wisc.edu    {
8710008Snilay@cs.wisc.edu        FaultType  fault;
8810008Snilay@cs.wisc.edu        Addr       addr;
8910008Snilay@cs.wisc.edu        Addr       addrMask;
9010008Snilay@cs.wisc.edu        bool       writable;
9110008Snilay@cs.wisc.edu    };
9210008Snilay@cs.wisc.edu
9310008Snilay@cs.wisc.edu    SMMUv3SlaveInterface &ifc;
9410008Snilay@cs.wisc.edu
9510008Snilay@cs.wisc.edu    SMMUTranslRequest request;
9610008Snilay@cs.wisc.edu    TranslContext context;
9710008Snilay@cs.wisc.edu
9810008Snilay@cs.wisc.edu    Tick recvTick;
9910008Snilay@cs.wisc.edu    Tick faultTick;
10010008Snilay@cs.wisc.edu
10110008Snilay@cs.wisc.edu    virtual void main(Yield &yield);
10210008Snilay@cs.wisc.edu
10310008Snilay@cs.wisc.edu    TranslResult bypass(Addr addr) const;
10410008Snilay@cs.wisc.edu    TranslResult smmuTranslation(Yield &yield);
10510300Scastilloe@unican.es
10610008Snilay@cs.wisc.edu    bool microTLBLookup(Yield &yield, TranslResult &tr);
10710008Snilay@cs.wisc.edu    bool ifcTLBLookup(Yield &yield, TranslResult &tr, bool &wasPrefetched);
10810008Snilay@cs.wisc.edu    bool smmuTLBLookup(Yield &yield, TranslResult &tr);
10910300Scastilloe@unican.es
11010008Snilay@cs.wisc.edu    void microTLBUpdate(Yield &yield, const TranslResult &tr);
11110008Snilay@cs.wisc.edu    void ifcTLBUpdate(Yield &yield, const TranslResult &tr);
11210008Snilay@cs.wisc.edu    void smmuTLBUpdate(Yield &yield, const TranslResult &tr);
11310008Snilay@cs.wisc.edu
11410008Snilay@cs.wisc.edu    bool configCacheLookup(Yield &yield, TranslContext &tc);
11510008Snilay@cs.wisc.edu    void configCacheUpdate(Yield &yield, const TranslContext &tc);
11610008Snilay@cs.wisc.edu    bool findConfig(Yield &yield, TranslContext &tc, TranslResult &tr);
11710008Snilay@cs.wisc.edu
11810008Snilay@cs.wisc.edu    void walkCacheLookup(Yield &yield,
11910008Snilay@cs.wisc.edu                         const WalkCache::Entry *&walkEntry,
12010008Snilay@cs.wisc.edu                         Addr addr, uint16_t asid, uint16_t vmid,
12110008Snilay@cs.wisc.edu                         unsigned stage, unsigned level);
12210008Snilay@cs.wisc.edu
12310008Snilay@cs.wisc.edu    void walkCacheUpdate(Yield &yield, Addr va, Addr vaMask, Addr pa,
12410008Snilay@cs.wisc.edu                         unsigned stage, unsigned level,
12510008Snilay@cs.wisc.edu                         bool leaf, uint8_t permissions);
12610008Snilay@cs.wisc.edu
12710008Snilay@cs.wisc.edu    TranslResult walkStage1And2(Yield &yield, Addr addr,
12810008Snilay@cs.wisc.edu                                const PageTableOps *pt_ops,
12910008Snilay@cs.wisc.edu                                unsigned level, Addr walkPtr);
13010008Snilay@cs.wisc.edu
13110008Snilay@cs.wisc.edu    TranslResult walkStage2(Yield &yield, Addr addr, bool final_tr,
13210311Snilay@cs.wisc.edu                            const PageTableOps *pt_ops,
13310311Snilay@cs.wisc.edu                            unsigned level, Addr walkPtr);
13410311Snilay@cs.wisc.edu
13510311Snilay@cs.wisc.edu    TranslResult translateStage1And2(Yield &yield, Addr addr);
13610311Snilay@cs.wisc.edu    TranslResult translateStage2(Yield &yield, Addr addr, bool final_tr);
13710311Snilay@cs.wisc.edu
13810311Snilay@cs.wisc.edu    TranslResult combineTranslations(const TranslResult &s1tr,
13910311Snilay@cs.wisc.edu                                     const TranslResult &s2tr) const;
14010311Snilay@cs.wisc.edu
14110311Snilay@cs.wisc.edu    /**
14210311Snilay@cs.wisc.edu     * Used to force ordering on transactions with same
14310311Snilay@cs.wisc.edu     * (SID, SSID, 4k page) to avoid multiple identical
14410311Snilay@cs.wisc.edu     * page-table walks.
14510008Snilay@cs.wisc.edu     */
14610008Snilay@cs.wisc.edu    bool hazard4kCheck();
14710008Snilay@cs.wisc.edu    void hazard4kRegister();
14810008Snilay@cs.wisc.edu    void hazard4kHold(Yield &yield);
14910008Snilay@cs.wisc.edu    void hazard4kRelease();
15010008Snilay@cs.wisc.edu
15110008Snilay@cs.wisc.edu    /**
15210008Snilay@cs.wisc.edu     * Used to force ordering on transactions with the same orderId.
15310008Snilay@cs.wisc.edu     * This attempts to model AXI IDs.
15410008Snilay@cs.wisc.edu     */
15510008Snilay@cs.wisc.edu    void hazardIdRegister();
15610008Snilay@cs.wisc.edu    void hazardIdHold(Yield &yield);
15710008Snilay@cs.wisc.edu    void hazardIdRelease();
15810008Snilay@cs.wisc.edu
15910008Snilay@cs.wisc.edu    void issuePrefetch(Addr addr);
16010008Snilay@cs.wisc.edu
16110311Snilay@cs.wisc.edu    void completeTransaction(Yield &yield, const TranslResult &tr);
16210311Snilay@cs.wisc.edu    void completePrefetch(Yield &yield);
16310311Snilay@cs.wisc.edu
16410311Snilay@cs.wisc.edu    void sendEvent(Yield &yield, const SMMUEvent &ev);
16510311Snilay@cs.wisc.edu
16610311Snilay@cs.wisc.edu    void doReadSTE(Yield &yield, StreamTableEntry &ste, uint32_t sid);
16710311Snilay@cs.wisc.edu    void doReadCD(Yield &yield, ContextDescriptor &cd,
16810311Snilay@cs.wisc.edu                  const StreamTableEntry &ste, uint32_t sid, uint32_t ssid);
16910311Snilay@cs.wisc.edu    void doReadConfig(Yield &yield, Addr addr, void *ptr, size_t size,
17010008Snilay@cs.wisc.edu                      uint32_t sid, uint32_t ssid);
17110008Snilay@cs.wisc.edu    void doReadPTE(Yield &yield, Addr va, Addr addr, void *ptr,
17210008Snilay@cs.wisc.edu                   unsigned stage, unsigned level);
17310008Snilay@cs.wisc.edu
17410008Snilay@cs.wisc.edu  public:
17510008Snilay@cs.wisc.edu    SMMUTranslationProcess(const std::string &name, SMMUv3 &_smmu,
17610008Snilay@cs.wisc.edu        SMMUv3SlaveInterface &_ifc)
17710008Snilay@cs.wisc.edu      :
17810008Snilay@cs.wisc.edu        SMMUProcess(name, _smmu),
17910008Snilay@cs.wisc.edu        ifc(_ifc)
18010008Snilay@cs.wisc.edu    {
18110008Snilay@cs.wisc.edu        reinit();
18210008Snilay@cs.wisc.edu    }
18310008Snilay@cs.wisc.edu
18410008Snilay@cs.wisc.edu    virtual ~SMMUTranslationProcess() {}
18510008Snilay@cs.wisc.edu
18610008Snilay@cs.wisc.edu    void beginTransaction(const SMMUTranslRequest &req);
18710008Snilay@cs.wisc.edu    void resumeTransaction();
18810008Snilay@cs.wisc.edu};
18910008Snilay@cs.wisc.edu
19010008Snilay@cs.wisc.edu#endif /* __DEV_ARM_SMMU_V3_TRANSL_HH__ */
19110008Snilay@cs.wisc.edu