blob: aa17c2616ea415514f2fb3edaf8171336e997d94 [file] [log] [blame]
Julian Hall4a658ac2022-10-20 10:44:49 +01001/*
2 * Copyright (c) 2022, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Julian Hall4a658ac2022-10-20 10:44:49 +01007#include "volume.h"
8
Gyorgy Szing3c446242023-03-31 01:53:15 +02009#include <errno.h>
10#include <stddef.h>
11
12void volume_init(struct volume *this_volume, const io_dev_funcs_t *io_dev_funcs,
13 uintptr_t concrete_volume)
Julian Hall4a658ac2022-10-20 10:44:49 +010014{
15 this_volume->dev_info.funcs = io_dev_funcs;
16 this_volume->dev_info.info = concrete_volume;
17
18 this_volume->dev_handle = (uintptr_t)&this_volume->dev_info;
19 this_volume->io_spec = concrete_volume;
20
21 this_volume->io_handle = 0;
22
23 /* Optional functions that a concrete volume may provide */
24 this_volume->erase = NULL;
25 this_volume->get_storage_ids = NULL;
26}
27
Gyorgy Szing3c446242023-03-31 01:53:15 +020028int volume_open(struct volume *this_volume)
Julian Hall4a658ac2022-10-20 10:44:49 +010029{
Gyorgy Szing3c446242023-03-31 01:53:15 +020030 return io_open(this_volume->dev_handle, this_volume->io_spec, &this_volume->io_handle);
Julian Hall4a658ac2022-10-20 10:44:49 +010031}
32
Gyorgy Szing3c446242023-03-31 01:53:15 +020033int volume_close(struct volume *this_volume)
Julian Hall4a658ac2022-10-20 10:44:49 +010034{
35 return io_close(this_volume->io_handle);
36}
37
Gyorgy Szing3c446242023-03-31 01:53:15 +020038int volume_seek(struct volume *this_volume, io_seek_mode_t mode, signed long long offset)
Julian Hall4a658ac2022-10-20 10:44:49 +010039{
40 return io_seek(this_volume->io_handle, mode, offset);
41}
42
Gyorgy Szing3c446242023-03-31 01:53:15 +020043int volume_size(struct volume *this_volume, size_t *size)
Julian Hall4a658ac2022-10-20 10:44:49 +010044{
45 return io_size(this_volume->io_handle, size);
46}
47
Gyorgy Szing3c446242023-03-31 01:53:15 +020048int volume_read(struct volume *this_volume, uintptr_t buffer, size_t length, size_t *length_read)
Julian Hall4a658ac2022-10-20 10:44:49 +010049{
50 return io_read(this_volume->io_handle, buffer, length, length_read);
51}
52
Gyorgy Szing3c446242023-03-31 01:53:15 +020053int volume_write(struct volume *this_volume, const uintptr_t buffer, size_t length,
54 size_t *length_written)
Julian Hall4a658ac2022-10-20 10:44:49 +010055{
56 return io_write(this_volume->io_handle, buffer, length, length_written);
57}
58
Gyorgy Szing3c446242023-03-31 01:53:15 +020059int volume_erase(struct volume *this_volume)
Julian Hall4a658ac2022-10-20 10:44:49 +010060{
Gyorgy Szing3c446242023-03-31 01:53:15 +020061 return (this_volume->erase) ? this_volume->erase(this_volume->dev_info.info) : 0;
Julian Hall4a658ac2022-10-20 10:44:49 +010062}
63
Gyorgy Szing3c446242023-03-31 01:53:15 +020064int volume_get_storage_ids(struct volume *this_volume, struct uuid_octets *partition_guid,
65 struct uuid_octets *parent_guid)
Julian Hall4a658ac2022-10-20 10:44:49 +010066{
67 if (this_volume->get_storage_ids)
Gyorgy Szing3c446242023-03-31 01:53:15 +020068 return this_volume->get_storage_ids(this_volume->dev_info.info, partition_guid,
69 parent_guid);
Julian Hall4a658ac2022-10-20 10:44:49 +010070
71 return -EIO;
72}