/*
 * Copyright (c) 2021 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 __DEV_AMDGPU_PM4_DEFINES_H__
#define __DEV_AMDGPU_PM4_DEFINES_H__

#include <cstdlib>
#include <iostream>
#include <vector>

#include "base/types.hh"

namespace gem5
{

/**
 * PM4 opcodes. Taken from linux tree from the following locations:
 * https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/blob/roc-4.3.x/
 *     drivers/gpu/drm/amd/amdkfd/kfd_pm4_opcodes.h
 * https://github.com/RadeonOpenCompute/ROCK-Kernel-Driver/blob/roc-4.3.x/
 *     drivers/gpu/drm/amd/amdgpu/soc15d.h
 */
enum it_opcode_type
{
    IT_NOP                               = 0x10,
    IT_WRITE_DATA                        = 0x37,
    IT_WAIT_REG_MEM                      = 0x3C,
    IT_INDIRECT_BUFFER                   = 0x3F,
    IT_RELEASE_MEM                       = 0x49,
    IT_SET_UCONFIG_REG                   = 0x79,
    IT_SWITCH_BUFFER                     = 0x8B,
    IT_INVALIDATE_TLBS                   = 0x98,
    IT_MAP_PROCESS                       = 0xA1,
    IT_MAP_QUEUES                        = 0xA2,
    IT_UNMAP_QUEUES                      = 0xA3,
    IT_QUERY_STATUS                      = 0xA4,
    IT_RUN_LIST                          = 0xA5,
};

/**
 * Value from vega10/pm4_header.h.
 */
#define PACKET3_SET_UCONFIG_REG_START                   0x0000c000

/**
 * PM4 packets
 */
typedef struct GEM5_PACKED
{
    union
    {
        struct
        {
            uint16_t predicated : 1;
            uint16_t shader : 1;
            uint16_t reserved : 6;
            uint16_t opcode : 8;
            uint16_t count : 14;
            uint16_t type : 2;
        };
        uint32_t ordinal;
    };
} PM4Header;
static_assert(sizeof(PM4Header) == 4);

typedef struct GEM5_PACKED
{
    uint32_t reserved1 : 8;
    uint32_t destSel : 4;
    uint32_t reserved2 : 4;
    uint32_t addrIncr : 1;
    uint32_t reserved3 : 2;
    uint32_t resume : 1;
    uint32_t writeConfirm : 1;
    uint32_t reserved4 : 4;
    uint32_t cachePolicy : 2;
    uint32_t reserved5 : 5;
    union
    {
        struct
        {
            uint32_t destAddrLo;
            uint32_t destAddrHi;
        };
        uint64_t destAddr;
    };
    uint32_t data;
}  PM4WriteData;
static_assert(sizeof(PM4WriteData) == 16);

typedef struct GEM5_PACKED
{
    uint32_t reserved1 : 4;
    uint32_t queueSel : 2;
    uint32_t reserved2 : 2;
    uint32_t vmid : 4;
    uint32_t reserved3 : 1;
    uint32_t me : 1;
    uint32_t pipe : 2;
    uint32_t queueSlot : 3;
    uint32_t reserved6 : 2;
    uint32_t queueType : 3;
    uint32_t allocFormat : 2;
    uint32_t engineSel : 3;
    uint32_t numQueues : 3;
    uint32_t reserved4 : 1;
    uint32_t checkDisable : 1;
    uint32_t doorbellOffset : 26;
    uint32_t reserved5 : 4;
    union
    {
        struct
        {
            uint32_t mqdAddrLo : 32;
            uint32_t mqdAddrHi : 32;
        };
        uint64_t mqdAddr;
    };
    union
    {
        struct
        {
            uint32_t wptrAddrLo : 32;
            uint32_t wptrAddrHi : 32;
        };
        uint64_t wptrAddr;
    };
}  PM4MapQueues;
static_assert(sizeof(PM4MapQueues) == 24);

