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