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