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