xref: /aosp_15_r20/system/nvram/hal/tests/scoped_nvram_device.cc (revision 7ba4dab5cc5e3c8f3eb594dcf3b33f99d9214aee)
1*7ba4dab5SXin Li //
2*7ba4dab5SXin Li // Copyright (C) 2016 The Android Open Source Project
3*7ba4dab5SXin Li //
4*7ba4dab5SXin Li // Licensed under the Apache License, Version 2.0 (the "License");
5*7ba4dab5SXin Li // you may not use this file except in compliance with the License.
6*7ba4dab5SXin Li // You may obtain a copy of the License at
7*7ba4dab5SXin Li //
8*7ba4dab5SXin Li //      http://www.apache.org/licenses/LICENSE-2.0
9*7ba4dab5SXin Li //
10*7ba4dab5SXin Li // Unless required by applicable law or agreed to in writing, software
11*7ba4dab5SXin Li // distributed under the License is distributed on an "AS IS" BASIS,
12*7ba4dab5SXin Li // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*7ba4dab5SXin Li // See the License for the specific language governing permissions and
14*7ba4dab5SXin Li // limitations under the License.
15*7ba4dab5SXin Li //
16*7ba4dab5SXin Li 
17*7ba4dab5SXin Li #include "nvram/hal/tests/scoped_nvram_device.h"
18*7ba4dab5SXin Li 
19*7ba4dab5SXin Li #include <android-base/logging.h>
20*7ba4dab5SXin Li #include <hardware/hardware.h>
21*7ba4dab5SXin Li #include <hardware/nvram.h>
22*7ba4dab5SXin Li 
23*7ba4dab5SXin Li namespace {
24*7ba4dab5SXin Li 
StringToBytePtr(const std::string & s)25*7ba4dab5SXin Li const uint8_t* StringToBytePtr(const std::string& s) {
26*7ba4dab5SXin Li   return s.empty() ? nullptr : reinterpret_cast<const uint8_t*>(s.data());
27*7ba4dab5SXin Li }
28*7ba4dab5SXin Li 
StringToMutableBytePtr(std::string * s)29*7ba4dab5SXin Li uint8_t* StringToMutableBytePtr(std::string* s) {
30*7ba4dab5SXin Li   return reinterpret_cast<uint8_t*>(&s->front());
31*7ba4dab5SXin Li }
32*7ba4dab5SXin Li 
33*7ba4dab5SXin Li }  // namespace
34*7ba4dab5SXin Li 
35*7ba4dab5SXin Li namespace nvram {
36*7ba4dab5SXin Li 
ScopedNvramDevice()37*7ba4dab5SXin Li ScopedNvramDevice::ScopedNvramDevice() {
38*7ba4dab5SXin Li   const hw_module_t* module = nullptr;
39*7ba4dab5SXin Li   int result = hw_get_module(NVRAM_HARDWARE_MODULE_ID, &module);
40*7ba4dab5SXin Li   if (result) {
41*7ba4dab5SXin Li     LOG(ERROR) << "Failed to load NVRAM module: " << result;
42*7ba4dab5SXin Li     return;
43*7ba4dab5SXin Li   }
44*7ba4dab5SXin Li   result = nvram_open(module, &device_);
45*7ba4dab5SXin Li   if (result) {
46*7ba4dab5SXin Li     LOG(ERROR) << "Failed to open NVRAM device: " << result;
47*7ba4dab5SXin Li     device_ = nullptr;
48*7ba4dab5SXin Li     return;
49*7ba4dab5SXin Li   }
50*7ba4dab5SXin Li   if (device_->common.version != NVRAM_DEVICE_API_VERSION_1_1) {
51*7ba4dab5SXin Li     LOG(ERROR) << "Unsupported NVRAM HAL version.";
52*7ba4dab5SXin Li     nvram_close(device_);
53*7ba4dab5SXin Li     device_ = nullptr;
54*7ba4dab5SXin Li     return;
55*7ba4dab5SXin Li   }
56*7ba4dab5SXin Li }
57*7ba4dab5SXin Li 
~ScopedNvramDevice()58*7ba4dab5SXin Li ScopedNvramDevice::~ScopedNvramDevice() {
59*7ba4dab5SXin Li   if (device_) {
60*7ba4dab5SXin Li     int result = nvram_close(device_);
61*7ba4dab5SXin Li     if (result) {
62*7ba4dab5SXin Li       LOG(WARNING) << "Failed to close NVRAM device: " << result;
63*7ba4dab5SXin Li       return;
64*7ba4dab5SXin Li     }
65*7ba4dab5SXin Li   }
66*7ba4dab5SXin Li }
67*7ba4dab5SXin Li 
GetTotalSizeInBytes(uint64_t * total_size)68*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::GetTotalSizeInBytes(uint64_t* total_size) {
69*7ba4dab5SXin Li   if (!device_) {
70*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
71*7ba4dab5SXin Li   }
72*7ba4dab5SXin Li   return device_->get_total_size_in_bytes(device_, total_size);
73*7ba4dab5SXin Li }
74*7ba4dab5SXin Li 
GetAvailableSizeInBytes(uint64_t * available_size)75*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::GetAvailableSizeInBytes(
76*7ba4dab5SXin Li     uint64_t* available_size) {
77*7ba4dab5SXin Li   if (!device_) {
78*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
79*7ba4dab5SXin Li   }
80*7ba4dab5SXin Li   return device_->get_available_size_in_bytes(device_, available_size);
81*7ba4dab5SXin Li }
82*7ba4dab5SXin Li 
GetMaxSpaceSizeInBytes(uint64_t * max_space_size)83*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::GetMaxSpaceSizeInBytes(
84*7ba4dab5SXin Li     uint64_t* max_space_size) {
85*7ba4dab5SXin Li   if (!device_) {
86*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
87*7ba4dab5SXin Li   }
88*7ba4dab5SXin Li   return device_->get_max_space_size_in_bytes(device_, max_space_size);
89*7ba4dab5SXin Li }
90*7ba4dab5SXin Li 
GetMaxSpaces(uint32_t * num_spaces)91*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::GetMaxSpaces(uint32_t* num_spaces) {
92*7ba4dab5SXin Li   if (!device_) {
93*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
94*7ba4dab5SXin Li   }
95*7ba4dab5SXin Li   return device_->get_max_spaces(device_, num_spaces);
96*7ba4dab5SXin Li }
97*7ba4dab5SXin Li 
GetSpaceList(std::vector<uint32_t> * space_index_list)98*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::GetSpaceList(
99*7ba4dab5SXin Li     std::vector<uint32_t>* space_index_list) {
100*7ba4dab5SXin Li   if (!device_) {
101*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
102*7ba4dab5SXin Li   }
103*7ba4dab5SXin Li   uint32_t max_spaces = 0;
104*7ba4dab5SXin Li   nvram_result_t result = device_->get_max_spaces(device_, &max_spaces);
105*7ba4dab5SXin Li   if (result) {
106*7ba4dab5SXin Li     return result;
107*7ba4dab5SXin Li   }
108*7ba4dab5SXin Li   space_index_list->resize(max_spaces);
109*7ba4dab5SXin Li   uint32_t list_size = 0;
110*7ba4dab5SXin Li   result = device_->get_space_list(device_, max_spaces,
111*7ba4dab5SXin Li                                    space_index_list->data(), &list_size);
112*7ba4dab5SXin Li   if (result) {
113*7ba4dab5SXin Li     return result;
114*7ba4dab5SXin Li   }
115*7ba4dab5SXin Li   space_index_list->resize(list_size);
116*7ba4dab5SXin Li   return NV_RESULT_SUCCESS;
117*7ba4dab5SXin Li }
118*7ba4dab5SXin Li 
GetSpaceSize(uint32_t index,uint64_t * size)119*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::GetSpaceSize(uint32_t index, uint64_t* size) {
120*7ba4dab5SXin Li   if (!device_) {
121*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
122*7ba4dab5SXin Li   }
123*7ba4dab5SXin Li   return device_->get_space_size(device_, index, size);
124*7ba4dab5SXin Li }
125*7ba4dab5SXin Li 
GetSpaceControls(uint32_t index,std::vector<nvram_control_t> * control_list)126*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::GetSpaceControls(
127*7ba4dab5SXin Li     uint32_t index,
128*7ba4dab5SXin Li     std::vector<nvram_control_t>* control_list) {
129*7ba4dab5SXin Li   constexpr uint32_t kMaxControls = 16;
130*7ba4dab5SXin Li   if (!device_) {
131*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
132*7ba4dab5SXin Li   }
133*7ba4dab5SXin Li   control_list->resize(kMaxControls);
134*7ba4dab5SXin Li   uint32_t list_size = 0;
135*7ba4dab5SXin Li   nvram_result_t result = device_->get_space_controls(
136*7ba4dab5SXin Li       device_, index, kMaxControls, control_list->data(), &list_size);
137*7ba4dab5SXin Li   if (result) {
138*7ba4dab5SXin Li     return result;
139*7ba4dab5SXin Li   }
140*7ba4dab5SXin Li   control_list->resize(list_size);
141*7ba4dab5SXin Li   return NV_RESULT_SUCCESS;
142*7ba4dab5SXin Li }
143*7ba4dab5SXin Li 
IsSpaceLocked(uint32_t index,int * write_lock_enabled,int * read_lock_enabled)144*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::IsSpaceLocked(uint32_t index,
145*7ba4dab5SXin Li                                                 int* write_lock_enabled,
146*7ba4dab5SXin Li                                                 int* read_lock_enabled) {
147*7ba4dab5SXin Li   if (!device_) {
148*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
149*7ba4dab5SXin Li   }
150*7ba4dab5SXin Li   return device_->is_space_locked(device_, index, write_lock_enabled,
151*7ba4dab5SXin Li                                   read_lock_enabled);
152*7ba4dab5SXin Li }
153*7ba4dab5SXin Li 
CreateSpace(uint32_t index,uint64_t size_in_bytes,const std::vector<nvram_control_t> & control_list,const std::string & authorization_value)154*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::CreateSpace(
155*7ba4dab5SXin Li     uint32_t index,
156*7ba4dab5SXin Li     uint64_t size_in_bytes,
157*7ba4dab5SXin Li     const std::vector<nvram_control_t>& control_list,
158*7ba4dab5SXin Li     const std::string& authorization_value) {
159*7ba4dab5SXin Li   if (!device_) {
160*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
161*7ba4dab5SXin Li   }
162*7ba4dab5SXin Li   return device_->create_space(
163*7ba4dab5SXin Li       device_, index, size_in_bytes, control_list.data(), control_list.size(),
164*7ba4dab5SXin Li       StringToBytePtr(authorization_value), authorization_value.size());
165*7ba4dab5SXin Li }
166*7ba4dab5SXin Li 
DeleteSpace(uint32_t index,const std::string & authorization_value)167*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::DeleteSpace(
168*7ba4dab5SXin Li     uint32_t index,
169*7ba4dab5SXin Li     const std::string& authorization_value) {
170*7ba4dab5SXin Li   return device_->delete_space(device_, index,
171*7ba4dab5SXin Li                                StringToBytePtr(authorization_value),
172*7ba4dab5SXin Li                                authorization_value.size());
173*7ba4dab5SXin Li }
174*7ba4dab5SXin Li 
DisableCreate()175*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::DisableCreate() {
176*7ba4dab5SXin Li   if (!device_) {
177*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
178*7ba4dab5SXin Li   }
179*7ba4dab5SXin Li   return device_->disable_create(device_);
180*7ba4dab5SXin Li }
181*7ba4dab5SXin Li 
WriteSpace(uint32_t index,const std::string & data,const std::string & authorization_value)182*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::WriteSpace(
183*7ba4dab5SXin Li     uint32_t index,
184*7ba4dab5SXin Li     const std::string& data,
185*7ba4dab5SXin Li     const std::string& authorization_value) {
186*7ba4dab5SXin Li   if (!device_) {
187*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
188*7ba4dab5SXin Li   }
189*7ba4dab5SXin Li   return device_->write_space(device_, index, StringToBytePtr(data),
190*7ba4dab5SXin Li                               data.size(), StringToBytePtr(authorization_value),
191*7ba4dab5SXin Li                               authorization_value.size());
192*7ba4dab5SXin Li }
193*7ba4dab5SXin Li 
ReadSpace(uint32_t index,uint64_t num_bytes_to_read,const std::string & authorization_value,std::string * data)194*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::ReadSpace(
195*7ba4dab5SXin Li     uint32_t index,
196*7ba4dab5SXin Li     uint64_t num_bytes_to_read,
197*7ba4dab5SXin Li     const std::string& authorization_value,
198*7ba4dab5SXin Li     std::string* data) {
199*7ba4dab5SXin Li   if (!device_) {
200*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
201*7ba4dab5SXin Li   }
202*7ba4dab5SXin Li   data->resize(num_bytes_to_read);
203*7ba4dab5SXin Li   uint64_t bytes_read = 0;
204*7ba4dab5SXin Li   nvram_result_t result = device_->read_space(
205*7ba4dab5SXin Li       device_, index, num_bytes_to_read, StringToBytePtr(authorization_value),
206*7ba4dab5SXin Li       authorization_value.size(), StringToMutableBytePtr(data), &bytes_read);
207*7ba4dab5SXin Li   if (result) {
208*7ba4dab5SXin Li     return result;
209*7ba4dab5SXin Li   }
210*7ba4dab5SXin Li   data->resize(bytes_read);
211*7ba4dab5SXin Li   return NV_RESULT_SUCCESS;
212*7ba4dab5SXin Li }
213*7ba4dab5SXin Li 
EnableWriteLock(uint32_t index,const std::string & authorization_value)214*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::EnableWriteLock(
215*7ba4dab5SXin Li     uint32_t index,
216*7ba4dab5SXin Li     const std::string& authorization_value) {
217*7ba4dab5SXin Li   if (!device_) {
218*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
219*7ba4dab5SXin Li   }
220*7ba4dab5SXin Li   return device_->enable_write_lock(device_, index,
221*7ba4dab5SXin Li                                     StringToBytePtr(authorization_value),
222*7ba4dab5SXin Li                                     authorization_value.size());
223*7ba4dab5SXin Li }
224*7ba4dab5SXin Li 
EnableReadLock(uint32_t index,const std::string & authorization_value)225*7ba4dab5SXin Li nvram_result_t ScopedNvramDevice::EnableReadLock(
226*7ba4dab5SXin Li     uint32_t index,
227*7ba4dab5SXin Li     const std::string& authorization_value) {
228*7ba4dab5SXin Li   if (!device_) {
229*7ba4dab5SXin Li     return NV_RESULT_INTERNAL_ERROR;
230*7ba4dab5SXin Li   }
231*7ba4dab5SXin Li   return device_->enable_read_lock(device_, index,
232*7ba4dab5SXin Li                                    StringToBytePtr(authorization_value),
233*7ba4dab5SXin Li                                    authorization_value.size());
234*7ba4dab5SXin Li }
235*7ba4dab5SXin Li 
236*7ba4dab5SXin Li }  // namespace nvram
237