blob: c794832d467c0ad21a1eab14bf24e387b4b64d35 [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
8#include <assert.h>
9#include <stddef.h>
10#include <string.h>
11#include <protocols/service/fwu/packed-c/status.h>
12#include "fw_directory.h"
13
14void fw_directory_init(
15 struct fw_directory *fw_directory)
16{
17 assert(fw_directory);
18
19 /* The fw_directory is initially empty. It will be populated by a
20 * fw_inspector.
21 */
22 memset(fw_directory, 0, sizeof(struct fw_directory));
23}
24
25void fw_directory_deinit(
26 struct fw_directory *fw_directory)
27{
28 (void)fw_directory;
29}
30
31void fw_directory_set_boot_info(
32 struct fw_directory *fw_directory,
33 const struct boot_info *boot_info)
34{
35 assert(fw_directory);
36 fw_directory->boot_info = *boot_info;
37}
38
39int fw_directory_add_image_info(
40 struct fw_directory *fw_directory,
41 const struct image_info *image_info)
42{
43 assert(fw_directory);
44 assert(image_info);
45
46 int status = FWU_STATUS_UNKNOWN;
47
48 if (fw_directory->num_images < FWU_MAX_FW_DIRECTORY_ENTRIES) {
49
50 uint32_t image_index = fw_directory->num_images;
51
52 fw_directory->entries[image_index] = *image_info;
53 fw_directory->entries[image_index].image_index = image_index;
54
55 ++fw_directory->num_images;
56
57 status = FWU_STATUS_SUCCESS;
58 }
59
60 return status;
61}
62
63const struct image_info *fw_directory_find_image_info(
64 const struct fw_directory *fw_directory,
65 const struct uuid_octets *img_type_uuid)
66{
67 assert(fw_directory);
68 assert(img_type_uuid);
69
70 const struct image_info *info = NULL;
71
72 for (size_t i = 0; i < fw_directory->num_images; i++) {
73
74 if (uuid_is_equal(img_type_uuid->octets,
75 fw_directory->entries[i].img_type_uuid.octets)) {
76
77 info = &fw_directory->entries[i];
78 break;
79 }
80 }
81
82 return info;
83}
84
85const struct boot_info *fw_directory_get_boot_info(
86 const struct fw_directory *fw_directory)
87{
88 assert(fw_directory);
89 return &fw_directory->boot_info;
90}
91
92const struct image_info *fw_directory_get_image_info(
93 const struct fw_directory *fw_directory,
94 size_t index)
95{
96 assert(fw_directory);
97
98 const struct image_info *info = NULL;
99
100 if (index < fw_directory->num_images)
101 info = &fw_directory->entries[index];
102
103 return info;
104}
105
106size_t fw_directory_num_images(
107 const struct fw_directory *fw_directory)
108{
109 assert(fw_directory);
110 return fw_directory->num_images;
111}