mirror of https://gitlab.freedesktop.org/mesa/mesa
1009 lines
35 KiB
Python
1009 lines
35 KiB
Python
#!/usr/bin/env python3
|
||
|
||
import sys, io, re, json
|
||
from canonicalize import json_canonicalize
|
||
|
||
######### BEGIN HARDCODED CONFIGURATION
|
||
|
||
gfx_levels = {
|
||
'gfx6': [
|
||
[],
|
||
'asic_reg/gca/gfx_6_0_d.h',
|
||
'asic_reg/gca/gfx_6_0_sh_mask.h',
|
||
'asic_reg/gca/gfx_7_2_enum.h' # the file for gfx6 doesn't exist
|
||
],
|
||
'gfx7': [
|
||
[],
|
||
'asic_reg/gca/gfx_7_2_d.h',
|
||
'asic_reg/gca/gfx_7_2_sh_mask.h',
|
||
'asic_reg/gca/gfx_7_2_enum.h'
|
||
],
|
||
'gfx8': [
|
||
[],
|
||
'asic_reg/gca/gfx_8_0_d.h',
|
||
'asic_reg/gca/gfx_8_0_sh_mask.h',
|
||
'asic_reg/gca/gfx_8_0_enum.h',
|
||
],
|
||
'gfx81': [
|
||
[],
|
||
'asic_reg/gca/gfx_8_1_d.h',
|
||
'asic_reg/gca/gfx_8_1_sh_mask.h',
|
||
'asic_reg/gca/gfx_8_1_enum.h',
|
||
],
|
||
'gfx9': [
|
||
[0x00002000, 0x0000A000, 0, 0, 0], # IP_BASE GC_BASE
|
||
'asic_reg/gc/gc_9_2_1_offset.h',
|
||
'asic_reg/gc/gc_9_2_1_sh_mask.h',
|
||
'vega10_enum.h',
|
||
],
|
||
'gfx940': [
|
||
[0x00002000, 0x0000A000, 0, 0, 0], # IP_BASE GC_BASE
|
||
'asic_reg/gc/gc_9_4_3_offset.h',
|
||
'asic_reg/gc/gc_9_4_3_sh_mask.h',
|
||
'vega10_enum.h',
|
||
],
|
||
'gfx10': [
|
||
[0x00001260, 0x0000A000, 0x02402C00, 0, 0], # IP_BASE GC_BASE
|
||
'asic_reg/gc/gc_10_1_0_offset.h',
|
||
'asic_reg/gc/gc_10_1_0_sh_mask.h',
|
||
'navi10_enum.h',
|
||
],
|
||
'gfx103': [
|
||
[0x00001260, 0x0000A000, 0x0001C000, 0x02402C00, 0], # IP_BASE GC_BASE
|
||
'asic_reg/gc/gc_10_3_0_offset.h',
|
||
'asic_reg/gc/gc_10_3_0_sh_mask.h',
|
||
'navi10_enum.h', # the file for gfx10.3 doesn't exist
|
||
],
|
||
'gfx11': [
|
||
[0x00001260, 0x0000A000, 0x0001C000, 0x02402C00, 0, 0], # IP_BASE GC_BASE
|
||
'asic_reg/gc/gc_11_0_0_offset.h',
|
||
'asic_reg/gc/gc_11_0_0_sh_mask.h',
|
||
'soc21_enum.h',
|
||
],
|
||
'gfx115': [
|
||
[0x00001260, 0x0000A000, 0x0001C000, 0x02402C00, 0, 0], # IP_BASE GC_BASE
|
||
'asic_reg/gc/gc_11_5_0_offset.h',
|
||
'asic_reg/gc/gc_11_5_0_sh_mask.h',
|
||
'soc21_enum.h',
|
||
],
|
||
'gfx12': [
|
||
[0x00001260, 0x0000A000, 0x0001C000, 0x02402C00, 0, 0], # IP_BASE GC_BASE
|
||
'asic_reg/gc/gc_12_0_0_offset.h',
|
||
'asic_reg/gc/gc_12_0_0_sh_mask.h',
|
||
'soc21_enum.h',
|
||
],
|
||
}
|
||
|
||
# match: #define mmSDMA0_DEC_START 0x0000
|
||
# match: #define ixSDMA0_DEC_START 0x0000
|
||
# match: #define regSDMA0_DEC_START 0x0000
|
||
re_offset = re.compile(r'^#define (?P<mm>(mm|ix|reg))(?P<name>\w+)\s+(?P<value>\w+)\n')
|
||
|
||
# match: #define SDMA0_DEC_START__START__SHIFT 0x0
|
||
re_shift = re.compile(r'^#define (?P<name>\w+)__(?P<field>\w+)__SHIFT\s+(?P<value>\w+)\n')
|
||
|
||
# match: #define SDMA0_DEC_START__START_MASK 0xFFFFFFFFL
|
||
# match: #define SDMA0_DEC_START__START_MASK 0xFFFFFFFF
|
||
re_mask = re.compile(r'^#define (?P<name>\w+)__(?P<field>\w+)_MASK\s+(?P<value>[0-9a-fA-Fx]+)L?\n')
|
||
|
||
def register_filter(gfx_level, name, offset, already_added):
|
||
group = offset // 0x1000
|
||
is_cdna = gfx_level in ['gfx940']
|
||
|
||
# Shader and uconfig registers
|
||
umd_ranges = [0xB, 0x30]
|
||
|
||
# Gfx context, other uconfig, and perf counter registers
|
||
if not is_cdna:
|
||
umd_ranges += [0x28, 0x31, 0x34, 0x35, 0x36, 0x37]
|
||
|
||
# Add all registers in the 0x8000 range for gfx6
|
||
if gfx_level == 'gfx6':
|
||
umd_ranges += [0x8]
|
||
|
||
# Only accept writeable registers and debug registers
|
||
return ((group in umd_ranges or
|
||
# Add SQ_WAVE registers for trap handlers
|
||
name.startswith('SQ_WAVE_') or
|
||
# Add registers in the 0x8000 range used by all generations
|
||
(group == 0x8 and
|
||
(name.startswith('SQ_IMG_') or
|
||
name.startswith('SQ_BUF_') or
|
||
name.startswith('SQ_THREAD') or
|
||
name.startswith('GRBM_STATUS') or
|
||
name.startswith('CP_CP'))) or
|
||
name.startswith('GCVM_L2_PROTECTION_FAULT_STATUS') or
|
||
# Add registers in the 0x9000 range
|
||
(group == 0x9 and
|
||
(name in ['TA_CS_BC_BASE_ADDR', 'GB_ADDR_CONFIG', 'SPI_CONFIG_CNTL'] or
|
||
(name.startswith('GB') and 'TILE_MODE' in name)))) and
|
||
# Remove SQ compiler definitions
|
||
offset // 4 not in (0x23B0, 0x23B1, 0x237F) and
|
||
# Remove conflicts (multiple definitions for the same offset)
|
||
not already_added and
|
||
'PREF_PRI_ACCUM' not in name and
|
||
# only define SPI and COMPUTE registers in the 0xB000 range.
|
||
(group != 0xB or name.startswith('SPI') or name.startswith('COMPUTE')) and
|
||
# only define CP_COHER uconfig registers on CDNA
|
||
(not is_cdna or group != 0x30 or name.startswith('CP_COHER')))
|
||
|
||
# Mapping from field names to enum types
|
||
enum_map = {
|
||
# Format:
|
||
# field: [type1] - all registers use the same enum
|
||
# OR:
|
||
# field: [type1, reg1, type2, reg2, ...] - apply different enums to different registers
|
||
"ALPHA_COMB_FCN": ["CombFunc", "CB_BLEND0_CONTROL", "SX_OPT_COMB_FCN", "SX_MRT0_BLEND_OPT"],
|
||
"ALPHA_DESTBLEND": ["BlendOp"],
|
||
"ALPHA_DST_OPT": ["SX_BLEND_OPT"],
|
||
"ALPHA_SRCBLEND": ["BlendOp"],
|
||
"ALPHA_SRC_OPT": ["SX_BLEND_OPT"],
|
||
"ARRAY_MODE": ["ArrayMode"],
|
||
"BANK_HEIGHT": ["BankHeight"],
|
||
"BANK_WIDTH": ["BankWidth"],
|
||
"BC_SWIZZLE": ["SQ_IMG_RSRC_WORD4__BC_SWIZZLE"],
|
||
"BIN_MAPPING_MODE": ["BinMapMode"],
|
||
"BINNING_MODE": ["BinningMode"],
|
||
"BIN_SIZE_X_EXTEND": ["BinSizeExtend"],
|
||
"BIN_SIZE_Y_EXTEND": ["BinSizeExtend"],
|
||
"BLEND_OPT_DISCARD_PIXEL": ["BlendOpt"],
|
||
"BLEND_OPT_DONT_RD_DST": ["BlendOpt"],
|
||
"BORDER_COLOR_TYPE": ["SQ_TEX_BORDER_COLOR"],
|
||
"BUF_TYPE": ["VGT_DMA_BUF_TYPE"],
|
||
"CLAMP_X": ["SQ_TEX_CLAMP"],
|
||
"CLAMP_Y": ["SQ_TEX_CLAMP"],
|
||
"CLAMP_Z": ["SQ_TEX_CLAMP"],
|
||
"CLEAR_FILTER_SEL": ["CBPerfClearFilterSel"],
|
||
"CLIP_RULE": ["CLIP_RULE"],
|
||
"CMASK_ADDR_TYPE": ["CmaskAddr"],
|
||
"CMASK_RD_POLICY": ["ReadPolicy"],
|
||
"CMASK_WR_POLICY": ["WritePolicy"],
|
||
"COL0_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COL1_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COL2_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COL3_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COL4_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COL5_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COL6_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COL7_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"COLOR_COMB_FCN": ["CombFunc", "CB_BLEND0_CONTROL", "SX_OPT_COMB_FCN", "SX_MRT0_BLEND_OPT"],
|
||
"COLOR_DESTBLEND": ["BlendOp"],
|
||
"COLOR_DST_OPT": ["SX_BLEND_OPT"],
|
||
"COLOR_RD_POLICY": ["ReadPolicy"],
|
||
"COLOR_SRCBLEND": ["BlendOp"],
|
||
"COLOR_SRC_OPT": ["SX_BLEND_OPT"],
|
||
"COLOR_WR_POLICY": ["WritePolicy"],
|
||
"COMPAREFUNC0": ["CompareFrag"],
|
||
"COMPAREFUNC1": ["CompareFrag"],
|
||
"COMP_SWAP": ["SurfaceSwap"],
|
||
"CONSERVATIVE_Z_EXPORT": ["ConservativeZExport"],
|
||
"COVERAGE_TO_SHADER_SELECT": ["CovToShaderSel"],
|
||
"CUT_MODE": ["VGT_GS_CUT_MODE"],
|
||
"DATA_FORMAT": ["BUF_DATA_FORMAT", "SQ_BUF_RSRC_WORD3", "IMG_DATA_FORMAT", "SQ_IMG_RSRC_WORD1"],
|
||
"DCC_RD_POLICY": ["ReadPolicy"],
|
||
"DCC_WR_POLICY": ["WritePolicy"],
|
||
"DEPTH_COMPARE_FUNC": ["SQ_TEX_DEPTH_COMPARE"],
|
||
"DETECT_ONE": ["VGT_DETECT_ONE"],
|
||
"DETECT_ZERO": ["VGT_DETECT_ZERO"],
|
||
"DISTRIBUTION_MODE": ["VGT_DIST_MODE"],
|
||
"DST_SEL_W": ["SQ_SEL_XYZW01"],
|
||
"DST_SEL_X": ["SQ_SEL_XYZW01"],
|
||
"DST_SEL_Y": ["SQ_SEL_XYZW01"],
|
||
"DST_SEL_Z": ["SQ_SEL_XYZW01"],
|
||
"ENDIAN": ["SurfaceEndian"],
|
||
"ES_EN": ["VGT_STAGES_ES_EN"],
|
||
"EVENT_TYPE": ["VGT_EVENT_TYPE"],
|
||
"EXCP": ["EXCP_EN"],
|
||
"EXCP_EN": ["EXCP_EN"],
|
||
"FAULT_BEHAVIOR": ["DbPRTFaultBehavior"],
|
||
"FILTER_MODE": ["SQ_IMG_FILTER_TYPE"],
|
||
"FLOAT_MODE": ["FLOAT_MODE"],
|
||
"FMASK_RD_POLICY": ["ReadPolicy"],
|
||
"FMASK_WR_POLICY": ["WritePolicy"],
|
||
"FORCE_FULL_Z_RANGE": ["ForceControl"],
|
||
"FORCE_HIS_ENABLE0": ["ForceControl"],
|
||
"FORCE_HIS_ENABLE1": ["ForceControl"],
|
||
"FORCE_HIZ_ENABLE": ["ForceControl"],
|
||
"FORCE_Z_LIMIT_SUMM": ["ZLimitSumm"],
|
||
"FORMAT": ["ColorFormat", "CB_COLOR0_INFO", "StencilFormat", "DB_STENCIL_INFO", "ZFormat", "DB_Z_INFO"],
|
||
"GS_EN": ["VGT_STAGES_GS_EN"],
|
||
"HIZ_ZFUNC": ["CompareFrag"],
|
||
"HS_EN": ["VGT_STAGES_HS_EN"],
|
||
"HTILE_RD_POLICY": ["ReadPolicy"],
|
||
"HTILE_WR_POLICY": ["WritePolicy"],
|
||
"IDX0_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],
|
||
"INDEX_TYPE": ["VGT_INDEX_TYPE_MODE"],
|
||
"LS_EN": ["VGT_STAGES_LS_EN"],
|
||
"MACRO_TILE_ASPECT": ["MacroTileAspect"],
|
||
"MAJOR_MODE": ["VGT_DI_MAJOR_MODE_SELECT"],
|
||
"MAX_UNCOMPRESSED_BLOCK_SIZE": ["CB_COLOR_DCC_CONTROL__MAX_UNCOMPRESSED_BLOCK_SIZE"],
|
||
"MICRO_TILE_MODE": ["GB_TILE_MODE0__MICRO_TILE_MODE"],
|
||
"MICRO_TILE_MODE_NEW": ["MicroTileMode"],
|
||
"MIN_COMPRESSED_BLOCK_SIZE": ["CB_COLOR_DCC_CONTROL__MIN_COMPRESSED_BLOCK_SIZE"],
|
||
"MIP_FILTER": ["SQ_TEX_MIP_FILTER"],
|
||
"MODE": ["CBMode", "CB_COLOR_CONTROL", "VGT_GS_MODE_TYPE", "VGT_GS_MODE"],
|
||
"MRT0_EPSILON": ["SX_BLEND_OPT_EPSILON__MRT0_EPSILON"],
|
||
"MRT0": ["SX_DOWNCONVERT_FORMAT"],
|
||
"MRT1": ["SX_DOWNCONVERT_FORMAT"],
|
||
"MRT2": ["SX_DOWNCONVERT_FORMAT"],
|
||
"MRT3": ["SX_DOWNCONVERT_FORMAT"],
|
||
"MRT4": ["SX_DOWNCONVERT_FORMAT"],
|
||
"MRT5": ["SX_DOWNCONVERT_FORMAT"],
|
||
"MRT6": ["SX_DOWNCONVERT_FORMAT"],
|
||
"MRT7": ["SX_DOWNCONVERT_FORMAT"],
|
||
"NUM_BANKS": ["NumBanks"],
|
||
"NUM_FORMAT": ["BUF_NUM_FORMAT", "SQ_BUF_RSRC_WORD3", "IMG_NUM_FORMAT", "SQ_IMG_RSRC_WORD1"],
|
||
"NUMBER_TYPE": ["SurfaceNumber"],
|
||
"OFFCHIP_GRANULARITY": ["VGT_HS_OFFCHIP_PARAM__OFFCHIP_GRANULARITY"],
|
||
"OP_FILTER_SEL": ["CBPerfOpFilterSel"],
|
||
"OREO_MODE": ["OreoMode"],
|
||
"OUTPRIM_TYPE_1": ["VGT_GS_OUTPRIM_TYPE"],
|
||
"OUTPRIM_TYPE_2": ["VGT_GS_OUTPRIM_TYPE"],
|
||
"OUTPRIM_TYPE_3": ["VGT_GS_OUTPRIM_TYPE"],
|
||
"OUTPRIM_TYPE": ["VGT_GS_OUTPRIM_TYPE"],
|
||
"PARTIAL_SQUAD_LAUNCH_CONTROL": ["DbPSLControl"],
|
||
"PARTITIONING": ["VGT_TESS_PARTITION"],
|
||
"PERFMON_ENABLE_MODE": ["CP_PERFMON_ENABLE_MODE"],
|
||
"PERFMON_STATE": ["CP_PERFMON_STATE"],
|
||
"PIPE_CONFIG": ["PipeConfig"],
|
||
"PKR_MAP": ["PkrMap"],
|
||
"PKR_XSEL2": ["PkrXsel2"],
|
||
"PKR_XSEL": ["PkrXsel"],
|
||
"PKR_YSEL": ["PkrYsel"],
|
||
"PNT_SPRITE_OVRD_W": ["SPI_PNT_SPRITE_OVERRIDE"],
|
||
"PNT_SPRITE_OVRD_X": ["SPI_PNT_SPRITE_OVERRIDE"],
|
||
"PNT_SPRITE_OVRD_Y": ["SPI_PNT_SPRITE_OVERRIDE"],
|
||
"PNT_SPRITE_OVRD_Z": ["SPI_PNT_SPRITE_OVERRIDE"],
|
||
"POLYMODE_BACK_PTYPE": ["PA_SU_SC_MODE_CNTL__POLYMODE_FRONT_PTYPE"],
|
||
"POLYMODE_FRONT_PTYPE": ["PA_SU_SC_MODE_CNTL__POLYMODE_FRONT_PTYPE"],
|
||
"POLY_MODE": ["PA_SU_SC_MODE_CNTL__POLY_MODE"],
|
||
"POS0_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],
|
||
"POS1_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],
|
||
"POS2_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],
|
||
"POS3_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],
|
||
"POS4_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],
|
||
"PRIM_TYPE": ["VGT_DI_PRIM_TYPE"],
|
||
"PUNCHOUT_MODE": ["DB_DFSM_CONTROL__PUNCHOUT_MODE"],
|
||
"QUANT_MODE": ["QUANT_MODE"],
|
||
"RB_MAP_PKR0": ["RbMap"],
|
||
"RB_MAP_PKR1": ["RbMap"],
|
||
"RB_XSEL2": ["RbXsel2"],
|
||
"RB_XSEL": ["RbXsel"],
|
||
"RB_YSEL": ["RbYsel"],
|
||
"ROP3": ["ROP3"],
|
||
"RDREQ_POLICY": ["VGT_RDREQ_POLICY"],
|
||
"REG_INCLUDE": ["ThreadTraceRegInclude"],
|
||
"ROUND_MODE": ["PA_SU_VTX_CNTL__ROUND_MODE", "PA_SU_VTX_CNTL"],
|
||
"SC_MAP": ["ScMap"],
|
||
"SC_XSEL": ["ScXsel"],
|
||
"SC_YSEL": ["ScYsel"],
|
||
"SE_MAP": ["SeMap"],
|
||
"SE_PAIR_MAP": ["SePairMap"],
|
||
"SE_PAIR_XSEL": ["SePairXsel"],
|
||
"SE_PAIR_YSEL": ["SePairYsel"],
|
||
"SE_XSEL": ["SeXsel"],
|
||
"SE_YSEL": ["SeYsel"],
|
||
"SOURCE_SELECT": ["VGT_DI_SOURCE_SELECT"],
|
||
"SPM_PERFMON_STATE": ["SPM_PERFMON_STATE"],
|
||
"S_RD_POLICY": ["ReadPolicy"],
|
||
"STENCILFAIL_BF": ["StencilOp"],
|
||
"STENCILFAIL": ["StencilOp"],
|
||
"STENCILFUNC_BF": ["CompareFrag"],
|
||
"STENCILFUNC": ["CompareFrag"],
|
||
"STENCILZFAIL_BF": ["StencilOp"],
|
||
"STENCILZFAIL": ["StencilOp"],
|
||
"STENCILZPASS_BF": ["StencilOp"],
|
||
"STENCILZPASS": ["StencilOp"],
|
||
"SWAP_MODE": ["VGT_DMA_SWAP_MODE"],
|
||
"S_WR_POLICY": ["WritePolicy"],
|
||
"TILE_SPLIT": ["TileSplit"],
|
||
"TOKEN_EXCLUDE": ["ThreadTraceTokenExclude"],
|
||
"TOPOLOGY": ["VGT_TESS_TOPOLOGY"],
|
||
"TYPE": ["SQ_RSRC_BUF_TYPE", "SQ_BUF_RSRC_WORD3", "SQ_RSRC_IMG_TYPE", "SQ_IMG_RSRC_WORD3", "VGT_TESS_TYPE", "VGT_TF_PARAM"],
|
||
"UNCERTAINTY_REGION_MODE": ["ScUncertaintyRegionMode"],
|
||
"VRS_HTILE_ENCODING": ["VRSHtileEncoding"],
|
||
"VRS_RATE": ["VRSrate"],
|
||
"VS_EN": ["VGT_STAGES_VS_EN"],
|
||
"XY_MAG_FILTER": ["SQ_TEX_XY_FILTER"],
|
||
"XY_MIN_FILTER": ["SQ_TEX_XY_FILTER"],
|
||
"Z_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],
|
||
"Z_FILTER": ["SQ_TEX_Z_FILTER"],
|
||
"ZFUNC": ["CompareFrag"],
|
||
"Z_ORDER": ["ZOrder"],
|
||
"ZPCPSD_WR_POLICY": ["WritePolicy"],
|
||
"Z_RD_POLICY": ["ReadPolicy"],
|
||
"Z_WR_POLICY": ["WritePolicy"],
|
||
|
||
"VERTEX_RATE_COMBINER_MODE": ["VRSCombinerModeSC"],
|
||
"PRIMITIVE_RATE_COMBINER_MODE": ["VRSCombinerModeSC"],
|
||
"HTILE_RATE_COMBINER_MODE": ["VRSCombinerModeSC"],
|
||
"SAMPLE_ITER_COMBINER_MODE": ["VRSCombinerModeSC"],
|
||
"VRS_OVERRIDE_RATE_COMBINER_MODE": ["VRSCombinerModeSC"],
|
||
}
|
||
|
||
# Enum definitions that are incomplete or missing in kernel headers
|
||
DB_DFSM_CONTROL__PUNCHOUT_MODE = {
|
||
"entries": [
|
||
{"name": "AUTO", "value": 0},
|
||
{"name": "FORCE_ON", "value": 1},
|
||
{"name": "FORCE_OFF", "value": 2},
|
||
{"name": "RESERVED", "value": 3}
|
||
]
|
||
}
|
||
|
||
ColorFormat = {
|
||
"entries": [
|
||
{"name": "COLOR_INVALID", "value": 0},
|
||
{"name": "COLOR_8", "value": 1},
|
||
{"name": "COLOR_16", "value": 2},
|
||
{"name": "COLOR_8_8", "value": 3},
|
||
{"name": "COLOR_32", "value": 4},
|
||
{"name": "COLOR_16_16", "value": 5},
|
||
{"name": "COLOR_10_11_11", "value": 6},
|
||
{"name": "COLOR_11_11_10", "value": 7},
|
||
{"name": "COLOR_10_10_10_2", "value": 8},
|
||
{"name": "COLOR_2_10_10_10", "value": 9},
|
||
{"name": "COLOR_8_8_8_8", "value": 10},
|
||
{"name": "COLOR_32_32", "value": 11},
|
||
{"name": "COLOR_16_16_16_16", "value": 12},
|
||
{"name": "COLOR_32_32_32_32", "value": 14},
|
||
{"name": "COLOR_5_6_5", "value": 16},
|
||
{"name": "COLOR_1_5_5_5", "value": 17},
|
||
{"name": "COLOR_5_5_5_1", "value": 18},
|
||
{"name": "COLOR_4_4_4_4", "value": 19},
|
||
{"name": "COLOR_8_24", "value": 20},
|
||
{"name": "COLOR_24_8", "value": 21},
|
||
{"name": "COLOR_X24_8_32_FLOAT", "value": 22},
|
||
{"name": "COLOR_5_9_9_9", "value": 24}
|
||
]
|
||
}
|
||
|
||
SQ_IMG_RSRC_WORD4__BC_SWIZZLE = {
|
||
"entries": [
|
||
{"name": "BC_SWIZZLE_XYZW", "value": 0},
|
||
{"name": "BC_SWIZZLE_XWYZ", "value": 1},
|
||
{"name": "BC_SWIZZLE_WZYX", "value": 2},
|
||
{"name": "BC_SWIZZLE_WXYZ", "value": 3},
|
||
{"name": "BC_SWIZZLE_ZYXW", "value": 4},
|
||
{"name": "BC_SWIZZLE_YXWZ", "value": 5}
|
||
]
|
||
}
|
||
|
||
SX_DOWNCONVERT_FORMAT = {
|
||
"entries": [
|
||
{"name": "SX_RT_EXPORT_NO_CONVERSION", "value": 0},
|
||
{"name": "SX_RT_EXPORT_32_R", "value": 1},
|
||
{"name": "SX_RT_EXPORT_32_A", "value": 2},
|
||
{"name": "SX_RT_EXPORT_10_11_11", "value": 3},
|
||
{"name": "SX_RT_EXPORT_2_10_10_10", "value": 4},
|
||
{"name": "SX_RT_EXPORT_8_8_8_8", "value": 5},
|
||
{"name": "SX_RT_EXPORT_5_6_5", "value": 6},
|
||
{"name": "SX_RT_EXPORT_1_5_5_5", "value": 7},
|
||
{"name": "SX_RT_EXPORT_4_4_4_4", "value": 8},
|
||
{"name": "SX_RT_EXPORT_16_16_GR", "value": 9},
|
||
{"name": "SX_RT_EXPORT_16_16_AR", "value": 10},
|
||
{"name": "SX_RT_EXPORT_9_9_9_E5", "value": 11}
|
||
]
|
||
}
|
||
|
||
ThreadTraceRegInclude = {
|
||
"entries": [
|
||
{"name": "REG_INCLUDE_SQDEC", "value": 1},
|
||
{"name": "REG_INCLUDE_SHDEC", "value": 2},
|
||
{"name": "REG_INCLUDE_GFXUDEC", "value": 4},
|
||
{"name": "REG_INCLUDE_COMP", "value": 8},
|
||
{"name": "REG_INCLUDE_CONTEXT", "value": 16},
|
||
{"name": "REG_INCLUDE_CONFIG", "value": 32},
|
||
{"name": "REG_INCLUDE_OTHER", "value": 64},
|
||
{"name": "REG_INCLUDE_READS", "value": 128}
|
||
]
|
||
}
|
||
|
||
ThreadTraceTokenExclude = {
|
||
"entries": [
|
||
{"name": "TOKEN_EXCLUDE_VMEMEXEC", "value": 1},
|
||
{"name": "TOKEN_EXCLUDE_ALUEXEC", "value": 2},
|
||
{"name": "TOKEN_EXCLUDE_VALUINST", "value": 4},
|
||
{"name": "TOKEN_EXCLUDE_WAVERDY", "value": 8},
|
||
{"name": "TOKEN_EXCLUDE_IMMED1", "value": 16},
|
||
{"name": "TOKEN_EXCLUDE_IMMEDIATE", "value": 32},
|
||
{"name": "TOKEN_EXCLUDE_REG", "value": 64},
|
||
{"name": "TOKEN_EXCLUDE_EVENT", "value": 128},
|
||
{"name": "TOKEN_EXCLUDE_INST", "value": 256},
|
||
{"name": "TOKEN_EXCLUDE_UTILCTR", "value": 512},
|
||
{"name": "TOKEN_EXCLUDE_WAVEALLOC", "value": 1024},
|
||
{"name": "TOKEN_EXCLUDE_PERF", "value": 2048}
|
||
]
|
||
}
|
||
|
||
GB_TILE_MODE0__MICRO_TILE_MODE = {
|
||
"entries": [
|
||
{"name": "ADDR_SURF_DISPLAY_MICRO_TILING", "value": 0},
|
||
{"name": "ADDR_SURF_THIN_MICRO_TILING", "value": 1},
|
||
{"name": "ADDR_SURF_DEPTH_MICRO_TILING", "value": 2},
|
||
{"name": "ADDR_SURF_THICK_MICRO_TILING_GFX6", "value": 3}
|
||
]
|
||
}
|
||
|
||
IMG_DATA_FORMAT_STENCIL = {
|
||
"entries": [
|
||
{"name": "IMG_DATA_FORMAT_S8_16", "value": 59},
|
||
{"name": "IMG_DATA_FORMAT_S8_32", "value": 60},
|
||
]
|
||
}
|
||
|
||
VRSCombinerModeSC = {
|
||
"entries": [
|
||
{"name": "SC_VRS_COMB_MODE_PASSTHRU", "value": 0},
|
||
{"name": "SC_VRS_COMB_MODE_OVERRIDE", "value": 1},
|
||
{"name": "SC_VRS_COMB_MODE_MIN", "value": 2},
|
||
{"name": "SC_VRS_COMB_MODE_MAX", "value": 3},
|
||
{"name": "SC_VRS_COMB_MODE_SATURATE", "value": 4},
|
||
]
|
||
}
|
||
|
||
VRSHtileEncoding = {
|
||
"entries": [
|
||
{"name": "VRS_HTILE_DISABLE", "value": 0},
|
||
{"name": "VRS_HTILE_2BIT_ENCODING", "value": 1},
|
||
{"name": "VRS_HTILE_4BIT_ENCODING", "value": 2},
|
||
]
|
||
}
|
||
|
||
BinningModeGfx11 = {
|
||
"entries": [
|
||
{"name": "BINNING_ALLOWED", "value": 0},
|
||
{"name": "FORCE_BINNING_ON", "value": 1},
|
||
{"name": "BINNING_ONE_PRIM_PER_BATCH", "value": 2},
|
||
{"name": "BINNING_DISABLED", "value": 3}
|
||
]
|
||
}
|
||
|
||
BinningModeGfx115Plus = {
|
||
"entries": [
|
||
{"name": "BINNING_ALLOWED", "value": 0},
|
||
{"name": "FORCE_BINNING_ON", "value": 1},
|
||
{"name": "BINNING_DISABLED", "value": 3}
|
||
]
|
||
}
|
||
|
||
missing_enums_all = {
|
||
'FLOAT_MODE': {
|
||
"entries": [
|
||
{"name": "FP_32_ROUND_TOWARDS_ZERO", "value": 3},
|
||
{"name": "FP_16_64_ROUND_TOWARDS_ZERO", "value": 12},
|
||
{"name": "FP_32_DENORMS", "value": 48},
|
||
{"name": "FP_16_64_DENORMS", "value": 192},
|
||
]
|
||
},
|
||
'QUANT_MODE': {
|
||
"entries": [
|
||
{"name": "X_16_8_FIXED_POINT_1_16TH", "value": 0},
|
||
{"name": "X_16_8_FIXED_POINT_1_8TH", "value": 1},
|
||
{"name": "X_16_8_FIXED_POINT_1_4TH", "value": 2},
|
||
{"name": "X_16_8_FIXED_POINT_1_2", "value": 3},
|
||
{"name": "X_16_8_FIXED_POINT_1", "value": 4},
|
||
{"name": "X_16_8_FIXED_POINT_1_256TH", "value": 5},
|
||
{"name": "X_14_10_FIXED_POINT_1_1024TH", "value": 6},
|
||
{"name": "X_12_12_FIXED_POINT_1_4096TH", "value": 7}
|
||
]
|
||
},
|
||
"CLIP_RULE": {
|
||
"entries": [
|
||
{"name": "OUT", "value": 1},
|
||
{"name": "IN_0", "value": 2},
|
||
{"name": "IN_1", "value": 4},
|
||
{"name": "IN_10", "value": 8},
|
||
{"name": "IN_2", "value": 16},
|
||
{"name": "IN_20", "value": 32},
|
||
{"name": "IN_21", "value": 64},
|
||
{"name": "IN_210", "value": 128},
|
||
{"name": "IN_3", "value": 256},
|
||
{"name": "IN_30", "value": 512},
|
||
{"name": "IN_31", "value": 1024},
|
||
{"name": "IN_310", "value": 2048},
|
||
{"name": "IN_32", "value": 4096},
|
||
{"name": "IN_320", "value": 8192},
|
||
{"name": "IN_321", "value": 16384},
|
||
{"name": "IN_3210", "value": 32768}
|
||
]
|
||
},
|
||
'PA_SU_VTX_CNTL__ROUND_MODE': {
|
||
"entries": [
|
||
{"name": "X_TRUNCATE", "value": 0},
|
||
{"name": "X_ROUND", "value": 1},
|
||
{"name": "X_ROUND_TO_EVEN", "value": 2},
|
||
{"name": "X_ROUND_TO_ODD", "value": 3}
|
||
]
|
||
},
|
||
"PA_SU_SC_MODE_CNTL__POLYMODE_FRONT_PTYPE": {
|
||
"entries": [
|
||
{"name": "X_DRAW_POINTS", "value": 0},
|
||
{"name": "X_DRAW_LINES", "value": 1},
|
||
{"name": "X_DRAW_TRIANGLES", "value": 2}
|
||
]
|
||
},
|
||
"PA_SU_SC_MODE_CNTL__POLY_MODE": {
|
||
"entries": [
|
||
{"name": "X_DISABLE_POLY_MODE", "value": 0},
|
||
{"name": "X_DUAL_MODE", "value": 1}
|
||
]
|
||
},
|
||
'VGT_HS_OFFCHIP_PARAM__OFFCHIP_GRANULARITY': {
|
||
"entries": [
|
||
{"name": "X_8K_DWORDS", "value": 0},
|
||
{"name": "X_4K_DWORDS", "value": 1},
|
||
{"name": "X_2K_DWORDS", "value": 2},
|
||
{"name": "X_1K_DWORDS", "value": 3}
|
||
]
|
||
},
|
||
"ROP3": {
|
||
"entries": [
|
||
{"name": "ROP3_CLEAR", "value": 0},
|
||
{"name": "X_0X05", "value": 5},
|
||
{"name": "X_0X0A", "value": 10},
|
||
{"name": "X_0X0F", "value": 15},
|
||
{"name": "ROP3_NOR", "value": 17},
|
||
{"name": "ROP3_AND_INVERTED", "value": 34},
|
||
{"name": "ROP3_COPY_INVERTED", "value": 51},
|
||
{"name": "ROP3_AND_REVERSE", "value": 68},
|
||
{"name": "X_0X50", "value": 80},
|
||
{"name": "ROP3_INVERT", "value": 85},
|
||
{"name": "X_0X5A", "value": 90},
|
||
{"name": "X_0X5F", "value": 95},
|
||
{"name": "ROP3_XOR", "value": 102},
|
||
{"name": "ROP3_NAND", "value": 119},
|
||
{"name": "ROP3_AND", "value": 136},
|
||
{"name": "ROP3_EQUIVALENT", "value": 153},
|
||
{"name": "X_0XA0", "value": 160},
|
||
{"name": "X_0XA5", "value": 165},
|
||
{"name": "ROP3_NO_OP", "value": 170},
|
||
{"name": "X_0XAF", "value": 175},
|
||
{"name": "ROP3_OR_INVERTED", "value": 187},
|
||
{"name": "ROP3_COPY", "value": 204},
|
||
{"name": "ROP3_OR_REVERSE", "value": 221},
|
||
{"name": "ROP3_OR", "value": 238},
|
||
{"name": "X_0XF0", "value": 240},
|
||
{"name": "X_0XF5", "value": 245},
|
||
{"name": "X_0XFA", "value": 250},
|
||
{"name": "ROP3_SET", "value": 255}
|
||
]
|
||
},
|
||
"EXCP_EN": {
|
||
"entries": [
|
||
{"name": "INVALID", "value": 1},
|
||
{"name": "INPUT_DENORMAL", "value": 2},
|
||
{"name": "DIVIDE_BY_ZERO", "value": 4},
|
||
{"name": "OVERFLOW", "value": 8},
|
||
{"name": "UNDERFLOW", "value": 16},
|
||
{"name": "INEXACT", "value": 32},
|
||
{"name": "INT_DIVIDE_BY_ZERO", "value": 64},
|
||
{"name": "ADDRESS_WATCH", "value": 128},
|
||
{"name": "MEMORY_VIOLATION", "value": 256}
|
||
]
|
||
}
|
||
}
|
||
|
||
missing_enums_gfx8plus = {
|
||
**missing_enums_all,
|
||
'CB_COLOR_DCC_CONTROL__MAX_UNCOMPRESSED_BLOCK_SIZE': {
|
||
"entries": [
|
||
{"name": "MAX_BLOCK_SIZE_64B", "value": 0},
|
||
{"name": "MAX_BLOCK_SIZE_128B", "value": 1},
|
||
{"name": "MAX_BLOCK_SIZE_256B", "value": 2}
|
||
]
|
||
},
|
||
'CB_COLOR_DCC_CONTROL__MIN_COMPRESSED_BLOCK_SIZE': {
|
||
"entries": [
|
||
{"name": "MIN_BLOCK_SIZE_32B", "value": 0},
|
||
{"name": "MIN_BLOCK_SIZE_64B", "value": 1}
|
||
]
|
||
},
|
||
}
|
||
|
||
missing_enums_gfx81plus = {
|
||
**missing_enums_gfx8plus,
|
||
"SX_BLEND_OPT_EPSILON__MRT0_EPSILON": {
|
||
"entries": [
|
||
{"name": "EXACT", "value": 0},
|
||
# This determines whether epsilon is 0.5 or 0.75 in the unnormalized format
|
||
# that is used to determine whether a channel is equal to 0 for blending.
|
||
# 0.5 is exactly between 0 and the next representable value. 0.75 can be
|
||
# used for less precise blending.
|
||
{"name": "10BIT_FORMAT_0_5", "value": 2}, # (1.0 * 2^−11) * 1024 = 0.5
|
||
{"name": "10BIT_FORMAT_0_75", "value": 3}, # (1.5 * 2^−11) * 1024 = 0.75
|
||
{"name": "8BIT_FORMAT_0_5", "value": 6}, # (1.0 * 2^−9) * 256 = 0.5
|
||
{"name": "8BIT_FORMAT_0_75", "value": 7}, # (1.5 * 2^−9) * 256 = 0.75
|
||
{"name": "6BIT_FORMAT_0_5", "value": 10}, # (1.0 * 2^-7) * 64 = 0.5
|
||
{"name": "6BIT_FORMAT_0_75", "value": 11}, # (1.5 * 2^-7) * 64 = 0.75
|
||
{"name": "5BIT_FORMAT_0_5", "value": 12}, # (1.0 * 2^-6) * 32 = 0.5
|
||
{"name": "5BIT_FORMAT_0_75", "value": 13}, # (1.5 * 2^-6) * 32 = 0.75
|
||
{"name": "4BIT_FORMAT_0_5", "value": 14}, # (1.0 * 2^-5) * 16 = 0.5
|
||
{"name": "4BIT_FORMAT_0_75", "value": 15}, # (1.5 * 2^-5) * 16 = 0.75
|
||
]
|
||
},
|
||
}
|
||
|
||
missing_enums_gfx9 = {
|
||
**missing_enums_gfx81plus,
|
||
"DB_DFSM_CONTROL__PUNCHOUT_MODE": DB_DFSM_CONTROL__PUNCHOUT_MODE,
|
||
"IMG_DATA_FORMAT_STENCIL": IMG_DATA_FORMAT_STENCIL,
|
||
"SQ_IMG_RSRC_WORD4__BC_SWIZZLE": SQ_IMG_RSRC_WORD4__BC_SWIZZLE,
|
||
"BinSizeExtend": {
|
||
"entries": [
|
||
{"name": "BIN_SIZE_32_PIXELS", "value": 0},
|
||
{"name": "BIN_SIZE_64_PIXELS", "value": 1},
|
||
{"name": "BIN_SIZE_128_PIXELS", "value": 2},
|
||
{"name": "BIN_SIZE_256_PIXELS", "value": 3},
|
||
{"name": "BIN_SIZE_512_PIXELS", "value": 4}
|
||
]
|
||
},
|
||
"ScUncertaintyRegionMode": {
|
||
"entries": [
|
||
{"name": "SC_HALF_LSB", "value": 0},
|
||
{"name": "SC_LSB_ONE_SIDED", "value": 1},
|
||
{"name": "SC_LSB_TWO_SIDED", "value": 2}
|
||
]
|
||
},
|
||
}
|
||
|
||
missing_enums_gfx103plus = {
|
||
**missing_enums_gfx81plus,
|
||
"ColorFormat": ColorFormat,
|
||
"ThreadTraceRegInclude": ThreadTraceRegInclude,
|
||
"ThreadTraceTokenExclude": ThreadTraceTokenExclude,
|
||
}
|
||
|
||
missing_enums_gfx11plus = {
|
||
**missing_enums_gfx103plus,
|
||
"ZFormat": {
|
||
"entries": [
|
||
{"name": "Z_INVALID", "value": 0},
|
||
{"name": "Z_16", "value": 1},
|
||
{"name": "Z_24", "value": 2},
|
||
{"name": "Z_32_FLOAT", "value": 3}
|
||
]
|
||
},
|
||
"StencilFormat": {
|
||
"entries": [
|
||
{"name": "STENCIL_INVALID", "value": 0},
|
||
{"name": "STENCIL_8", "value": 1}
|
||
]
|
||
},
|
||
"SurfaceNumber": {
|
||
"entries": [
|
||
{"name": "NUMBER_UNORM", "value": 0},
|
||
{"name": "NUMBER_SNORM", "value": 1},
|
||
{"name": "NUMBER_USCALED", "value": 2},
|
||
{"name": "NUMBER_SSCALED", "value": 3},
|
||
{"name": "NUMBER_UINT", "value": 4},
|
||
{"name": "NUMBER_SINT", "value": 5},
|
||
{"name": "NUMBER_SRGB", "value": 6},
|
||
{"name": "NUMBER_FLOAT", "value": 7}
|
||
]
|
||
},
|
||
"SurfaceSwap": {
|
||
"entries": [
|
||
{"name": "SWAP_STD", "value": 0},
|
||
{"name": "SWAP_ALT", "value": 1},
|
||
{"name": "SWAP_STD_REV", "value": 2},
|
||
{"name": "SWAP_ALT_REV", "value": 3}
|
||
]
|
||
},
|
||
}
|
||
|
||
missing_enums_gfx115plus = {
|
||
**missing_enums_gfx11plus,
|
||
"BinningMode": BinningModeGfx115Plus,
|
||
}
|
||
|
||
enums_missing = {
|
||
'gfx6': {
|
||
**missing_enums_all,
|
||
"GB_TILE_MODE0__MICRO_TILE_MODE": GB_TILE_MODE0__MICRO_TILE_MODE,
|
||
},
|
||
'gfx7': {
|
||
**missing_enums_all,
|
||
},
|
||
'gfx8': {
|
||
**missing_enums_gfx8plus,
|
||
},
|
||
'gfx81': {
|
||
**missing_enums_gfx81plus,
|
||
},
|
||
'gfx9': {
|
||
**missing_enums_gfx9,
|
||
},
|
||
'gfx940': {
|
||
**missing_enums_gfx9,
|
||
},
|
||
'gfx10': {
|
||
**missing_enums_gfx81plus,
|
||
"DB_DFSM_CONTROL__PUNCHOUT_MODE": DB_DFSM_CONTROL__PUNCHOUT_MODE,
|
||
"ThreadTraceRegInclude": ThreadTraceRegInclude,
|
||
"ThreadTraceTokenExclude": ThreadTraceTokenExclude,
|
||
},
|
||
'gfx103': {
|
||
**missing_enums_gfx103plus,
|
||
"SX_DOWNCONVERT_FORMAT": SX_DOWNCONVERT_FORMAT,
|
||
"DB_DFSM_CONTROL__PUNCHOUT_MODE": DB_DFSM_CONTROL__PUNCHOUT_MODE,
|
||
"VRSHtileEncoding": VRSHtileEncoding,
|
||
"VRSCombinerModeSC": VRSCombinerModeSC,
|
||
},
|
||
'gfx11': {
|
||
**missing_enums_gfx11plus,
|
||
"BinningMode": BinningModeGfx11,
|
||
},
|
||
'gfx115': {
|
||
**missing_enums_gfx115plus,
|
||
},
|
||
'gfx12': {
|
||
**missing_enums_gfx115plus,
|
||
},
|
||
}
|
||
|
||
# Register field definitions that are missing in kernel headers
|
||
fields_missing = {
|
||
# Format:
|
||
# Register: [[Field, StartBit, EndBit, EnumType(optional), ReplaceField=True/False(optional)], ...]
|
||
'gfx6': {
|
||
"COMPUTE_RESOURCE_LIMITS": [["WAVES_PER_SH_GFX6", 0, 5]],
|
||
"GB_TILE_MODE0": [["MICRO_TILE_MODE", 0, 1, "GB_TILE_MODE0__MICRO_TILE_MODE"]],
|
||
"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],
|
||
"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],
|
||
},
|
||
'gfx7': {
|
||
"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],
|
||
"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],
|
||
},
|
||
'gfx8': {
|
||
"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],
|
||
"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],
|
||
},
|
||
'gfx81': {
|
||
"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],
|
||
"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],
|
||
},
|
||
'gfx9': {
|
||
"SQ_IMG_RSRC_WORD1": [
|
||
["DATA_FORMAT_STENCIL", 20, 25, "IMG_DATA_FORMAT_STENCIL"],
|
||
["NUM_FORMAT_FMASK", 26, 29, "IMG_NUM_FORMAT_FMASK"]
|
||
],
|
||
},
|
||
'gfx10': {
|
||
"DB_RESERVED_REG_2": [["RESOURCE_LEVEL", 28, 31, None, True]],
|
||
},
|
||
'gfx103': {
|
||
"DB_RESERVED_REG_2": [["RESOURCE_LEVEL", 28, 31, None, True]],
|
||
"VGT_DRAW_PAYLOAD_CNTL": [["EN_VRS_RATE", 6, 6]],
|
||
"VGT_SHADER_STAGES_EN": [["PRIMGEN_PASSTHRU_NO_MSG", 26, 26]],
|
||
},
|
||
'gfx11': {
|
||
"VGT_DRAW_PAYLOAD_CNTL": [["EN_VRS_RATE", 6, 6]],
|
||
# Only GFX1103_R2:
|
||
"CB_COLOR0_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
"CB_COLOR1_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
"CB_COLOR2_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
"CB_COLOR3_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
"CB_COLOR4_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
"CB_COLOR5_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
"CB_COLOR6_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
"CB_COLOR7_FDCC_CONTROL": [["DISABLE_OVERRIDE_INCONSISTENT_KEYS", 25, 25],
|
||
["ENABLE_MAX_COMP_FRAG_OVERRIDE", 26, 26],
|
||
["MAX_COMP_FRAGS", 27, 29]],
|
||
},
|
||
}
|
||
|
||
######### END HARDCODED CONFIGURATION
|
||
|
||
def bitcount(n):
|
||
return bin(n).count('1')
|
||
|
||
def generate_json(gfx_level, amd_headers_path):
|
||
gc_base_offsets = gfx_levels[gfx_level][0]
|
||
|
||
# Add the path to the filenames
|
||
filenames = [amd_headers_path + '/' + a for a in gfx_levels[gfx_level][1:]]
|
||
|
||
# Open the files
|
||
files = [open(a, 'r').readlines() if a is not None else None for a in filenames]
|
||
|
||
# Parse the offset.h file
|
||
name = None
|
||
offset = None
|
||
added_offsets = set()
|
||
regs = {}
|
||
for line in files[0]:
|
||
r = re_offset.match(line)
|
||
if r is None:
|
||
continue
|
||
|
||
if '_BASE_IDX' not in r.group('name'):
|
||
name = r.group('name')
|
||
offset = int(r.group('value'), 0) * 4
|
||
if len(gc_base_offsets) > 0 and r.group('mm') == 'mm':
|
||
continue
|
||
else:
|
||
if name != r.group('name')[:-9]:
|
||
print('Warning: "{0}" not preceded by {1} but by {2}'.format(r.group('name'), r.group('name')[:-9], name))
|
||
continue
|
||
idx = int(r.group('value'))
|
||
assert idx < len(gc_base_offsets)
|
||
offset += gc_base_offsets[idx] * 4
|
||
|
||
# Remove the _UMD suffix because it was mistakenly added to indicate it's for a User-Mode Driver
|
||
if name[-4:] == '_UMD':
|
||
name = name[:-4]
|
||
|
||
# Only accept writeable registers and debug registers
|
||
if register_filter(gfx_level, name, offset, offset in added_offsets):
|
||
regs[name] = {
|
||
'chips': [gfx_level],
|
||
'map': {'at': offset, 'to': 'mm'},
|
||
'name': name,
|
||
}
|
||
added_offsets.add(offset)
|
||
|
||
|
||
# Parse the sh_mask.h file
|
||
shifts = {}
|
||
masks = {}
|
||
for line in files[1]:
|
||
r = re_shift.match(line)
|
||
is_shift = r is not None
|
||
r = re_mask.match(line) if r is None else r
|
||
if r is None:
|
||
continue
|
||
|
||
name = r.group('name')
|
||
if name not in regs.keys():
|
||
continue
|
||
|
||
field = r.group('field')
|
||
value = int(r.group('value'), 0)
|
||
assert not is_shift or value < 32
|
||
|
||
d = shifts if is_shift else masks
|
||
if name not in d:
|
||
d[name] = {}
|
||
d[name][field] = value
|
||
|
||
|
||
# Parse the enum.h file
|
||
re_enum_begin = re.compile(r'^typedef enum (?P<name>\w+) {\n')
|
||
re_enum_entry = re.compile(r'\s*(?P<name>\w+)\s*=\s*(?P<value>\w+),?\n')
|
||
re_enum_end = re.compile(r'^} \w+;\n')
|
||
inside_enum = False
|
||
name = None
|
||
enums = enums_missing[gfx_level] if gfx_level in enums_missing else {}
|
||
|
||
for line in files[2]:
|
||
r = re_enum_begin.match(line)
|
||
if r is not None:
|
||
name = r.group('name')
|
||
if name in enums:
|
||
continue
|
||
enums[name] = {'entries': []}
|
||
inside_enum = True
|
||
continue
|
||
|
||
r = re_enum_end.match(line)
|
||
if r is not None:
|
||
inside_enum = False
|
||
name = None
|
||
continue
|
||
|
||
if inside_enum:
|
||
r = re_enum_entry.match(line)
|
||
assert r
|
||
enums[name]['entries'].append({
|
||
'name': r.group('name'),
|
||
'value': int(r.group('value'), 0),
|
||
})
|
||
|
||
|
||
# Assemble everything
|
||
reg_types = {}
|
||
reg_mappings = []
|
||
missing_fields = fields_missing[gfx_level] if gfx_level in fields_missing else {}
|
||
|
||
for (name, reg) in regs.items():
|
||
type = {'fields': []}
|
||
|
||
if name in shifts and name in masks:
|
||
for (field, shift) in shifts[name].items():
|
||
if field not in masks[name]:
|
||
continue
|
||
|
||
new = {
|
||
'bits': [shift, shift + bitcount(masks[name][field]) - 1],
|
||
'name': field,
|
||
}
|
||
if field in enum_map:
|
||
type_map = enum_map[field]
|
||
type_name = None
|
||
|
||
if len(type_map) == 1:
|
||
type_name = type_map[0];
|
||
else:
|
||
reg_index = type_map.index(name) if name in type_map else -1
|
||
if reg_index >= 1 and reg_index % 2 == 1:
|
||
type_name = type_map[reg_index - 1]
|
||
|
||
if type_name is not None:
|
||
if type_name not in enums:
|
||
print('{0}: {1} type not found for {2}.{3}'
|
||
.format(gfx_level, type_name, name, field), file=sys.stderr)
|
||
else:
|
||
new['enum_ref'] = type_name
|
||
|
||
type['fields'].append(new)
|
||
|
||
if name in missing_fields:
|
||
fields = missing_fields[name]
|
||
for f in fields:
|
||
field = {
|
||
'bits': [f[1], f[2]],
|
||
'name': f[0],
|
||
}
|
||
if len(f) >= 4 and f[3] is not None and f[3] in enums:
|
||
field['enum_ref'] = f[3]
|
||
# missing_fields should replace overlapping fields if requested
|
||
if len(f) >= 5 and f[4]:
|
||
for f2 in type['fields']:
|
||
if f2['bits'] == field['bits']:
|
||
type['fields'].remove(f2)
|
||
|
||
type['fields'].append(field)
|
||
|
||
if len(type['fields']) > 0:
|
||
reg_types[name] = type
|
||
|
||
# Don't define types that have only one field covering all bits
|
||
field0_bits = type['fields'][0]['bits'];
|
||
if len(type['fields']) > 1 or field0_bits[0] != 0 or field0_bits[1] != 31:
|
||
reg['type_ref'] = name
|
||
|
||
reg_mappings.append(reg)
|
||
|
||
|
||
# Generate and canonicalize json
|
||
all = {
|
||
'enums': enums,
|
||
'register_mappings': reg_mappings,
|
||
'register_types': reg_types,
|
||
}
|
||
|
||
return json_canonicalize(io.StringIO(json.dumps(all, indent=1)))
|
||
|
||
|
||
if __name__ == '__main__':
|
||
if len(sys.argv) <= 1 or (sys.argv[1] not in gfx_levels and sys.argv[1] != 'all'):
|
||
print('First parameter should be one of: all, ' + ', '.join(gfx_levels.keys()), file=sys.stderr)
|
||
sys.exit(1)
|
||
|
||
if len(sys.argv) <= 2:
|
||
print('Second parameter should be the path to the amd/include directory.', file=sys.stderr)
|
||
sys.exit(1)
|
||
|
||
if sys.argv[1] == 'all':
|
||
for gfx_level in gfx_levels.keys():
|
||
print(generate_json(gfx_level, sys.argv[2]), file=open(gfx_level + '.json', 'w'))
|
||
sys.exit(0)
|
||
|
||
print(generate_json(sys.argv[1], sys.argv[2]))
|