typedef struct GEM5_PACKED
{
    uint32_t action : 2;
    uint32_t reserved : 2;
    uint32_t queueSel : 2;
    uint32_t reserved1 : 20;
    uint32_t engineSel : 3;
    uint32_t numQueues : 3;
    union
    {
        struct
        {
            uint32_t pasid : 16;
            uint32_t reserved2 : 16;
        };
        struct
        {
            uint32_t reserved3 : 2;
            uint32_t doorbellOffset0 : 26;
            uint32_t reserved4 : 4;
        };
    };
    uint32_t reserved5 : 2;
    uint32_t doorbellOffset1 : 26;
    uint32_t reserved6 : 4;
    uint32_t reserved7 : 2;
    uint32_t doorbellOffset2 : 26;
    uint32_t reserved8 : 4;
    uint32_t reserved9 : 2;
    uint32_t doorbellOffset3 : 26;
    uint32_t reserved10 : 4;
}  PM4UnmapQueues;
static_assert(sizeof(PM4UnmapQueues) == 20);

typedef struct GEM5_PACKED
{
    uint32_t vmidMask : 16;
    uint32_t unmapLatency : 8;
    uint32_t reserved : 5;
    uint32_t queueType : 3;
    union
    {
        struct
        {
            uint32_t queueMaskLo;
            uint32_t queueMaskHi;
        };
        uint64_t queueMask;
    };
    union
    {
        struct
        {
            uint32_t gwsMaskLo;
            uint32_t gwsMaskHi;
        };
        uint64_t gwsMask;
    };
    uint16_t oacMask;
    uint16_t reserved1;
    uint32_t gdsHeapBase : 6;
    uint32_t reserved2 : 5;
    uint32_t gdsHeapSize : 6;
    uint32_t reserved3 : 15;
}  PM4SetResources;
static_assert(sizeof(PM4SetResources) == 28);

typedef struct GEM5_PACKED
{
    uint32_t pasid : 16;
    uint32_t reserved0 : 8;
    uint32_t diq : 1;
    uint32_t processQuantum : 7;
    union
    {
        struct
        {
            uint32_t ptBaseLo;
            uint32_t ptBaseHi;
        };
        uint64_t ptBase;
    };
    uint32_t shMemBases;
    uint32_t shMemConfig;
    uint32_t reserved1;
    uint32_t reserved2;
    uint32_t reserved3;
    uint32_t reserved4;
    uint32_t reserved5;
    union
    {
        struct
        {
            uint32_t gdsAddrLo;
            uint32_t gdsAddrHi;
        };
        uint64_t gdsAddr;
    };
    uint32_t numGws : 6;
    uint32_t reserved7 : 2;
    uint32_t numOac : 4;
    uint32_t reserved8 : 4;
    uint32_t gdsSize : 6;
    uint32_t numQueues : 10;
    union
    {
        struct
        {
            uint32_t completionSignalLo;
            uint32_t completionSignalHi;
        };
        uint64_t completionSignal;
    };
}  PM4MapProcess;
static_assert(sizeof(PM4MapProcess) == 60);

typedef struct GEM5_PACKED
{
    uint32_t function : 4;
    uint32_t memSpace : 2;
    uint32_t operation : 2;
    uint32_t reserved1 : 24;
    union
    {
        struct
        {
            uint32_t regAddr1 : 18;
            uint32_t reserved2 : 14;
        };
        uint32_t memAddrLo;
    };
    union
    {
        struct
        {
            uint32_t regAddr2 : 18;
            uint32_t reserved3 : 14;
        };
        uint32_t memAddrHi;
    };
    uint32_t reference;
    uint32_t mask;
    uint32_t pollInterval;
}  PM4WaitRegMem;
static_assert(sizeof(PM4WaitRegMem) == 24);

typedef struct GEM5_PACKED
{
    uint32_t regOffset : 16;
    uint32_t reserved : 16;
    uint32_t regData;
}  PM4SetUConfig;
static_assert(sizeof(PM4SetUConfig) == 8);

typedef struct GEM5_PACKED
{
    union
    {
        struct
        {
            uint32_t ibBaseLo;
            uint32_t ibBaseHi;
        };
        uint64_t ibBase;
    };
    uint32_t ibSize : 20;
    uint32_t chain : 1;
    uint32_t poll : 1;
    uint32_t reserved0 : 1;
    uint32_t valid: 1;
    uint32_t vmid : 4;
    uint32_t cachePolicy : 2;
    uint32_t reserved1 : 1;
    uint32_t priv : 1;
}  PM4IndirectBuf;
static_assert(sizeof(PM4IndirectBuf) == 12);

