/*
 *  Test code for x86 CPUID and Topology functions
 *
 *  Copyright (c) 2012 Red Hat Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <glib.h>

#include "topology.h"

static void test_topo_bits(void)
{
    /* simple tests for 1 thread per core, 1 core per socket */
    g_assert_cmpuint(apicid_smt_width(1, 1), ==, 0);
    g_assert_cmpuint(apicid_core_width(1, 1), ==, 0);

    g_assert_cmpuint(x86_apicid_from_cpu_idx(1, 1, 0), ==, 0);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(1, 1, 1), ==, 1);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(1, 1, 2), ==, 2);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(1, 1, 3), ==, 3);


    /* Test field width calculation for multiple values
     */
    g_assert_cmpuint(apicid_smt_width(1, 2), ==, 1);
    g_assert_cmpuint(apicid_smt_width(1, 3), ==, 2);
    g_assert_cmpuint(apicid_smt_width(1, 4), ==, 2);

    g_assert_cmpuint(apicid_smt_width(1, 14), ==, 4);
    g_assert_cmpuint(apicid_smt_width(1, 15), ==, 4);
    g_assert_cmpuint(apicid_smt_width(1, 16), ==, 4);
    g_assert_cmpuint(apicid_smt_width(1, 17), ==, 5);


    g_assert_cmpuint(apicid_core_width(30, 2), ==, 5);
    g_assert_cmpuint(apicid_core_width(31, 2), ==, 5);
    g_assert_cmpuint(apicid_core_width(32, 2), ==, 5);
    g_assert_cmpuint(apicid_core_width(33, 2), ==, 6);


    /* build a weird topology and see if IDs are calculated correctly
     */

    /* This will use 2 bits for thread ID and 3 bits for core ID
     */
    g_assert_cmpuint(apicid_smt_width(6, 3), ==, 2);
    g_assert_cmpuint(apicid_core_width(6, 3), ==, 3);
    g_assert_cmpuint(apicid_pkg_offset(6, 3), ==, 5);

    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 0), ==, 0);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 1), ==, 1);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 2), ==, 2);

    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 1 * 3 + 0), ==,
                     (1 << 2) | 0);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 1 * 3 + 1), ==,
                     (1 << 2) | 1);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 1 * 3 + 2), ==,
                     (1 << 2) | 2);

    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 2 * 3 + 0), ==,
                     (2 << 2) | 0);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 2 * 3 + 1), ==,
                     (2 << 2) | 1);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 2 * 3 + 2), ==,
                     (2 << 2) | 2);

    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 5 * 3 + 0), ==,
                     (5 << 2) | 0);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 5 * 3 + 1), ==,
                     (5 << 2) | 1);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 5 * 3 + 2), ==,
                     (5 << 2) | 2);

    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 1 * 6 * 3 + 0 * 3 + 0), ==,
                     (1 << 5));
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 1 * 6 * 3 + 1 * 3 + 1), ==,
                     (1 << 5) | (1 << 2) | 1);
    g_assert_cmpuint(x86_apicid_from_cpu_idx(6, 3, 3 * 6 * 3 + 5 * 3 + 2), ==,
                     (3 << 5) | (5 << 2) | 2);
}

int main(int argc, char **argv)
{
    g_test_init(&argc, &argv, NULL);

    g_test_add_func("/cpuid/topology/basic", test_topo_bits);

    g_test_run();

    return 0;
}
