1fe82ebb0SRobert Mustacchi /*
2fe82ebb0SRobert Mustacchi * This file and its contents are supplied under the terms of the
3fe82ebb0SRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
4fe82ebb0SRobert Mustacchi * You may only use this file in accordance with the terms of version
5fe82ebb0SRobert Mustacchi * 1.0 of the CDDL.
6fe82ebb0SRobert Mustacchi *
7fe82ebb0SRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this
8fe82ebb0SRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at
9fe82ebb0SRobert Mustacchi * http://www.illumos.org/license/CDDL.
10fe82ebb0SRobert Mustacchi */
11fe82ebb0SRobert Mustacchi
12fe82ebb0SRobert Mustacchi /*
13*f7379be0SRobert Mustacchi * Copyright 2024 Oxide Computer Company
14fe82ebb0SRobert Mustacchi */
15fe82ebb0SRobert Mustacchi
16fe82ebb0SRobert Mustacchi /*
17fe82ebb0SRobert Mustacchi * Basic test of libjedec temperature features.
18fe82ebb0SRobert Mustacchi */
19fe82ebb0SRobert Mustacchi
20fe82ebb0SRobert Mustacchi #include <stdlib.h>
21fe82ebb0SRobert Mustacchi #include <limits.h>
22fe82ebb0SRobert Mustacchi #include <err.h>
23fe82ebb0SRobert Mustacchi #include <sys/sysmacros.h>
24fe82ebb0SRobert Mustacchi #include <libjedec.h>
25fe82ebb0SRobert Mustacchi
26fe82ebb0SRobert Mustacchi typedef struct {
27fe82ebb0SRobert Mustacchi uint32_t ltt_temp;
28fe82ebb0SRobert Mustacchi boolean_t ltt_res;
29fe82ebb0SRobert Mustacchi int32_t ltt_min;
30fe82ebb0SRobert Mustacchi int32_t ltt_max;
31fe82ebb0SRobert Mustacchi const char *ltt_desc;
32fe82ebb0SRobert Mustacchi } libjedec_temp_test_t;
33fe82ebb0SRobert Mustacchi
34fe82ebb0SRobert Mustacchi static const libjedec_temp_test_t temp_tests[] = {
35fe82ebb0SRobert Mustacchi { JEDEC_TEMP_CASE_A2T, B_TRUE, -40, 105, "Operating temperature A2T" },
36fe82ebb0SRobert Mustacchi { JEDEC_TEMP_CASE_RT, B_TRUE, 0, 45, "Operating temperature RT" },
37fe82ebb0SRobert Mustacchi { JEDEC_TEMP_AMB_CT, B_TRUE, 0, 70, "Ambient temperature CT" },
38fe82ebb0SRobert Mustacchi { JEDEC_TEMP_AMB_IOT, B_TRUE, -40, 85, "Ambient temperature IOT" },
39fe82ebb0SRobert Mustacchi { JEDEC_TEMP_AMB_AO1T, B_TRUE, -40, 125, "Ambient temperature A01T" },
40fe82ebb0SRobert Mustacchi { JEDEC_TEMP_STOR_ST, B_TRUE, -40, 85, "Storage temperature ST" },
41*f7379be0SRobert Mustacchi { JEDEC_TEMP_JNCT_A90, B_TRUE, -40, 90, "Junction temperature A90" },
42*f7379be0SRobert Mustacchi { JEDEC_TEMP_JNCT_LT115, B_TRUE, -40, 115,
43*f7379be0SRobert Mustacchi "Junction temperature LT115" },
44*f7379be0SRobert Mustacchi { JEDEC_TEMP_JNCT_ET, B_TRUE, -25, 105, "Junction temperature ET" },
45*f7379be0SRobert Mustacchi { JEDEC_TEMP_JNCT_XT, B_TRUE, 0, 95, "Junction temperature XT" },
46*f7379be0SRobert Mustacchi { 142, B_FALSE, 0, 0, "invalid temperature (142)" },
47fe82ebb0SRobert Mustacchi { INT32_MAX, B_FALSE, 0, 0, "invalid temperature (INT32_MAX)" },
48fe82ebb0SRobert Mustacchi { UINT32_MAX, B_FALSE, 0, 0, "invalid temperature (UINT32_MAX)" }
49fe82ebb0SRobert Mustacchi };
50fe82ebb0SRobert Mustacchi
51fe82ebb0SRobert Mustacchi static boolean_t
libjedec_temp_run_single(const libjedec_temp_test_t * test)52fe82ebb0SRobert Mustacchi libjedec_temp_run_single(const libjedec_temp_test_t *test)
53fe82ebb0SRobert Mustacchi {
54fe82ebb0SRobert Mustacchi int32_t min = INT32_MIN, max = INT32_MAX;
55fe82ebb0SRobert Mustacchi boolean_t res;
56fe82ebb0SRobert Mustacchi
57fe82ebb0SRobert Mustacchi res = libjedec_temp_range(test->ltt_temp, &min, &max);
58fe82ebb0SRobert Mustacchi if (res != test->ltt_res) {
59fe82ebb0SRobert Mustacchi if (test->ltt_res) {
60fe82ebb0SRobert Mustacchi warnx("libjedec_temp_range() succeeded, but we "
61fe82ebb0SRobert Mustacchi "expected failure!");
62fe82ebb0SRobert Mustacchi } else {
63fe82ebb0SRobert Mustacchi warnx("libjedec_temp_range() failed, but we expected "
64fe82ebb0SRobert Mustacchi "success!");
65fe82ebb0SRobert Mustacchi }
66fe82ebb0SRobert Mustacchi return (B_FALSE);
67fe82ebb0SRobert Mustacchi }
68fe82ebb0SRobert Mustacchi
69fe82ebb0SRobert Mustacchi if (!res) {
70fe82ebb0SRobert Mustacchi return (B_TRUE);
71fe82ebb0SRobert Mustacchi }
72fe82ebb0SRobert Mustacchi
73fe82ebb0SRobert Mustacchi if (min != test->ltt_min) {
74fe82ebb0SRobert Mustacchi warnx("received incorrect minimum temperature: expected %d, "
75fe82ebb0SRobert Mustacchi "found %d\n", test->ltt_min, min);
76fe82ebb0SRobert Mustacchi }
77fe82ebb0SRobert Mustacchi
78fe82ebb0SRobert Mustacchi if (max != test->ltt_max) {
79fe82ebb0SRobert Mustacchi warnx("received incorrect maximum temperature: expected %d, "
80fe82ebb0SRobert Mustacchi "found %d\n", test->ltt_max, max);
81fe82ebb0SRobert Mustacchi }
82fe82ebb0SRobert Mustacchi
83fe82ebb0SRobert Mustacchi return (B_TRUE);
84fe82ebb0SRobert Mustacchi }
85fe82ebb0SRobert Mustacchi
86fe82ebb0SRobert Mustacchi int
main(void)87fe82ebb0SRobert Mustacchi main(void)
88fe82ebb0SRobert Mustacchi {
89fe82ebb0SRobert Mustacchi int ret = EXIT_SUCCESS;
90fe82ebb0SRobert Mustacchi
91fe82ebb0SRobert Mustacchi for (size_t i = 0; i < ARRAY_SIZE(temp_tests); i++) {
92fe82ebb0SRobert Mustacchi const libjedec_temp_test_t *test = &temp_tests[i];
93fe82ebb0SRobert Mustacchi
94fe82ebb0SRobert Mustacchi if (libjedec_temp_run_single(test)) {
95fe82ebb0SRobert Mustacchi (void) printf("TEST PASSED: %s\n", test->ltt_desc);
96fe82ebb0SRobert Mustacchi } else {
97fe82ebb0SRobert Mustacchi (void) fprintf(stderr, "TEST FAILED: %s\n",
98fe82ebb0SRobert Mustacchi test->ltt_desc);
99fe82ebb0SRobert Mustacchi ret = EXIT_FAILURE;
100fe82ebb0SRobert Mustacchi }
101fe82ebb0SRobert Mustacchi }
102fe82ebb0SRobert Mustacchi
103*f7379be0SRobert Mustacchi if (ret == EXIT_SUCCESS) {
104*f7379be0SRobert Mustacchi (void) printf("All tests passed successfully!\n");
105*f7379be0SRobert Mustacchi }
106*f7379be0SRobert Mustacchi
107fe82ebb0SRobert Mustacchi return (ret);
108fe82ebb0SRobert Mustacchi }
109