xref: /aosp_15_r20/external/vboot_reference/futility/flash_helpers.c (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
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 
6*8617a60dSAndroid Build Coastguard Worker #include "flash_helpers.h"
7*8617a60dSAndroid Build Coastguard Worker #include "futility.h"
8*8617a60dSAndroid Build Coastguard Worker #include "updater.h"
9*8617a60dSAndroid Build Coastguard Worker 
setup_flash(struct updater_config ** cfg,struct updater_config_arguments * args)10*8617a60dSAndroid Build Coastguard Worker int setup_flash(struct updater_config **cfg,
11*8617a60dSAndroid Build Coastguard Worker 		struct updater_config_arguments *args)
12*8617a60dSAndroid Build Coastguard Worker {
13*8617a60dSAndroid Build Coastguard Worker #ifdef USE_FLASHROM
14*8617a60dSAndroid Build Coastguard Worker 	*cfg = updater_new_config();
15*8617a60dSAndroid Build Coastguard Worker 	if (!*cfg) {
16*8617a60dSAndroid Build Coastguard Worker 		ERROR("Out of memory\n");
17*8617a60dSAndroid Build Coastguard Worker 		return 1;
18*8617a60dSAndroid Build Coastguard Worker 	}
19*8617a60dSAndroid Build Coastguard Worker 	if (args->detect_servo) {
20*8617a60dSAndroid Build Coastguard Worker 		char *servo_programmer = host_detect_servo(&(*cfg)->prepare_ctrl_name);
21*8617a60dSAndroid Build Coastguard Worker 		if (!servo_programmer) {
22*8617a60dSAndroid Build Coastguard Worker 			ERROR("Problem communicating with servo\n");
23*8617a60dSAndroid Build Coastguard Worker 			goto errdelete;
24*8617a60dSAndroid Build Coastguard Worker 		}
25*8617a60dSAndroid Build Coastguard Worker 
26*8617a60dSAndroid Build Coastguard Worker 		if (!args->programmer)
27*8617a60dSAndroid Build Coastguard Worker 			args->programmer = servo_programmer;
28*8617a60dSAndroid Build Coastguard Worker 		else
29*8617a60dSAndroid Build Coastguard Worker 			free(servo_programmer);
30*8617a60dSAndroid Build Coastguard Worker 	}
31*8617a60dSAndroid Build Coastguard Worker 
32*8617a60dSAndroid Build Coastguard Worker 	if (updater_setup_config(*cfg, args)) {
33*8617a60dSAndroid Build Coastguard Worker 		ERROR("Bad servo options\n");
34*8617a60dSAndroid Build Coastguard Worker 		goto errdelete;
35*8617a60dSAndroid Build Coastguard Worker 	}
36*8617a60dSAndroid Build Coastguard Worker 	prepare_servo_control((*cfg)->prepare_ctrl_name, true);
37*8617a60dSAndroid Build Coastguard Worker 	return 0;
38*8617a60dSAndroid Build Coastguard Worker 
39*8617a60dSAndroid Build Coastguard Worker errdelete:
40*8617a60dSAndroid Build Coastguard Worker 	updater_delete_config(*cfg);
41*8617a60dSAndroid Build Coastguard Worker 	*cfg = NULL;
42*8617a60dSAndroid Build Coastguard Worker 	return 1;
43*8617a60dSAndroid Build Coastguard Worker #else
44*8617a60dSAndroid Build Coastguard Worker 	return 1;
45*8617a60dSAndroid Build Coastguard Worker #endif /* USE_FLASHROM */
46*8617a60dSAndroid Build Coastguard Worker }
47*8617a60dSAndroid Build Coastguard Worker 
teardown_flash(struct updater_config * cfg)48*8617a60dSAndroid Build Coastguard Worker void teardown_flash(struct updater_config *cfg)
49*8617a60dSAndroid Build Coastguard Worker {
50*8617a60dSAndroid Build Coastguard Worker #ifdef USE_FLASHROM
51*8617a60dSAndroid Build Coastguard Worker 	prepare_servo_control(cfg->prepare_ctrl_name, false);
52*8617a60dSAndroid Build Coastguard Worker 	updater_delete_config(cfg);
53*8617a60dSAndroid Build Coastguard Worker #endif /* USE_FLASHROM */
54*8617a60dSAndroid Build Coastguard Worker }
55