root/usr/src/test/os-tests/tests/imc/imc_test_skx_loop.c
/*
 * This file and its contents are supplied under the terms of the
 * Common Development and Distribution License ("CDDL"), version 1.0.
 * You may only use this file in accordance with the terms of version
 * 1.0 of the CDDL.
 *
 * A full copy of the text of the CDDL should have accompanied this
 * source.  A copy of the CDDL is also available via the Internet at
 * http://www.illumos.org/license/CDDL.
 */

/*
 * Copyright 2019 Joyent, Inc.
 */

#include "imc_test.h"

/*
 * Verify that we properly detect loops on Skylake based multi-socket systems.
 * This represents an erroneous condition.
 */

/*
 * This is a multi-socket bare bones Skylake structure (we don't bother with
 * anything past the SAD as we should never need it. This checks to make sure
 * that we detect such a loop.
 */
static const imc_t imc_skx_loop_2s = {
        .imc_gen = IMC_GEN_SKYLAKE,
        .imc_nsockets = 2,
        .imc_sockets[0] = {
                .isock_nodeid = 0,
                .isock_valid = IMC_SOCKET_V_VALID,
                .isock_sad = {
                        .isad_flags = 0,
                        .isad_valid = IMC_SAD_V_VALID,
                        .isad_tolm = 0x80000000,
                        .isad_tohm = 0,
                        .isad_nrules = 24,
                        .isad_rules[0] = {
                                .isr_enable = B_TRUE,
                                .isr_limit = 0x80000000,
                                .isr_imode = IMC_SAD_IMODE_8t6,
                                .isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
                                .isr_targets = { 1, 1, 1, 1, 1, 1, 1, 1 }
                        },
                        .isad_mcroute = {
                                .ismc_nroutes = 6,
                                .ismc_mcroutes[0] = { 0, 0 },
                        }
                }
        },
        .imc_sockets[1] = {
                .isock_nodeid = 1,
                .isock_valid = IMC_SOCKET_V_VALID,
                .isock_sad = {
                        .isad_flags = 0,
                        .isad_valid = IMC_SAD_V_VALID,
                        .isad_tolm = 0x80000000,
                        .isad_tohm = 0,
                        .isad_nrules = 24,
                        .isad_rules[0] = {
                                .isr_enable = B_TRUE,
                                .isr_limit = 0x80000000,
                                .isr_imode = IMC_SAD_IMODE_8t6,
                                .isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
                                .isr_targets = { 0, 0, 0, 0, 0, 0, 0, 0 }
                        },
                        .isad_mcroute = {
                                .ismc_nroutes = 6,
                                .ismc_mcroutes[0] = { 0, 0 },
                        }
                }
        }
};

/*
 * This has a target that causes us to loop back to ourselves.
 */
static const imc_t imc_skx_loop_self = {
        .imc_gen = IMC_GEN_SKYLAKE,
        .imc_nsockets = 1,
        .imc_sockets[0] = {
                .isock_nodeid = 0,
                .isock_valid = IMC_SOCKET_V_VALID,
                .isock_sad = {
                        .isad_flags = 0,
                        .isad_valid = IMC_SAD_V_VALID,
                        .isad_tolm = 0x80000000,
                        .isad_tohm = 0,
                        .isad_nrules = 24,
                        .isad_rules[0] = {
                                .isr_enable = B_TRUE,
                                .isr_limit = 0x80000000,
                                .isr_imode = IMC_SAD_IMODE_8t6,
                                .isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
                                .isr_targets = { 0, 0, 0, 0, 0, 0, 0, 0 }
                        },
                        .isad_mcroute = {
                                .ismc_nroutes = 6,
                                .ismc_mcroutes[0] = { 0, 0 },
                        }
                }
        }
};

/*
 * This referes to a non-existant socket in the search loop.
 */
static const imc_t imc_skx_loop_badsock = {
        .imc_gen = IMC_GEN_SKYLAKE,
        .imc_nsockets = 1,
        .imc_sockets[0] = {
                .isock_nodeid = 0,
                .isock_valid = IMC_SOCKET_V_VALID,
                .isock_sad = {
                        .isad_flags = 0,
                        .isad_valid = IMC_SAD_V_VALID,
                        .isad_tolm = 0x80000000,
                        .isad_tohm = 0,
                        .isad_nrules = 24,
                        .isad_rules[0] = {
                                .isr_enable = B_TRUE,
                                .isr_limit = 0x80000000,
                                .isr_imode = IMC_SAD_IMODE_8t6,
                                .isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
                                .isr_targets = { 5, 5, 5, 5, 5, 5, 5, 5 }
                        },
                        .isad_mcroute = {
                                .ismc_nroutes = 6,
                                .ismc_mcroutes[0] = { 0, 0 },
                        }
                }
        }
};

const imc_test_case_t imc_test_skx_loop[] = { {
        .itc_desc = "Skylake loop detection, 2s (1)",
        .itc_imc = &imc_skx_loop_2s,
        .itc_pa = 0x0,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
}, {
        .itc_desc = "Skylake loop detection, 2s (2)",
        .itc_imc = &imc_skx_loop_2s,
        .itc_pa = 0x7fffffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
}, {
        .itc_desc = "Skylake loop detection, self (1)",
        .itc_imc = &imc_skx_loop_self,
        .itc_pa = 0x0,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
}, {
        .itc_desc = "Skylake loop detection, self (2)",
        .itc_imc = &imc_skx_loop_self,
        .itc_pa = 0x7fffffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_SAD_SEARCH_LOOP
}, {
        .itc_desc = "Skylake loop detection, bad sock (1)",
        .itc_imc = &imc_skx_loop_badsock,
        .itc_pa = 0x0,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_BAD_REMOTE_MC_ROUTE
}, {
        .itc_desc = "Skylake loop detection, bad sock (2)",
        .itc_imc = &imc_skx_loop_badsock,
        .itc_pa = 0x7fffffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_BAD_REMOTE_MC_ROUTE
}, {
        .itc_desc = NULL
} };