blob: 52a47d3a2d64108f86d711072f7953eebc2ac6c5 [file] [log] [blame]
/*
* 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_SDMA_PACKETS_HH__
#define __DEV_AMDGPU_SDMA_PACKETS_HH__
namespace gem5
{
/**
* SDMA packets
*/
typedef struct GEM5_PACKED
{
uint32_t count : 30;
uint32_t res0 : 2;
uint32_t res1 : 16;
uint32_t sdw: 2;
uint32_t res2 : 6;
uint32_t ddw: 2;
uint32_t res3 : 6;
uint64_t source;
uint64_t dest;
} sdmaCopy;
static_assert(sizeof(sdmaCopy) == 24);
typedef struct GEM5_PACKED
{
uint64_t dest;
uint32_t count : 20;
uint32_t reserved0 : 4;
uint32_t sw : 2;
uint32_t reserved1 : 6;
} sdmaWrite;
static_assert(sizeof(sdmaWrite) == 12);
typedef struct GEM5_PACKED
{
union
{
struct
{
uint32_t addrLo;
uint32_t addrHi;
};
Addr addr;
};
uint32_t srcData;
uint32_t unused : 10;
uint32_t count : 22;
} sdmaConstFill;
static_assert(sizeof(sdmaConstFill) == 16);
typedef struct GEM5_PACKED
{
uint32_t key0;
uint32_t key1;
uint32_t key2;
uint32_t key3;
uint32_t count0;
uint32_t count1;
uint32_t count2;
uint32_t count3;
} sdmaAESKey;
static_assert(sizeof(sdmaAESKey) == 32);
typedef struct GEM5_PACKED
{
uint32_t countData0;
uint32_t countData1;
uint32_t countData2;
uint32_t countData3;
} sdmaAESCounter;
static_assert(sizeof(sdmaAESCounter) == 16);
typedef struct GEM5_PACKED
{
uint32_t countKey0;
uint32_t countKey1;
uint32_t countKey2;
uint32_t countKey3;
} sdmaAESLoad;
static_assert(sizeof(sdmaAESLoad) == 16);
typedef struct GEM5_PACKED
{
uint32_t reserved : 6;
uint32_t offset : 26;
} sdmaAESOffset;
static_assert(sizeof(sdmaAESOffset) == 4);
typedef struct GEM5_PACKED
{
uint64_t base;
uint32_t size : 20;
uint32_t reserved : 12;
uint64_t csaAddr;
} sdmaIndirectBuffer;
static_assert(sizeof(sdmaIndirectBuffer) == 20);
typedef struct GEM5_PACKED
{
uint32_t priv : 1;
uint32_t reserved1 : 11;
uint32_t vmid : 4;
uint32_t reserved2 : 16;
} sdmaIndirectBufferHeader;
static_assert(sizeof(sdmaIndirectBufferHeader) == 4);
typedef struct GEM5_PACKED
{
uint64_t dest;
uint32_t data;
} sdmaFence;
static_assert(sizeof(sdmaFence) == 12);
typedef struct GEM5_PACKED
{
union
{
struct
{
uint32_t contextId : 3;
uint32_t rbRptr: 13;
uint32_t ibOffset : 12;
uint32_t reserved : 4;
};
uint32_t intrContext;
};
} sdmaTrap;
static_assert(sizeof(sdmaTrap) == 4);
typedef struct GEM5_PACKED
{
union
{
struct
{
uint32_t reserved : 3;
uint32_t addrLo : 29;
uint32_t addrHi;
};
Addr addr;
};
} sdmaSemaphore;
static_assert(sizeof(sdmaSemaphore) == 8);
typedef struct GEM5_PACKED
{
union
{
struct
{
uint32_t reserved : 3;
uint32_t addrLo : 29;
uint32_t addrHi;
};
Addr addr;
};
} sdmaMemInc;
static_assert(sizeof(sdmaMemInc) == 8);
typedef struct GEM5_PACKED
{
uint32_t regAddr : 18;
uint32_t reserved : 2;
uint32_t apertureId : 12;
uint32_t data;
} sdmaSRBMWrite;
static_assert(sizeof(sdmaSRBMWrite) == 8);
typedef struct GEM5_PACKED
{
uint32_t reserved : 28;
uint32_t byteEnable : 4;
} sdmaSRBMWriteHeader;
static_assert(sizeof(sdmaSRBMWriteHeader) == 4);
typedef struct GEM5_PACKED
{
uint64_t address;
uint32_t ref;
uint32_t mask;
uint32_t pollInt : 16;
uint32_t retryCount : 12;
uint32_t reserved1 : 4;
} sdmaPollRegMem;
static_assert(sizeof(sdmaPollRegMem) == 20);
typedef struct GEM5_PACKED
{
uint32_t reserved : 26;
uint32_t op : 2; // Operation
uint32_t func : 3; // Comparison function
uint32_t mode : 1; // Mode: register or memory polling
} sdmaPollRegMemHeader;
static_assert(sizeof(sdmaPollRegMemHeader) == 4);
typedef struct GEM5_PACKED
{
union
{
struct
{
uint32_t addrLo;
uint32_t addrHi;
};
Addr addr;
};
uint32_t reference;
union
{
struct
{
uint32_t execCount : 14;
uint32_t unused : 18;
};
uint32_t ordinal;
};
} sdmaCondExec;
static_assert(sizeof(sdmaCondExec) == 16);
typedef struct GEM5_PACKED
{
union
{
struct
{
uint32_t addrLo;
uint32_t addrHi;
};
Addr addr;
};
union
{
struct
{
uint32_t srcDataLo;
uint32_t srdDataHi;
};
uint64_t srcData;
};
union
{
struct
{
uint32_t cmpDataLo;
uint32_t cmpDataHi;
};
uint64_t cmpData;
};
uint32_t loopInt : 13;
uint32_t reserved : 19;
} sdmaAtomic;
static_assert(sizeof(sdmaAtomic) == 28);
typedef struct GEM5_PACKED
{
int unused2 : 16;
int loop : 1;
int unused1 : 8;
int opcode : 7;
} sdmaAtomicHeader;
static_assert(sizeof(sdmaAtomicHeader) == 4);
constexpr unsigned int SDMA_ATOMIC_ADD64 = 47;
typedef struct GEM5_PACKED
{
uint64_t dest;
uint64_t mask;
uint64_t initValue;
uint64_t increment;
uint32_t count: 19;
uint32_t reserved : 13;
} sdmaPtePde;
static_assert(sizeof(sdmaPtePde) == 36);
typedef struct GEM5_PACKED
{
union
{
struct
{
uint32_t initDataLo;
uint32_t initDataHi;
};
uint64_t initData;
};
} sdmaTimestamp;
static_assert(sizeof(sdmaTimestamp) == 8);
typedef struct GEM5_PACKED
{
uint32_t execCount : 14;
uint32_t reserved : 18;
} sdmaPredExec;
static_assert(sizeof(sdmaPredExec) == 4);
typedef struct GEM5_PACKED
{
uint32_t opcode : 8;
uint32_t subOpcode : 8;
uint32_t device : 8;
uint32_t unused : 8;
} sdmaPredExecHeader;
static_assert(sizeof(sdmaPredExecHeader) == 4);
typedef struct GEM5_PACKED
{
uint32_t contextId : 3;
uint32_t rbRptr: 13;
uint32_t ibOffset : 12;
uint32_t reserved : 4;
} sdmaDummyTrap;
static_assert(sizeof(sdmaDummyTrap) == 4);
typedef struct GEM5_PACKED
{
uint32_t byteStride;
uint32_t dmaCount;
union
{
struct
{
uint32_t destLo;
uint32_t destHi;
};
uint64_t dest;
};
uint32_t byteCount : 26;
} sdmaDataFillMulti;
static_assert(sizeof(sdmaDataFillMulti) == 20);
typedef struct GEM5_PACKED
{
uint16_t format : 8;
uint16_t barrier : 1;
uint16_t acqFenceScope : 2;
uint16_t relFenceScope : 2;
uint16_t reserved : 3;
} sdmaHeaderAgentDisp;
static_assert(sizeof(sdmaHeaderAgentDisp) == 2);
typedef struct GEM5_PACKED
{
sdmaHeaderAgentDisp header;
uint16_t res0;
uint32_t res1;
union
{
struct
{
uint32_t retLo;
uint32_t retHi;
};
Addr ret;
};
uint32_t count : 22;
uint32_t res2 : 10;
uint32_t res3 : 16;
uint32_t swDest : 2;
uint32_t res4 : 6;
uint32_t swSrc : 2;
uint32_t unused : 6;
union
{
struct
{
uint32_t srcLo;
uint32_t srcHi;
};
Addr src;
};
union
{
struct
{
uint32_t destLo;
uint32_t destHi;
};
Addr dest;
};
uint64_t res5;
uint64_t res6;
union
{
struct
{
uint32_t compSignalLo;
uint32_t compSignalHi;
};
Addr compSignal;
};
} sdmaAQLCopy;
static_assert(sizeof(sdmaAQLCopy) == 64);
typedef struct GEM5_PACKED
{
sdmaHeaderAgentDisp header;
uint16_t res0;
uint32_t res1;
Addr depSignal0;
Addr depSignal1;
Addr depSignal2;
Addr depSignal3;
Addr depSignal4;
uint64_t res2;
union
{
struct
{
uint32_t compSignalLo;
uint32_t compSignalHi;
};
Addr compSignal;
};
} sdmaAQLBarrierOr;
static_assert(sizeof(sdmaAQLBarrierOr) == 64);
} // namespace gem5
#endif // __DEV_AMDGPU_SDMA_PACKETS_HH__