| /* |
| * Copyright (c) 2022 Advanced Micro Devices, Inc. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * 3. Neither the name of the copyright holder nor the names of its |
| * contributors may be used to endorse or promote products derived from this |
| * software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #ifndef __ARCH_AMDGPU_COMMON_GPU_TRANSLATION_STATE_HH__ |
| #define __ARCH_AMDGPU_COMMON_GPU_TRANSLATION_STATE_HH__ |
| |
| #include "arch/generic/mmu.hh" |
| |
| namespace gem5 |
| { |
| |
| class ResponsePort; |
| |
| /** |
| * GPU TranslationState: this currently is a somewhat bastardization of |
| * the usage of SenderState, whereby the receiver of a packet is not |
| * usually supposed to need to look at the contents of the senderState, |
| * you're really only supposed to look at what you pushed on, pop it |
| * off, and send it back. |
| * |
| * However, since there is state that we want to pass to the TLBs using |
| * the send/recv Timing/Functional/etc. APIs, which don't allow for new |
| * arguments, we need a common TLB senderState to pass between TLBs, |
| * both "forwards" and "backwards." |
| * |
| * So, basically, the rule is that any packet received by a TLB port |
| * (cpuside OR memside) must be safely castable to a GpuTranslationState. |
| */ |
| |
| struct GpuTranslationState : public Packet::SenderState |
| { |
| // TLB mode, read or write |
| BaseMMU::Mode tlbMode; |
| // SE mode thread context associated with this req |
| ThreadContext *tc; |
| // FS mode related fields |
| int deviceId; |
| int pasId; // Process Address Space ID |
| |
| /* |
| * TLB entry to be populated and passed back and filled in |
| * previous TLBs. Equivalent to the data cache concept of |
| * "data return." |
| */ |
| Serializable *tlbEntry; |
| // Is this a TLB prefetch request? |
| bool isPrefetch; |
| // When was the req for this translation issued |
| uint64_t issueTime; |
| // Remember where this came from |
| std::vector<ResponsePort*>ports; |
| |
| // keep track of #uncoalesced reqs per packet per TLB level; |
| // reqCnt per level >= reqCnt higher level |
| std::vector<int> reqCnt; |
| // TLB level this packet hit in; 0 if it hit in the page table |
| int hitLevel; |
| Packet::SenderState *saved; |
| |
| GpuTranslationState(BaseMMU::Mode tlb_mode, ThreadContext *_tc, |
| bool _prefetch=false, |
| Packet::SenderState *_saved=nullptr) |
| : tlbMode(tlb_mode), tc(_tc), deviceId(0), pasId(0), tlbEntry(nullptr), |
| isPrefetch(_prefetch), issueTime(0), hitLevel(0), saved(_saved) |
| { } |
| |
| GpuTranslationState(BaseMMU::Mode tlb_mode, |
| bool _prefetch=false, |
| Packet::SenderState *_saved=nullptr) |
| : tlbMode(tlb_mode), tc(nullptr), deviceId(0), pasId(0), |
| tlbEntry(nullptr), isPrefetch(_prefetch), issueTime(0), hitLevel(0), |
| saved(_saved) |
| { } |
| }; |
| |
| } // namespace gem5 |
| |
| #endif // __ARCH_AMDGPU_COMMON_GPU_TRANSLATION_STATE_HH__ |