171815ce7SRobert Mustacchi /* 271815ce7SRobert Mustacchi * This file and its contents are supplied under the terms of the 371815ce7SRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0. 471815ce7SRobert Mustacchi * You may only use this file in accordance with the terms of version 571815ce7SRobert Mustacchi * 1.0 of the CDDL. 671815ce7SRobert Mustacchi * 771815ce7SRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this 871815ce7SRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at 971815ce7SRobert Mustacchi * http://www.illumos.org/license/CDDL. 1071815ce7SRobert Mustacchi */ 1171815ce7SRobert Mustacchi 1271815ce7SRobert Mustacchi /* 13*0dd92943SRobert Mustacchi * Copyright 2023 Oxide Computer Company 1471815ce7SRobert Mustacchi */ 1571815ce7SRobert Mustacchi 1671815ce7SRobert Mustacchi /* 1771815ce7SRobert Mustacchi * This tries to make sure that if we had invalid state somehow, we'd properly 1871815ce7SRobert Mustacchi * end up detecting an error. Note, for these we try to do include the most bare 1971815ce7SRobert Mustacchi * minimum style zen_umc_t to minimize the size (at least in this one file for a 2071815ce7SRobert Mustacchi * change). Note, testing hole decoding errors has been performed in 2171815ce7SRobert Mustacchi * zen_umc_test_hole.c. 2271815ce7SRobert Mustacchi */ 2371815ce7SRobert Mustacchi 2471815ce7SRobert Mustacchi #include "zen_umc_test.h" 2571815ce7SRobert Mustacchi 2671815ce7SRobert Mustacchi /* 2771815ce7SRobert Mustacchi * This first structure is used to test: 2871815ce7SRobert Mustacchi * o Being outside TOM2 2971815ce7SRobert Mustacchi * o Being in the 1 TiB reserved region 3071815ce7SRobert Mustacchi * o Not being covered by a valid DF rule 3171815ce7SRobert Mustacchi * o Several invalid interleave combinations 3271815ce7SRobert Mustacchi * o Unsupported interleave rule 3371815ce7SRobert Mustacchi * o Bad Remap set counts 3471815ce7SRobert Mustacchi */ 3571815ce7SRobert Mustacchi static const zen_umc_t zen_umc_bad_df = { 3671815ce7SRobert Mustacchi .umc_tom = 4ULL * 1024ULL * 1024ULL * 1024ULL, 3771815ce7SRobert Mustacchi .umc_tom2 = 2ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL, 3871815ce7SRobert Mustacchi .umc_df_rev = DF_REV_3, 3971815ce7SRobert Mustacchi .umc_decomp = { 4071815ce7SRobert Mustacchi .dfd_sock_mask = 0x01, 4171815ce7SRobert Mustacchi .dfd_die_mask = 0x00, 4271815ce7SRobert Mustacchi .dfd_node_mask = 0x20, 4371815ce7SRobert Mustacchi .dfd_comp_mask = 0x1f, 4471815ce7SRobert Mustacchi .dfd_sock_shift = 0, 4571815ce7SRobert Mustacchi .dfd_die_shift = 0, 4671815ce7SRobert Mustacchi .dfd_node_shift = 5, 4771815ce7SRobert Mustacchi .dfd_comp_shift = 0 4871815ce7SRobert Mustacchi }, 4971815ce7SRobert Mustacchi .umc_ndfs = 1, 5071815ce7SRobert Mustacchi .umc_dfs = { { 5171815ce7SRobert Mustacchi .zud_dfno = 0, 5271815ce7SRobert Mustacchi .zud_dram_nrules = 10, 5371815ce7SRobert Mustacchi .zud_rules = { { 5471815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 5571815ce7SRobert Mustacchi .ddr_base = 0, 5671815ce7SRobert Mustacchi .ddr_limit = 1ULL * 1024ULL * 1024ULL, 5771815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 5871815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 1, 5971815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 6071815ce7SRobert Mustacchi .ddr_addr_start = 9, 6171815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_COD4_2CH 6271815ce7SRobert Mustacchi }, { 6371815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 6471815ce7SRobert Mustacchi .ddr_base = 2ULL * 1024ULL * 1024ULL, 6571815ce7SRobert Mustacchi .ddr_limit = 3ULL * 1024ULL * 1024ULL, 6671815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 6771815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 6871815ce7SRobert Mustacchi .ddr_die_ileave_bits = 2, 6971815ce7SRobert Mustacchi .ddr_addr_start = 9, 7071815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_COD1_8CH 7171815ce7SRobert Mustacchi }, { 7271815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 7371815ce7SRobert Mustacchi .ddr_base = 4ULL * 1024ULL * 1024ULL, 7471815ce7SRobert Mustacchi .ddr_limit = 5ULL * 1024ULL * 1024ULL, 7571815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 7671815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 7771815ce7SRobert Mustacchi .ddr_die_ileave_bits = 2, 7871815ce7SRobert Mustacchi .ddr_addr_start = 9, 7971815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_6CH 8071815ce7SRobert Mustacchi }, { 8171815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 8271815ce7SRobert Mustacchi .ddr_base = 6ULL * 1024ULL * 1024ULL, 8371815ce7SRobert Mustacchi .ddr_limit = 7ULL * 1024ULL * 1024ULL, 8471815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 8571815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 2, 8671815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 8771815ce7SRobert Mustacchi .ddr_addr_start = 9, 8871815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_6CH 8971815ce7SRobert Mustacchi }, { 9071815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 9171815ce7SRobert Mustacchi .ddr_base = 8ULL * 1024ULL * 1024ULL, 9271815ce7SRobert Mustacchi .ddr_limit = 9ULL * 1024ULL * 1024ULL, 9371815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 9471815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 2, 9571815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 9671815ce7SRobert Mustacchi .ddr_addr_start = 9, 9771815ce7SRobert Mustacchi .ddr_chan_ileave = INT32_MAX 9871815ce7SRobert Mustacchi }, { 9971815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 10071815ce7SRobert Mustacchi .ddr_base = 10ULL * 1024ULL * 1024ULL, 10171815ce7SRobert Mustacchi .ddr_limit = 11ULL * 1024ULL * 1024ULL, 10271815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 10371815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 1, 10471815ce7SRobert Mustacchi .ddr_die_ileave_bits = 1, 10571815ce7SRobert Mustacchi .ddr_addr_start = 9, 10671815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_NPS2_5CH 10771815ce7SRobert Mustacchi }, { 10871815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 10971815ce7SRobert Mustacchi .ddr_base = 12ULL * 1024ULL * 1024ULL, 11071815ce7SRobert Mustacchi .ddr_limit = 13ULL * 1024ULL * 1024ULL, 11171815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 11271815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 11371815ce7SRobert Mustacchi .ddr_die_ileave_bits = 2, 11471815ce7SRobert Mustacchi .ddr_addr_start = 9, 11571815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_NPS4_2CH 11671815ce7SRobert Mustacchi }, { 11771815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_REMAP_EN | 11871815ce7SRobert Mustacchi DF_DRAM_F_REMAP_SOCK, 11971815ce7SRobert Mustacchi .ddr_base = 14ULL * 1024ULL * 1024ULL, 12071815ce7SRobert Mustacchi .ddr_limit = 15ULL * 1024ULL * 1024ULL, 12171815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 12271815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 12371815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 12471815ce7SRobert Mustacchi .ddr_addr_start = 9, 12571815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_4CH 12671815ce7SRobert Mustacchi }, { 12771815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_REMAP_EN, 12871815ce7SRobert Mustacchi .ddr_base = 16ULL * 1024ULL * 1024ULL, 12971815ce7SRobert Mustacchi .ddr_limit = 17ULL * 1024ULL * 1024ULL, 13071815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 13171815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 13271815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 13371815ce7SRobert Mustacchi .ddr_addr_start = 9, 13471815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_4CH 13571815ce7SRobert Mustacchi }, { 13671815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_REMAP_EN, 13771815ce7SRobert Mustacchi .ddr_base = 18ULL * 1024ULL * 1024ULL, 13871815ce7SRobert Mustacchi .ddr_limit = 19ULL * 1024ULL * 1024ULL, 13971815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 14071815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 14171815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 14271815ce7SRobert Mustacchi .ddr_addr_start = 9, 14371815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_4CH, 14471815ce7SRobert Mustacchi .ddr_remap_ent = 3 14571815ce7SRobert Mustacchi } }, 14671815ce7SRobert Mustacchi } } 14771815ce7SRobert Mustacchi }; 14871815ce7SRobert Mustacchi 14971815ce7SRobert Mustacchi /* 15071815ce7SRobert Mustacchi * This UMC contains a weird relationship between its rule, TOM and the actual 15171815ce7SRobert Mustacchi * DRAM hole base. This creates an inconsistency that should underflow. This is 15271815ce7SRobert Mustacchi * honestly a bit odd to actually try to find in the wild. The fact that TOM is 15371815ce7SRobert Mustacchi * much greater than the hole base is key. This requires DFv4 for subtracting 15471815ce7SRobert Mustacchi * the base. 15571815ce7SRobert Mustacchi */ 15671815ce7SRobert Mustacchi static const zen_umc_t zen_umc_hole_underflow = { 15771815ce7SRobert Mustacchi .umc_tom = 3ULL * 1024ULL * 1024ULL * 1024ULL, 15871815ce7SRobert Mustacchi .umc_tom2 = 2ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL, 15971815ce7SRobert Mustacchi .umc_df_rev = DF_REV_4, 16071815ce7SRobert Mustacchi .umc_decomp = { 16171815ce7SRobert Mustacchi .dfd_sock_mask = 0x01, 16271815ce7SRobert Mustacchi .dfd_die_mask = 0x00, 16371815ce7SRobert Mustacchi .dfd_node_mask = 0x20, 16471815ce7SRobert Mustacchi .dfd_comp_mask = 0x1f, 16571815ce7SRobert Mustacchi .dfd_sock_shift = 0, 16671815ce7SRobert Mustacchi .dfd_die_shift = 0, 16771815ce7SRobert Mustacchi .dfd_node_shift = 5, 16871815ce7SRobert Mustacchi .dfd_comp_shift = 0 16971815ce7SRobert Mustacchi }, 17071815ce7SRobert Mustacchi .umc_ndfs = 1, 17171815ce7SRobert Mustacchi .umc_dfs = { { 17271815ce7SRobert Mustacchi .zud_flags = ZEN_UMC_DF_F_HOLE_VALID, 17371815ce7SRobert Mustacchi .zud_dfno = 0, 17471815ce7SRobert Mustacchi .zud_dram_nrules = 2, 17571815ce7SRobert Mustacchi .zud_hole_base = 0x0, 17671815ce7SRobert Mustacchi .zud_rules = { { 17771815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_HOLE, 17871815ce7SRobert Mustacchi .ddr_base = 1ULL * 1024ULL * 1024ULL, 17971815ce7SRobert Mustacchi .ddr_limit = 8ULL * 1024ULL * 1024ULL * 1024ULL, 18071815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 18171815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 18271815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 18371815ce7SRobert Mustacchi .ddr_addr_start = 9, 18471815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_NPS4_2CH 18571815ce7SRobert Mustacchi } } 18671815ce7SRobert Mustacchi } }, 18771815ce7SRobert Mustacchi }; 18871815ce7SRobert Mustacchi 18971815ce7SRobert Mustacchi /* 19071815ce7SRobert Mustacchi * This is a variant of the previous one, but it takes place when normalization 19171815ce7SRobert Mustacchi * occurs. The biggest gotcha there is that for DFv3 the base isn't subtracted 19271815ce7SRobert Mustacchi * initially for interleaving, only when normalizing. 19371815ce7SRobert Mustacchi */ 19471815ce7SRobert Mustacchi static const zen_umc_t zen_umc_norm_underflow = { 19571815ce7SRobert Mustacchi .umc_tom = 3ULL * 1024ULL * 1024ULL * 1024ULL, 19671815ce7SRobert Mustacchi .umc_tom2 = 16ULL * 1024ULL * 1024ULL * 1024ULL, 19771815ce7SRobert Mustacchi .umc_df_rev = DF_REV_3, 19871815ce7SRobert Mustacchi .umc_decomp = { 19971815ce7SRobert Mustacchi .dfd_sock_mask = 0x01, 20071815ce7SRobert Mustacchi .dfd_die_mask = 0x00, 20171815ce7SRobert Mustacchi .dfd_node_mask = 0x20, 20271815ce7SRobert Mustacchi .dfd_comp_mask = 0x1f, 20371815ce7SRobert Mustacchi .dfd_sock_shift = 0, 20471815ce7SRobert Mustacchi .dfd_die_shift = 0, 20571815ce7SRobert Mustacchi .dfd_node_shift = 5, 20671815ce7SRobert Mustacchi .dfd_comp_shift = 0 20771815ce7SRobert Mustacchi }, 20871815ce7SRobert Mustacchi .umc_ndfs = 1, 20971815ce7SRobert Mustacchi .umc_dfs = { { 21071815ce7SRobert Mustacchi .zud_flags = ZEN_UMC_DF_F_HOLE_VALID, 21171815ce7SRobert Mustacchi .zud_dfno = 0, 21271815ce7SRobert Mustacchi .zud_dram_nrules = 2, 21371815ce7SRobert Mustacchi .zud_nchan = 1, 21471815ce7SRobert Mustacchi .zud_hole_base = 0xc0000000, 21571815ce7SRobert Mustacchi .zud_rules = { { 21671815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_HOLE, 21771815ce7SRobert Mustacchi .ddr_base = 4ULL * 1024ULL * 1024ULL * 1024ULL, 21871815ce7SRobert Mustacchi .ddr_limit = 8ULL * 1024ULL * 1024ULL * 1024ULL, 21971815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 22071815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 22171815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 22271815ce7SRobert Mustacchi .ddr_addr_start = 9, 22371815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH 22471815ce7SRobert Mustacchi } }, 22571815ce7SRobert Mustacchi .zud_chan = { { 22671815ce7SRobert Mustacchi .chan_flags = UMC_CHAN_F_ECC_EN, 22771815ce7SRobert Mustacchi .chan_fabid = 0, 22871815ce7SRobert Mustacchi .chan_instid = 0, 22971815ce7SRobert Mustacchi .chan_logid = 0, 23071815ce7SRobert Mustacchi .chan_nrules = 1, 231*0dd92943SRobert Mustacchi .chan_type = UMC_DIMM_T_DDR4, 23271815ce7SRobert Mustacchi .chan_rules = { { 23371815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_HOLE, 23471815ce7SRobert Mustacchi .ddr_base = 4ULL * 1024ULL * 1024ULL * 1024ULL, 23571815ce7SRobert Mustacchi .ddr_limit = 8ULL * 1024ULL * 1024ULL * 1024ULL, 23671815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 23771815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 23871815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 23971815ce7SRobert Mustacchi .ddr_addr_start = 9, 24071815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH 24171815ce7SRobert Mustacchi } }, 24271815ce7SRobert Mustacchi .chan_dimms = { { 24371815ce7SRobert Mustacchi .ud_flags = UMC_DIMM_F_VALID, 24471815ce7SRobert Mustacchi .ud_width = UMC_DIMM_W_X4, 24571815ce7SRobert Mustacchi .ud_kind = UMC_DIMM_K_RDIMM, 24671815ce7SRobert Mustacchi .ud_dimmno = 0, 24771815ce7SRobert Mustacchi .ud_cs = { { 24871815ce7SRobert Mustacchi .ucs_base = { 24971815ce7SRobert Mustacchi .udb_base = 0, 25071815ce7SRobert Mustacchi .udb_valid = B_TRUE 25171815ce7SRobert Mustacchi }, 25271815ce7SRobert Mustacchi .ucs_base_mask = 0x3ffffffff, 25371815ce7SRobert Mustacchi .ucs_nbanks = 0x4, 25471815ce7SRobert Mustacchi .ucs_ncol = 0xa, 25571815ce7SRobert Mustacchi .ucs_nrow_lo = 0x11, 25671815ce7SRobert Mustacchi .ucs_nbank_groups = 0x2, 25771815ce7SRobert Mustacchi .ucs_row_hi_bit = 0x18, 25871815ce7SRobert Mustacchi .ucs_row_low_bit = 0x11, 25971815ce7SRobert Mustacchi .ucs_bank_bits = { 0xf, 0x10, 0xd, 26071815ce7SRobert Mustacchi 0xe }, 26171815ce7SRobert Mustacchi .ucs_col_bits = { 0x3, 0x4, 0x5, 0x6, 26271815ce7SRobert Mustacchi 0x7, 0x8, 0x9, 0xa, 0xb, 0xc } 26371815ce7SRobert Mustacchi } } 26471815ce7SRobert Mustacchi } }, 26571815ce7SRobert Mustacchi } } 26671815ce7SRobert Mustacchi } } 26771815ce7SRobert Mustacchi }; 26871815ce7SRobert Mustacchi 26971815ce7SRobert Mustacchi /* 27071815ce7SRobert Mustacchi * This DF is designed to capture bad remap entry pointers and remap entries 27171815ce7SRobert Mustacchi * with bad components. 27271815ce7SRobert Mustacchi */ 27371815ce7SRobert Mustacchi static const zen_umc_t zen_umc_remap_errs = { 27471815ce7SRobert Mustacchi .umc_tom = 4ULL * 1024ULL * 1024ULL * 1024ULL, 27571815ce7SRobert Mustacchi .umc_tom2 = 64ULL * 1024ULL * 1024ULL * 1024ULL, 27671815ce7SRobert Mustacchi .umc_df_rev = DF_REV_3, 27771815ce7SRobert Mustacchi .umc_decomp = { 27871815ce7SRobert Mustacchi .dfd_sock_mask = 0x01, 27971815ce7SRobert Mustacchi .dfd_die_mask = 0x00, 28071815ce7SRobert Mustacchi .dfd_node_mask = 0x20, 28171815ce7SRobert Mustacchi .dfd_comp_mask = 0x1f, 28271815ce7SRobert Mustacchi .dfd_sock_shift = 0, 28371815ce7SRobert Mustacchi .dfd_die_shift = 0, 28471815ce7SRobert Mustacchi .dfd_node_shift = 5, 28571815ce7SRobert Mustacchi .dfd_comp_shift = 0 28671815ce7SRobert Mustacchi }, 28771815ce7SRobert Mustacchi .umc_ndfs = 1, 28871815ce7SRobert Mustacchi .umc_dfs = { { 28971815ce7SRobert Mustacchi .zud_dfno = 0, 29071815ce7SRobert Mustacchi .zud_dram_nrules = 2, 29171815ce7SRobert Mustacchi .zud_nchan = 4, 29271815ce7SRobert Mustacchi .zud_cs_nremap = 2, 29371815ce7SRobert Mustacchi .zud_hole_base = 0, 29471815ce7SRobert Mustacchi .zud_rules = { { 29571815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_REMAP_EN | 29671815ce7SRobert Mustacchi DF_DRAM_F_REMAP_SOCK, 29771815ce7SRobert Mustacchi .ddr_base = 0, 29871815ce7SRobert Mustacchi .ddr_limit = 32ULL * 1024ULL * 1024ULL * 1024ULL, 29971815ce7SRobert Mustacchi .ddr_dest_fabid = 0x1f, 30071815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 30171815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 30271815ce7SRobert Mustacchi .ddr_addr_start = 12, 30371815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH, 30471815ce7SRobert Mustacchi }, { 30571815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID | DF_DRAM_F_REMAP_EN, 30671815ce7SRobert Mustacchi .ddr_base = 32ULL * 1024ULL * 1024ULL * 1024ULL, 30771815ce7SRobert Mustacchi .ddr_limit = 64ULL * 1024ULL * 1024ULL * 1024ULL, 30871815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 30971815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 31071815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 31171815ce7SRobert Mustacchi .ddr_addr_start = 12, 31271815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH, 31371815ce7SRobert Mustacchi .ddr_remap_ent = 1 31471815ce7SRobert Mustacchi } }, 31571815ce7SRobert Mustacchi .zud_remap = { { 31671815ce7SRobert Mustacchi .csr_nremaps = ZEN_UMC_MAX_REMAP_ENTS, 31771815ce7SRobert Mustacchi .csr_remaps = { 0x0 } 31871815ce7SRobert Mustacchi }, { 31971815ce7SRobert Mustacchi .csr_nremaps = ZEN_UMC_MAX_REMAP_ENTS, 32071815ce7SRobert Mustacchi .csr_remaps = { 0x21 } 32171815ce7SRobert Mustacchi } } 32271815ce7SRobert Mustacchi } } 32371815ce7SRobert Mustacchi }; 32471815ce7SRobert Mustacchi 32571815ce7SRobert Mustacchi /* 32671815ce7SRobert Mustacchi * This umc is used to cover the cases where: 32771815ce7SRobert Mustacchi * o There is no match to the fabric ID 32871815ce7SRobert Mustacchi * o The UMC in question doesn't have rules for our PA 32971815ce7SRobert Mustacchi * o Normalization underflow 33071815ce7SRobert Mustacchi * o Failure to match a chip-select 33171815ce7SRobert Mustacchi */ 33271815ce7SRobert Mustacchi static const zen_umc_t zen_umc_fab_errs = { 33371815ce7SRobert Mustacchi .umc_tom = 4ULL * 1024ULL * 1024ULL * 1024ULL, 33471815ce7SRobert Mustacchi .umc_tom2 = 64ULL * 1024ULL * 1024ULL * 1024ULL, 33571815ce7SRobert Mustacchi .umc_df_rev = DF_REV_3, 33671815ce7SRobert Mustacchi .umc_decomp = { 33771815ce7SRobert Mustacchi .dfd_sock_mask = 0x01, 33871815ce7SRobert Mustacchi .dfd_die_mask = 0x00, 33971815ce7SRobert Mustacchi .dfd_node_mask = 0x20, 34071815ce7SRobert Mustacchi .dfd_comp_mask = 0x1f, 34171815ce7SRobert Mustacchi .dfd_sock_shift = 0, 34271815ce7SRobert Mustacchi .dfd_die_shift = 0, 34371815ce7SRobert Mustacchi .dfd_node_shift = 5, 34471815ce7SRobert Mustacchi .dfd_comp_shift = 0 34571815ce7SRobert Mustacchi }, 34671815ce7SRobert Mustacchi .umc_ndfs = 1, 34771815ce7SRobert Mustacchi .umc_dfs = { { 34871815ce7SRobert Mustacchi .zud_dfno = 0, 34971815ce7SRobert Mustacchi .zud_dram_nrules = 4, 35071815ce7SRobert Mustacchi .zud_nchan = 2, 35171815ce7SRobert Mustacchi .zud_cs_nremap = 0, 35271815ce7SRobert Mustacchi .zud_hole_base = 0, 35371815ce7SRobert Mustacchi .zud_rules = { { 35471815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 35571815ce7SRobert Mustacchi .ddr_base = 0, 35671815ce7SRobert Mustacchi .ddr_limit = 1ULL * 1024ULL * 1024ULL * 1024ULL, 35771815ce7SRobert Mustacchi .ddr_dest_fabid = 0x22, 35871815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 35971815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 36071815ce7SRobert Mustacchi .ddr_addr_start = 9, 36171815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH 36271815ce7SRobert Mustacchi }, { 36371815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 36471815ce7SRobert Mustacchi .ddr_base = 2ULL * 1024ULL * 1024ULL * 1024ULL, 36571815ce7SRobert Mustacchi .ddr_limit = 3ULL * 1024ULL * 1024ULL * 1024ULL, 36671815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 36771815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 36871815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 36971815ce7SRobert Mustacchi .ddr_addr_start = 9, 37071815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH 37171815ce7SRobert Mustacchi }, { 37271815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 37371815ce7SRobert Mustacchi .ddr_base = 4ULL * 1024ULL * 1024ULL * 1024ULL, 37471815ce7SRobert Mustacchi .ddr_limit = 5ULL * 1024ULL * 1024ULL * 1024ULL, 37571815ce7SRobert Mustacchi .ddr_dest_fabid = 0x1, 37671815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 37771815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 37871815ce7SRobert Mustacchi .ddr_addr_start = 9, 37971815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH 38071815ce7SRobert Mustacchi } }, 38171815ce7SRobert Mustacchi .zud_chan = { { 38271815ce7SRobert Mustacchi .chan_flags = UMC_CHAN_F_ECC_EN, 38371815ce7SRobert Mustacchi .chan_fabid = 0, 38471815ce7SRobert Mustacchi .chan_instid = 0, 38571815ce7SRobert Mustacchi .chan_logid = 0, 38671815ce7SRobert Mustacchi .chan_nrules = 1, 387*0dd92943SRobert Mustacchi .chan_type = UMC_DIMM_T_DDR4, 38871815ce7SRobert Mustacchi .chan_rules = { { 38971815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 39071815ce7SRobert Mustacchi .ddr_base = 32ULL * 1024ULL * 1024ULL * 39171815ce7SRobert Mustacchi 1024ULL, 39271815ce7SRobert Mustacchi .ddr_limit = 64ULL * 1024ULL * 1024ULL * 39371815ce7SRobert Mustacchi 1024ULL, 39471815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 39571815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 39671815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 39771815ce7SRobert Mustacchi .ddr_addr_start = 9, 39871815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH 39971815ce7SRobert Mustacchi } } 40071815ce7SRobert Mustacchi }, { 40171815ce7SRobert Mustacchi .chan_flags = UMC_CHAN_F_ECC_EN, 40271815ce7SRobert Mustacchi .chan_fabid = 1, 40371815ce7SRobert Mustacchi .chan_instid = 1, 40471815ce7SRobert Mustacchi .chan_logid = 1, 40571815ce7SRobert Mustacchi .chan_nrules = 1, 406*0dd92943SRobert Mustacchi .chan_type = UMC_DIMM_T_DDR4, 40771815ce7SRobert Mustacchi .chan_rules = { { 40871815ce7SRobert Mustacchi .ddr_flags = DF_DRAM_F_VALID, 40971815ce7SRobert Mustacchi .ddr_base = 0, 41071815ce7SRobert Mustacchi .ddr_limit = 64ULL * 1024ULL * 1024ULL * 41171815ce7SRobert Mustacchi 1024ULL, 41271815ce7SRobert Mustacchi .ddr_dest_fabid = 0, 41371815ce7SRobert Mustacchi .ddr_sock_ileave_bits = 0, 41471815ce7SRobert Mustacchi .ddr_die_ileave_bits = 0, 41571815ce7SRobert Mustacchi .ddr_addr_start = 9, 41671815ce7SRobert Mustacchi .ddr_chan_ileave = DF_CHAN_ILEAVE_1CH 41771815ce7SRobert Mustacchi } }, 41871815ce7SRobert Mustacchi .chan_dimms = { { 41971815ce7SRobert Mustacchi .ud_flags = UMC_DIMM_F_VALID, 42071815ce7SRobert Mustacchi .ud_width = UMC_DIMM_W_X4, 42171815ce7SRobert Mustacchi .ud_kind = UMC_DIMM_K_RDIMM, 42271815ce7SRobert Mustacchi .ud_dimmno = 0, 42371815ce7SRobert Mustacchi .ud_cs = { { 42471815ce7SRobert Mustacchi .ucs_base = { 42571815ce7SRobert Mustacchi .udb_base = 0x400000000, 42671815ce7SRobert Mustacchi .udb_valid = B_TRUE 42771815ce7SRobert Mustacchi }, 42871815ce7SRobert Mustacchi .ucs_base_mask = 0x3ffffffff, 42971815ce7SRobert Mustacchi .ucs_nbanks = 0x4, 43071815ce7SRobert Mustacchi .ucs_ncol = 0xa, 43171815ce7SRobert Mustacchi .ucs_nrow_lo = 0x11, 43271815ce7SRobert Mustacchi .ucs_nbank_groups = 0x2, 43371815ce7SRobert Mustacchi .ucs_row_hi_bit = 0x18, 43471815ce7SRobert Mustacchi .ucs_row_low_bit = 0x11, 43571815ce7SRobert Mustacchi .ucs_bank_bits = { 0xf, 0x10, 0xd, 43671815ce7SRobert Mustacchi 0xe }, 43771815ce7SRobert Mustacchi .ucs_col_bits = { 0x3, 0x4, 0x5, 0x6, 43871815ce7SRobert Mustacchi 0x7, 0x8, 0x9, 0xa, 0xb, 0xc } 43971815ce7SRobert Mustacchi } } 44071815ce7SRobert Mustacchi } }, 44171815ce7SRobert Mustacchi } } 44271815ce7SRobert Mustacchi } } 44371815ce7SRobert Mustacchi }; 44471815ce7SRobert Mustacchi 44571815ce7SRobert Mustacchi const umc_decode_test_t zen_umc_test_errors[] = { { 44671815ce7SRobert Mustacchi .udt_desc = "Memory beyond TOM2 doesn't decode (0)", 44771815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 44871815ce7SRobert Mustacchi .udt_pa = 0x20000000000, 44971815ce7SRobert Mustacchi .udt_pass = B_FALSE, 45071815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_OUTSIDE_DRAM 45171815ce7SRobert Mustacchi }, { 45271815ce7SRobert Mustacchi .udt_desc = "Memory beyond TOM2 doesn't decode (1)", 45371815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 45471815ce7SRobert Mustacchi .udt_pa = 0x2123456789a, 45571815ce7SRobert Mustacchi .udt_pass = B_FALSE, 45671815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_OUTSIDE_DRAM 45771815ce7SRobert Mustacchi }, { 45871815ce7SRobert Mustacchi .udt_desc = "Memory in 1 TiB-12 GiB hole doesn't decode (0)", 45971815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 46071815ce7SRobert Mustacchi .udt_pa = 0xfd00000000, 46171815ce7SRobert Mustacchi .udt_pass = B_FALSE, 46271815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_OUTSIDE_DRAM 46371815ce7SRobert Mustacchi }, { 46471815ce7SRobert Mustacchi .udt_desc = "Memory in 1 TiB-12 GiB hole doesn't decode (1)", 46571815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 46671815ce7SRobert Mustacchi .udt_pa = 0xfd00000001, 46771815ce7SRobert Mustacchi .udt_pass = B_FALSE, 46871815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_OUTSIDE_DRAM 46971815ce7SRobert Mustacchi }, { 47071815ce7SRobert Mustacchi .udt_desc = "Memory in 1 TiB-12 GiB hole doesn't decode (2)", 47171815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 47271815ce7SRobert Mustacchi .udt_pa = 0xffffffffff, 47371815ce7SRobert Mustacchi .udt_pass = B_FALSE, 47471815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_OUTSIDE_DRAM 47571815ce7SRobert Mustacchi }, { 47671815ce7SRobert Mustacchi .udt_desc = "No valid DF rule (0)", 47771815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 47871815ce7SRobert Mustacchi .udt_pa = 0x1ffffffffff, 47971815ce7SRobert Mustacchi .udt_pass = B_FALSE, 48071815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_NO_DF_RULE 48171815ce7SRobert Mustacchi }, { 48271815ce7SRobert Mustacchi .udt_desc = "No valid DF rule (1)", 48371815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 48471815ce7SRobert Mustacchi .udt_pa = 0xfcffffffff, 48571815ce7SRobert Mustacchi .udt_pass = B_FALSE, 48671815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_NO_DF_RULE 48771815ce7SRobert Mustacchi }, { 48871815ce7SRobert Mustacchi .udt_desc = "No valid DF rule (2)", 48971815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 49071815ce7SRobert Mustacchi .udt_pa = 0x123456, 49171815ce7SRobert Mustacchi .udt_pass = B_FALSE, 49271815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_NO_DF_RULE 49371815ce7SRobert Mustacchi }, { 49471815ce7SRobert Mustacchi .udt_desc = "Bad COD hash interleave - socket", 49571815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 49671815ce7SRobert Mustacchi .udt_pa = 0x0, 49771815ce7SRobert Mustacchi .udt_pass = B_FALSE, 49871815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_COD_BAD_ILEAVE 49971815ce7SRobert Mustacchi }, { 50071815ce7SRobert Mustacchi .udt_desc = "Bad COD hash interleave - die", 50171815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 50271815ce7SRobert Mustacchi .udt_pa = 0x200000, 50371815ce7SRobert Mustacchi .udt_pass = B_FALSE, 50471815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_COD_BAD_ILEAVE 50571815ce7SRobert Mustacchi }, { 50671815ce7SRobert Mustacchi .udt_desc = "Bad COD 6ch hash interleave - socket", 50771815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 50871815ce7SRobert Mustacchi .udt_pa = 0x400000, 50971815ce7SRobert Mustacchi .udt_pass = B_FALSE, 51071815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_COD_BAD_ILEAVE 51171815ce7SRobert Mustacchi }, { 51271815ce7SRobert Mustacchi .udt_desc = "Bad COD 6ch hash interleave - die", 51371815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 51471815ce7SRobert Mustacchi .udt_pa = 0x600000, 51571815ce7SRobert Mustacchi .udt_pass = B_FALSE, 51671815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_COD_BAD_ILEAVE 51771815ce7SRobert Mustacchi }, { 51871815ce7SRobert Mustacchi .udt_desc = "Unknown interleave", 51971815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 52071815ce7SRobert Mustacchi .udt_pa = 0x800000, 52171815ce7SRobert Mustacchi .udt_pass = B_FALSE, 52271815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_CHAN_ILEAVE_NOTSUP, 52371815ce7SRobert Mustacchi }, { 52471815ce7SRobert Mustacchi .udt_desc = "Bad NPS hash interleave - die", 52571815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 52671815ce7SRobert Mustacchi .udt_pa = 0xc00000, 52771815ce7SRobert Mustacchi .udt_pass = B_FALSE, 52871815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_NPS_BAD_ILEAVE 52971815ce7SRobert Mustacchi }, { 53071815ce7SRobert Mustacchi .udt_desc = "Bad NPS NP2 hash interleave - die", 53171815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 53271815ce7SRobert Mustacchi .udt_pa = 0xa00000, 53371815ce7SRobert Mustacchi .udt_pass = B_FALSE, 53471815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_NPS_BAD_ILEAVE 53571815ce7SRobert Mustacchi }, { 53671815ce7SRobert Mustacchi .udt_desc = "Bad Remap Set - DFv3", 53771815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 53871815ce7SRobert Mustacchi .udt_pa = 0xe00000, 53971815ce7SRobert Mustacchi .udt_pass = B_FALSE, 54071815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_BAD_REMAP_SET 54171815ce7SRobert Mustacchi }, { 54271815ce7SRobert Mustacchi .udt_desc = "Bad Remap Set - DFv4 (0)", 54371815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 54471815ce7SRobert Mustacchi .udt_pa = 0x1000000, 54571815ce7SRobert Mustacchi .udt_pass = B_FALSE, 54671815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_BAD_REMAP_SET 54771815ce7SRobert Mustacchi }, { 54871815ce7SRobert Mustacchi .udt_desc = "Bad Remap Set - DFv4 (1)", 54971815ce7SRobert Mustacchi .udt_umc = &zen_umc_bad_df, 55071815ce7SRobert Mustacchi .udt_pa = 0x1200000, 55171815ce7SRobert Mustacchi .udt_pass = B_FALSE, 55271815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_BAD_REMAP_SET 55371815ce7SRobert Mustacchi }, { 55471815ce7SRobert Mustacchi .udt_desc = "Interleave address underflow", 55571815ce7SRobert Mustacchi .udt_umc = &zen_umc_hole_underflow, 55671815ce7SRobert Mustacchi .udt_pa = 0x100000000, 55771815ce7SRobert Mustacchi .udt_pass = B_FALSE, 55871815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_ILEAVE_UNDERFLOW 55971815ce7SRobert Mustacchi }, { 56071815ce7SRobert Mustacchi .udt_desc = "Normal address underflow", 56171815ce7SRobert Mustacchi .udt_umc = &zen_umc_norm_underflow, 56271815ce7SRobert Mustacchi .udt_pa = 0x100000000, 56371815ce7SRobert Mustacchi .udt_pass = B_FALSE, 56471815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_CALC_NORM_UNDERFLOW 56571815ce7SRobert Mustacchi }, { 56671815ce7SRobert Mustacchi .udt_desc = "Non-existent remap entry", 56771815ce7SRobert Mustacchi .udt_umc = &zen_umc_remap_errs, 56871815ce7SRobert Mustacchi .udt_pa = 0x0, 56971815ce7SRobert Mustacchi .udt_pass = B_FALSE, 57071815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_BAD_REMAP_ENTRY 57171815ce7SRobert Mustacchi }, { 57271815ce7SRobert Mustacchi .udt_desc = "Remap entry has bogus ID", 57371815ce7SRobert Mustacchi .udt_umc = &zen_umc_remap_errs, 57471815ce7SRobert Mustacchi .udt_pa = 0x8f0000000, 57571815ce7SRobert Mustacchi .udt_pass = B_FALSE, 57671815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_REMAP_HAS_BAD_COMP 57771815ce7SRobert Mustacchi }, { 57871815ce7SRobert Mustacchi .udt_desc = "Target fabric ID doesn't exist", 57971815ce7SRobert Mustacchi .udt_umc = &zen_umc_fab_errs, 58071815ce7SRobert Mustacchi .udt_pa = 0x12345, 58171815ce7SRobert Mustacchi .udt_pass = B_FALSE, 58271815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_CANNOT_MAP_FABID 58371815ce7SRobert Mustacchi }, { 58471815ce7SRobert Mustacchi .udt_desc = "UMC doesn't have DRAM rule", 58571815ce7SRobert Mustacchi .udt_umc = &zen_umc_fab_errs, 58671815ce7SRobert Mustacchi .udt_pa = 0x87654321, 58771815ce7SRobert Mustacchi .udt_pass = B_FALSE, 58871815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_UMC_DOESNT_HAVE_PA 58971815ce7SRobert Mustacchi }, { 59071815ce7SRobert Mustacchi .udt_desc = "No matching chip-select", 59171815ce7SRobert Mustacchi .udt_umc = &zen_umc_fab_errs, 59271815ce7SRobert Mustacchi .udt_pa = 0x101234567, 59371815ce7SRobert Mustacchi .udt_pass = B_FALSE, 59471815ce7SRobert Mustacchi .udt_fail = ZEN_UMC_DECODE_F_NO_CS_BASE_MATCH 59571815ce7SRobert Mustacchi }, { 59671815ce7SRobert Mustacchi .udt_desc = NULL 59771815ce7SRobert Mustacchi } }; 598