blob: a698fc51c22d19cfac2be6f5af6a3697f93a1a3b [file] [log] [blame]
Jakub Czapigadadcae62021-04-08 16:29:03 +02001/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <dimm_info_util.h>
4#include <spd.h>
5#include <tests/test.h>
6
7static void test_smbios_bus_width_to_spd_width(void **state)
8{
9 /* Non-ECC variants */
10 assert_int_equal(MEMORY_BUS_WIDTH_64, smbios_bus_width_to_spd_width(64, 64));
11 assert_int_equal(MEMORY_BUS_WIDTH_32, smbios_bus_width_to_spd_width(32, 32));
12 assert_int_equal(MEMORY_BUS_WIDTH_16, smbios_bus_width_to_spd_width(16, 16));
13 assert_int_equal(MEMORY_BUS_WIDTH_8, smbios_bus_width_to_spd_width(8, 8));
14 /* Incorrect data width. Fallback to 8-bit */
15 assert_int_equal(MEMORY_BUS_WIDTH_8, smbios_bus_width_to_spd_width(15, 15));
16
17 /* ECC variants */
18 assert_int_equal(MEMORY_BUS_WIDTH_64 | SPD_ECC_8BIT,
19 smbios_bus_width_to_spd_width(64 + 8, 64));
20 assert_int_equal(MEMORY_BUS_WIDTH_32 | SPD_ECC_8BIT,
21 smbios_bus_width_to_spd_width(32 + 8, 32));
22 assert_int_equal(MEMORY_BUS_WIDTH_16 | SPD_ECC_8BIT,
23 smbios_bus_width_to_spd_width(16 + 8, 16));
24 assert_int_equal(MEMORY_BUS_WIDTH_8 | SPD_ECC_8BIT,
25 smbios_bus_width_to_spd_width(8 + 8, 8));
26 /* Incorrect data width. Fallback to 8-bit */
27 assert_int_equal(MEMORY_BUS_WIDTH_8 | SPD_ECC_8BIT,
28 smbios_bus_width_to_spd_width(15 + 8, 15));
29}
30
31static void test_smbios_memory_size_to_mib(void **state)
32{
33 uint32_t extended_size;
34 uint16_t memory_size;
35
36 /* Unknown memory size */
37 assert_int_equal(0, smbios_memory_size_to_mib(0xFFFF, 0));
38 assert_int_equal(0, smbios_memory_size_to_mib(0xFFFF, 0xFFFF));
39 assert_int_equal(0, smbios_memory_size_to_mib(0xFFFF, 87642));
40
41 /* 32GiB - 1MiB */
42 extended_size = 0;
43 assert_int_equal(extended_size, smbios_memory_size_to_mib(0x7FFF, extended_size));
44 extended_size = 0xFFFFFFFF;
45 assert_int_equal(extended_size, smbios_memory_size_to_mib(0x7FFF, extended_size));
46 extended_size = 0xDEDE6666;
47 assert_int_equal(extended_size, smbios_memory_size_to_mib(0x7FFF, extended_size));
48
49 /* Memory size in KiB when MSB is flipped */
50 memory_size = 0x0 & 0x8000; /* Zero bytes */
51 assert_int_equal(0, smbios_memory_size_to_mib(memory_size, 0));
52 assert_int_equal(0, smbios_memory_size_to_mib(memory_size, 0xFFFFFFFF));
53 assert_int_equal(0, smbios_memory_size_to_mib(memory_size, 2345568));
54 memory_size = (31 * KiB) | 0x8000;
55 assert_int_equal(31, smbios_memory_size_to_mib(memory_size, 0));
56 assert_int_equal(31, smbios_memory_size_to_mib(memory_size, 0xFFFFFFFF));
57 assert_int_equal(31, smbios_memory_size_to_mib(memory_size, 72594344));
58
59 /* Value in MiB Only when memory size is not 0xFFFF and 0x7FFF and MSB is not set */
60 memory_size = 32766; /* value in MiB */
61 assert_int_equal(memory_size, smbios_memory_size_to_mib(memory_size, 0));
62 assert_int_equal(memory_size, smbios_memory_size_to_mib(memory_size, 0xFFFFFFFF));
63 assert_int_equal(memory_size, smbios_memory_size_to_mib(memory_size, 694735));
64}
65
66static void test_smbios_form_factor_to_spd_mod_type(void **state)
67{
68 /* Form factors defined in coreboot */
69 const LargestIntegralType udimm_allowed[] = {
70 SPD_UDIMM, SPD_MICRO_DIMM, SPD_MINI_UDIMM,
71 };
72 assert_in_set(smbios_form_factor_to_spd_mod_type(MEMORY_FORMFACTOR_DIMM),
73 udimm_allowed, ARRAY_SIZE(udimm_allowed));
74
75 const LargestIntegralType rdimm_allowed[] = { SPD_RDIMM, SPD_MINI_RDIMM };
76 assert_in_set(smbios_form_factor_to_spd_mod_type(MEMORY_FORMFACTOR_RIMM),
77 rdimm_allowed, ARRAY_SIZE(rdimm_allowed));
78
79 assert_int_equal(SPD_SODIMM,
80 smbios_form_factor_to_spd_mod_type(MEMORY_FORMFACTOR_SODIMM));
81
82 const smbios_memory_form_factor undefined_factors[] = {
83 MEMORY_FORMFACTOR_OTHER,
84 MEMORY_FORMFACTOR_UNKNOWN,
85 MEMORY_FORMFACTOR_SIMM,
86 MEMORY_FORMFACTOR_SIP,
87 MEMORY_FORMFACTOR_CHIP,
88 MEMORY_FORMFACTOR_DIP,
89 MEMORY_FORMFACTOR_ZIP,
90 MEMORY_FORMFACTOR_PROPRIETARY_CARD,
91 MEMORY_FORMFACTOR_TSOP,
92 MEMORY_FORMFACTOR_ROC,
93 MEMORY_FORMFACTOR_SRIMM,
94 MEMORY_FORMFACTOR_FBDIMM,
95 MEMORY_FORMFACTOR_DIE,
96 };
97 for (int i = 0; i < ARRAY_SIZE(undefined_factors); ++i) {
98 assert_int_equal(SPD_UNDEFINED,
99 smbios_form_factor_to_spd_mod_type(undefined_factors[i]));
100 }
101}
102
103int main(void)
104{
105 const struct CMUnitTest tests[] = {
106 cmocka_unit_test(test_smbios_bus_width_to_spd_width),
107 cmocka_unit_test(test_smbios_memory_size_to_mib),
108 cmocka_unit_test(test_smbios_form_factor_to_spd_mod_type),
109 };
110
111 return cmocka_run_group_tests(tests, NULL, NULL);
112}