Path: blob/21.2-virgl/src/amd/registers/parse_kernel_headers.py
7080 views
#!/usr/bin/env python312import sys, io, re, json3from canonicalize import json_canonicalize45######### BEGIN HARDCODED CONFIGURATION67gfx_versions = {8'gfx6': [9None,10'asic_reg/gca/gfx_6_0_d.h',11'asic_reg/gca/gfx_6_0_sh_mask.h',12'asic_reg/gca/gfx_7_2_enum.h' # the file for gfx6 doesn't exist13],14'gfx7': [15None,16'asic_reg/gca/gfx_7_2_d.h',17'asic_reg/gca/gfx_7_2_sh_mask.h',18'asic_reg/gca/gfx_7_2_enum.h'19],20'gfx8': [21None,22'asic_reg/gca/gfx_8_0_d.h',23'asic_reg/gca/gfx_8_0_sh_mask.h',24'asic_reg/gca/gfx_8_0_enum.h',25],26'gfx81': [27None,28'asic_reg/gca/gfx_8_1_d.h',29'asic_reg/gca/gfx_8_1_sh_mask.h',30'asic_reg/gca/gfx_8_1_enum.h',31],32'gfx9': [33'vega10_ip_offset.h',34'asic_reg/gc/gc_9_2_1_offset.h',35'asic_reg/gc/gc_9_2_1_sh_mask.h',36'vega10_enum.h',37],38'gfx10': [39'navi14_ip_offset.h',40'asic_reg/gc/gc_10_1_0_offset.h',41'asic_reg/gc/gc_10_1_0_sh_mask.h',42'navi10_enum.h',43],44'gfx103': [45'sienna_cichlid_ip_offset.h',46'asic_reg/gc/gc_10_3_0_offset.h',47'asic_reg/gc/gc_10_3_0_sh_mask.h',48'navi10_enum.h', # the file for gfx10.3 doesn't exist49],50}5152# match: static const struct IP_BASE GC_BASE ={ { { { 0x00001260, 0x0000A000, 0x02402C00, 0, 0 } },53re_base = re.compile(r'^static const struct IP_BASE.*GC_BASE\s*=\s*{ { { { (\w+), (\w+), (\w+), (\w+), (\w+).*} },\n')5455# match: #define mmSDMA0_DEC_START 0x000056# match: #define ixSDMA0_DEC_START 0x000057# match: #define regSDMA0_DEC_START 0x000058re_offset = re.compile(r'^#define (?P<mm>(mm|ix|reg))(?P<name>\w+)\s+(?P<value>\w+)\n')5960# match: #define SDMA0_DEC_START__START__SHIFT 0x061re_shift = re.compile(r'^#define (?P<name>\w+)__(?P<field>\w+)__SHIFT\s+(?P<value>\w+)\n')6263# match: #define SDMA0_DEC_START__START_MASK 0xFFFFFFFFL64# match: #define SDMA0_DEC_START__START_MASK 0xFFFFFFFF65re_mask = re.compile(r'^#define (?P<name>\w+)__(?P<field>\w+)_MASK\s+(?P<value>[0-9a-fA-Fx]+)L?\n')6667def register_filter(gfx_version, name, offset, already_added):68# Only accept writeable registers and debug registers69return ((offset // 0x1000 in [0xB, 0x28, 0x30, 0x31, 0x34, 0x35, 0x36, 0x37] or70# Add SQ_WAVE registers for trap handlers71name.startswith('SQ_WAVE_') or72# Add registers in the 0x8000 range used by all generations73(offset // 0x1000 == 0x8 and74(name.startswith('SQ_IMG_') or75name.startswith('SQ_BUF_') or76name.startswith('SQ_THREAD') or77name.startswith('GRBM_STATUS') or78name.startswith('CP_CP'))) or79# Add all registers in the 0x8000 range for gfx680(gfx_version == 'gfx6' and offset // 0x1000 == 0x8) or81# Add registers in the 0x9000 range82(offset // 0x1000 == 0x9 and83(name in ['TA_CS_BC_BASE_ADDR', 'GB_ADDR_CONFIG', 'SPI_CONFIG_CNTL'] or84(name.startswith('GB') and 'TILE_MODE' in name)))) and85# Remove SQ compiler definitions86offset // 4 not in (0x23B0, 0x23B1, 0x237F) and87# Remove conflicts (multiple definitions for the same offset)88not already_added and89'PREF_PRI_ACCUM' not in name)9091# Mapping from field names to enum types92enum_map = {93# Format:94# field: [type1] - all registers use the same enum95# OR:96# field: [type1, reg1, type2, reg2, ...] - apply different enums to different registers97"ALPHA_COMB_FCN": ["CombFunc", "CB_BLEND0_CONTROL", "SX_OPT_COMB_FCN", "SX_MRT0_BLEND_OPT"],98"ALPHA_DESTBLEND": ["BlendOp"],99"ALPHA_DST_OPT": ["SX_BLEND_OPT"],100"ALPHA_SRCBLEND": ["BlendOp"],101"ALPHA_SRC_OPT": ["SX_BLEND_OPT"],102"ARRAY_MODE": ["ArrayMode"],103"BANK_HEIGHT": ["BankHeight"],104"BANK_WIDTH": ["BankWidth"],105"BC_SWIZZLE": ["SQ_IMG_RSRC_WORD4__BC_SWIZZLE"],106"BIN_MAPPING_MODE": ["BinMapMode"],107"BINNING_MODE": ["BinningMode"],108"BIN_SIZE_X_EXTEND": ["BinSizeExtend"],109"BIN_SIZE_Y_EXTEND": ["BinSizeExtend"],110"BLEND_OPT_DISCARD_PIXEL": ["BlendOpt"],111"BLEND_OPT_DONT_RD_DST": ["BlendOpt"],112"BORDER_COLOR_TYPE": ["SQ_TEX_BORDER_COLOR"],113"BUF_TYPE": ["VGT_DMA_BUF_TYPE"],114"CLAMP_X": ["SQ_TEX_CLAMP"],115"CLAMP_Y": ["SQ_TEX_CLAMP"],116"CLAMP_Z": ["SQ_TEX_CLAMP"],117"CLEAR_FILTER_SEL": ["CBPerfClearFilterSel"],118"CLIP_RULE": ["CLIP_RULE"],119"CMASK_ADDR_TYPE": ["CmaskAddr"],120"CMASK_RD_POLICY": ["ReadPolicy"],121"CMASK_WR_POLICY": ["WritePolicy"],122"COL0_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],123"COL1_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],124"COL2_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],125"COL3_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],126"COL4_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],127"COL5_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],128"COL6_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],129"COL7_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],130"COLOR_COMB_FCN": ["CombFunc", "CB_BLEND0_CONTROL", "SX_OPT_COMB_FCN", "SX_MRT0_BLEND_OPT"],131"COLOR_DESTBLEND": ["BlendOp"],132"COLOR_DST_OPT": ["SX_BLEND_OPT"],133"COLOR_RD_POLICY": ["ReadPolicy"],134"COLOR_SRCBLEND": ["BlendOp"],135"COLOR_SRC_OPT": ["SX_BLEND_OPT"],136"COLOR_WR_POLICY": ["WritePolicy"],137"COMPAREFUNC0": ["CompareFrag"],138"COMPAREFUNC1": ["CompareFrag"],139"COMP_SWAP": ["SurfaceSwap"],140"CONSERVATIVE_Z_EXPORT": ["ConservativeZExport"],141"COVERAGE_TO_SHADER_SELECT": ["CovToShaderSel"],142"CUT_MODE": ["VGT_GS_CUT_MODE"],143"DATA_FORMAT": ["BUF_DATA_FORMAT", "SQ_BUF_RSRC_WORD3", "IMG_DATA_FORMAT", "SQ_IMG_RSRC_WORD1"],144"DCC_RD_POLICY": ["ReadPolicy"],145"DCC_WR_POLICY": ["WritePolicy"],146"DEPTH_COMPARE_FUNC": ["SQ_TEX_DEPTH_COMPARE"],147"DETECT_ONE": ["VGT_DETECT_ONE"],148"DETECT_ZERO": ["VGT_DETECT_ZERO"],149"DISTRIBUTION_MODE": ["VGT_DIST_MODE"],150"DST_SEL_W": ["SQ_SEL_XYZW01"],151"DST_SEL_X": ["SQ_SEL_XYZW01"],152"DST_SEL_Y": ["SQ_SEL_XYZW01"],153"DST_SEL_Z": ["SQ_SEL_XYZW01"],154"ENDIAN": ["SurfaceEndian"],155"ES_EN": ["VGT_STAGES_ES_EN"],156"EVENT_TYPE": ["VGT_EVENT_TYPE"],157"EXCP": ["EXCP_EN"],158"EXCP_EN": ["EXCP_EN"],159"FAULT_BEHAVIOR": ["DbPRTFaultBehavior"],160"FILTER_MODE": ["SQ_IMG_FILTER_TYPE"],161"FLOAT_MODE": ["FLOAT_MODE"],162"FMASK_RD_POLICY": ["ReadPolicy"],163"FMASK_WR_POLICY": ["WritePolicy"],164"FORCE_FULL_Z_RANGE": ["ForceControl"],165"FORCE_HIS_ENABLE0": ["ForceControl"],166"FORCE_HIS_ENABLE1": ["ForceControl"],167"FORCE_HIZ_ENABLE": ["ForceControl"],168"FORCE_Z_LIMIT_SUMM": ["ZLimitSumm"],169"FORMAT": ["ColorFormat", "CB_COLOR0_INFO", "StencilFormat", "DB_STENCIL_INFO", "ZFormat", "DB_Z_INFO"],170"GS_EN": ["VGT_STAGES_GS_EN"],171"HIZ_ZFUNC": ["CompareFrag"],172"HS_EN": ["VGT_STAGES_HS_EN"],173"HTILE_RD_POLICY": ["ReadPolicy"],174"HTILE_WR_POLICY": ["WritePolicy"],175"IDX0_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],176"INDEX_TYPE": ["VGT_INDEX_TYPE_MODE"],177"LS_EN": ["VGT_STAGES_LS_EN"],178"MACRO_TILE_ASPECT": ["MacroTileAspect"],179"MAJOR_MODE": ["VGT_DI_MAJOR_MODE_SELECT"],180"MAX_UNCOMPRESSED_BLOCK_SIZE": ["CB_COLOR_DCC_CONTROL__MAX_UNCOMPRESSED_BLOCK_SIZE"],181"MICRO_TILE_MODE": ["GB_TILE_MODE0__MICRO_TILE_MODE"],182"MICRO_TILE_MODE_NEW": ["MicroTileMode"],183"MIN_COMPRESSED_BLOCK_SIZE": ["CB_COLOR_DCC_CONTROL__MIN_COMPRESSED_BLOCK_SIZE"],184"MIP_FILTER": ["SQ_TEX_MIP_FILTER"],185"MODE": ["CBMode", "CB_COLOR_CONTROL", "VGT_GS_MODE_TYPE", "VGT_GS_MODE"],186"MRT0_EPSILON": ["SX_BLEND_OPT_EPSILON__MRT0_EPSILON"],187"MRT0": ["SX_DOWNCONVERT_FORMAT"],188"MRT1": ["SX_DOWNCONVERT_FORMAT"],189"MRT2": ["SX_DOWNCONVERT_FORMAT"],190"MRT3": ["SX_DOWNCONVERT_FORMAT"],191"MRT4": ["SX_DOWNCONVERT_FORMAT"],192"MRT5": ["SX_DOWNCONVERT_FORMAT"],193"MRT6": ["SX_DOWNCONVERT_FORMAT"],194"MRT7": ["SX_DOWNCONVERT_FORMAT"],195"NUM_BANKS": ["NumBanks"],196"NUM_FORMAT": ["BUF_NUM_FORMAT", "SQ_BUF_RSRC_WORD3", "IMG_NUM_FORMAT", "SQ_IMG_RSRC_WORD1"],197"NUMBER_TYPE": ["SurfaceNumber"],198"OFFCHIP_GRANULARITY": ["VGT_HS_OFFCHIP_PARAM__OFFCHIP_GRANULARITY"],199"OP_FILTER_SEL": ["CBPerfOpFilterSel"],200"OUTPRIM_TYPE_1": ["VGT_GS_OUTPRIM_TYPE"],201"OUTPRIM_TYPE_2": ["VGT_GS_OUTPRIM_TYPE"],202"OUTPRIM_TYPE_3": ["VGT_GS_OUTPRIM_TYPE"],203"OUTPRIM_TYPE": ["VGT_GS_OUTPRIM_TYPE"],204"PARTIAL_SQUAD_LAUNCH_CONTROL": ["DbPSLControl"],205"PARTITIONING": ["VGT_TESS_PARTITION"],206"PERFMON_ENABLE_MODE": ["CP_PERFMON_ENABLE_MODE"],207"PERFMON_STATE": ["CP_PERFMON_STATE"],208"PIPE_CONFIG": ["PipeConfig"],209"PKR_MAP": ["PkrMap"],210"PKR_XSEL2": ["PkrXsel2"],211"PKR_XSEL": ["PkrXsel"],212"PKR_YSEL": ["PkrYsel"],213"PNT_SPRITE_OVRD_W": ["SPI_PNT_SPRITE_OVERRIDE"],214"PNT_SPRITE_OVRD_X": ["SPI_PNT_SPRITE_OVERRIDE"],215"PNT_SPRITE_OVRD_Y": ["SPI_PNT_SPRITE_OVERRIDE"],216"PNT_SPRITE_OVRD_Z": ["SPI_PNT_SPRITE_OVERRIDE"],217"POLYMODE_BACK_PTYPE": ["PA_SU_SC_MODE_CNTL__POLYMODE_FRONT_PTYPE"],218"POLYMODE_FRONT_PTYPE": ["PA_SU_SC_MODE_CNTL__POLYMODE_FRONT_PTYPE"],219"POLY_MODE": ["PA_SU_SC_MODE_CNTL__POLY_MODE"],220"POS0_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],221"POS1_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],222"POS2_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],223"POS3_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],224"POS4_EXPORT_FORMAT": ["SPI_SHADER_FORMAT"],225"PRIM_TYPE": ["VGT_DI_PRIM_TYPE"],226"PUNCHOUT_MODE": ["DB_DFSM_CONTROL__PUNCHOUT_MODE"],227"QUANT_MODE": ["QUANT_MODE"],228"RB_MAP_PKR0": ["RbMap"],229"RB_MAP_PKR1": ["RbMap"],230"RB_XSEL2": ["RbXsel2"],231"RB_XSEL": ["RbXsel"],232"RB_YSEL": ["RbYsel"],233"ROP3": ["ROP3"],234"RDREQ_POLICY": ["VGT_RDREQ_POLICY"],235"REG_INCLUDE": ["ThreadTraceRegInclude"],236"ROUND_MODE": ["PA_SU_VTX_CNTL__ROUND_MODE", "PA_SU_VTX_CNTL"],237"SC_MAP": ["ScMap"],238"SC_XSEL": ["ScXsel"],239"SC_YSEL": ["ScYsel"],240"SE_MAP": ["SeMap"],241"SE_PAIR_MAP": ["SePairMap"],242"SE_PAIR_XSEL": ["SePairXsel"],243"SE_PAIR_YSEL": ["SePairYsel"],244"SE_XSEL": ["SeXsel"],245"SE_YSEL": ["SeYsel"],246"SOURCE_SELECT": ["VGT_DI_SOURCE_SELECT"],247"SPM_PERFMON_STATE": ["SPM_PERFMON_STATE"],248"S_RD_POLICY": ["ReadPolicy"],249"STENCILFAIL_BF": ["StencilOp"],250"STENCILFAIL": ["StencilOp"],251"STENCILFUNC_BF": ["CompareFrag"],252"STENCILFUNC": ["CompareFrag"],253"STENCILZFAIL_BF": ["StencilOp"],254"STENCILZFAIL": ["StencilOp"],255"STENCILZPASS_BF": ["StencilOp"],256"STENCILZPASS": ["StencilOp"],257"SWAP_MODE": ["VGT_DMA_SWAP_MODE"],258"S_WR_POLICY": ["WritePolicy"],259"TILE_SPLIT": ["TileSplit"],260"TOKEN_EXCLUDE": ["ThreadTraceTokenExclude"],261"TOPOLOGY": ["VGT_TESS_TOPOLOGY"],262"TYPE": ["SQ_RSRC_BUF_TYPE", "SQ_BUF_RSRC_WORD3", "SQ_RSRC_IMG_TYPE", "SQ_IMG_RSRC_WORD3", "VGT_TESS_TYPE", "VGT_TF_PARAM"],263"UNCERTAINTY_REGION_MODE": ["ScUncertaintyRegionMode"],264"VRS_HTILE_ENCODING": ["VRSHtileEncoding"],265"VS_EN": ["VGT_STAGES_VS_EN"],266"XY_MAG_FILTER": ["SQ_TEX_XY_FILTER"],267"XY_MIN_FILTER": ["SQ_TEX_XY_FILTER"],268"Z_EXPORT_FORMAT": ["SPI_SHADER_EX_FORMAT"],269"Z_FILTER": ["SQ_TEX_Z_FILTER"],270"ZFUNC": ["CompareFrag"],271"Z_ORDER": ["ZOrder"],272"ZPCPSD_WR_POLICY": ["WritePolicy"],273"Z_RD_POLICY": ["ReadPolicy"],274"Z_WR_POLICY": ["WritePolicy"],275276"VERTEX_RATE_COMBINER_MODE": ["VRSCombinerMode"],277"PRIMITIVE_RATE_COMBINER_MODE": ["VRSCombinerMode"],278"HTILE_RATE_COMBINER_MODE": ["VRSCombinerMode"],279"SAMPLE_ITER_COMBINER_MODE": ["VRSCombinerMode"],280"VRS_OVERRIDE_RATE_COMBINER_MODE": ["VRSCombinerMode"],281}282283# Enum definitions that are incomplete or missing in kernel headers284DB_DFSM_CONTROL__PUNCHOUT_MODE = {285"entries": [286{"name": "AUTO", "value": 0},287{"name": "FORCE_ON", "value": 1},288{"name": "FORCE_OFF", "value": 2},289{"name": "RESERVED", "value": 3}290]291}292293ColorFormat = {294"entries": [295{"name": "COLOR_INVALID", "value": 0},296{"name": "COLOR_8", "value": 1},297{"name": "COLOR_16", "value": 2},298{"name": "COLOR_8_8", "value": 3},299{"name": "COLOR_32", "value": 4},300{"name": "COLOR_16_16", "value": 5},301{"name": "COLOR_10_11_11", "value": 6},302{"name": "COLOR_11_11_10", "value": 7},303{"name": "COLOR_10_10_10_2", "value": 8},304{"name": "COLOR_2_10_10_10", "value": 9},305{"name": "COLOR_8_8_8_8", "value": 10},306{"name": "COLOR_32_32", "value": 11},307{"name": "COLOR_16_16_16_16", "value": 12},308{"name": "COLOR_32_32_32_32", "value": 14},309{"name": "COLOR_5_6_5", "value": 16},310{"name": "COLOR_1_5_5_5", "value": 17},311{"name": "COLOR_5_5_5_1", "value": 18},312{"name": "COLOR_4_4_4_4", "value": 19},313{"name": "COLOR_8_24", "value": 20},314{"name": "COLOR_24_8", "value": 21},315{"name": "COLOR_X24_8_32_FLOAT", "value": 22},316{"name": "COLOR_5_9_9_9", "value": 24}317]318}319320SQ_IMG_RSRC_WORD4__BC_SWIZZLE = {321"entries": [322{"name": "BC_SWIZZLE_XYZW", "value": 0},323{"name": "BC_SWIZZLE_XWYZ", "value": 1},324{"name": "BC_SWIZZLE_WZYX", "value": 2},325{"name": "BC_SWIZZLE_WXYZ", "value": 3},326{"name": "BC_SWIZZLE_ZYXW", "value": 4},327{"name": "BC_SWIZZLE_YXWZ", "value": 5}328]329}330331SX_DOWNCONVERT_FORMAT = {332"entries": [333{"name": "SX_RT_EXPORT_NO_CONVERSION", "value": 0},334{"name": "SX_RT_EXPORT_32_R", "value": 1},335{"name": "SX_RT_EXPORT_32_A", "value": 2},336{"name": "SX_RT_EXPORT_10_11_11", "value": 3},337{"name": "SX_RT_EXPORT_2_10_10_10", "value": 4},338{"name": "SX_RT_EXPORT_8_8_8_8", "value": 5},339{"name": "SX_RT_EXPORT_5_6_5", "value": 6},340{"name": "SX_RT_EXPORT_1_5_5_5", "value": 7},341{"name": "SX_RT_EXPORT_4_4_4_4", "value": 8},342{"name": "SX_RT_EXPORT_16_16_GR", "value": 9},343{"name": "SX_RT_EXPORT_16_16_AR", "value": 10},344{"name": "SX_RT_EXPORT_9_9_9_E5", "value": 11}345]346}347348ThreadTraceRegInclude = {349"entries": [350{"name": "REG_INCLUDE_SQDEC", "value": 1},351{"name": "REG_INCLUDE_SHDEC", "value": 2},352{"name": "REG_INCLUDE_GFXUDEC", "value": 4},353{"name": "REG_INCLUDE_COMP", "value": 8},354{"name": "REG_INCLUDE_CONTEXT", "value": 16},355{"name": "REG_INCLUDE_CONFIG", "value": 32},356{"name": "REG_INCLUDE_OTHER", "value": 64},357{"name": "REG_INCLUDE_READS", "value": 128}358]359}360361ThreadTraceTokenExclude = {362"entries": [363{"name": "TOKEN_EXCLUDE_VMEMEXEC", "value": 1},364{"name": "TOKEN_EXCLUDE_ALUEXEC", "value": 2},365{"name": "TOKEN_EXCLUDE_VALUINST", "value": 4},366{"name": "TOKEN_EXCLUDE_WAVERDY", "value": 8},367{"name": "TOKEN_EXCLUDE_IMMED1", "value": 16},368{"name": "TOKEN_EXCLUDE_IMMEDIATE", "value": 32},369{"name": "TOKEN_EXCLUDE_REG", "value": 64},370{"name": "TOKEN_EXCLUDE_EVENT", "value": 128},371{"name": "TOKEN_EXCLUDE_INST", "value": 256},372{"name": "TOKEN_EXCLUDE_UTILCTR", "value": 512},373{"name": "TOKEN_EXCLUDE_WAVEALLOC", "value": 1024},374{"name": "TOKEN_EXCLUDE_PERF", "value": 2048}375]376}377378GB_TILE_MODE0__MICRO_TILE_MODE = {379"entries": [380{"name": "ADDR_SURF_DISPLAY_MICRO_TILING", "value": 0},381{"name": "ADDR_SURF_THIN_MICRO_TILING", "value": 1},382{"name": "ADDR_SURF_DEPTH_MICRO_TILING", "value": 2},383{"name": "ADDR_SURF_THICK_MICRO_TILING_GFX6", "value": 3}384]385}386387IMG_DATA_FORMAT_STENCIL = {388"entries": [389{"name": "IMG_DATA_FORMAT_S8_16", "value": 59},390{"name": "IMG_DATA_FORMAT_S8_32", "value": 60},391]392}393394VRSCombinerMode = {395"entries": [396{"name": "VRS_COMB_MODE_PASSTHRU", "value": 0},397{"name": "VRS_COMB_MODE_OVERRIDE", "value": 1},398{"name": "VRS_COMB_MODE_MIN", "value": 2},399{"name": "VRS_COMB_MODE_MAX", "value": 3},400{"name": "VRS_COMB_MODE_SATURATE", "value": 4},401]402}403404VRSHtileEncoding = {405"entries": [406{"name": "VRS_HTILE_DISABLE", "value": 0},407{"name": "VRS_HTILE_2BIT_ENCODING", "value": 1},408{"name": "VRS_HTILE_4BIT_ENCODING", "value": 2},409]410}411412missing_enums_all = {413'FLOAT_MODE': {414"entries": [415{"name": "FP_32_DENORMS", "value": 48},416{"name": "FP_64_DENORMS", "value": 192},417{"name": "FP_ALL_DENORMS", "value": 240}418]419},420'QUANT_MODE': {421"entries": [422{"name": "X_16_8_FIXED_POINT_1_16TH", "value": 0},423{"name": "X_16_8_FIXED_POINT_1_8TH", "value": 1},424{"name": "X_16_8_FIXED_POINT_1_4TH", "value": 2},425{"name": "X_16_8_FIXED_POINT_1_2", "value": 3},426{"name": "X_16_8_FIXED_POINT_1", "value": 4},427{"name": "X_16_8_FIXED_POINT_1_256TH", "value": 5},428{"name": "X_14_10_FIXED_POINT_1_1024TH", "value": 6},429{"name": "X_12_12_FIXED_POINT_1_4096TH", "value": 7}430]431},432"CLIP_RULE": {433"entries": [434{"name": "OUT", "value": 1},435{"name": "IN_0", "value": 2},436{"name": "IN_1", "value": 4},437{"name": "IN_10", "value": 8},438{"name": "IN_2", "value": 16},439{"name": "IN_20", "value": 32},440{"name": "IN_21", "value": 64},441{"name": "IN_210", "value": 128},442{"name": "IN_3", "value": 256},443{"name": "IN_30", "value": 512},444{"name": "IN_31", "value": 1024},445{"name": "IN_310", "value": 2048},446{"name": "IN_32", "value": 4096},447{"name": "IN_320", "value": 8192},448{"name": "IN_321", "value": 16384},449{"name": "IN_3210", "value": 32768}450]451},452'PA_SU_VTX_CNTL__ROUND_MODE': {453"entries": [454{"name": "X_TRUNCATE", "value": 0},455{"name": "X_ROUND", "value": 1},456{"name": "X_ROUND_TO_EVEN", "value": 2},457{"name": "X_ROUND_TO_ODD", "value": 3}458]459},460"PA_SU_SC_MODE_CNTL__POLYMODE_FRONT_PTYPE": {461"entries": [462{"name": "X_DRAW_POINTS", "value": 0},463{"name": "X_DRAW_LINES", "value": 1},464{"name": "X_DRAW_TRIANGLES", "value": 2}465]466},467"PA_SU_SC_MODE_CNTL__POLY_MODE": {468"entries": [469{"name": "X_DISABLE_POLY_MODE", "value": 0},470{"name": "X_DUAL_MODE", "value": 1}471]472},473'VGT_HS_OFFCHIP_PARAM__OFFCHIP_GRANULARITY': {474"entries": [475{"name": "X_8K_DWORDS", "value": 0},476{"name": "X_4K_DWORDS", "value": 1},477{"name": "X_2K_DWORDS", "value": 2},478{"name": "X_1K_DWORDS", "value": 3}479]480},481"ROP3": {482"entries": [483{"name": "ROP3_CLEAR", "value": 0},484{"name": "X_0X05", "value": 5},485{"name": "X_0X0A", "value": 10},486{"name": "X_0X0F", "value": 15},487{"name": "ROP3_NOR", "value": 17},488{"name": "ROP3_AND_INVERTED", "value": 34},489{"name": "ROP3_COPY_INVERTED", "value": 51},490{"name": "ROP3_AND_REVERSE", "value": 68},491{"name": "X_0X50", "value": 80},492{"name": "ROP3_INVERT", "value": 85},493{"name": "X_0X5A", "value": 90},494{"name": "X_0X5F", "value": 95},495{"name": "ROP3_XOR", "value": 102},496{"name": "ROP3_NAND", "value": 119},497{"name": "ROP3_AND", "value": 136},498{"name": "ROP3_EQUIVALENT", "value": 153},499{"name": "X_0XA0", "value": 160},500{"name": "X_0XA5", "value": 165},501{"name": "ROP3_NO_OP", "value": 170},502{"name": "X_0XAF", "value": 175},503{"name": "ROP3_OR_INVERTED", "value": 187},504{"name": "ROP3_COPY", "value": 204},505{"name": "ROP3_OR_REVERSE", "value": 221},506{"name": "ROP3_OR", "value": 238},507{"name": "X_0XF0", "value": 240},508{"name": "X_0XF5", "value": 245},509{"name": "X_0XFA", "value": 250},510{"name": "ROP3_SET", "value": 255}511]512},513"EXCP_EN": {514"entries": [515{"name": "INVALID", "value": 1},516{"name": "INPUT_DENORMAL", "value": 2},517{"name": "DIVIDE_BY_ZERO", "value": 4},518{"name": "OVERFLOW", "value": 8},519{"name": "UNDERFLOW", "value": 16},520{"name": "INEXACT", "value": 32},521{"name": "INT_DIVIDE_BY_ZERO", "value": 64},522{"name": "ADDRESS_WATCH", "value": 128},523{"name": "MEMORY_VIOLATION", "value": 256}524]525}526}527528missing_enums_gfx8plus = {529**missing_enums_all,530'CB_COLOR_DCC_CONTROL__MAX_UNCOMPRESSED_BLOCK_SIZE': {531"entries": [532{"name": "MAX_BLOCK_SIZE_64B", "value": 0},533{"name": "MAX_BLOCK_SIZE_128B", "value": 1},534{"name": "MAX_BLOCK_SIZE_256B", "value": 2}535]536},537'CB_COLOR_DCC_CONTROL__MIN_COMPRESSED_BLOCK_SIZE': {538"entries": [539{"name": "MIN_BLOCK_SIZE_32B", "value": 0},540{"name": "MIN_BLOCK_SIZE_64B", "value": 1}541]542},543}544545missing_enums_gfx81plus = {546**missing_enums_gfx8plus,547"SX_BLEND_OPT_EPSILON__MRT0_EPSILON": {548"entries": [549{"name": "EXACT", "value": 0},550{"name": "11BIT_FORMAT", "value": 1},551{"name": "10BIT_FORMAT", "value": 3},552{"name": "8BIT_FORMAT", "value": 6},553{"name": "6BIT_FORMAT", "value": 11},554{"name": "5BIT_FORMAT", "value": 13},555{"name": "4BIT_FORMAT", "value": 15}556]557},558}559560enums_missing = {561'gfx6': {562**missing_enums_all,563"GB_TILE_MODE0__MICRO_TILE_MODE": GB_TILE_MODE0__MICRO_TILE_MODE,564},565'gfx7': {566**missing_enums_all,567},568'gfx8': {569**missing_enums_gfx8plus,570},571'gfx81': {572**missing_enums_gfx81plus,573},574'gfx9': {575**missing_enums_gfx81plus,576"DB_DFSM_CONTROL__PUNCHOUT_MODE": DB_DFSM_CONTROL__PUNCHOUT_MODE,577"IMG_DATA_FORMAT_STENCIL": IMG_DATA_FORMAT_STENCIL,578"SQ_IMG_RSRC_WORD4__BC_SWIZZLE": SQ_IMG_RSRC_WORD4__BC_SWIZZLE,579},580'gfx10': {581**missing_enums_gfx81plus,582"DB_DFSM_CONTROL__PUNCHOUT_MODE": DB_DFSM_CONTROL__PUNCHOUT_MODE,583"ThreadTraceRegInclude": ThreadTraceRegInclude,584"ThreadTraceTokenExclude": ThreadTraceTokenExclude,585},586'gfx103': {587**missing_enums_gfx81plus,588"ColorFormat": ColorFormat,589"SX_DOWNCONVERT_FORMAT": SX_DOWNCONVERT_FORMAT,590"DB_DFSM_CONTROL__PUNCHOUT_MODE": DB_DFSM_CONTROL__PUNCHOUT_MODE,591"ThreadTraceRegInclude": ThreadTraceRegInclude,592"ThreadTraceTokenExclude": ThreadTraceTokenExclude,593"VRSCombinerMode": VRSCombinerMode,594"VRSHtileEncoding": VRSHtileEncoding,595},596}597598# Register field definitions that are missing in kernel headers599fields_missing = {600# Format:601# Register: [[Field, StartBit, EndBit, EnumType(optional), ReplaceField=True/False(optional)], ...]602'gfx6': {603"COMPUTE_RESOURCE_LIMITS": [["WAVES_PER_SH_GFX6", 0, 5]],604"GB_TILE_MODE0": [["MICRO_TILE_MODE", 0, 1, "GB_TILE_MODE0__MICRO_TILE_MODE"]],605"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],606"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],607},608'gfx7': {609"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],610"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],611},612'gfx8': {613"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],614"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],615},616'gfx81': {617"SQ_IMG_SAMP_WORD3": [["UPGRADED_DEPTH", 29, 29]],618"SQ_THREAD_TRACE_MASK": [["RANDOM_SEED", 16, 31]],619},620'gfx9': {621"SQ_IMG_RSRC_WORD1": [622["DATA_FORMAT_STENCIL", 20, 25, "IMG_DATA_FORMAT_STENCIL"],623["NUM_FORMAT_FMASK", 26, 29, "IMG_NUM_FORMAT_FMASK"]624],625},626'gfx10': {627"DB_RESERVED_REG_2": [["RESOURCE_LEVEL", 28, 31, None, True]],628},629'gfx103': {630"DB_RESERVED_REG_2": [["RESOURCE_LEVEL", 28, 31, None, True]],631"VGT_DRAW_PAYLOAD_CNTL": [["EN_VRS_RATE", 6, 6]],632"VGT_SHADER_STAGES_EN": [["PRIMGEN_PASSTHRU_NO_MSG", 26, 26]],633},634}635636######### END HARDCODED CONFIGURATION637638def bitcount(n):639return bin(n).count('1')640641def generate_json(gfx_version, amd_headers_path):642# Add the path to the filenames643filenames = [amd_headers_path + '/' + a if a is not None else None for a in gfx_versions[gfx_version]]644old_gen = filenames[0] is None645646# Open the files647files = [open(a, 'r').readlines() if a is not None else None for a in filenames]648649# Parse the ip_offset.h file650base_offsets = None651if not old_gen:652for line in files[0]:653r = re_base.match(line)654if r is not None:655base_offsets = r.groups()656657if base_offsets is None:658print('Can\'t parse: ' + filenames[0], file=sys.stderr)659sys.exit(1)660661662# Parse the offset.h file663name = None664offset = None665added_offsets = set()666regs = {}667for line in files[1]:668r = re_offset.match(line)669if r is None:670continue671672if '_BASE_IDX' not in r.group('name'):673name = r.group('name')674offset = int(r.group('value'), 0) * 4675if not old_gen and r.group('mm') == 'mm':676continue677else:678assert name == r.group('name')[:-9]679idx = int(r.group('value'))680assert idx < len(base_offsets)681offset += int(base_offsets[idx], 0) * 4682683# Only accept writeable registers and debug registers684if register_filter(gfx_version, name, offset, offset in added_offsets):685regs[name] = {686'chips': [gfx_version],687'map': {'at': offset, 'to': 'mm'},688'name': name,689}690added_offsets.add(offset)691692693# Parse the sh_mask.h file694shifts = {}695masks = {}696for line in files[2]:697r = re_shift.match(line)698is_shift = r is not None699r = re_mask.match(line) if r is None else r700if r is None:701continue702703name = r.group('name')704if name not in regs.keys():705continue706707field = r.group('field')708value = int(r.group('value'), 0)709assert not is_shift or value < 32710711d = shifts if is_shift else masks712if name not in d:713d[name] = {}714d[name][field] = value715716717# Parse the enum.h file718re_enum_begin = re.compile(r'^typedef enum (?P<name>\w+) {\n')719re_enum_entry = re.compile(r'\s*(?P<name>\w+)\s*=\s*(?P<value>\w+),?\n')720re_enum_end = re.compile(r'^} \w+;\n')721inside_enum = False722name = None723enums = enums_missing[gfx_version] if gfx_version in enums_missing else {}724725for line in files[3]:726r = re_enum_begin.match(line)727if r is not None:728name = r.group('name')729if name in enums:730continue731enums[name] = {'entries': []}732inside_enum = True733continue734735r = re_enum_end.match(line)736if r is not None:737inside_enum = False738name = None739continue740741if inside_enum:742r = re_enum_entry.match(line)743assert r744enums[name]['entries'].append({745'name': r.group('name'),746'value': int(r.group('value'), 0),747})748749750# Assemble everything751reg_types = {}752reg_mappings = []753missing_fields = fields_missing[gfx_version] if gfx_version in fields_missing else {}754755for (name, reg) in regs.items():756type = {'fields': []}757758if name in shifts and name in masks:759for (field, shift) in shifts[name].items():760if field not in masks[name]:761continue762763new = {764'bits': [shift, shift + bitcount(masks[name][field]) - 1],765'name': field,766}767if field in enum_map:768type_map = enum_map[field]769type_name = None770771if len(type_map) == 1:772type_name = type_map[0];773else:774reg_index = type_map.index(name) if name in type_map else -1775if reg_index >= 1 and reg_index % 2 == 1:776type_name = type_map[reg_index - 1]777778if type_name is not None:779if type_name not in enums:780print('{0}: {1} type not found for {2}.{3}'781.format(gfx_version, type_name, name, field), file=sys.stderr)782else:783new['enum_ref'] = type_name784785type['fields'].append(new)786787if name in missing_fields:788fields = missing_fields[name]789for f in fields:790field = {791'bits': [f[1], f[2]],792'name': f[0],793}794if len(f) >= 4 and f[3] is not None and f[3] in enums:795field['enum_ref'] = f[3]796# missing_fields should replace overlapping fields if requested797if len(f) >= 5 and f[4]:798for f2 in type['fields']:799if f2['bits'] == field['bits']:800type['fields'].remove(f2)801802type['fields'].append(field)803804if len(type['fields']) > 0:805reg_types[name] = type806807# Don't define types that have only one field covering all bits808field0_bits = type['fields'][0]['bits'];809if len(type['fields']) > 1 or field0_bits[0] != 0 or field0_bits[1] != 31:810reg['type_ref'] = name811812reg_mappings.append(reg)813814815# Generate and canonicalize json816all = {817'enums': enums,818'register_mappings': reg_mappings,819'register_types': reg_types,820}821822return json_canonicalize(io.StringIO(json.dumps(all, indent=1)))823824825if __name__ == '__main__':826if len(sys.argv) <= 1 or (sys.argv[1] not in gfx_versions and sys.argv[1] != 'all'):827print('First parameter should be one of: all, ' + ', '.join(gfx_versions.keys()), file=sys.stderr)828sys.exit(1)829830if len(sys.argv) <= 2:831print('Second parameter should be the path to the amd/include directory.', file=sys.stderr)832sys.exit(1)833834if sys.argv[1] == 'all':835for gfx_version in gfx_versions.keys():836print(generate_json(gfx_version, sys.argv[2]), file=open(gfx_version + '.json', 'w'))837sys.exit(0)838839print(generate_json(sys.argv[1], sys.argv[2]))840841842