/* *********************************************************************************************************************** * * Copyright (c) 2017-2021 Advanced Micro Devices, Inc. All Rights Reserved. * * 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. * **********************************************************************************************************************/ #ifndef __SI_CI_VI_MERGED_PM4DEFS_HEADER #define __SI_CI_VI_MERGED_PM4DEFS_HEADER #include "si_ci_vi_merged_typedef.h" /****************************************************************************** * * si_ci_vi_merged_pm4defs.h * * SI/CI/VI PM4 definitions, typedefs, and enumerations. * ******************************************************************************/ namespace Pal { namespace Gfx6 { inline namespace Chip { // File version information #define SI_CI_VI_PM4DEFS_VERSION_MAJOR 3 #define SI_CI_VI_PM4DEFS_VERSION_MINOR 0 // PM4 command shifts #define PM4_PREDICATE_SHIFT 0 #define PM4_SHADERTYPE_SHIFT 1 #define PM4_OP_SHIFT 8 #define PM4_COUNT_SHIFT 16 #define PM4_TYPE_SHIFT 30 #define PM4_T0_ONE_REG_WR_SHIFT 15 #define PM4_T0_INDX_SHIFT 0 // PM4 command control settings #define PM4_T0_NO_INCR (1 << PM4_T0_ONE_REG_WR_SHIFT) // ROLL_CONTEXT defines #define PM4_SEL_8_CP_STATE 0 #define PM4_SEL_BLOCK_STATE 1 /** *************************************************************************************************** * @brief This enum defines the Shader types supported in PM4 type 3 header *************************************************************************************************** */ enum PM4ShaderType { ShaderGraphics = 0, ///< Graphics shader ShaderCompute = 1 ///< Compute shader }; /** *************************************************************************************************** * @brief This enum defines the predicate value supported in PM4 type 3 header *************************************************************************************************** */ enum PM4Predicate { PredDisable = 0, ///< Predicate disabled PredEnable = 1 ///< Predicate enabled }; // PM4 type 3 header macro for creating a PM4 type 3 header #define PM4_TYPE_3_HDR(opCode, count, shaderType, predicate) \ ((unsigned int)(predicate << PM4_PREDICATE_SHIFT) | \ (shaderType << PM4_SHADERTYPE_SHIFT) | \ (PM4_TYPE_3 << PM4_TYPE_SHIFT) | \ ((count - 2) << PM4_COUNT_SHIFT) | \ (opCode << PM4_OP_SHIFT)) // PM4 type 0 header macros #define PM4_TYPE_0_HDR(Reg0, nWrites) \ ((((unsigned int)(nWrites)-1) << PM4_COUNT_SHIFT) | \ ((Reg0) << PM4_T0_INDX_SHIFT)) // RJVR: This macro needs to be modified to use Type 3 ONE_REG_WRITE. #define PM4_TYPE_0_HDR_NO_INCR(Reg0, nWrites) \ ((((unsigned int)(nWrites)-1) << PM4_COUNT_SHIFT) | \ ((Reg0) << PM4_T0_INDX_SHIFT) | \ PM4_T0_NO_INCR) // PM4 type 2 NOP #define PM4_TYPE_2_NOP (PM4_TYPE_2 << PM4_TYPE_SHIFT) //------------------------------------------------------------------------------------------------- typedef union _PM4_TYPE_0_HEADER { struct { unsigned int base : 16;///< the DWORD Memory-mapped address unsigned int count : 14;///< count of DWORDs in the *information* body (N - 1 for N dwords) unsigned int type : 2;///< packet identifier. It should be 0 for type 0 packets. }; unsigned int u32All; } PM4_TYPE_0_HEADER; //------------------------------------------------------------------------------------------------- typedef union PM4_TYPE_3_HEADER { struct { unsigned int predicate : 1; ///< predicated version of packet when set unsigned int shaderType: 1; ///< 0: Graphics, 1: Compute Shader unsigned int reserved1 : 6; ///< reserved unsigned int opcode : 8; ///< IT opcode unsigned int count : 14;///< number of DWORDs - 1 in the information body. unsigned int type : 2; ///< packet identifier. It should be 3 for type 3 packets }; unsigned int u32All; } PM4_TYPE_3_HEADER; //------------------------------------------------------------------------------------------------- typedef union _CONTEXT_CONTROL_ENABLE { struct { unsigned int enableSingleCntxConfigReg : 1; ///< single context config reg unsigned int enableMultiCntxRenderReg : 1; ///< multi context render state reg unsigned int reserved1 : 13; ///< reserved unsigned int enableUserConfigReg__CI : 1; ///< User Config Reg on CI(reserved for SI) unsigned int enableGfxSHReg : 1; ///< Gfx SH Registers unsigned int reserved2 : 7; ///< reserved unsigned int enableCSSHReg : 1; ///< CS SH Registers unsigned int reserved3 : 6; ///< reserved unsigned int enableDw : 1; ///< DW enable }; unsigned int u32All; } CONTEXT_CONTROL_ENABLE; //------------------------------------------------------------------------------------------------- typedef struct _PM4CMDCONTEXTCONTROL { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; union { CONTEXT_CONTROL_ENABLE loadControl; ///< enable bits for loading unsigned int ordinal2; }; union { CONTEXT_CONTROL_ENABLE shadowEnable;///< enable bits for shadowing unsigned int ordinal3; }; } PM4CMDCONTEXTCONTROL, *PPM4CMDCONTEXTCONTROL; //------------------------------------------------------------------------------------------------- typedef union _LOAD_ADDRESS_HIGH { struct { unsigned int ADDR_HI : 16; ///< bits (47:32) for the block in Memory from where ///< the CP will fetch the state unsigned int reserved1 : 15; ///< reserved unsigned int WAIT_IDLE : 1; ///< if set the CP will wait for the graphics pipe to ///< be idle by writing to the GRBM Wait Until register ///< with "Wait for 3D idle" }; unsigned int u32All; } LOAD_ADDRESS_HIGH; //------------------------------------------------------------------------------------------------- // PM4CMDLOADDATA can be used with the following opcodes // - IT_LOAD_CONFIG_REG // - IT_LOAD_CONTEXT_REG // - IT_LOAD_SH_REG typedef struct _PM4CMDLOADDATA { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; union { unsigned int addrLo; ///< low 32 address bits for the block in memory from where ///< the CP will fetch the state unsigned int ordinal2; }; union { LOAD_ADDRESS_HIGH addrHi; unsigned int ordinal3; }; union { unsigned int regOffset; ///< offset in DWords from the register base address unsigned int ordinal4; }; union { unsigned int numDwords; ///< number of DWords that the CP will fetch and write ///< into the chip. A value of zero will fetch nothing unsigned int ordinal5; }; // This is a variable length packet. So, based on size in header, the layout following this // looks as follows (offser/numDwords pairs). // unsigned int offset1; // unsigned int numDwords1; // ... // unsigned int offsetN; // unsigned int numDwordsN; } PM4CMDLOADDATA, *PPM4CMDLOADDATA; //------------------------------------------------------------------------------------------------- typedef union _LOAD_ADDRESS_LOW { struct { unsigned int index : 1; ///< 0 : ADDR_LO is direct address ///< 1 : ARRD_LO is ignored and memory offset is in ordinal 3 unsigned int reserved : 1; ///< reserved unsigned int ADDR_LO : 30; ///< bits (31:2) for the block in Memory from where ///< the CP will fetch the state. DWORD aligned }; unsigned int u32All; } LOAD_ADDRESS_LOW; //------------------------------------------------------------------------------------------------- // PM4CMDLOADDATAINDEX can be used with the following opcodes (VI+) // - IT_LOAD_CONTEXT_REG_INDEX // - IT_LOAD_SH_REG_INDEX // Index values (VI+) #define LOAD_DATA_INDEX_DIRECT_ADDR 0 // Direct load from memory address #define LOAD_DATA_INDEX_OFFSET 1 // Load from indirect memory offset (_INDEX packets) #define LOAD_DATA_FORMAT_OFFSET_AND_SIZE 0 // Data is consecutive DWORDs #define LOAD_DATA_FORMAT_OFFSET_AND_DATA 1 // Register offset and data is interleaved typedef struct _PM4CMDLOADDATAINDEX { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; union { LOAD_ADDRESS_LOW addrLo; ///< low 32 address bits for the block in memory from where ///< the CP will fetch the state unsigned int ordinal2; }; union { unsigned int addrOffset; ///< addrLo.index = 1 Indexed mode unsigned int ordinal3; }; union { struct { unsigned int regOffset : 16; ///< offset in DWords from the register base address unsigned int reserved : 15; unsigned int dataFormat : 1; ///< LOAD_DATA_FORMAT_* }; unsigned int ordinal4; }; union { unsigned int numDwords; ///< number of DWords that the CP will fetch and write ///< into the chip. A value of zero will fetch nothing unsigned int ordinal5; }; // This is a variable length packet. So, based on size in header, the layout following this // looks as follows (offser/numDwords pairs). // unsigned int offset1; // unsigned int numDwords1; // ... // unsigned int offsetN; // unsigned int numDwordsN; } PM4CMDLOADDATAINDEX, *PPM4CMDLOADDATAINDEX; //------------------------------------------------------------------------------------------------- // PM4CMDSETDATA can be used with the following opcodes: // // - IT_SET_CONFIG_REG // - IT_SET_CONTEXT_REG // - IT_SET_CONTEXT_REG_INDIRECT // - IT_SET_SH_REG // - IT_SET_SH_REG_INDEX // - IT_SET_UCONFIG_REG // SET_CONTEXT_REG index values (CI+) #define SET_CONTEXT_INDEX_DEFAULT 0 // Use this for all registers except the following... #define SET_CONTEXT_INDEX_MULTI_VGT_PARAM 1 // Use this when writing IA_MULTI_VGT_PARAM #define SET_CONTEXT_INDEX_VGT_LS_HS_CONFIG 2 // Use this when writing VGT_LS_HS_CONFIG #define SET_CONTEXT_INDEX_PA_SC_RASTER_CONFIG 3 // Use this when writing PA_SC_RASTER_CONFIG #define SET_CONTEXT_INDEX_SHIFT 28 // Offset in ordinal2 of the index field. // SET_UCONFIG_REG index values (CI+) #define SET_UCONFIG_INDEX_DEFAULT 0 // Use this for all registers except the following... #define SET_UCONFIG_INDEX_PRIM_TYPE 1 // Use this when writing VGT_PRIMITIVE_TYPE #define SET_UCONFIG_INDEX_INDEX_TYPE 2 // Use this when writing VGT_INDEX_TYPE #define SET_UCONFIG_INDEX_NUM_INSTANCES 3 // Use this when writing VGT_NUM_INSTANCES // SET_SH_REG_INDEX index values (Hawaii, VI+) // Index (0-2): reserved #define SET_SH_REG_INDEX_CP_MODIFY_CU_MASK 3 // Use this to modify CU_EN for COMPUTE_STATIC* and SPI_SHADER_PGM_RSRC3* // CP performs AND operation on KMD and UMD CU masks to write registers. typedef struct _PM4CMDSETDATA { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; union { struct { unsigned int regOffset : 16; ///< offset in DWords from the register base address unsigned int reserved1 : 12; ///< Program to zero unsigned int index : 4; ///< Index for UCONFIG/CONTEXT on CI+ ///< Program to zero for other opcodes and on SI }; unsigned int ordinal2; }; // This is a variable length packet. So, based on size in header, the layout following this // looks as follows: // Data for SET_CONTEXT_REG // DW Offset into Patch table for SET_CONTEXT_REG_INDIRECT // unsigned int data0; // ... // unsigned int dataN; } PM4CMDSETDATA, *PPM4CMDSETDATA; //------------------------------------------------------------------------------------------------- typedef struct _PM4CMDNOP { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; } PM4CMDNOP, *PPM4CMDNOP; //------------------------------------------------------------------------------------------------- typedef struct _PM4CMDDRAWINDEXOFFSET2 { union { PM4_TYPE_3_HEADER header; ///
) the Reference Value. ///< 111 = Reserved. If ENGINE=PFP, only 101/Greater Than or Equal is valid, since that is all the ucode implemented in the PFP. unsigned int operation : 2; ///< operation: ///< 0 = Write Reference to Address0 -> Poll Address1 -> Write Reference to Address 1 unsigned int reserved1 : 3; unsigned int engine : 1; ///< engine, 0 = ME, 1 = PFP unsigned int reserved2 : 23; }; unsigned int ordinal2; }; union { unsigned int addrLo; unsigned int ordinal3; }; union { unsigned int addrHi; unsigned int ordinal4; }; union { unsigned int reference; unsigned int ordinal5; }; union { unsigned int mask; unsigned int ordinal6; }; union { struct { unsigned int pollInterval : 16; unsigned int reserved4 : 16; }; unsigned int ordinal7; }; } PM4WRITEDATACONFIRM, *PPM4WRITEDATACONFIRM; //------------------------------------------------------------------------------------------------- typedef struct _PM4DMADATA { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; union { struct { unsigned int engine : 1; unsigned int reserved1 : 11; unsigned int srcATC : 1; unsigned int srcCachePolicy : 2; unsigned int srcVolatile : 1; unsigned int reserved2 : 4; unsigned int dstSel : 2; unsigned int reserved3 : 2; unsigned int dstATC : 1; unsigned int dstCachePolicy : 2; unsigned int dstVolatile : 1; unsigned int reserved4 : 1; unsigned int srcSel : 2; unsigned int cpSync : 1; }; unsigned int ordinal2; }; union { unsigned int srcAddrLo; unsigned int data; unsigned int ordinal3; }; union { unsigned int srcAddrHi; unsigned int ordinal4; }; union { unsigned int dstAddrLo; unsigned int ordinal5; }; union { unsigned int dstAddrHi; unsigned int ordinal6; }; union { struct { unsigned int byteCount : 21; unsigned int disWC : 1; unsigned int srcSwap : 2; unsigned int dstSwap : 2; unsigned int sas : 1; unsigned int das : 1; unsigned int saic : 1; unsigned int daic : 1; unsigned int rawWait : 1; unsigned int reserved5 : 1; }; unsigned int command; unsigned int ordinal7; }; } PM4DMADATA, *PPM4DMADATA; //------------------------------------------------------------------------------------------------- typedef struct _PM4CMDRELEASEMEM { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; union { struct { unsigned int eventType : 6; ///< event type written to VGT_EVENT_INITIATOR unsigned int reserved1 : 2; ///< reserved unsigned int eventIndex : 4; ///< event index unsigned int tcl1VolActionEna : 1; ///< unsigned int tcVolActionEna : 1; ///< unsigned int reserved2 : 1; unsigned int tcWbActionEna : 1; ///< unsigned int tcl1ActionEna : 1; ///< unsigned int tcActionEna : 1; unsigned int reserved3 : 7; unsigned int cachePolicy : 2; ///< Cache Policy setting used for writing fences and timestamps to the TCL2 unsigned int _volatile__CI : 1; ///< Volatile setting used for writing fences and timestamps to the TCL2. unsigned int reserved5 : 4; }; unsigned int ordinal2; }; union { struct { unsigned int reserved6 : 16; ///< reserved unsigned int dstSel : 2; ///< destination select unsigned int reserved7 : 6; ///< reserved unsigned int intSel : 3; ///< selects interrupt action for end-of-pipe unsigned int reserved8 : 2; ///< reserved unsigned int dataSel : 3; ///< selects source of data }; unsigned int ordinal3; }; union { unsigned int addressLo; ///< low bits of address unsigned int ordinal4; }; union { unsigned int addressHi; ///< high bits of address unsigned int ordinal5; }; union { struct { unsigned int gdsIndex : 16; ///< Byte offset into GDS to copy from unsigned int numDwords : 16; ///< Number of DWORDS of GDS to copy }; unsigned int dataLo; ///< value that will be written to memory when event occurs unsigned int ordinal6; }; union { unsigned int dataHi; ///< value that will be written to memory when event occurs unsigned int ordinal7; }; } PM4CMDRELEASEMEM, *PPM4CMDRELEASEMEM; // EVENT_WRITE_EOP packet definitions #define RELEASEMEM_DST_SEL_MEMORY 0 #define RELEASEMEM_DST_SEL_L2 1 #define RELEASEMEM_DATA_SEL_DISCARD 0 #define RELEASEMEM_DATA_SEL_SEND_DATA32 1 #define RELEASEMEM_DATA_SEL_SEND_DATA64 2 #define RELEASEMEM_DATA_SEL_SEND_GPU_CLOCK 3 #define RELEASEMEM_DATA_SEL_SEND_CP_PERFCOUNTER 4 #define RELEASEMEM_DATA_SEL_STORE_GDS_DATA 5 #define RELEASEMEM_INT_SEL_NONE 0 #define RELEASEMEM_INT_SEL_SEND_INT 1 #define RELEASEMEM_INT_SEL_SEND_INT_ON_CONFIRM 2 #define RELEASEMEM_INT_SEL_SEND_DATA_ON_CONFIRM 3 //------------------------------------------------------------------------------------------------- typedef struct _PM4CMDREWIND { union { PM4_TYPE_3_HEADER header; ///< header unsigned int ordinal1; }; union { struct { unsigned int reserved0 : 24; ///< Reserved unsigned int offloadEnable : 1; ///< Enable offload polling valid bit to IQ unsigned int reserved1 : 6; ///< Reserved unsigned int valid : 1; ///< Set when subsequent packets are valid }; unsigned int ordinal2; }; } PM4CMDREWIND, *PPM4CMDREWIND; // Rewind packet valid bit mask #define REWIND_MASK_VALID 0x800000000 //------------------------------------------------------------------------------------------------- // PM4 command template sizes #define PM4_CMD_NOP_DWORDS \ (sizeof(PM4CMDNOP) / sizeof(unsigned int)) #define PM4_CMD_DRAW_PREAMBLE_DWORDS \ (sizeof(PM4CMDDRAWPREAMBLE) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_2_DWORDS \ (sizeof(PM4CMDDRAWINDEX2) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_OFFSET_2_DWORDS \ (sizeof(PM4CMDDRAWINDEXOFFSET2) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_AUTO_DWORDS \ (sizeof(PM4CMDDRAWINDEXAUTO) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_IMMD_DWORDS \ (sizeof(PM4CMDDRAWINDEXIMMD) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_TYPE_DWORDS \ (sizeof(PM4CMDDRAWINDEXTYPE) / sizeof(unsigned int)) #define PM4_CMD_INDEX_ATTRIBUTES_INDIRECT_DWORDS \ (sizeof(PM4CMDINDEXATTRIBUTESINDIRECT) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_BUFFER_SIZE_DWORDS \ (sizeof(PM4CMDDRAWINDEXBUFFERSIZE) / sizeof(unsigned int)) #define PM4_CMD_DRAW_NUM_INSTANCES_DWORDS \ (sizeof(PM4CMDDRAWNUMINSTANCES) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_BASE_DWORDS \ (sizeof(PM4CMDDRAWINDEXBASE) / sizeof(unsigned int)) #define PM4_CMD_DRAW_SET_BASE_DWORDS \ (sizeof(PM4CMDDRAWSETBASE) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDIRECT_DWORDS \ (sizeof(PM4CMDDRAWINDIRECT) / sizeof(unsigned int)) #define PM4_CMD_LOAD_DATA_DWORDS \ (sizeof(PM4CMDLOADDATA) / sizeof(unsigned int)) #define PM4_CMD_LOAD_DATA_INDEX_DWORDS \ (sizeof(PM4CMDLOADDATAINDEX) / sizeof(unsigned int)) #define PM4_CMD_SET_DATA_DWORDS \ (sizeof(PM4CMDSETDATA) / sizeof(unsigned int)) #define PM4_CMD_WAIT_REG_MEM_DWORDS \ (sizeof(PM4CMDWAITREGMEM) / sizeof(unsigned int)) #define PM4_CMD_WAIT_REG_MEM64_DWORDS \ (sizeof(PM4CMDWAITREGMEM64) / sizeof(unsigned int)) #define PM4_CMD_WAIT_EVENT_WRITE_DWORDS \ (sizeof(PM4CMDEVENTWRITE) / sizeof(unsigned int)) #define PM4_CMD_WAIT_EVENT_WRITE_QUERY_DWORDS \ (sizeof(PM4CMDEVENTWRITEQUERY) / sizeof(unsigned int)) #define PM4_CMD_WAIT_EVENT_WRITE_EOP_DWORDS \ (sizeof(PM4CMDEVENTWRITEEOP) / sizeof(unsigned int)) #define PM4_CMD_STRMOUT_BUFFER_UPDATE_DWORDS \ (sizeof(PM4CMDSTRMOUTBUFFERUPDATE) / sizeof(unsigned int)) #define PM4_CMD_CONTEXT_CTL_DWORDS \ (sizeof(PM4CMDCONTEXTCONTROL) / sizeof(unsigned int)) #define PM4_CMD_SET_PREDICATION_DWORDS \ (sizeof(PM4CMDSETPREDICATION) / sizeof(unsigned int)) #define PM4_CMD_SURFACE_SYNC_DWORDS \ (sizeof(PM4CMDSURFACESYNC) / sizeof(unsigned int)) #define PM4_CMD_DISPATCH_DIRECT_DWORDS \ (sizeof(PM4CMDDISPATCHDIRECT) / sizeof(unsigned int)) #define PM4_CMD_DISPATCH_INDIRECT_DWORDS \ (sizeof(PM4CMDDISPATCHINDIRECT) / sizeof(unsigned int)) #define PM4_CMD_DISPATCH_INDIRECT_MEC_DWORDS \ (sizeof(PM4CMDDISPATCHINDIRECTMEC) / sizeof(unsigned int)) #define PM4_CMD_CLEAR_STATE_DWORDS \ (sizeof(PM4CMDCLEARSTATE) / sizeof(unsigned int)) #define PM4_CMD_EVENT_WRITE_EOS_DWORDS \ (sizeof(PM4CMDEVENTWRITEEOS) / sizeof(unsigned int)) #define PM4_CMD_SCRATCH_RAM_WRITE_DWORDS \ (sizeof(PM4CMDSCRATCHRAMWRITE) / sizeof(unsigned int)) #define PM4_CMD_WRITE_CONST_RAM_DWORDS \ (sizeof(PM4CMDCONSTRAMWRITE) / sizeof(unsigned int)) #define PM4_CMD_DUMP_CONST_RAM_DWORDS \ (sizeof(PM4CMDCONSTRAMDUMP) / sizeof(unsigned int)) #define PM4_CMD_DUMP_CONST_RAM_OFFSET_DWORDS \ (sizeof(PM4CMDCONSTRAMDUMPOFFSET) / sizeof(unsigned int)) #define PM4_CMD_LOAD_CONST_RAM_DWORDS \ (sizeof(PM4CMDCONSTRAMLOAD) / sizeof(unsigned int)) #define PM4_CMD_INC_CE_COUNTER_DWORDS \ (sizeof(PM4CMDINCCECOUNTER) / sizeof(unsigned int)) #define PM4_CMD_INC_DE_COUNTER_DWORDS \ (sizeof(PM4CMDINCDECOUNTER) / sizeof(unsigned int)) #define PM4_CMD_SET_CE_DE_COUNTERS_DWORDS \ (sizeof(PM4CMDSETCEDECOUNTERS) / sizeof(unsigned int)) #define PM4_CMD_WAIT_ON_AVAIL_BUFFER_DWORDS \ (sizeof(PM4CMDWAITONAVAILBUFFER) / sizeof(unsigned int)) #define PM4_CMD_WAIT_ON_CE_COUNTER_DWORDS \ (sizeof(PM4CMDWAITONCECOUNTER) / sizeof(unsigned int)) #define PM4_CMD_WAIT_ON_DE_COUNTER_DIFF_DWORDS \ (sizeof(PM4CMDWAITONDECOUNTERDIFF) / sizeof(unsigned int)) // Miscellaneous defines #define PM4_CMD_MAX_SIZE_DWORDS (1 << 14) #define PM4_SETTING_PRED_EXEC(mask, count) ((mask << 24) | count) //------------------------------------------------------------------------------------------------- #define PM4_CMD_INDIRECT_BUFFER_CONST_DWORDS \ (sizeof(PM4CMDINDIRECTBUFFER) / sizeof(unsigned int)) #define PM4_CMD_INDIRECT_BUFFER_DWORDS \ (sizeof(PM4CMDINDIRECTBUFFER) / sizeof(unsigned int)) #define PM4_CMD_COND_INDIRECT_BUFFER_DWORDS \ (sizeof(PM4CMDCONDINDIRECTBUFFER) / sizeof(unsigned int)) #define PM4_CMD_SET_SH_REG_OFFSET_DWORDS \ (sizeof(PM4CMDSETSHREGOFFSET) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_INDIRECT_DWORDS \ (sizeof(PM4CMDDRAWINDEXINDIRECT) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_INDIRECT_MULTI_DWORDS \ (sizeof(PM4CMDDRAWINDEXINDIRECTMULTI) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_MULTI_AUTO_DWORDS \ (sizeof(PM4CMDDRAWINDEXMULTIAUTO) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDIRECT_DWORDS \ (sizeof(PM4CMDDRAWINDIRECT) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDIRECT_MULTI_DWORDS \ (sizeof(PM4CMDDRAWINDIRECTMULTI) / sizeof(unsigned int)) #define PM4_CMD_INCREMENT_DE_COUNTER_DWORDS \ (sizeof(PM4CMDINCREMENTCOUNTER) / sizeof(unsigned int)) #define PM4_CMD_DRAW_INDEX_BASE_DWORDS \ (sizeof(PM4CMDDRAWINDEXBASE) / sizeof(unsigned int)) #define PM4_CMD_DRAW_MPEG_INDEX_DWORDS \ (sizeof(PM4CMDDRAWMPEGINDEX) / sizeof(unsigned int)) #define PM4_CMD_COND_EXEC_DWORDS \ (sizeof(PM4CMDCONDEXEC) / sizeof(unsigned int)) #define PM4_CMD_COND_EXEC_CI_DWORDS \ (sizeof(PM4CMDCONDEXEC_CI) / sizeof(unsigned int)) #define PM4_CMD_COND_WRITE_DWORDS \ (sizeof(PM4CMDCONDWRITE) / sizeof(unsigned int)) #define PM4_CMD_PRED_EXEC_DWORDS \ (sizeof(PM4CMDPREDEXEC) / sizeof(unsigned int)) #define PM4_CMD_ATOMIC_DWORDS \ (sizeof(PM4CMDATOMIC) / sizeof(unsigned int)) #define PM4_CMD_ATOMIC_GDS_DWORDS \ (sizeof(PPM4CMDATOMICGDS) / sizeof(unsigned int)) #define PM4_CMD_OCCLUSION_QUERY_DWORDS \ (sizeof(PM4CMDOCCLUSIONQUERY) / sizeof(unsigned int)) #define PM4_CMD_ALLOC_GDS_DWORDS \ (sizeof(PM4CMDALLOCGDS) / sizeof(unsigned int)) #define PM4_CMD_CP_DMA_DWORDS \ (sizeof(PM4CMDCPDMA) / sizeof(unsigned int)) #define PM4_CMD_REG_RMW_DWORDS \ (sizeof(PM4CMDREGRMW) / sizeof(unsigned int)) #define PM4_CONTEXT_REG_RMW_DWORDS \ (sizeof(PM4CONTEXTREGRMW) / sizeof(unsigned int)) #define PM4_CMD_WRITE_GDS_RAM_DWORDS \ (sizeof(PM4CMDWRITEGDSRAM) / sizeof(unsigned int)) #define PM4_CMD_WRITE_DATA_DWORDS \ (sizeof(PM4CMDWRITEDATA) / sizeof(unsigned int)) #define PM4_CMD_WRITE_CONST_RAM_OFFSET_DWORDS \ (sizeof(PM4CMDCONSTRAMWRITE) / sizeof(unsigned int)) #define PM4_CMD_LOAD_CONFIG_REG_DWORDS \ (sizeof(PM4CMDLOADDATA) / sizeof(unsigned int)) #define PM4_CMD_SET_CONFIG_REG_DWORDS \ (sizeof(PM4CMDSETDATA) / sizeof(unsigned int)) #define PM4_CMD_PREAMBLE_CNTL_REG_DWORDS \ (sizeof(PM4CMDPREAMBLECNTL) / sizeof(unsigned int)) #define PM4_CMD_SET_CONTEXT_REG_DWORDS \ (sizeof(PM4CMDSETDATA) / sizeof(unsigned int)) #define PM4_CMD_SET_CONTEXT_REG_INDIRECT_DWORDS \ (sizeof(PM4CMDSETDATA) / sizeof(unsigned int)) #define PM4_CMD_LOAD_CONTEXT_REG_DWORDS \ (sizeof(PM4CMDLOADDATA) / sizeof(unsigned int)) #define PM4_CMD_LOAD_SH_REG_DWORDS \ (sizeof(PM4CMDLOADDATA) / sizeof(unsigned int)) #define PM4_CMD_SET_SH_REG_DWORDS \ (sizeof(PM4CMDSETDATA) / sizeof(unsigned int)) #define PM4_CMD_WRITE_CONST_RAM_INDIRECT_DWORDS \ (sizeof(PM4CMDCONSTRAMWRITE) / sizeof(unsigned int)) #define PM4_CMD_MEM_SEMAPHORE_DWORDS \ (sizeof(PM4CMDMEMSEMAPHORE) / sizeof(unsigned int)) #define PM4_CMD_PFP_SYNC_ME_DWORDS \ (sizeof(PM4CMDPFPSYNCME) / sizeof(unsigned int)) #define PM4_CMD_COPY_DATA_DWORDS \ (sizeof(PM4CMDCOPYDATA) / sizeof(unsigned int)) #define PM4_CMD_ACQUIRE_MEM_DWORDS \ (sizeof(PM4ACQUIREMEM) / sizeof (unsigned int)) #define PM4_CMD_ATOMIC_MEM_DWORDS \ (sizeof(PM4ATOMICMEM_CI) / sizeof (unsigned int)) #define PM4_CMD_WRITE_DATA_CONFIRM_DWORDS \ (sizeof(PM4WRITEDATACONFIRM) / sizeof (unsigned int)) #define PM4_CMD_DMA_DATA_DWORDS \ (sizeof(PM4DMADATA) / sizeof (unsigned int)) #define PM4_CMD_RELEASE_MEM_DWORDS \ (sizeof(PM4CMDRELEASEMEM) / sizeof (unsigned int)) #define PM4_CMD_REWIND_DWORDS \ (sizeof(PM4CMDREWIND) / sizeof(unsigned int)) } // inline namespace Chip } // namespace Gfx6 } // namespace Pal #endif