blob: d1507f55ebe01224550b33ec6b4ced5587a59b51 [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
Julian Hall351a0722023-01-12 11:58:42 +000080 if (!is_handled) {
81
82 /* This is normal on first-boot */
83 status = -1;
84 }
Julian Hall65bb4102023-01-19 12:09:02 +000085
86 } else
87 IMSG("Failed to read metadata volume");
88
89 volume_close(volume);
90
91 } else
92 IMSG("Failed to open metadata volume");
93
94 return status;
95}
96