typedef struct GEM5_PACKED
{
    union
    {
        struct
        {
            uint32_t tmz : 1;
            uint32_t reserved : 31;
        };
        uint32_t dummy;
    };
}  PM4SwitchBuf;
static_assert(sizeof(PM4SwitchBuf) == 4);

typedef struct GEM5_PACKED
{
    union
    {
        struct
        {
            uint32_t ibBaseLo;
            uint32_t ibBaseHi;
        };
        uint64_t ibBase;
    };
    uint32_t ibSize : 20;
    uint32_t chain : 1;
    uint32_t ena : 1;
    uint32_t reserved1 : 2;
    uint32_t vmid : 4;
    uint32_t cachePolicy : 2;
    uint32_t preResume : 1;
    uint32_t priv : 1;
}  PM4IndirectBufConst;
static_assert(sizeof(PM4IndirectBufConst) == 12);

typedef struct GEM5_PACKED
{
    uint32_t tmz : 1;
    uint32_t reserved : 27;
    uint32_t command : 4;
}  PM4FrameCtrl;
static_assert(sizeof(PM4FrameCtrl) == 4);

typedef struct GEM5_PACKED
{
    uint32_t event : 6;
    uint32_t reserved0 : 2;
    uint32_t eventIdx : 4;
    uint32_t l1Volatile : 1;
    uint32_t l2Volatile : 1;
    uint32_t reserved1 : 1;
    uint32_t l2WB : 1;
    uint32_t l1Inv : 1;
    uint32_t l2Inv : 1;
    uint32_t reserved2 : 1;
    uint32_t l2NC : 1;
    uint32_t l2WC : 1;
    uint32_t l2Meta : 1;
    uint32_t reserved3 : 3;
    uint32_t cachePolicy : 2;
    uint32_t reserved4 : 1;
    uint32_t execute : 1;
    uint32_t reserved5 : 3;
    uint32_t reserved6 : 16;
    uint32_t destSelect : 2;
    uint32_t reserved7 : 6;
    uint32_t intSelect : 3;
    uint32_t reserved8 : 2;
    uint32_t dataSelect : 3;
    union
    {
        struct
        {
            uint32_t addrLo;
            uint32_t addrHi;
        };
        uint64_t addr;
    };
    union
    {
        struct
        {
            union
            {
                struct
                {
                    uint32_t dwOffset : 16;
                    uint32_t numDws : 16;
                };
                uint32_t dataLo : 32;
            };
            uint32_t dataHi;
        };
        uint64_t data;
    };
    uint32_t intCtxId;
}  PM4ReleaseMem;
static_assert(sizeof(PM4ReleaseMem) == 28);

typedef struct GEM5_PACKED
{
    uint32_t offset : 16;
    uint32_t reserved : 16;
    uint32_t data;
}  PM4SetUconfigReg;
static_assert(sizeof(PM4SetUconfigReg) == 8);

typedef struct GEM5_PACKED
{
    union
    {
        struct
        {
            uint32_t ibBaseLo;
            uint32_t ibBaseHi;
        };
        uint64_t ibBase;
    };
    uint32_t ibSize : 20;
    uint32_t chain : 1;
    uint32_t offleadPolling : 1;
    uint32_t reserved1 : 1;
    uint32_t valid : 1;
    uint32_t processCnt : 4;
    uint32_t reserved2 : 4;
}  PM4RunList;
static_assert(sizeof(PM4RunList) == 12);

typedef struct GEM5_PACKED
{
    uint32_t contextId : 28;
    uint32_t interruptSel : 2;
    uint32_t command : 2;
    union
    {
        struct
        {
            uint32_t pasid : 16;
            uint32_t reserved0 : 16;
        };
        struct
        {
            uint32_t reserved1 : 2;
            uint32_t doorbellOffset : 26;
            uint32_t engineSel : 3;
            uint32_t reserved2 : 1;
        };
    };
    union
    {
        struct
        {
            uint32_t addrLo;
            uint32_t addrHi;
        };
        uint64_t addr;
    };
    union
    {
        struct
        {
            uint32_t dataLo;
            uint32_t dataHi;
        };
        uint64_t data;
    };
}  PM4QueryStatus;
static_assert(sizeof(PM4QueryStatus) == 24);

} // namespace gem5

#endif // __DEV_AMDGPU_PM4_DEFINES_HH__
