1 /*
2  * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include "installer.h"
9 
10 #include <assert.h>
11 #include <stdbool.h>
12 #include <stddef.h>
13 
14 #include "protocols/service/fwu/status.h"
15 
installer_init(struct installer * installer,enum install_type install_type,uint32_t location_id,const struct uuid_octets * location_uuid,void * context,const struct installer_interface * interface)16 void installer_init(struct installer *installer, enum install_type install_type,
17 		    uint32_t location_id, const struct uuid_octets *location_uuid, void *context,
18 		    const struct installer_interface *interface)
19 {
20 	assert(installer);
21 	assert(location_uuid);
22 	assert(context);
23 	assert(interface);
24 
25 	installer->install_type = install_type;
26 	installer->location_id = location_id;
27 	installer->location_uuid = *location_uuid;
28 	installer->context = context;
29 	installer->interface = interface;
30 
31 	installer->install_status = FWU_STATUS_SUCCESS;
32 	installer->is_active = false;
33 	installer->next = NULL;
34 }
35 
installer_begin(struct installer * installer,uint32_t current_volume_id,uint32_t update_volume_id)36 int installer_begin(struct installer *installer, uint32_t current_volume_id,
37 		    uint32_t update_volume_id)
38 {
39 	assert(installer);
40 	assert(installer->interface);
41 	assert(installer->interface->begin);
42 
43 	installer->install_status = FWU_STATUS_SUCCESS;
44 	installer->is_active = true;
45 
46 	return installer->interface->begin(installer->context, current_volume_id, update_volume_id);
47 }
48 
installer_finalize(struct installer * installer)49 int installer_finalize(struct installer *installer)
50 {
51 	assert(installer);
52 	assert(installer->interface);
53 	assert(installer->interface->finalize);
54 
55 	installer->is_active = false;
56 
57 	return installer->interface->finalize(installer->context);
58 }
59 
installer_abort(struct installer * installer)60 void installer_abort(struct installer *installer)
61 {
62 	assert(installer);
63 	assert(installer->interface);
64 	assert(installer->interface->abort);
65 
66 	installer->is_active = false;
67 
68 	installer->interface->abort(installer->context);
69 }
70 
installer_open(struct installer * installer,const struct image_info * image_info)71 int installer_open(struct installer *installer, const struct image_info *image_info)
72 {
73 	assert(installer);
74 	assert(installer->interface);
75 	assert(installer->interface->open);
76 
77 	int status = installer->interface->open(installer->context, image_info);
78 
79 	if (status && !installer->install_status)
80 		installer->install_status = status;
81 
82 	return status;
83 }
84 
installer_commit(struct installer * installer)85 int installer_commit(struct installer *installer)
86 {
87 	assert(installer);
88 	assert(installer->interface);
89 	assert(installer->interface->commit);
90 
91 	int status = installer->interface->commit(installer->context);
92 
93 	if (status && !installer->install_status)
94 		installer->install_status = status;
95 
96 	return status;
97 }
98 
installer_write(struct installer * installer,const uint8_t * data,size_t data_len)99 int installer_write(struct installer *installer, const uint8_t *data, size_t data_len)
100 {
101 	assert(installer);
102 	assert(installer->interface);
103 	assert(installer->interface->write);
104 
105 	int status = installer->interface->write(installer->context, data, data_len);
106 
107 	if (status && !installer->install_status)
108 		installer->install_status = status;
109 
110 	return status;
111 }
112 
installer_enumerate(struct installer * installer,uint32_t volume_id,struct fw_directory * fw_directory)113 int installer_enumerate(struct installer *installer, uint32_t volume_id,
114 			struct fw_directory *fw_directory)
115 {
116 	assert(installer);
117 	assert(installer->interface);
118 	assert(installer->interface->enumerate);
119 
120 	return installer->interface->enumerate(installer->context, volume_id, fw_directory);
121 }
122