1 /*
2  * Copyright (c) 2022-2023, Arm Limited. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #include <string.h>
9 #include "storage_partition.h"
10 
11 
storage_partition_init(struct storage_partition * partition,const struct uuid_octets * partition_guid,size_t num_blocks,size_t block_size)12 void storage_partition_init(
13 	struct storage_partition *partition,
14 	const struct uuid_octets *partition_guid,
15 	size_t num_blocks,
16 	size_t block_size)
17 {
18 	memset(partition, 0, sizeof(struct storage_partition));
19 
20 	if (partition_guid) partition->partition_guid = *partition_guid;
21 	partition->block_size = block_size;
22 	partition->num_blocks = num_blocks;
23 
24 	partition->base_lba = 0;
25 	storage_partition_acl_init(&partition->acl);
26 }
27 
storage_partition_deinit(struct storage_partition * partition)28 void storage_partition_deinit(
29 	struct storage_partition *partition)
30 {
31 	memset(partition, 0, sizeof(struct storage_partition));
32 }
33 
storage_partition_grant_access(struct storage_partition * partition,uint32_t client_id)34 bool storage_partition_grant_access(
35 	struct storage_partition *partition,
36 	uint32_t client_id)
37 {
38 	return storage_partition_acl_add(&partition->acl, client_id);
39 }
40 
storage_partition_assign_ownership(struct storage_partition * partition,const char * owner_id)41 bool storage_partition_assign_ownership(
42 	struct storage_partition *partition,
43 	const char *owner_id)
44 {
45 	return storage_partition_acl_set_owner_id(&partition->acl, owner_id);
46 }
47 
storage_partition_is_guid_matched(const struct storage_partition * partition,const struct uuid_octets * partition_guid)48 bool storage_partition_is_guid_matched(
49 	const struct storage_partition *partition,
50 	const struct uuid_octets *partition_guid)
51 {
52 	return (memcmp(&partition->partition_guid, partition_guid, sizeof(struct uuid_octets)) == 0);
53 }
54 
storage_partition_is_open_permitted(struct storage_partition * partition,uint32_t client_id,storage_partition_authorizer authorizer)55 bool storage_partition_is_open_permitted(
56 	struct storage_partition *partition,
57 	uint32_t client_id,
58 	storage_partition_authorizer authorizer)
59 {
60 	return storage_partition_acl_authorize(&partition->acl, client_id, authorizer);
61 }
62 
storage_partition_is_access_permitted(const struct storage_partition * partition,uint32_t client_id)63 bool storage_partition_is_access_permitted(
64 	const struct storage_partition *partition,
65 	uint32_t client_id)
66 {
67 	return storage_partition_acl_check(&partition->acl, client_id);
68 }
69 
storage_partition_is_lba_legal(const struct storage_partition * partition,uint64_t lba)70 bool storage_partition_is_lba_legal(
71 	const struct storage_partition *partition,
72 	uint64_t lba)
73 {
74 	return lba < partition->num_blocks;
75 }
76 
storage_partition_clip_length(const struct storage_partition * partition,uint64_t lba,size_t offset,size_t req_len)77 size_t storage_partition_clip_length(
78 	const struct storage_partition *partition,
79 	uint64_t lba,
80 	size_t offset,
81 	size_t req_len)
82 {
83 	size_t clipped_len = 0;
84 
85 	if (lba < partition->num_blocks) {
86 
87 		size_t remaining_len = (partition->num_blocks - lba) * partition->block_size;
88 
89 		remaining_len = (offset < remaining_len) ? remaining_len - offset : 0;
90 		clipped_len = (req_len > remaining_len) ? remaining_len : req_len;
91 	}
92 
93 	return clipped_len;
94 }
95 
storage_partition_clip_num_blocks(const struct storage_partition * partition,uint64_t lba,size_t num_blocks)96 size_t storage_partition_clip_num_blocks(
97 	const struct storage_partition *partition,
98 	uint64_t lba,
99 	size_t num_blocks)
100 {
101 	size_t clipped_num_blocks = 0;
102 
103 	if (lba < partition->num_blocks) {
104 
105 		size_t remaining_blocks = partition->num_blocks - lba;
106 
107 		clipped_num_blocks = (num_blocks > remaining_blocks) ? remaining_blocks : num_blocks;
108 	}
109 
110 	return clipped_num_blocks;
111 }
112