xref: /illumos-gate/usr/src/test/util-tests/tests/smbios/smbios_test_mgmtdev.c (revision 1d111dc8a7b0c978fa8cafbedf00eefa9768061e)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2025 Oxide Computer Company
14  */
15 
16 /*
17  * Basic tests for the SMBIOS Management Device and Component. Types 34 and 35.
18  */
19 
20 #include "smbios_test.h"
21 
22 static const char *smbios_dev_desc = "Black Mage";
23 static const char *smbios_comp_desc = "White Mage";
24 
25 boolean_t
smbios_test_mgmtdev_mktable(smbios_test_table_t * table)26 smbios_test_mgmtdev_mktable(smbios_test_table_t *table)
27 {
28 	smb_mgmtdev_t md;
29 
30 	bzero(&md, sizeof (md));
31 	md.smbmgd_hdr.smbh_type = SMB_TYPE_MGMTDEV;
32 	md.smbmgd_hdr.smbh_len = sizeof (md);
33 	md.smbmgd_desc = 1;
34 	md.smbmgd_dtype = SMB_MGMTDEV_DT_LM79;
35 	md.smbmgd_addr = 0x42;
36 	md.smbmgd_atype = SMB_MGMTDEV_AT_SMBUS;
37 
38 	(void) smbios_test_table_append(table, &md, sizeof (md));
39 	smbios_test_table_append_string(table, smbios_dev_desc);
40 	smbios_test_table_str_fini(table);
41 	smbios_test_table_append_eot(table);
42 
43 	return (B_TRUE);
44 }
45 
46 boolean_t
smbios_test_mgmtdev_verify(smbios_hdl_t * hdl)47 smbios_test_mgmtdev_verify(smbios_hdl_t *hdl)
48 {
49 	smbios_struct_t sp;
50 	smbios_mgmtdev_t md;
51 	boolean_t ret = B_TRUE;
52 
53 	if (smbios_lookup_type(hdl, SMB_TYPE_MGMTDEV, &sp) == -1) {
54 		warnx("failed to lookup SMBIOS management device: %s",
55 		    smbios_errmsg(smbios_errno(hdl)));
56 		return (B_FALSE);
57 	}
58 
59 	if (smbios_info_mgmtdev(hdl, sp.smbstr_id, &md) == -1) {
60 		warnx("failed to get management device: %s",
61 		    smbios_errmsg(smbios_errno(hdl)));
62 		return (B_FALSE);
63 	}
64 
65 	if (strcmp(md.smbmd_desc, smbios_dev_desc) != 0) {
66 		warnx("management device description mismatch: found %s, "
67 		    "expected %s", md.smbmd_desc, smbios_dev_desc);
68 		ret = B_FALSE;
69 	}
70 
71 	if (md.smbmd_dtype != SMB_MGMTDEV_DT_LM79) {
72 		warnx("management device device type mismatch: found 0x%x, "
73 		    "expected 0x%x", md.smbmd_dtype, SMB_MGMTDEV_DT_LM79);
74 		ret = B_FALSE;
75 	}
76 
77 	if (md.smbmd_addr != 0x42) {
78 		warnx("management device address mismatch: found 0x%x, "
79 		    "expected 0x42", md.smbmd_addr);
80 		ret = B_FALSE;
81 	}
82 
83 	if (md.smbmd_atype != SMB_MGMTDEV_AT_SMBUS) {
84 		warnx("management device address type mismatch: found 0x%x, "
85 		    "expected 0x%x", md.smbmd_atype, SMB_MGMTDEV_AT_SMBUS);
86 		ret = B_FALSE;
87 	}
88 
89 	return (ret);
90 }
91 
92 boolean_t
smbios_test_mgmtcomp_mktable(smbios_test_table_t * table)93 smbios_test_mgmtcomp_mktable(smbios_test_table_t *table)
94 {
95 	smb_mgmtcomp_t mc;
96 
97 	bzero(&mc, sizeof (mc));
98 	mc.smbmgc_hdr.smbh_type = SMB_TYPE_MGMTDEVCP;
99 	mc.smbmgc_hdr.smbh_len = sizeof (mc);
100 	mc.smbmgc_desc = 1;
101 	mc.smbmgc_mgmtdev = 0x1234;
102 	mc.smbmgc_comp = 0x5678;
103 	mc.smbmgc_thresh = 0x789a;
104 
105 	(void) smbios_test_table_append(table, &mc, sizeof (mc));
106 	smbios_test_table_append_string(table, smbios_comp_desc);
107 	smbios_test_table_str_fini(table);
108 	smbios_test_table_append_eot(table);
109 
110 	return (B_TRUE);
111 }
112 
113 boolean_t
smbios_test_mgmtcomp_verify(smbios_hdl_t * hdl)114 smbios_test_mgmtcomp_verify(smbios_hdl_t *hdl)
115 {
116 	smbios_struct_t sp;
117 	smbios_mgmtcomp_t mc;
118 	boolean_t ret = B_TRUE;
119 
120 	if (smbios_lookup_type(hdl, SMB_TYPE_MGMTDEVCP, &sp) == -1) {
121 		warnx("failed to lookup SMBIOS management component: %s",
122 		    smbios_errmsg(smbios_errno(hdl)));
123 		return (B_FALSE);
124 	}
125 
126 	if (smbios_info_mgmtcomp(hdl, sp.smbstr_id, &mc) == -1) {
127 		warnx("failed to get management component: %s",
128 		    smbios_errmsg(smbios_errno(hdl)));
129 		return (B_FALSE);
130 	}
131 
132 	if (strcmp(mc.smbmc_desc, smbios_comp_desc) != 0) {
133 		warnx("management component description mismatch: found %s, "
134 		    "expected %s", mc.smbmc_desc, smbios_comp_desc);
135 		ret = B_FALSE;
136 	}
137 
138 	if (mc.smbmc_mgmtdev != 0x1234) {
139 		warnx("management component mgmt dev handle mismatch: found "
140 		    "0x%" _PRIxID ", expected 0x1234", mc.smbmc_mgmtdev);
141 		ret = B_FALSE;
142 	}
143 
144 	if (mc.smbmc_comp != 0x5678) {
145 		warnx("management component component handle mismatch: found "
146 		    "0x%" _PRIxID ", expected 0x5678", mc.smbmc_comp);
147 		ret = B_FALSE;
148 	}
149 
150 	if (mc.smbmc_thresh != 0x789a) {
151 		warnx("management component threshold handle mismatch: found "
152 		    "0x%" _PRIxID ", expected 0x789a", mc.smbmc_thresh);
153 		ret = B_FALSE;
154 	}
155 
156 	return (ret);
157 }
158