/*==============================================================================
Copyright(c) 2019 Intel Corporation

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files(the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and / or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.

Description: This file contains the class definitions for GmmPageTableMgr
             for user-mode PageTable management, that is common for both 
             Linux and Windows.

============================================================================*/

#pragma once
#include "GmmHw.h"

#if defined(__linux__) || defined(__Fuchsia__)
#include <pthread.h>
#endif

typedef enum _GMM_ENGINE_TYPE
{
    ENGINE_TYPE_RCS = 0,            //RCS
    ENGINE_TYPE_COMPUTE = 1,        //Compute-CS
    ENGINE_TYPE_BCS,                //BLT
    ENGINE_TYPE_VD0,
    ENGINE_TYPE_VD1,
    ENGINE_TYPE_VE0
    //Add all engines supporting  AUX-TT
} GMM_ENGINE_TYPE;

typedef enum TT_Flags
{
    AUXTT = 1,              //Indicate TT request for AUX i.e. e2e compression
} TT_TYPE;


#if !(defined(__GMM_KMD__))
// Shared Structure for both Windows and Linux
typedef struct __GMM_DDI_UPDATEAUXTABLE
{
    GMM_UMD_SYNCCONTEXT * UmdContext;     // [in]  pointer to thread-specific data, specifying BBQHandle/Fence etc
    GMM_RESOURCE_INFO * BaseResInfo;      // [in]  GmmResourceInfo ptr for compressed resource
    GMM_RESOURCE_INFO * AuxResInfo;       // [in]  GmmResourceInfo ptr for separate Auxiliary resource
    GMM_GFX_ADDRESS BaseGpuVA;            // [in]  GPUVA where compressed resource has been mapped
    GMM_GFX_ADDRESS AuxSurfVA;            // [in]  GPUVA where separate Auxiliary resource has been mapped
    uint8_t Map;                          // [in]  specifies if resource is being mapped or unmapped
    uint8_t DoNotWait;                    // [in]  specifies if PageTable update be done on CPU (true) or GPU (false)
}GMM_DDI_UPDATEAUXTABLE;

#ifdef __cplusplus
#include "GmmMemAllocator.hpp"

namespace GmmLib
{
    class SyncInfoLin {                       //dummy class
    public:
        HANDLE BBQueueHandle;
        uint64_t BBFence;
        SyncInfoLin() : BBQueueHandle(NULL), BBFence(0) {}
        SyncInfoLin(HANDLE Handle, uint64_t Fence) : BBQueueHandle(Handle), BBFence(Fence) {}
    };
    typedef class SyncInfoLin  SyncInfo;


     //Forward class declarations
     class AuxTable;
     class GmmPageTablePool;
     typedef class GmmPageTablePool GMM_PAGETABLEPool;

     typedef enum POOL_TYPE_REC
     {
         POOL_TYPE_TRTTL1  = 0,
         POOL_TYPE_TRTTL2  = 1,
         POOL_TYPE_AUXTTL1 = 2,
         POOL_TYPE_AUXTTL2 = 3,
     } POOL_TYPE;

    //////////////////////////////////////////////////////////////////////////////////////////////
    /// Contains functions and members for GMM_PAGETABLE_MGR, clients must place its pointer in
    /// their device object. Clients call GmmLib to initialize the instance and use it for mapping
    /// /unmapping on GmmLib managed page tables (TR-TT for SparseResources, AUX-TT for compression)
    //////////////////////////////////////////////////////////////////////////////////////////////
    class GMM_LIB_API NON_PAGED_SECTION GmmPageTableMgr :
                     public GmmMemAllocator
    {
    private:
        GMM_ENGINE_TYPE EngType;             //PageTable managed @ device-level (specifies engine associated with the device)

        AuxTable* AuxTTObj;                  //Auxiliary Translation Table obj

        GMM_PAGETABLEPool *pPool;            //Common page table pool
        uint32_t NumNodePoolElements;
        GmmClientContext    *pClientContext;    ///< ClientContext of the client creating this Object

         //OS-specific defn
#if defined  __linux__ || defined(__Fuchsia__)
	pthread_mutex_t PoolLock;
#endif
    public:
        GMM_DEVICE_CALLBACKS DeviceCb;       //OS-specific defn: Will be used by Clients to send as input arguments for TR-TT APIs
        GMM_DEVICE_CALLBACKS_INT DeviceCbInt;       //OS-specific defn: Will be used internally GMM lib
        GMM_TRANSLATIONTABLE_CALLBACKS TTCb; //OS-specific defn
        HANDLE hCsr;  // OCL per-device command stream receiver handle for aubcapture
    public:
        GmmPageTableMgr();
        GmmPageTableMgr(GMM_DEVICE_CALLBACKS_INT *, uint32_t TTFlags, GmmClientContext  *pClientContextIn); // Allocates memory for indicate TT’s root-tables, initializes common node-pool
        
        
        //GMM_VIRTUAL GMM_GFX_ADDRESS GetTRL3TableAddr();
        GMM_VIRTUAL GMM_GFX_ADDRESS GetAuxL3TableAddr();

        //Update TT root table address in context-image
        GMM_VIRTUAL GMM_STATUS InitContextAuxTableRegister(HANDLE initialBBHandle, GMM_ENGINE_TYPE engType); //Clients call it to update Aux-Table pointer in context-image, engType reqd. if @ context level

        //Aux TT management API
        GMM_VIRTUAL GMM_STATUS UpdateAuxTable(const GMM_DDI_UPDATEAUXTABLE*);      //new API for updating Aux-Table to point to correct 16B-chunk
                                                                       //for given host page VA  when base/Aux surf is mapped/unmapped
        GMM_VIRTUAL void __ReleaseUnusedPool(GMM_UMD_SYNCCONTEXT *UmdContext);
        GMM_VIRTUAL GMM_PAGETABLEPool * __GetFreePoolNode(uint32_t * FreePoolNodeIdx, POOL_TYPE PoolType);


#if defined __linux__ || defined(__Fuchsia__)
        //returns number of BOs for indicated TTs = NumNodePoolElements+1 BOs for root table and pools
        GMM_VIRTUAL int GetNumOfPageTableBOs(uint8_t TTFlags);
        //returns BO* list for indicated TT in client allocated memory
        GMM_VIRTUAL int GetPageTableBOList(uint8_t TTFlags, void* BOList);
#endif

        //Destructor
        GMM_VIRTUAL ~GmmPageTableMgr();                         //Clean-up page table structures

        // Inline Functions
        /////////////////////////////////////////////////////////////////////////////////////
        /// Returns GmmClientContext associated with this PageTableMgr
        /// @return ::GmmClientContext
        /////////////////////////////////////////////////////////////////////////////////////
        GMM_INLINE_VIRTUAL GmmClientContext* GetClientContext()
        {
            return pClientContext;
        }

    private:
        GMM_PAGETABLEPool * __AllocateNodePool(uint32_t AddrAlignment, POOL_TYPE Type);

    };

    
}
#endif  // #ifdef __cplusplus
#endif
