blob: 6423aa99591c670e1db9c0f6db9aa70bbfd085db [file] [log] [blame]
Julian Hall65bb4102023-01-19 12:09:02 +00001/*
2 * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include <media/volume/volume.h>
8#include <media/volume/index/volume_index.h>
9#include <service/fwu/fw_store/banked/volume_id.h>
10#include "metadata_reader.h"
11
12extern "C" {
13#include <trace.h>
14}
15
16metadata_reader::metadata_reader() :
17 registered_readers()
18{
19
20}
21
22metadata_reader::~metadata_reader()
23{
24
25}
26
27metadata_reader *metadata_reader::instance()
28{
29 static metadata_reader the_instance;
30 return &the_instance;
31}
32
33void metadata_reader::register_reader(metadata_version_specific_reader *reader)
34{
35 registered_readers.push_back(reader);
36}
37
38int metadata_reader::get_boot_info(
39 unsigned int &active_index,
40 unsigned int &metadata_version) const
41{
42 struct volume *volume;
43
44 int status = volume_index_find(BANKED_VOLUME_ID_PRIMARY_METADATA, &volume);
45
46 if (status) {
47
48 IMSG("Failed to find metadata volume");
49 return status;
50 }
51
52 status = volume_open(volume);
53
54 if (!status) {
55
56 /* Assume whatever metadata version is in-use, it will fit in the buffer */
57 size_t len_read = 0;
58 uint8_t buf[1000];
59
60 status = volume_read(volume, (uintptr_t)buf, sizeof(buf), &len_read);
61
62 if (!status) {
63
64 bool is_handled = false;
65
66 for (unsigned int i = 0; i < registered_readers.size(); i++) {
67
68 metadata_version_specific_reader *reader = registered_readers[i];
69
70 if (reader->is_supported(buf, len_read)) {
71
72 reader->get_version(buf, len_read, metadata_version);
73 reader->get_active_index(buf, len_read, active_index);
74
75 is_handled = true;
76 break;
77 }
78 }
79
80 if (!is_handled)
81 IMSG("No metadata recognised");
82
83 } else
84 IMSG("Failed to read metadata volume");
85
86 volume_close(volume);
87
88 } else
89 IMSG("Failed to open metadata volume");
90
91 return status;
92}
93