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  * Verify that we properly detect loops on Skylake based multi-socket systems.
20*eb00b1c8SRobert Mustacchi  * This represents an erroneous condition.
21*eb00b1c8SRobert Mustacchi  */
22*eb00b1c8SRobert Mustacchi 
23*eb00b1c8SRobert Mustacchi /*
24*eb00b1c8SRobert Mustacchi  * This is a multi-socket bare bones Skylake structure (we don't bother with
25*eb00b1c8SRobert Mustacchi  * anything past the SAD as we should never need it. This checks to make sure
26*eb00b1c8SRobert Mustacchi  * that we detect such a loop.
27*eb00b1c8SRobert Mustacchi  */
28*eb00b1c8SRobert Mustacchi static const imc_t imc_skx_loop_2s = {
29*eb00b1c8SRobert Mustacchi 	.imc_gen = IMC_GEN_SKYLAKE,
30*eb00b1c8SRobert Mustacchi 	.imc_nsockets = 2,
31*eb00b1c8SRobert Mustacchi 	.imc_sockets[0] = {
32*eb00b1c8SRobert Mustacchi 		.isock_nodeid = 0,
33*eb00b1c8SRobert Mustacchi 		.isock_valid = IMC_SOCKET_V_VALID,
34*eb00b1c8SRobert Mustacchi 		.isock_sad = {
35*eb00b1c8SRobert Mustacchi 			.isad_flags = 0,
36*eb00b1c8SRobert Mustacchi 			.isad_valid = IMC_SAD_V_VALID,
37*eb00b1c8SRobert Mustacchi 			.isad_tolm = 0x80000000,
38*eb00b1c8SRobert Mustacchi 			.isad_tohm = 0,
39*eb00b1c8SRobert Mustacchi 			.isad_nrules = 24,
40*eb00b1c8SRobert Mustacchi 			.isad_rules[0] = {
41*eb00b1c8SRobert Mustacchi 				.isr_enable = B_TRUE,
42*eb00b1c8SRobert Mustacchi 				.isr_limit = 0x80000000,
43*eb00b1c8SRobert Mustacchi 				.isr_imode = IMC_SAD_IMODE_8t6,
44*eb00b1c8SRobert Mustacchi 				.isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
45*eb00b1c8SRobert Mustacchi 				.isr_targets = { 1, 1, 1, 1, 1, 1, 1, 1 }
46*eb00b1c8SRobert Mustacchi 			},
47*eb00b1c8SRobert Mustacchi 			.isad_mcroute = {
48*eb00b1c8SRobert Mustacchi 				.ismc_nroutes = 6,
49*eb00b1c8SRobert Mustacchi 				.ismc_mcroutes[0] = { 0, 0 },
50*eb00b1c8SRobert Mustacchi 			}
51*eb00b1c8SRobert Mustacchi 		}
52*eb00b1c8SRobert Mustacchi 	},
53*eb00b1c8SRobert Mustacchi 	.imc_sockets[1] = {
54*eb00b1c8SRobert Mustacchi 		.isock_nodeid = 1,
55*eb00b1c8SRobert Mustacchi 		.isock_valid = IMC_SOCKET_V_VALID,
56*eb00b1c8SRobert Mustacchi 		.isock_sad = {
57*eb00b1c8SRobert Mustacchi 			.isad_flags = 0,
58*eb00b1c8SRobert Mustacchi 			.isad_valid = IMC_SAD_V_VALID,
59*eb00b1c8SRobert Mustacchi 			.isad_tolm = 0x80000000,
60*eb00b1c8SRobert Mustacchi 			.isad_tohm = 0,
61*eb00b1c8SRobert Mustacchi 			.isad_nrules = 24,
62*eb00b1c8SRobert Mustacchi 			.isad_rules[0] = {
63*eb00b1c8SRobert Mustacchi 				.isr_enable = B_TRUE,
64*eb00b1c8SRobert Mustacchi 				.isr_limit = 0x80000000,
65*eb00b1c8SRobert Mustacchi 				.isr_imode = IMC_SAD_IMODE_8t6,
66*eb00b1c8SRobert Mustacchi 				.isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
67*eb00b1c8SRobert Mustacchi 				.isr_targets = { 0, 0, 0, 0, 0, 0, 0, 0 }
68*eb00b1c8SRobert Mustacchi 			},
69*eb00b1c8SRobert Mustacchi 			.isad_mcroute = {
70*eb00b1c8SRobert Mustacchi 				.ismc_nroutes = 6,
71*eb00b1c8SRobert Mustacchi 				.ismc_mcroutes[0] = { 0, 0 },
72*eb00b1c8SRobert Mustacchi 			}
73*eb00b1c8SRobert Mustacchi 		}
74*eb00b1c8SRobert Mustacchi 	}
75*eb00b1c8SRobert Mustacchi };
76*eb00b1c8SRobert Mustacchi 
77*eb00b1c8SRobert Mustacchi /*
78*eb00b1c8SRobert Mustacchi  * This has a target that causes us to loop back to ourselves.
79*eb00b1c8SRobert Mustacchi  */
80*eb00b1c8SRobert Mustacchi static const imc_t imc_skx_loop_self = {
81*eb00b1c8SRobert Mustacchi 	.imc_gen = IMC_GEN_SKYLAKE,
82*eb00b1c8SRobert Mustacchi 	.imc_nsockets = 1,
83*eb00b1c8SRobert Mustacchi 	.imc_sockets[0] = {
84*eb00b1c8SRobert Mustacchi 		.isock_nodeid = 0,
85*eb00b1c8SRobert Mustacchi 		.isock_valid = IMC_SOCKET_V_VALID,
86*eb00b1c8SRobert Mustacchi 		.isock_sad = {
87*eb00b1c8SRobert Mustacchi 			.isad_flags = 0,
88*eb00b1c8SRobert Mustacchi 			.isad_valid = IMC_SAD_V_VALID,
89*eb00b1c8SRobert Mustacchi 			.isad_tolm = 0x80000000,
90*eb00b1c8SRobert Mustacchi 			.isad_tohm = 0,
91*eb00b1c8SRobert Mustacchi 			.isad_nrules = 24,
92*eb00b1c8SRobert Mustacchi 			.isad_rules[0] = {
93*eb00b1c8SRobert Mustacchi 				.isr_enable = B_TRUE,
94*eb00b1c8SRobert Mustacchi 				.isr_limit = 0x80000000,
95*eb00b1c8SRobert Mustacchi 				.isr_imode = IMC_SAD_IMODE_8t6,
96*eb00b1c8SRobert Mustacchi 				.isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
97*eb00b1c8SRobert Mustacchi 				.isr_targets = { 0, 0, 0, 0, 0, 0, 0, 0 }
98*eb00b1c8SRobert Mustacchi 			},
99*eb00b1c8SRobert Mustacchi 			.isad_mcroute = {
100*eb00b1c8SRobert Mustacchi 				.ismc_nroutes = 6,
101*eb00b1c8SRobert Mustacchi 				.ismc_mcroutes[0] = { 0, 0 },
102*eb00b1c8SRobert Mustacchi 			}
103*eb00b1c8SRobert Mustacchi 		}
104*eb00b1c8SRobert Mustacchi 	}
105*eb00b1c8SRobert Mustacchi };
106*eb00b1c8SRobert Mustacchi 
107*eb00b1c8SRobert Mustacchi /*
108*eb00b1c8SRobert Mustacchi  * This referes to a non-existant socket in the search loop.
109*eb00b1c8SRobert Mustacchi  */
110*eb00b1c8SRobert Mustacchi static const imc_t imc_skx_loop_badsock = {
111*eb00b1c8SRobert Mustacchi 	.imc_gen = IMC_GEN_SKYLAKE,
112*eb00b1c8SRobert Mustacchi 	.imc_nsockets = 1,
113*eb00b1c8SRobert Mustacchi 	.imc_sockets[0] = {
114*eb00b1c8SRobert Mustacchi 		.isock_nodeid = 0,
115*eb00b1c8SRobert Mustacchi 		.isock_valid = IMC_SOCKET_V_VALID,
116*eb00b1c8SRobert Mustacchi 		.isock_sad = {
117*eb00b1c8SRobert Mustacchi 			.isad_flags = 0,
118*eb00b1c8SRobert Mustacchi 			.isad_valid = IMC_SAD_V_VALID,
119*eb00b1c8SRobert Mustacchi 			.isad_tolm = 0x80000000,
120*eb00b1c8SRobert Mustacchi 			.isad_tohm = 0,
121*eb00b1c8SRobert Mustacchi 			.isad_nrules = 24,
122*eb00b1c8SRobert Mustacchi 			.isad_rules[0] = {
123*eb00b1c8SRobert Mustacchi 				.isr_enable = B_TRUE,
124*eb00b1c8SRobert Mustacchi 				.isr_limit = 0x80000000,
125*eb00b1c8SRobert Mustacchi 				.isr_imode = IMC_SAD_IMODE_8t6,
126*eb00b1c8SRobert Mustacchi 				.isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
127*eb00b1c8SRobert Mustacchi 				.isr_targets = { 5, 5, 5, 5, 5, 5, 5, 5 }
128*eb00b1c8SRobert Mustacchi 			},
129*eb00b1c8SRobert Mustacchi 			.isad_mcroute = {
130*eb00b1c8SRobert Mustacchi 				.ismc_nroutes = 6,
131*eb00b1c8SRobert Mustacchi 				.ismc_mcroutes[0] = { 0, 0 },
132*eb00b1c8SRobert Mustacchi 			}
133*eb00b1c8SRobert Mustacchi 		}
134*eb00b1c8SRobert Mustacchi 	}
135*eb00b1c8SRobert Mustacchi };
136*eb00b1c8SRobert Mustacchi 
137*eb00b1c8SRobert Mustacchi const imc_test_case_t imc_test_skx_loop[] = { {
138*eb00b1c8SRobert Mustacchi 	.itc_desc = "Skylake loop detection, 2s (1)",
139*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_skx_loop_2s,
140*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x0,
141*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
142*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
143*eb00b1c8SRobert Mustacchi }, {
144*eb00b1c8SRobert Mustacchi 	.itc_desc = "Skylake loop detection, 2s (2)",
145*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_skx_loop_2s,
146*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x7fffffff,
147*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
148*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
149*eb00b1c8SRobert Mustacchi }, {
150*eb00b1c8SRobert Mustacchi 	.itc_desc = "Skylake loop detection, self (1)",
151*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_skx_loop_self,
152*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x0,
153*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
154*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
155*eb00b1c8SRobert Mustacchi }, {
156*eb00b1c8SRobert Mustacchi 	.itc_desc = "Skylake loop detection, self (2)",
157*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_skx_loop_self,
158*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x7fffffff,
159*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
160*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
161*eb00b1c8SRobert Mustacchi }, {
162*eb00b1c8SRobert Mustacchi 	.itc_desc = "Skylake loop detection, bad sock (1)",
163*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_skx_loop_badsock,
164*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x0,
165*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
166*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_BAD_REMOTE_MC_ROUTE
167*eb00b1c8SRobert Mustacchi }, {
168*eb00b1c8SRobert Mustacchi 	.itc_desc = "Skylake loop detection, bad sock (2)",
169*eb00b1c8SRobert Mustacchi 	.itc_imc = &imc_skx_loop_badsock,
170*eb00b1c8SRobert Mustacchi 	.itc_pa = 0x7fffffff,
171*eb00b1c8SRobert Mustacchi 	.itc_pass = B_FALSE,
172*eb00b1c8SRobert Mustacchi 	.itc_fail = IMC_DECODE_F_BAD_REMOTE_MC_ROUTE
173*eb00b1c8SRobert Mustacchi }, {
174*eb00b1c8SRobert Mustacchi 	.itc_desc = NULL
175*eb00b1c8SRobert Mustacchi } };
176