blob: 7f68616f10c8dca6e99b1a42e306f567a8a531e3 [file] [log] [blame]
Julian Hallcfe2f5b2022-09-22 11:26:35 +01001/*
2 * Copyright (c) 2022, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include <stddef.h>
9#include <stdint.h>
10#include <string.h>
Julian Hallcfe2f5b2022-09-22 11:26:35 +010011#include "volume_index.h"
12
13#ifndef VOLUME_INDEX_MAX_ENTRIES
14#define VOLUME_INDEX_MAX_ENTRIES (4)
15#endif
16
17/**
18 * Singleton index of volume IDs to IO devices.
19 */
20static struct
21{
22 size_t size;
23 struct
24 {
25 unsigned int volume_id;
26 uintptr_t dev_handle;
27 uintptr_t volume_spec;
28 } entries[VOLUME_INDEX_MAX_ENTRIES];
29
30} volume_index;
31
32/**
33 * @brief Gets a device for volume IO operations
34 *
35 * @param[in] volume_id Identifies the image
36 * @param[out] dev_handle Handle for IO operations
37 * @param[out] volume_spec Opaque configuration data
38 *
39 * This function realizes the interface expected by tf-a components to
40 * provide a concrete IO device for the specified volume ID. When used in
41 * TS deployments, the set of IO devices required for a deployment
42 * are registered during service configuration.
43 */
44int plat_get_image_source(
45 unsigned int volume_id,
46 uintptr_t *dev_handle,
47 uintptr_t *volume_spec)
48{
49 int result = -1;
50
51 for (size_t i = 0; i < volume_index.size; i++) {
52
53 if (volume_index.entries[i].volume_id == volume_id) {
54
55 *dev_handle = volume_index.entries[i].dev_handle;
56 *volume_spec = volume_index.entries[i].volume_spec;
57
58 result = 0;
59 break;
60 }
61 }
62
63 return result;
64}
65
66void volume_index_init(void)
67{
68 volume_index_clear();
69}
70
71void volume_index_clear(void)
72{
73 memset(&volume_index, 0, sizeof(volume_index));
74}
75
76int volume_index_add(
77 unsigned int volume_id,
78 uintptr_t dev_handle,
79 uintptr_t volume_spec)
80{
81 int result = -1;
82
83 if (volume_index.size < VOLUME_INDEX_MAX_ENTRIES)
84 {
85 size_t i = volume_index.size;
86
87 ++volume_index.size;
88 volume_index.entries[i].volume_id = volume_id;
89 volume_index.entries[i].dev_handle = dev_handle;
90 volume_index.entries[i].volume_spec = volume_spec;
91
92 result = 0;
93 }
94
95 return result;
96}