111308Santhony.gutierrez@amd.com/* 212697Santhony.gutierrez@amd.com * Copyright (c) 2011-2015,2018 Advanced Micro Devices, Inc. 311308Santhony.gutierrez@amd.com * All rights reserved. 411308Santhony.gutierrez@amd.com * 511308Santhony.gutierrez@amd.com * For use for simulation and test purposes only 611308Santhony.gutierrez@amd.com * 711308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without 811308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are met: 911308Santhony.gutierrez@amd.com * 1011308Santhony.gutierrez@amd.com * 1. Redistributions of source code must retain the above copyright notice, 1111308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer. 1211308Santhony.gutierrez@amd.com * 1311308Santhony.gutierrez@amd.com * 2. Redistributions in binary form must reproduce the above copyright notice, 1411308Santhony.gutierrez@amd.com * this list of conditions and the following disclaimer in the documentation 1511308Santhony.gutierrez@amd.com * and/or other materials provided with the distribution. 1611308Santhony.gutierrez@amd.com * 1712697Santhony.gutierrez@amd.com * 3. Neither the name of the copyright holder nor the names of its 1812697Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from this 1912697Santhony.gutierrez@amd.com * software without specific prior written permission. 2011308Santhony.gutierrez@amd.com * 2111308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2211308Santhony.gutierrez@amd.com * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2311308Santhony.gutierrez@amd.com * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2411308Santhony.gutierrez@amd.com * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 2511308Santhony.gutierrez@amd.com * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2611308Santhony.gutierrez@amd.com * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2711308Santhony.gutierrez@amd.com * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2811308Santhony.gutierrez@amd.com * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2911308Santhony.gutierrez@amd.com * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3011308Santhony.gutierrez@amd.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3111308Santhony.gutierrez@amd.com * POSSIBILITY OF SUCH DAMAGE. 3211308Santhony.gutierrez@amd.com * 3312697Santhony.gutierrez@amd.com * Authors: Brad Beckmann, 3412697Santhony.gutierrez@amd.com * Marc Orr, 3512697Santhony.gutierrez@amd.com * Anthony Gutierrez 3611308Santhony.gutierrez@amd.com */ 3711308Santhony.gutierrez@amd.com 3811308Santhony.gutierrez@amd.com#ifndef __GPU_DISPATCHER_HH__ 3911308Santhony.gutierrez@amd.com#define __GPU_DISPATCHER_HH__ 4011308Santhony.gutierrez@amd.com 4111308Santhony.gutierrez@amd.com#include <queue> 4211308Santhony.gutierrez@amd.com#include <vector> 4311308Santhony.gutierrez@amd.com 4411308Santhony.gutierrez@amd.com#include "base/statistics.hh" 4511308Santhony.gutierrez@amd.com#include "dev/dma_device.hh" 4611308Santhony.gutierrez@amd.com#include "gpu-compute/compute_unit.hh" 4711308Santhony.gutierrez@amd.com#include "gpu-compute/ndrange.hh" 4811308Santhony.gutierrez@amd.com#include "gpu-compute/qstruct.hh" 4911308Santhony.gutierrez@amd.com#include "mem/port.hh" 5011308Santhony.gutierrez@amd.com#include "params/GpuDispatcher.hh" 5111308Santhony.gutierrez@amd.com 5211308Santhony.gutierrez@amd.comclass BaseCPU; 5311308Santhony.gutierrez@amd.comclass Shader; 5411308Santhony.gutierrez@amd.com 5511308Santhony.gutierrez@amd.comclass GpuDispatcher : public DmaDevice 5611308Santhony.gutierrez@amd.com{ 5711308Santhony.gutierrez@amd.com public: 5811308Santhony.gutierrez@amd.com typedef GpuDispatcherParams Params; 5911308Santhony.gutierrez@amd.com 6011308Santhony.gutierrez@amd.com MasterID masterId() { return _masterId; } 6111308Santhony.gutierrez@amd.com 6211308Santhony.gutierrez@amd.com protected: 6311308Santhony.gutierrez@amd.com MasterID _masterId; 6411308Santhony.gutierrez@amd.com 6511308Santhony.gutierrez@amd.com // Base and length of PIO register space 6611308Santhony.gutierrez@amd.com Addr pioAddr; 6711308Santhony.gutierrez@amd.com Addr pioSize; 6811308Santhony.gutierrez@amd.com Tick pioDelay; 6911308Santhony.gutierrez@amd.com 7011308Santhony.gutierrez@amd.com HsaQueueEntry curTask; 7111308Santhony.gutierrez@amd.com 7211308Santhony.gutierrez@amd.com std::unordered_map<int, NDRange> ndRangeMap; 7311308Santhony.gutierrez@amd.com NDRange ndRange; 7411308Santhony.gutierrez@amd.com 7511308Santhony.gutierrez@amd.com // list of kernel_ids to launch 7611308Santhony.gutierrez@amd.com std::queue<int> execIds; 7711308Santhony.gutierrez@amd.com // list of kernel_ids that have finished 7811308Santhony.gutierrez@amd.com std::queue<int> doneIds; 7911308Santhony.gutierrez@amd.com 8011308Santhony.gutierrez@amd.com uint64_t dispatchCount; 8111308Santhony.gutierrez@amd.com // is there a kernel in execution? 8211308Santhony.gutierrez@amd.com bool dispatchActive; 8311308Santhony.gutierrez@amd.com 8411308Santhony.gutierrez@amd.com BaseCPU *cpu; 8511308Santhony.gutierrez@amd.com Shader *shader; 8611308Santhony.gutierrez@amd.com ClDriver *driver; 8712126Sspwilson2@wisc.edu EventFunctionWrapper tickEvent; 8812126Sspwilson2@wisc.edu 8911308Santhony.gutierrez@amd.com 9011308Santhony.gutierrez@amd.com static GpuDispatcher *instance; 9111308Santhony.gutierrez@amd.com 9211308Santhony.gutierrez@amd.com // sycall emulation mode can have only 1 application running(?) 9311308Santhony.gutierrez@amd.com // else we have to do some pid based tagging 9411308Santhony.gutierrez@amd.com // unused 9511308Santhony.gutierrez@amd.com typedef std::unordered_map<uint64_t, uint64_t> TranslationBuffer; 9611308Santhony.gutierrez@amd.com TranslationBuffer tlb; 9711308Santhony.gutierrez@amd.com 9811308Santhony.gutierrez@amd.com public: 9911308Santhony.gutierrez@amd.com /*statistics*/ 10011308Santhony.gutierrez@amd.com Stats::Scalar num_kernelLaunched; 10111308Santhony.gutierrez@amd.com GpuDispatcher(const Params *p); 10211308Santhony.gutierrez@amd.com 10311308Santhony.gutierrez@amd.com ~GpuDispatcher() { } 10411308Santhony.gutierrez@amd.com 10511308Santhony.gutierrez@amd.com void exec(); 10614292Sjqu32@wisc.edu virtual void serialize(CheckpointOut &cp) const override; 10714292Sjqu32@wisc.edu virtual void unserialize(CheckpointIn &cp) override; 10811308Santhony.gutierrez@amd.com void notifyWgCompl(Wavefront *w); 10911308Santhony.gutierrez@amd.com void scheduleDispatch(); 11011308Santhony.gutierrez@amd.com void accessUserVar(BaseCPU *cpu, uint64_t addr, int val, int off); 11111308Santhony.gutierrez@amd.com 11211308Santhony.gutierrez@amd.com // using singleton so that glue code can pass pointer locations 11311308Santhony.gutierrez@amd.com // to the dispatcher. when there are multiple dispatchers, we can 11411308Santhony.gutierrez@amd.com // call something like getInstance(index) 11511308Santhony.gutierrez@amd.com static void 11611308Santhony.gutierrez@amd.com setInstance(GpuDispatcher *_instance) 11711308Santhony.gutierrez@amd.com { 11811308Santhony.gutierrez@amd.com instance = _instance; 11911308Santhony.gutierrez@amd.com } 12011308Santhony.gutierrez@amd.com 12111308Santhony.gutierrez@amd.com static GpuDispatcher* getInstance() { return instance; } 12211308Santhony.gutierrez@amd.com 12311308Santhony.gutierrez@amd.com class TLBPort : public MasterPort 12411308Santhony.gutierrez@amd.com { 12511308Santhony.gutierrez@amd.com public: 12611308Santhony.gutierrez@amd.com 12711308Santhony.gutierrez@amd.com TLBPort(const std::string &_name, GpuDispatcher *_dispatcher) 12811308Santhony.gutierrez@amd.com : MasterPort(_name, _dispatcher), dispatcher(_dispatcher) { } 12911308Santhony.gutierrez@amd.com 13011308Santhony.gutierrez@amd.com protected: 13111308Santhony.gutierrez@amd.com GpuDispatcher *dispatcher; 13211308Santhony.gutierrez@amd.com 13311308Santhony.gutierrez@amd.com virtual bool recvTimingResp(PacketPtr pkt) { return true; } 13411308Santhony.gutierrez@amd.com virtual Tick recvAtomic(PacketPtr pkt) { return 0; } 13511308Santhony.gutierrez@amd.com virtual void recvFunctional(PacketPtr pkt) { } 13611308Santhony.gutierrez@amd.com virtual void recvRangeChange() { } 13711308Santhony.gutierrez@amd.com virtual void recvReqRetry() { } 13811308Santhony.gutierrez@amd.com 13911308Santhony.gutierrez@amd.com }; 14011308Santhony.gutierrez@amd.com 14111308Santhony.gutierrez@amd.com TLBPort *tlbPort; 14211308Santhony.gutierrez@amd.com 14313784Sgabeblack@google.com Port &getPort(const std::string &if_name, 14413784Sgabeblack@google.com PortID idx=InvalidPortID) override; 14511308Santhony.gutierrez@amd.com 14614292Sjqu32@wisc.edu AddrRangeList getAddrRanges() const override; 14714292Sjqu32@wisc.edu Tick read(PacketPtr pkt) override; 14814292Sjqu32@wisc.edu Tick write(PacketPtr pkt) override; 14911308Santhony.gutierrez@amd.com 15011308Santhony.gutierrez@amd.com // helper functions to retrieve/set GPU attributes 15111308Santhony.gutierrez@amd.com int getNumCUs(); 15211534Sjohn.kalamatianos@amd.com int wfSize() const; 15311308Santhony.gutierrez@amd.com void setFuncargsSize(int funcargs_size); 15411640Salexandru.dutu@amd.com 15511640Salexandru.dutu@amd.com /** Returns the size of the static hardware context of a wavefront */ 15611640Salexandru.dutu@amd.com uint32_t getStaticContextSize() const; 15711308Santhony.gutierrez@amd.com}; 15811308Santhony.gutierrez@amd.com 15911308Santhony.gutierrez@amd.com#endif // __GPU_DISPATCHER_HH__ 160