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