blob: 3e95cc058e37df9729c29c659294ca38442e42ad [file] [log] [blame]
Julian Hallc1353f72022-11-18 12:00:09 +00001/*
2 * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
Gyorgy Szing3c446242023-03-31 01:53:15 +02008#include "fw_directory.h"
9
Julian Hallc1353f72022-11-18 12:00:09 +000010#include <assert.h>
11#include <stddef.h>
12#include <string.h>
Julian Hallc1353f72022-11-18 12:00:09 +000013
Imre Kis7554c472024-07-04 10:09:31 +020014#include "protocols/service/fwu/status.h"
Gyorgy Szing3c446242023-03-31 01:53:15 +020015
16void fw_directory_init(struct fw_directory *fw_directory)
Julian Hallc1353f72022-11-18 12:00:09 +000017{
18 assert(fw_directory);
19
20 /* The fw_directory is initially empty. It will be populated by a
21 * fw_inspector.
22 */
23 memset(fw_directory, 0, sizeof(struct fw_directory));
24}
25
Gyorgy Szing3c446242023-03-31 01:53:15 +020026void fw_directory_deinit(struct fw_directory *fw_directory)
Julian Hallc1353f72022-11-18 12:00:09 +000027{
28 (void)fw_directory;
29}
30
Gyorgy Szing3c446242023-03-31 01:53:15 +020031void fw_directory_set_boot_info(struct fw_directory *fw_directory,
32 const struct boot_info *boot_info)
Julian Hallc1353f72022-11-18 12:00:09 +000033{
34 assert(fw_directory);
35 fw_directory->boot_info = *boot_info;
36}
37
Gyorgy Szing3c446242023-03-31 01:53:15 +020038int fw_directory_add_image_info(struct fw_directory *fw_directory,
39 const struct image_info *image_info)
Julian Hallc1353f72022-11-18 12:00:09 +000040{
41 assert(fw_directory);
42 assert(image_info);
43
44 int status = FWU_STATUS_UNKNOWN;
45
46 if (fw_directory->num_images < FWU_MAX_FW_DIRECTORY_ENTRIES) {
Julian Hallc1353f72022-11-18 12:00:09 +000047 uint32_t image_index = fw_directory->num_images;
48
49 fw_directory->entries[image_index] = *image_info;
50 fw_directory->entries[image_index].image_index = image_index;
51
52 ++fw_directory->num_images;
53
54 status = FWU_STATUS_SUCCESS;
55 }
56
57 return status;
58}
59
Gyorgy Szing3c446242023-03-31 01:53:15 +020060const struct image_info *fw_directory_find_image_info(const struct fw_directory *fw_directory,
61 const struct uuid_octets *img_type_uuid)
Julian Hallc1353f72022-11-18 12:00:09 +000062{
63 assert(fw_directory);
64 assert(img_type_uuid);
65
66 const struct image_info *info = NULL;
67
68 for (size_t i = 0; i < fw_directory->num_images; i++) {
Julian Hallc1353f72022-11-18 12:00:09 +000069 if (uuid_is_equal(img_type_uuid->octets,
Gyorgy Szing3c446242023-03-31 01:53:15 +020070 fw_directory->entries[i].img_type_uuid.octets)) {
Julian Hallc1353f72022-11-18 12:00:09 +000071 info = &fw_directory->entries[i];
72 break;
73 }
74 }
75
76 return info;
77}
78
Gyorgy Szing3c446242023-03-31 01:53:15 +020079const struct boot_info *fw_directory_get_boot_info(const struct fw_directory *fw_directory)
Julian Hallc1353f72022-11-18 12:00:09 +000080{
81 assert(fw_directory);
82 return &fw_directory->boot_info;
83}
84
Gyorgy Szing3c446242023-03-31 01:53:15 +020085const struct image_info *fw_directory_get_image_info(const struct fw_directory *fw_directory,
86 size_t index)
Julian Hallc1353f72022-11-18 12:00:09 +000087{
88 assert(fw_directory);
89
90 const struct image_info *info = NULL;
91
92 if (index < fw_directory->num_images)
93 info = &fw_directory->entries[index];
94
95 return info;
96}
97
Gyorgy Szing3c446242023-03-31 01:53:15 +020098size_t fw_directory_num_images(const struct fw_directory *fw_directory)
Julian Hallc1353f72022-11-18 12:00:09 +000099{
100 assert(fw_directory);
101 return fw_directory->num_images;
102}