1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2023 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker *
5*8617a60dSAndroid Build Coastguard Worker * The DUT interface helper functions for the firmware updater.
6*8617a60dSAndroid Build Coastguard Worker */
7*8617a60dSAndroid Build Coastguard Worker
8*8617a60dSAndroid Build Coastguard Worker #include <assert.h>
9*8617a60dSAndroid Build Coastguard Worker #ifdef HAVE_CROSID
10*8617a60dSAndroid Build Coastguard Worker #include <crosid.h>
11*8617a60dSAndroid Build Coastguard Worker #endif
12*8617a60dSAndroid Build Coastguard Worker #include <limits.h>
13*8617a60dSAndroid Build Coastguard Worker #include "crossystem.h"
14*8617a60dSAndroid Build Coastguard Worker #include "updater.h"
15*8617a60dSAndroid Build Coastguard Worker
dut_get_manifest_key(char ** manifest_key_out,struct updater_config * cfg)16*8617a60dSAndroid Build Coastguard Worker int dut_get_manifest_key(char **manifest_key_out, struct updater_config *cfg)
17*8617a60dSAndroid Build Coastguard Worker {
18*8617a60dSAndroid Build Coastguard Worker if (cfg->dut_is_remote) {
19*8617a60dSAndroid Build Coastguard Worker WARN("Cannot retrieve the remote DUT manifest info. "
20*8617a60dSAndroid Build Coastguard Worker "Please specify the DUT type by --model.\n");
21*8617a60dSAndroid Build Coastguard Worker return -1;
22*8617a60dSAndroid Build Coastguard Worker }
23*8617a60dSAndroid Build Coastguard Worker #ifdef HAVE_CROSID
24*8617a60dSAndroid Build Coastguard Worker return crosid_get_firmware_manifest_key(manifest_key_out);
25*8617a60dSAndroid Build Coastguard Worker #else
26*8617a60dSAndroid Build Coastguard Worker ERROR("This version of futility was compiled without libcrosid "
27*8617a60dSAndroid Build Coastguard Worker "(perhaps compiled outside of the Chrome OS build system?) and "
28*8617a60dSAndroid Build Coastguard Worker "the update command is not fully supported. Either compile "
29*8617a60dSAndroid Build Coastguard Worker "from the Chrome OS build, or pass --model to manually specify "
30*8617a60dSAndroid Build Coastguard Worker "the machine model.\n");
31*8617a60dSAndroid Build Coastguard Worker return -1;
32*8617a60dSAndroid Build Coastguard Worker #endif
33*8617a60dSAndroid Build Coastguard Worker }
34*8617a60dSAndroid Build Coastguard Worker
dut_set_property_string(const char * key,const char * value,struct updater_config * cfg)35*8617a60dSAndroid Build Coastguard Worker int dut_set_property_string(const char *key, const char *value,
36*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg)
37*8617a60dSAndroid Build Coastguard Worker {
38*8617a60dSAndroid Build Coastguard Worker if (cfg->dut_is_remote) {
39*8617a60dSAndroid Build Coastguard Worker WARN("Ignored setting property %s on a remote DUT.\n", key);
40*8617a60dSAndroid Build Coastguard Worker return -1;
41*8617a60dSAndroid Build Coastguard Worker }
42*8617a60dSAndroid Build Coastguard Worker return VbSetSystemPropertyString(key, value);
43*8617a60dSAndroid Build Coastguard Worker }
44*8617a60dSAndroid Build Coastguard Worker
dut_get_property_string(const char * key,char * dest,size_t size,struct updater_config * cfg)45*8617a60dSAndroid Build Coastguard Worker int dut_get_property_string(const char *key, char *dest, size_t size,
46*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg)
47*8617a60dSAndroid Build Coastguard Worker {
48*8617a60dSAndroid Build Coastguard Worker if (cfg->dut_is_remote) {
49*8617a60dSAndroid Build Coastguard Worker WARN("Ignored getting property %s on a remote DUT.\n", key);
50*8617a60dSAndroid Build Coastguard Worker return -1;
51*8617a60dSAndroid Build Coastguard Worker }
52*8617a60dSAndroid Build Coastguard Worker return VbGetSystemPropertyString(key, dest, size);
53*8617a60dSAndroid Build Coastguard Worker }
54*8617a60dSAndroid Build Coastguard Worker
dut_set_property_int(const char * key,const int value,struct updater_config * cfg)55*8617a60dSAndroid Build Coastguard Worker int dut_set_property_int(const char *key, const int value,
56*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg)
57*8617a60dSAndroid Build Coastguard Worker {
58*8617a60dSAndroid Build Coastguard Worker if (cfg->dut_is_remote) {
59*8617a60dSAndroid Build Coastguard Worker WARN("Ignored setting property %s on a remote DUT.\n", key);
60*8617a60dSAndroid Build Coastguard Worker return -1;
61*8617a60dSAndroid Build Coastguard Worker }
62*8617a60dSAndroid Build Coastguard Worker return VbSetSystemPropertyInt(key, value);
63*8617a60dSAndroid Build Coastguard Worker }
64*8617a60dSAndroid Build Coastguard Worker
dut_get_property_int(const char * key,struct updater_config * cfg)65*8617a60dSAndroid Build Coastguard Worker int dut_get_property_int(const char *key, struct updater_config *cfg)
66*8617a60dSAndroid Build Coastguard Worker {
67*8617a60dSAndroid Build Coastguard Worker if (cfg->dut_is_remote) {
68*8617a60dSAndroid Build Coastguard Worker WARN("Ignored getting property %s on a remote DUT.\n", key);
69*8617a60dSAndroid Build Coastguard Worker return -1;
70*8617a60dSAndroid Build Coastguard Worker }
71*8617a60dSAndroid Build Coastguard Worker return VbGetSystemPropertyInt(key);
72*8617a60dSAndroid Build Coastguard Worker }
73*8617a60dSAndroid Build Coastguard Worker
74*8617a60dSAndroid Build Coastguard Worker /* An helper function to return "mainfw_act" system property. */
dut_get_mainfw_act(struct updater_config * cfg)75*8617a60dSAndroid Build Coastguard Worker static int dut_get_mainfw_act(struct updater_config *cfg)
76*8617a60dSAndroid Build Coastguard Worker {
77*8617a60dSAndroid Build Coastguard Worker char buf[VB_MAX_STRING_PROPERTY];
78*8617a60dSAndroid Build Coastguard Worker
79*8617a60dSAndroid Build Coastguard Worker if (dut_get_property_string("mainfw_act", buf, sizeof(buf), cfg) != 0)
80*8617a60dSAndroid Build Coastguard Worker return SLOT_UNKNOWN;
81*8617a60dSAndroid Build Coastguard Worker
82*8617a60dSAndroid Build Coastguard Worker if (strcmp(buf, FWACT_A) == 0)
83*8617a60dSAndroid Build Coastguard Worker return SLOT_A;
84*8617a60dSAndroid Build Coastguard Worker else if (strcmp(buf, FWACT_B) == 0)
85*8617a60dSAndroid Build Coastguard Worker return SLOT_B;
86*8617a60dSAndroid Build Coastguard Worker
87*8617a60dSAndroid Build Coastguard Worker return SLOT_UNKNOWN;
88*8617a60dSAndroid Build Coastguard Worker }
89*8617a60dSAndroid Build Coastguard Worker
90*8617a60dSAndroid Build Coastguard Worker /* A helper function to return the "tpm_fwver" system property. */
dut_get_tpm_fwver(struct updater_config * cfg)91*8617a60dSAndroid Build Coastguard Worker static int dut_get_tpm_fwver(struct updater_config *cfg)
92*8617a60dSAndroid Build Coastguard Worker {
93*8617a60dSAndroid Build Coastguard Worker return dut_get_property_int("tpm_fwver", cfg);
94*8617a60dSAndroid Build Coastguard Worker }
95*8617a60dSAndroid Build Coastguard Worker
96*8617a60dSAndroid Build Coastguard Worker /* A helper function to return the "hardware write protection" status. */
dut_get_wp_hw(struct updater_config * cfg)97*8617a60dSAndroid Build Coastguard Worker static int dut_get_wp_hw(struct updater_config *cfg)
98*8617a60dSAndroid Build Coastguard Worker {
99*8617a60dSAndroid Build Coastguard Worker /* wpsw refers to write protection 'switch', not 'software'. */
100*8617a60dSAndroid Build Coastguard Worker return dut_get_property_int("wpsw_cur", cfg);
101*8617a60dSAndroid Build Coastguard Worker }
102*8617a60dSAndroid Build Coastguard Worker
dut_get_platform_version(struct updater_config * cfg)103*8617a60dSAndroid Build Coastguard Worker static int dut_get_platform_version(struct updater_config *cfg)
104*8617a60dSAndroid Build Coastguard Worker {
105*8617a60dSAndroid Build Coastguard Worker long rev = dut_get_property_int("board_id", cfg);
106*8617a60dSAndroid Build Coastguard Worker /* Assume platform version = 0 on error. */
107*8617a60dSAndroid Build Coastguard Worker if (rev < 0)
108*8617a60dSAndroid Build Coastguard Worker rev = 0;
109*8617a60dSAndroid Build Coastguard Worker if (rev > INT_MAX)
110*8617a60dSAndroid Build Coastguard Worker rev = INT_MAX;
111*8617a60dSAndroid Build Coastguard Worker return rev;
112*8617a60dSAndroid Build Coastguard Worker }
113*8617a60dSAndroid Build Coastguard Worker
114*8617a60dSAndroid Build Coastguard Worker /* Helper function to return host software write protection status. */
dut_get_wp_sw(const char * programmer)115*8617a60dSAndroid Build Coastguard Worker static int dut_get_wp_sw(const char *programmer)
116*8617a60dSAndroid Build Coastguard Worker {
117*8617a60dSAndroid Build Coastguard Worker assert(programmer);
118*8617a60dSAndroid Build Coastguard Worker bool mode;
119*8617a60dSAndroid Build Coastguard Worker
120*8617a60dSAndroid Build Coastguard Worker if (flashrom_get_wp(programmer, &mode, NULL, NULL, -1)) {
121*8617a60dSAndroid Build Coastguard Worker /* Read WP status error */
122*8617a60dSAndroid Build Coastguard Worker return -1;
123*8617a60dSAndroid Build Coastguard Worker }
124*8617a60dSAndroid Build Coastguard Worker return mode;
125*8617a60dSAndroid Build Coastguard Worker }
126*8617a60dSAndroid Build Coastguard Worker
127*8617a60dSAndroid Build Coastguard Worker /* Helper function to return host AP software write protection status. */
dut_get_wp_sw_ap(struct updater_config * cfg)128*8617a60dSAndroid Build Coastguard Worker static inline int dut_get_wp_sw_ap(struct updater_config *cfg)
129*8617a60dSAndroid Build Coastguard Worker {
130*8617a60dSAndroid Build Coastguard Worker return dut_get_wp_sw(cfg->image.programmer);
131*8617a60dSAndroid Build Coastguard Worker }
132*8617a60dSAndroid Build Coastguard Worker
133*8617a60dSAndroid Build Coastguard Worker /* Helper function to return host EC software write protection status. */
dut_get_wp_sw_ec(struct updater_config * cfg)134*8617a60dSAndroid Build Coastguard Worker static inline int dut_get_wp_sw_ec(struct updater_config *cfg)
135*8617a60dSAndroid Build Coastguard Worker {
136*8617a60dSAndroid Build Coastguard Worker return dut_get_wp_sw(cfg->ec_image.programmer);
137*8617a60dSAndroid Build Coastguard Worker }
138*8617a60dSAndroid Build Coastguard Worker
139*8617a60dSAndroid Build Coastguard Worker /* Helper functions to use or configure the DUT properties. */
140*8617a60dSAndroid Build Coastguard Worker
dut_get_property(enum dut_property_type property_type,struct updater_config * cfg)141*8617a60dSAndroid Build Coastguard Worker int dut_get_property(enum dut_property_type property_type,
142*8617a60dSAndroid Build Coastguard Worker struct updater_config *cfg)
143*8617a60dSAndroid Build Coastguard Worker {
144*8617a60dSAndroid Build Coastguard Worker struct dut_property *prop;
145*8617a60dSAndroid Build Coastguard Worker
146*8617a60dSAndroid Build Coastguard Worker assert(property_type < DUT_PROP_MAX);
147*8617a60dSAndroid Build Coastguard Worker prop = &cfg->dut_properties[property_type];
148*8617a60dSAndroid Build Coastguard Worker if (!prop->initialized) {
149*8617a60dSAndroid Build Coastguard Worker prop->initialized = 1;
150*8617a60dSAndroid Build Coastguard Worker prop->value = prop->getter(cfg);
151*8617a60dSAndroid Build Coastguard Worker }
152*8617a60dSAndroid Build Coastguard Worker return prop->value;
153*8617a60dSAndroid Build Coastguard Worker }
154*8617a60dSAndroid Build Coastguard Worker
dut_init_properties(struct dut_property * props,int num)155*8617a60dSAndroid Build Coastguard Worker void dut_init_properties(struct dut_property *props, int num)
156*8617a60dSAndroid Build Coastguard Worker {
157*8617a60dSAndroid Build Coastguard Worker memset(props, 0, num * sizeof(*props));
158*8617a60dSAndroid Build Coastguard Worker assert(num >= DUT_PROP_MAX);
159*8617a60dSAndroid Build Coastguard Worker props[DUT_PROP_MAINFW_ACT].getter = dut_get_mainfw_act;
160*8617a60dSAndroid Build Coastguard Worker props[DUT_PROP_TPM_FWVER].getter = dut_get_tpm_fwver;
161*8617a60dSAndroid Build Coastguard Worker props[DUT_PROP_PLATFORM_VER].getter = dut_get_platform_version;
162*8617a60dSAndroid Build Coastguard Worker props[DUT_PROP_WP_HW].getter = dut_get_wp_hw;
163*8617a60dSAndroid Build Coastguard Worker props[DUT_PROP_WP_SW_AP].getter = dut_get_wp_sw_ap;
164*8617a60dSAndroid Build Coastguard Worker props[DUT_PROP_WP_SW_EC].getter = dut_get_wp_sw_ec;
165*8617a60dSAndroid Build Coastguard Worker }
166