blob: 2d38a2f39f061cf7dec72228bdaa7c4c8f49f598 [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
Julian Hall65bb4102023-01-19 12:09:02 +00007#include "metadata_reader.h"
8
Gyorgy Szing3c446242023-03-31 01:53:15 +02009#include "media/volume/index/volume_index.h"
10#include "media/volume/volume.h"
11#include "service/fwu/fw_store/banked/volume_id.h"
12
Julian Hall65bb4102023-01-19 12:09:02 +000013extern "C" {
Gyorgy Szing3c446242023-03-31 01:53:15 +020014#include "trace.h"
Julian Hall65bb4102023-01-19 12:09:02 +000015}
16
Gyorgy Szing3c446242023-03-31 01:53:15 +020017metadata_reader::metadata_reader()
18 : registered_readers()
Julian Hall65bb4102023-01-19 12:09:02 +000019{
Julian Hall65bb4102023-01-19 12:09:02 +000020}
21
22metadata_reader::~metadata_reader()
23{
Julian Hall65bb4102023-01-19 12:09:02 +000024}
25
26metadata_reader *metadata_reader::instance()
27{
28 static metadata_reader the_instance;
29 return &the_instance;
30}
31
32void metadata_reader::register_reader(metadata_version_specific_reader *reader)
33{
34 registered_readers.push_back(reader);
35}
36
Gyorgy Szing3c446242023-03-31 01:53:15 +020037int metadata_reader::get_boot_info(unsigned int &active_index, unsigned int &metadata_version) const
Julian Hall65bb4102023-01-19 12:09:02 +000038{
39 struct volume *volume;
40
41 int status = volume_index_find(BANKED_VOLUME_ID_PRIMARY_METADATA, &volume);
42
43 if (status) {
Julian Hall65bb4102023-01-19 12:09:02 +000044 IMSG("Failed to find metadata volume");
45 return status;
46 }
47
48 status = volume_open(volume);
49
50 if (!status) {
Julian Hall65bb4102023-01-19 12:09:02 +000051 /* Assume whatever metadata version is in-use, it will fit in the buffer */
52 size_t len_read = 0;
53 uint8_t buf[1000];
54
55 status = volume_read(volume, (uintptr_t)buf, sizeof(buf), &len_read);
56
57 if (!status) {
Julian Hall65bb4102023-01-19 12:09:02 +000058 bool is_handled = false;
59
60 for (unsigned int i = 0; i < registered_readers.size(); i++) {
Julian Hall65bb4102023-01-19 12:09:02 +000061 metadata_version_specific_reader *reader = registered_readers[i];
62
63 if (reader->is_supported(buf, len_read)) {
Julian Hall65bb4102023-01-19 12:09:02 +000064 reader->get_version(buf, len_read, metadata_version);
65 reader->get_active_index(buf, len_read, active_index);
66
67 is_handled = true;
68 break;
69 }
70 }
71
Julian Hall351a0722023-01-12 11:58:42 +000072 if (!is_handled) {
Julian Hall351a0722023-01-12 11:58:42 +000073 /* This is normal on first-boot */
74 status = -1;
75 }
Julian Hall65bb4102023-01-19 12:09:02 +000076
77 } else
78 IMSG("Failed to read metadata volume");
79
80 volume_close(volume);
81
82 } else
83 IMSG("Failed to open metadata volume");
84
85 return status;
86}