root/usr/src/test/os-tests/tests/imc/imc_test_badaddr.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"

/*
 * This file does a bunch of tests to make sure that we correctly handle cases
 * where we're asked to decode the following types of addresses:
 *
 *   - Legacy Reserved Addresses
 *   - Between TOLM, TOHM
 *   - Above TOHM
 */

/*
 * This IMC represents a basic case where we have a single 8 GiB dual rank DIMM.
 * We have system memory in the lower 2 GiB and then the remaining 6 GiB starts
 * at the bottom of high memory (4 GiB).
 */
static const imc_t imc_badaddr = {
        .imc_gen = IMC_GEN_SANDY,
        .imc_nsockets = 1,
        .imc_sockets[0] = {
                .isock_valid = IMC_SOCKET_V_VALID,
                .isock_sad = {
                        .isad_flags = 0,
                        .isad_valid = IMC_SAD_V_VALID,
                        .isad_tolm = 0x80000000,        /* 2 GiB */
                        .isad_tohm = 0x280000000ULL,    /* 10 GiB */
                        .isad_nrules = 10,
                        .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_rules[1] = {
                                .isr_enable = B_TRUE,
                                .isr_limit = 0x280000000ULL,
                                .isr_imode = IMC_SAD_IMODE_8t6,
                                .isr_ntargets = IMC_MAX_SAD_INTERLEAVE,
                                .isr_targets = { 0, 0, 0, 0, 0, 0, 0, 0 }
                        }
                },
                .isock_ntad = 1,
                .isock_tad[0] = {
                        .itad_flags = 0,
                        .itad_nrules = 12,
                        .itad_rules[0] = {
                                .itr_base = 0x0,
                                .itr_limit = 0x80000000,
                                .itr_sock_way = 1,
                                .itr_chan_way = 1,
                                .itr_sock_gran = IMC_TAD_GRAN_64B,
                                .itr_chan_gran = IMC_TAD_GRAN_64B,
                                .itr_ntargets = 4,
                                .itr_targets = { 0, 0, 0, 0 }
                        },
                        .itad_rules[1] = {
                                .itr_base = 0x80000000,
                                .itr_limit = 0x280000000ULL,
                                .itr_sock_way = 1,
                                .itr_chan_way = 1,
                                .itr_sock_gran = IMC_TAD_GRAN_64B,
                                .itr_chan_gran = IMC_TAD_GRAN_64B,
                                .itr_ntargets = 4,
                                .itr_targets = { 0, 0, 0, 0 }
                        }
                },
                .isock_nimc = 1,
                .isock_imcs[0] = {
                        .icn_nchannels = 1,
                        .icn_dimm_type = IMC_DIMM_DDR3,
                        .icn_ecc = B_TRUE,
                        .icn_lockstep = B_FALSE,
                        .icn_closed = B_FALSE,
                        .icn_channels[0] = {
                                .ich_ndimms = 1,
                                .ich_dimms[0] = {
                                        .idimm_present = B_TRUE,
                                        .idimm_nbanks = 3,
                                        .idimm_width = 8,
                                        .idimm_density = 2,
                                        .idimm_nranks = 2,
                                        .idimm_nrows = 14,
                                        .idimm_ncolumns = 10,
                                        .idimm_size = 0x80000000
                                },
                                .ich_ntad_offsets = 12,
                                .ich_tad_offsets = { 0, 0x80000000, 0, 0, 0, 0,
                                    0, 0, 0, 0, 0 },
                                .ich_nrankileaves = 8,
                                .ich_rankileaves[0] = {
                                        .irle_enabled = B_TRUE,
                                        .irle_nways = 2,
                                        .irle_nwaysbits = 1,
                                        .irle_limit = 0x200000000ULL,
                                        .irle_nentries = 5,
                                        .irle_entries[0] = { 0x0, 0x0 },
                                        .irle_entries[1] = { 0x1, 0x0 }
                                }
                        }
                }
        }
};

const imc_test_case_t imc_test_badaddr[] = { {
        .itc_desc = "Bad Address, legacy VGA (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xa0000,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, legacy VGA (2)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xbffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, legacy VGA (3)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xafc89,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, legacy PAM (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xc0000,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, legacy PAM (2)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xfffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, Reserved (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xffffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
},  {
        .itc_desc = "Bad Address, Reserved (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xffffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, System (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x00fe000000,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, System (2)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x00fe123446,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, System (3)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x00ff000000,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, System (4)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x00ffffffff,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Bad Address, System (5)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x00ff5abc32,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_LEGACY_RANGE
}, {
        .itc_desc = "Outside TOLM (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x80000000,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
}, {
        .itc_desc = "Outside TOLM (2)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xF0000000,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
}, {
        .itc_desc = "Outside TOLM (3)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0xfdffffffULL,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
}, {
        .itc_desc = "Outside TOHM (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x280000000ULL,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
}, {
        .itc_desc = "Outside TOHM (2)",
        .itc_imc = &imc_badaddr,
        .itc_pa = UINT64_MAX,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
}, {
        .itc_desc = "Outside TOHM (1)",
        .itc_imc = &imc_badaddr,
        .itc_pa = 0x1280000000ULL,
        .itc_pass = B_FALSE,
        .itc_fail = IMC_DECODE_F_OUTSIDE_DRAM
}, {
        .itc_desc = NULL
} };