1*eb00b1c8SRobert Mustacchi /*
2*eb00b1c8SRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*eb00b1c8SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*eb00b1c8SRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*eb00b1c8SRobert Mustacchi  * 1.0 of the CDDL.
6*eb00b1c8SRobert Mustacchi  *
7*eb00b1c8SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*eb00b1c8SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*eb00b1c8SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*eb00b1c8SRobert Mustacchi  */
11*eb00b1c8SRobert Mustacchi 
12*eb00b1c8SRobert Mustacchi /*
13*eb00b1c8SRobert Mustacchi  * Copyright 2019 Joyent, Inc.
14*eb00b1c8SRobert Mustacchi  */
15*eb00b1c8SRobert Mustacchi 
16*eb00b1c8SRobert Mustacchi #include "imc_test.h"
17*eb00b1c8SRobert Mustacchi 
18*eb00b1c8SRobert Mustacchi /*
19*eb00b1c8SRobert Mustacchi  * This file does a bunch of tests to make sure that we correctly handle cases
20*eb00b1c8SRobert Mustacchi  * where we're asked to decode the following types of addresses:
21*eb00b1c8SRobert Mustacchi  *
22*eb00b1c8SRobert Mustacchi  *   - Legacy Reserved Addresses
23*eb00b1c8SRobert Mustacchi  *   - Between TOLM, TOHM
24*eb00b1c8SRobert Mustacchi  *   - Above TOHM
25*eb00b1c8SRobert Mustacchi  */
26*eb00b1c8SRobert Mustacchi 
27*eb00b1c8SRobert Mustacchi /*
28*eb00b1c8SRobert Mustacchi  * This IMC represents a basic case where we have a single 8 GiB dual rank DIMM.
29*eb00b1c8SRobert Mustacchi  * We have system memory in the lower 2 GiB and then the remaining 6 GiB starts
30*eb00b1c8SRobert Mustacchi  * at the bottom of high memory (4 GiB).
31*eb00b1c8SRobert Mustacchi  */
32*eb00b1c8SRobert Mustacchi static const imc_t imc_badaddr = {
33*eb00b1c8SRobert Mustacchi 	.imc_gen = IMC_GEN_SANDY,
34*eb00b1c8SRobert Mustacchi 	.imc_nsockets = 1,
35*eb00b1c8SRobert Mustacchi 	.imc_sockets[0] = {
36*eb00b1c8SRobert Mustacchi 		.isock_valid = IMC_SOCKET_V_VALID,
37*eb00b1c8SRobert Mustacchi 		.isock_sad = {
38*eb00b1c8SRobert Mustacchi 			.isad_flags = 0,
39*eb00b1c8SRobert Mustacchi 			.isad_valid = IMC_SAD_V_VALID,
40*eb00b1c8SRobert Mustacchi 			.isad_tolm = 0x80000000,	/* 2 GiB */
41*eb00b1c8SRobert Mustacchi 			.isad_tohm = 0x280000000ULL,	/* 10 GiB */
42*eb00b1c8SRobert Mustacchi 			.isad_nrules = 10,
43*eb00b1c8SRobert Mustacchi 			.isad_rules[0] = {
44*eb00b1c8SRobert Mustacchi 				.isr_enable = B_TRUE,
45*eb00b1c8SRobert Mustacchi 				.isr_limit = 0x80000000,
46*eb00b1c8SRobert Mustacchi 				.isr_imode = IMC_SAD_IMODE_8t6,
47*eb00b1c8SRobert Mustacchi 				.isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
48*eb00b1c8SRobert Mustacchi 				.isr_targets = { 0, 0, 0, 0, 0, 0, 0, 0 }
49*eb00b1c8SRobert Mustacchi 			},
50*eb00b1c8SRobert Mustacchi 			.isad_rules[1] = {
51*eb00b1c8SRobert Mustacchi 				.isr_enable = B_TRUE,
52*eb00b1c8SRobert Mustacchi 				.isr_limit = 0x280000000ULL,
53*eb00b1c8SRobert Mustacchi 				.isr_imode = IMC_SAD_IMODE_8t6,
54*eb00b1c8SRobert Mustacchi 				.isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
55*eb00b1c8SRobert Mustacchi 				.isr_targets = { 0, 0, 0, 0, 0, 0, 0, 0 }
56*eb00b1c8SRobert Mustacchi 			}
57*eb00b1c8SRobert Mustacchi 		},
58*eb00b1c8SRobert Mustacchi 		.isock_ntad = 1,
59*eb00b1c8SRobert Mustacchi 		.isock_tad[0] = {
60*eb00b1c8SRobert Mustacchi 			.itad_flags = 0,
61*eb00b1c8SRobert Mustacchi 			.itad_nrules = 12,
62*eb00b1c8SRobert Mustacchi 			.itad_rules[0] = {
63*eb00b1c8SRobert Mustacchi 				.itr_base = 0x0,
64*eb00b1c8SRobert Mustacchi 				.itr_limit = 0x80000000,
65*eb00b1c8SRobert Mustacchi 				.itr_sock_way = 1,
66*eb00b1c8SRobert Mustacchi 				.itr_chan_way = 1,
67*eb00b1c8SRobert Mustacchi 				.itr_sock_gran = IMC_TAD_GRAN_64B,
68*eb00b1c8SRobert Mustacchi 				.itr_chan_gran = IMC_TAD_GRAN_64B,
69*eb00b1c8SRobert Mustacchi 				.itr_ntargets = 4,
70*eb00b1c8SRobert Mustacchi 				.itr_targets = { 0, 0, 0, 0 }
71*eb00b1c8SRobert Mustacchi 			},
72*eb00b1c8SRobert Mustacchi 			.itad_rules[1] = {
73*eb00b1c8SRobert Mustacchi 				.itr_base = 0x80000000,
74*eb00b1c8SRobert Mustacchi 				.itr_limit = 0x280000000ULL,
75*eb00b1c8SRobert Mustacchi 				.itr_sock_way = 1,
76*eb00b1c8SRobert Mustacchi 				.itr_chan_way = 1,
77*eb00b1c8SRobert Mustacchi 				.itr_sock_gran = IMC_TAD_GRAN_64B,
78*eb00b1c8SRobert Mustacchi 				.itr_chan_gran = IMC_TAD_GRAN_64B,
79*eb00b1c8SRobert Mustacchi 				.itr_ntargets = 4,
80*eb00b1c8SRobert Mustacchi 				.itr_targets = { 0, 0, 0, 0 }
81*eb00b1c8SRobert Mustacchi 			}
82*eb00b1c8SRobert Mustacchi 		},
83*eb00b1c8SRobert Mustacchi 		.isock_nimc = 1,
84*eb00b1c8SRobert Mustacchi 		.isock_imcs[0] = {
85*eb00b1c8SRobert Mustacchi 			.icn_nchannels = 1,
86*eb00b1c8SRobert Mustacchi 			.icn_dimm_type = IMC_DIMM_DDR3,
87*eb00b1c8SRobert Mustacchi 			.icn_ecc = B_TRUE,
88*eb00b1c8SRobert Mustacchi 			.icn_lockstep = B_FALSE,
89*eb00b1c8SRobert Mustacchi 			.icn_closed = B_FALSE,
90*eb00b1c8SRobert Mustacchi 			.icn_channels[0] = {
91*eb00b1c8SRobert Mustacchi 				.ich_ndimms = 1,
92*eb00b1c8SRobert Mustacchi 				.ich_dimms[0] = {
93*eb00b1c8SRobert Mustacchi 					.idimm_present = B_TRUE,
94*eb00b1c8SRobert Mustacchi 					.idimm_nbanks = 3,
95*eb00b1c8SRobert Mustacchi 					.idimm_width = 8,
96*eb00b1c8SRobert Mustacchi 					.idimm_density = 2,
97*eb00b1c8SRobert Mustacchi 					.idimm_nranks = 2,
98*eb00b1c8SRobert Mustacchi 					.idimm_nrows = 14,
99*eb00b1c8SRobert Mustacchi 					.idimm_ncolumns = 10,
100*eb00b1c8SRobert Mustacchi 					.idimm_size = 0x80000000
101*eb00b1c8SRobert Mustacchi 				},
102*eb00b1c8SRobert Mustacchi 				.ich_ntad_offsets = 12,
103*eb00b1c8SRobert Mustacchi 				.ich_tad_offsets = { 0, 0x80000000, 0, 0, 0, 0,
104*eb00b1c8SRobert Mustacchi 				    0, 0, 0, 0, 0 },
105*eb00b1c8SRobert Mustacchi 				.ich_nrankileaves = 8,
106*eb00b1c8SRobert Mustacchi 				.ich_rankileaves[0] = {
107*eb00b1c8SRobert Mustacchi 					.irle_enabled = B_TRUE,
108*eb00b1c8SRobert Mustacchi 					.irle_nways = 2,
109*eb00b1c8SRobert Mustacchi 					.irle_nwaysbits = 1,
110*eb00b1c8SRobert Mustacchi 					.irle_limit = 0x200000000ULL,
111*eb00b1c8SRobert Mustacchi 					.irle_nentries = 5,
112*eb00b1c8SRobert Mustacchi 					.irle_entries[0] = { 0x0, 0x0 },
113*eb00b1c8SRobert Mustacchi 					.irle_entries[1] = { 0x1, 0x0 }
114*eb00b1c8SRobert Mustacchi 				}
115*eb00b1c8SRobert Mustacchi 			}
116*eb00b1c8SRobert Mustacchi 		}
117*eb00b1c8SRobert Mustacchi 	}
118*eb00b1c8SRobert Mustacchi };
119*eb00b1c8SRobert Mustacchi 
120*eb00b1c8SRobert Mustacchi const imc_test_case_t imc_test_badaddr[] = { {
121*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, legacy VGA (1)",
122*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
123*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xa0000,
124*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
125*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
126*eb00b1c8SRobert Mustacchi }, {
127*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, legacy VGA (2)",
128*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
129*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xbffff,
130*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
131*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
132*eb00b1c8SRobert Mustacchi }, {
133*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, legacy VGA (3)",
134*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
135*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xafc89,
136*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
137*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
138*eb00b1c8SRobert Mustacchi }, {
139*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, legacy PAM (1)",
140*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
141*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xc0000,
142*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
143*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
144*eb00b1c8SRobert Mustacchi }, {
145*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, legacy PAM (2)",
146*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
147*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xfffff,
148*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
149*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
150*eb00b1c8SRobert Mustacchi }, {
151*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, Reserved (1)",
152*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
153*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xffffff,
154*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
155*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
156*eb00b1c8SRobert Mustacchi },  {
157*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, Reserved (1)",
158*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
159*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xffffff,
160*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
161*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
162*eb00b1c8SRobert Mustacchi }, {
163*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, System (1)",
164*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
165*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x00fe000000,
166*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
167*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
168*eb00b1c8SRobert Mustacchi }, {
169*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, System (2)",
170*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
171*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x00fe123446,
172*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
173*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
174*eb00b1c8SRobert Mustacchi }, {
175*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, System (3)",
176*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
177*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x00ff000000,
178*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
179*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
180*eb00b1c8SRobert Mustacchi }, {
181*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, System (4)",
182*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
183*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x00ffffffff,
184*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
185*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
186*eb00b1c8SRobert Mustacchi }, {
187*eb00b1c8SRobert Mustacchi 	.itc_desc = "Bad Address, System (5)",
188*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
189*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x00ff5abc32,
190*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
191*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_LEGACY_RANGE
192*eb00b1c8SRobert Mustacchi }, {
193*eb00b1c8SRobert Mustacchi 	.itc_desc = "Outside TOLM (1)",
194*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
195*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x80000000,
196*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
197*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
198*eb00b1c8SRobert Mustacchi }, {
199*eb00b1c8SRobert Mustacchi 	.itc_desc = "Outside TOLM (2)",
200*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
201*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xF0000000,
202*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
203*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
204*eb00b1c8SRobert Mustacchi }, {
205*eb00b1c8SRobert Mustacchi 	.itc_desc = "Outside TOLM (3)",
206*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
207*eb00b1c8SRobert Mustacchi 	.itc_pa = 0xfdffffffULL,
208*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
209*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
210*eb00b1c8SRobert Mustacchi }, {
211*eb00b1c8SRobert Mustacchi 	.itc_desc = "Outside TOHM (1)",
212*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
213*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x280000000ULL,
214*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
215*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
216*eb00b1c8SRobert Mustacchi }, {
217*eb00b1c8SRobert Mustacchi 	.itc_desc = "Outside TOHM (2)",
218*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
219*eb00b1c8SRobert Mustacchi 	.itc_pa = UINT64_MAX,
220*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
221*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
222*eb00b1c8SRobert Mustacchi }, {
223*eb00b1c8SRobert Mustacchi 	.itc_desc = "Outside TOHM (1)",
224*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_badaddr,
225*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x1280000000ULL,
226*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
227*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
228*eb00b1c8SRobert Mustacchi }, {
229*eb00b1c8SRobert Mustacchi 	.itc_desc = NULL
230*eb00b1c8SRobert Mustacchi } };
231