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/nvram_device_adapter.h>
18*7ba4dab5SXin Li
19*7ba4dab5SXin Li #include <string.h>
20*7ba4dab5SXin Li
21*7ba4dab5SXin Li #include <algorithm>
22*7ba4dab5SXin Li #include <type_traits>
23*7ba4dab5SXin Li #include <utility>
24*7ba4dab5SXin Li
25*7ba4dab5SXin Li namespace nvram {
26*7ba4dab5SXin Li namespace {
27*7ba4dab5SXin Li
28*7ba4dab5SXin Li // Executes an operation on the |NvramDeviceAdapter| corresponding to |device|.
29*7ba4dab5SXin Li // |command| identifies the type of operation, |request_payload| provides the
30*7ba4dab5SXin Li // input parameters. Output parameters are stored in |response_payload|, and the
31*7ba4dab5SXin Li // the nvram operation result code is returned.
32*7ba4dab5SXin Li template <nvram::Command command,
33*7ba4dab5SXin Li typename RequestPayload,
34*7ba4dab5SXin Li typename ResponsePayload>
Execute(const nvram_device_t * device,RequestPayload && request_payload,ResponsePayload * response_payload)35*7ba4dab5SXin Li nvram_result_t Execute(const nvram_device_t* device,
36*7ba4dab5SXin Li RequestPayload&& request_payload,
37*7ba4dab5SXin Li ResponsePayload* response_payload) {
38*7ba4dab5SXin Li NvramDeviceAdapter* adapter = reinterpret_cast<NvramDeviceAdapter*>(
39*7ba4dab5SXin Li const_cast<nvram_device_t*>(device));
40*7ba4dab5SXin Li
41*7ba4dab5SXin Li nvram::Request request;
42*7ba4dab5SXin Li request.payload.Activate<command>() = std::move(request_payload);
43*7ba4dab5SXin Li nvram::Response response;
44*7ba4dab5SXin Li adapter->nvram_implementation()->Execute(request, &response);
45*7ba4dab5SXin Li if (response.result != NV_RESULT_SUCCESS) {
46*7ba4dab5SXin Li return response.result;
47*7ba4dab5SXin Li }
48*7ba4dab5SXin Li
49*7ba4dab5SXin Li ResponsePayload* response_payload_ptr = response.payload.get<command>();
50*7ba4dab5SXin Li if (!response_payload_ptr) {
51*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
52*7ba4dab5SXin Li }
53*7ba4dab5SXin Li *response_payload = std::move(*response_payload_ptr);
54*7ba4dab5SXin Li
55*7ba4dab5SXin Li return NV_RESULT_SUCCESS;
56*7ba4dab5SXin Li }
57*7ba4dab5SXin Li
58*7ba4dab5SXin Li // All the HAL methods need to be callable from C code.
59*7ba4dab5SXin Li extern "C" {
60*7ba4dab5SXin Li
device_get_total_size_in_bytes(const nvram_device_t * device,uint64_t * total_size)61*7ba4dab5SXin Li nvram_result_t device_get_total_size_in_bytes(const nvram_device_t* device,
62*7ba4dab5SXin Li uint64_t* total_size) {
63*7ba4dab5SXin Li nvram::GetInfoRequest get_info_request;
64*7ba4dab5SXin Li nvram::GetInfoResponse get_info_response;
65*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_INFO>(
66*7ba4dab5SXin Li device, std::move(get_info_request), &get_info_response);
67*7ba4dab5SXin Li *total_size = get_info_response.total_size;
68*7ba4dab5SXin Li return result;
69*7ba4dab5SXin Li }
70*7ba4dab5SXin Li
device_get_available_size_in_bytes(const nvram_device_t * device,uint64_t * available_size)71*7ba4dab5SXin Li nvram_result_t device_get_available_size_in_bytes(const nvram_device_t* device,
72*7ba4dab5SXin Li uint64_t* available_size) {
73*7ba4dab5SXin Li nvram::GetInfoRequest get_info_request;
74*7ba4dab5SXin Li nvram::GetInfoResponse get_info_response;
75*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_INFO>(
76*7ba4dab5SXin Li device, std::move(get_info_request), &get_info_response);
77*7ba4dab5SXin Li *available_size = get_info_response.available_size;
78*7ba4dab5SXin Li return result;
79*7ba4dab5SXin Li }
80*7ba4dab5SXin Li
device_get_max_space_size_in_bytes(const nvram_device_t * device,uint64_t * max_space_size)81*7ba4dab5SXin Li nvram_result_t device_get_max_space_size_in_bytes(const nvram_device_t* device,
82*7ba4dab5SXin Li uint64_t* max_space_size) {
83*7ba4dab5SXin Li nvram::GetInfoRequest get_info_request;
84*7ba4dab5SXin Li nvram::GetInfoResponse get_info_response;
85*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_INFO>(
86*7ba4dab5SXin Li device, std::move(get_info_request), &get_info_response);
87*7ba4dab5SXin Li *max_space_size = get_info_response.max_space_size;
88*7ba4dab5SXin Li return result;
89*7ba4dab5SXin Li }
90*7ba4dab5SXin Li
device_get_max_spaces(const nvram_device_t * device,uint32_t * num_spaces)91*7ba4dab5SXin Li nvram_result_t device_get_max_spaces(const nvram_device_t* device,
92*7ba4dab5SXin Li uint32_t* num_spaces) {
93*7ba4dab5SXin Li nvram::GetInfoRequest get_info_request;
94*7ba4dab5SXin Li nvram::GetInfoResponse get_info_response;
95*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_INFO>(
96*7ba4dab5SXin Li device, std::move(get_info_request), &get_info_response);
97*7ba4dab5SXin Li *num_spaces = get_info_response.max_spaces;
98*7ba4dab5SXin Li return result;
99*7ba4dab5SXin Li }
100*7ba4dab5SXin Li
device_get_space_list(const nvram_device_t * device,uint32_t max_list_size,uint32_t * space_index_list,uint32_t * list_size)101*7ba4dab5SXin Li nvram_result_t device_get_space_list(const nvram_device_t* device,
102*7ba4dab5SXin Li uint32_t max_list_size,
103*7ba4dab5SXin Li uint32_t* space_index_list,
104*7ba4dab5SXin Li uint32_t* list_size) {
105*7ba4dab5SXin Li nvram::GetInfoRequest get_info_request;
106*7ba4dab5SXin Li nvram::GetInfoResponse get_info_response;
107*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_INFO>(
108*7ba4dab5SXin Li device, std::move(get_info_request), &get_info_response);
109*7ba4dab5SXin Li
110*7ba4dab5SXin Li if (space_index_list) {
111*7ba4dab5SXin Li *list_size = std::min(get_info_response.space_list.size(),
112*7ba4dab5SXin Li static_cast<size_t>(max_list_size));
113*7ba4dab5SXin Li for (size_t i = 0; i < *list_size; ++i) {
114*7ba4dab5SXin Li space_index_list[i] = get_info_response.space_list[i];
115*7ba4dab5SXin Li }
116*7ba4dab5SXin Li } else {
117*7ba4dab5SXin Li *list_size = get_info_response.space_list.size();
118*7ba4dab5SXin Li }
119*7ba4dab5SXin Li
120*7ba4dab5SXin Li return result;
121*7ba4dab5SXin Li }
122*7ba4dab5SXin Li
device_get_space_size(const nvram_device_t * device,uint32_t index,uint64_t * size)123*7ba4dab5SXin Li nvram_result_t device_get_space_size(const nvram_device_t* device,
124*7ba4dab5SXin Li uint32_t index,
125*7ba4dab5SXin Li uint64_t* size) {
126*7ba4dab5SXin Li nvram::GetSpaceInfoRequest get_space_info_request;
127*7ba4dab5SXin Li get_space_info_request.index = index;
128*7ba4dab5SXin Li nvram::GetSpaceInfoResponse get_space_info_response;
129*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_SPACE_INFO>(
130*7ba4dab5SXin Li device, std::move(get_space_info_request), &get_space_info_response);
131*7ba4dab5SXin Li *size = get_space_info_response.size;
132*7ba4dab5SXin Li return result;
133*7ba4dab5SXin Li }
134*7ba4dab5SXin Li
device_get_space_controls(const nvram_device_t * device,uint32_t index,uint32_t max_list_size,nvram_control_t * control_list,uint32_t * list_size)135*7ba4dab5SXin Li nvram_result_t device_get_space_controls(const nvram_device_t* device,
136*7ba4dab5SXin Li uint32_t index,
137*7ba4dab5SXin Li uint32_t max_list_size,
138*7ba4dab5SXin Li nvram_control_t* control_list,
139*7ba4dab5SXin Li uint32_t* list_size) {
140*7ba4dab5SXin Li nvram::GetSpaceInfoRequest get_space_info_request;
141*7ba4dab5SXin Li get_space_info_request.index = index;
142*7ba4dab5SXin Li nvram::GetSpaceInfoResponse get_space_info_response;
143*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_SPACE_INFO>(
144*7ba4dab5SXin Li device, std::move(get_space_info_request), &get_space_info_response);
145*7ba4dab5SXin Li
146*7ba4dab5SXin Li if (control_list) {
147*7ba4dab5SXin Li *list_size = std::min(get_space_info_response.controls.size(),
148*7ba4dab5SXin Li static_cast<size_t>(max_list_size));
149*7ba4dab5SXin Li for (size_t i = 0; i < *list_size; ++i) {
150*7ba4dab5SXin Li control_list[i] = get_space_info_response.controls[i];
151*7ba4dab5SXin Li }
152*7ba4dab5SXin Li } else {
153*7ba4dab5SXin Li *list_size = get_space_info_response.controls.size();
154*7ba4dab5SXin Li }
155*7ba4dab5SXin Li
156*7ba4dab5SXin Li return result;
157*7ba4dab5SXin Li }
158*7ba4dab5SXin Li
device_is_space_locked(const nvram_device_t * device,uint32_t index,int * write_lock_enabled,int * read_lock_enabled)159*7ba4dab5SXin Li nvram_result_t device_is_space_locked(const nvram_device_t* device,
160*7ba4dab5SXin Li uint32_t index,
161*7ba4dab5SXin Li int* write_lock_enabled,
162*7ba4dab5SXin Li int* read_lock_enabled) {
163*7ba4dab5SXin Li nvram::GetSpaceInfoRequest get_space_info_request;
164*7ba4dab5SXin Li get_space_info_request.index = index;
165*7ba4dab5SXin Li nvram::GetSpaceInfoResponse get_space_info_response;
166*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_GET_SPACE_INFO>(
167*7ba4dab5SXin Li device, std::move(get_space_info_request), &get_space_info_response);
168*7ba4dab5SXin Li *write_lock_enabled = get_space_info_response.write_locked;
169*7ba4dab5SXin Li *read_lock_enabled = get_space_info_response.read_locked;
170*7ba4dab5SXin Li return result;
171*7ba4dab5SXin Li }
172*7ba4dab5SXin Li
device_create_space(const nvram_device_t * device,uint32_t index,uint64_t size_in_bytes,const nvram_control_t * control_list,uint32_t list_size,const uint8_t * authorization_value,uint32_t authorization_value_size)173*7ba4dab5SXin Li nvram_result_t device_create_space(const nvram_device_t* device,
174*7ba4dab5SXin Li uint32_t index,
175*7ba4dab5SXin Li uint64_t size_in_bytes,
176*7ba4dab5SXin Li const nvram_control_t* control_list,
177*7ba4dab5SXin Li uint32_t list_size,
178*7ba4dab5SXin Li const uint8_t* authorization_value,
179*7ba4dab5SXin Li uint32_t authorization_value_size) {
180*7ba4dab5SXin Li nvram::CreateSpaceRequest create_space_request;
181*7ba4dab5SXin Li create_space_request.index = index;
182*7ba4dab5SXin Li create_space_request.size = size_in_bytes;
183*7ba4dab5SXin Li if (!create_space_request.controls.Resize(list_size)) {
184*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
185*7ba4dab5SXin Li }
186*7ba4dab5SXin Li for (size_t i = 0; i < list_size; ++i) {
187*7ba4dab5SXin Li create_space_request.controls[i] = control_list[i];
188*7ba4dab5SXin Li }
189*7ba4dab5SXin Li if (!create_space_request.authorization_value.Assign(
190*7ba4dab5SXin Li authorization_value, authorization_value_size)) {
191*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
192*7ba4dab5SXin Li }
193*7ba4dab5SXin Li nvram::CreateSpaceResponse create_space_response;
194*7ba4dab5SXin Li return Execute<nvram::COMMAND_CREATE_SPACE>(
195*7ba4dab5SXin Li device, std::move(create_space_request), &create_space_response);
196*7ba4dab5SXin Li }
197*7ba4dab5SXin Li
device_delete_space(const nvram_device_t * device,uint32_t index,const uint8_t * authorization_value,uint32_t authorization_value_size)198*7ba4dab5SXin Li nvram_result_t device_delete_space(const nvram_device_t* device,
199*7ba4dab5SXin Li uint32_t index,
200*7ba4dab5SXin Li const uint8_t* authorization_value,
201*7ba4dab5SXin Li uint32_t authorization_value_size) {
202*7ba4dab5SXin Li nvram::DeleteSpaceRequest delete_space_request;
203*7ba4dab5SXin Li delete_space_request.index = index;
204*7ba4dab5SXin Li if (!delete_space_request.authorization_value.Assign(
205*7ba4dab5SXin Li authorization_value, authorization_value_size)) {
206*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
207*7ba4dab5SXin Li }
208*7ba4dab5SXin Li nvram::DeleteSpaceResponse delete_space_response;
209*7ba4dab5SXin Li return Execute<nvram::COMMAND_DELETE_SPACE>(
210*7ba4dab5SXin Li device, std::move(delete_space_request), &delete_space_response);
211*7ba4dab5SXin Li }
212*7ba4dab5SXin Li
device_disable_create(const nvram_device_t * device)213*7ba4dab5SXin Li nvram_result_t device_disable_create(const nvram_device_t* device) {
214*7ba4dab5SXin Li nvram::DisableCreateRequest disable_create_request;
215*7ba4dab5SXin Li nvram::DisableCreateResponse disable_create_response;
216*7ba4dab5SXin Li return Execute<nvram::COMMAND_DISABLE_CREATE>(
217*7ba4dab5SXin Li device, std::move(disable_create_request), &disable_create_response);
218*7ba4dab5SXin Li }
219*7ba4dab5SXin Li
device_write_space(const nvram_device_t * device,uint32_t index,const uint8_t * buffer,uint64_t buffer_size,const uint8_t * authorization_value,uint32_t authorization_value_size)220*7ba4dab5SXin Li nvram_result_t device_write_space(const nvram_device_t* device,
221*7ba4dab5SXin Li uint32_t index,
222*7ba4dab5SXin Li const uint8_t* buffer,
223*7ba4dab5SXin Li uint64_t buffer_size,
224*7ba4dab5SXin Li const uint8_t* authorization_value,
225*7ba4dab5SXin Li uint32_t authorization_value_size) {
226*7ba4dab5SXin Li nvram::WriteSpaceRequest write_space_request;
227*7ba4dab5SXin Li write_space_request.index = index;
228*7ba4dab5SXin Li if (!write_space_request.buffer.Assign(buffer, buffer_size) ||
229*7ba4dab5SXin Li !write_space_request.authorization_value.Assign(
230*7ba4dab5SXin Li authorization_value, authorization_value_size)) {
231*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
232*7ba4dab5SXin Li }
233*7ba4dab5SXin Li nvram::WriteSpaceResponse write_space_response;
234*7ba4dab5SXin Li return Execute<nvram::COMMAND_WRITE_SPACE>(
235*7ba4dab5SXin Li device, std::move(write_space_request), &write_space_response);
236*7ba4dab5SXin Li }
237*7ba4dab5SXin Li
device_read_space(const nvram_device_t * device,uint32_t index,uint64_t num_bytes_to_read,const uint8_t * authorization_value,uint32_t authorization_value_size,uint8_t * buffer,uint64_t * bytes_read)238*7ba4dab5SXin Li nvram_result_t device_read_space(const nvram_device_t* device,
239*7ba4dab5SXin Li uint32_t index,
240*7ba4dab5SXin Li uint64_t num_bytes_to_read,
241*7ba4dab5SXin Li const uint8_t* authorization_value,
242*7ba4dab5SXin Li uint32_t authorization_value_size,
243*7ba4dab5SXin Li uint8_t* buffer,
244*7ba4dab5SXin Li uint64_t* bytes_read) {
245*7ba4dab5SXin Li nvram::ReadSpaceRequest read_space_request;
246*7ba4dab5SXin Li read_space_request.index = index;
247*7ba4dab5SXin Li if (!read_space_request.authorization_value.Assign(
248*7ba4dab5SXin Li authorization_value, authorization_value_size)) {
249*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
250*7ba4dab5SXin Li }
251*7ba4dab5SXin Li nvram::ReadSpaceResponse read_space_response;
252*7ba4dab5SXin Li nvram_result_t result = Execute<nvram::COMMAND_READ_SPACE>(
253*7ba4dab5SXin Li device, std::move(read_space_request), &read_space_response);
254*7ba4dab5SXin Li *bytes_read = std::min(static_cast<size_t>(num_bytes_to_read),
255*7ba4dab5SXin Li read_space_response.buffer.size());
256*7ba4dab5SXin Li memcpy(buffer, read_space_response.buffer.data(), *bytes_read);
257*7ba4dab5SXin Li return result;
258*7ba4dab5SXin Li }
259*7ba4dab5SXin Li
device_enable_write_lock(const nvram_device_t * device,uint32_t index,const uint8_t * authorization_value,uint32_t authorization_value_size)260*7ba4dab5SXin Li nvram_result_t device_enable_write_lock(const nvram_device_t* device,
261*7ba4dab5SXin Li uint32_t index,
262*7ba4dab5SXin Li const uint8_t* authorization_value,
263*7ba4dab5SXin Li uint32_t authorization_value_size) {
264*7ba4dab5SXin Li nvram::LockSpaceWriteRequest lock_space_write_request;
265*7ba4dab5SXin Li lock_space_write_request.index = index;
266*7ba4dab5SXin Li if (!lock_space_write_request.authorization_value.Assign(
267*7ba4dab5SXin Li authorization_value, authorization_value_size)) {
268*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
269*7ba4dab5SXin Li }
270*7ba4dab5SXin Li nvram::LockSpaceWriteResponse lock_space_write_response;
271*7ba4dab5SXin Li return Execute<nvram::COMMAND_LOCK_SPACE_WRITE>(
272*7ba4dab5SXin Li device, std::move(lock_space_write_request), &lock_space_write_response);
273*7ba4dab5SXin Li }
274*7ba4dab5SXin Li
device_enable_read_lock(const nvram_device_t * device,uint32_t index,const uint8_t * authorization_value,uint32_t authorization_value_size)275*7ba4dab5SXin Li nvram_result_t device_enable_read_lock(const nvram_device_t* device,
276*7ba4dab5SXin Li uint32_t index,
277*7ba4dab5SXin Li const uint8_t* authorization_value,
278*7ba4dab5SXin Li uint32_t authorization_value_size) {
279*7ba4dab5SXin Li nvram::LockSpaceReadRequest lock_space_read_request;
280*7ba4dab5SXin Li lock_space_read_request.index = index;
281*7ba4dab5SXin Li if (!lock_space_read_request.authorization_value.Assign(
282*7ba4dab5SXin Li authorization_value, authorization_value_size)) {
283*7ba4dab5SXin Li return NV_RESULT_INTERNAL_ERROR;
284*7ba4dab5SXin Li }
285*7ba4dab5SXin Li nvram::LockSpaceReadResponse lock_space_read_response;
286*7ba4dab5SXin Li return Execute<nvram::COMMAND_LOCK_SPACE_READ>(
287*7ba4dab5SXin Li device, std::move(lock_space_read_request), &lock_space_read_response);
288*7ba4dab5SXin Li }
289*7ba4dab5SXin Li
device_nvram_device_close(struct hw_device_t * device)290*7ba4dab5SXin Li int device_nvram_device_close(struct hw_device_t* device) {
291*7ba4dab5SXin Li delete reinterpret_cast<NvramDeviceAdapter*>(
292*7ba4dab5SXin Li reinterpret_cast<nvram_device_t*>(device));
293*7ba4dab5SXin Li return 0;
294*7ba4dab5SXin Li }
295*7ba4dab5SXin Li
296*7ba4dab5SXin Li } // extern "C"
297*7ba4dab5SXin Li } // namespace
298*7ba4dab5SXin Li
NvramDeviceAdapter(const hw_module_t * module,NvramImplementation * implementation)299*7ba4dab5SXin Li NvramDeviceAdapter::NvramDeviceAdapter(const hw_module_t* module,
300*7ba4dab5SXin Li NvramImplementation* implementation)
301*7ba4dab5SXin Li : implementation_(implementation) {
302*7ba4dab5SXin Li memset(&device_, 0, sizeof(nvram_device_t));
303*7ba4dab5SXin Li
304*7ba4dab5SXin Li device_.common.tag = HARDWARE_DEVICE_TAG;
305*7ba4dab5SXin Li device_.common.version = NVRAM_DEVICE_API_VERSION_1_1;
306*7ba4dab5SXin Li device_.common.module = const_cast<hw_module_t *>(module);
307*7ba4dab5SXin Li device_.common.close = device_nvram_device_close;
308*7ba4dab5SXin Li
309*7ba4dab5SXin Li device_.get_total_size_in_bytes = device_get_total_size_in_bytes;
310*7ba4dab5SXin Li device_.get_available_size_in_bytes = device_get_available_size_in_bytes;
311*7ba4dab5SXin Li device_.get_max_space_size_in_bytes = device_get_max_space_size_in_bytes;
312*7ba4dab5SXin Li device_.get_max_spaces = device_get_max_spaces;
313*7ba4dab5SXin Li device_.get_space_list = device_get_space_list;
314*7ba4dab5SXin Li device_.get_space_size = device_get_space_size;
315*7ba4dab5SXin Li device_.get_space_controls = device_get_space_controls;
316*7ba4dab5SXin Li device_.is_space_locked = device_is_space_locked;
317*7ba4dab5SXin Li device_.create_space = device_create_space;
318*7ba4dab5SXin Li device_.delete_space = device_delete_space;
319*7ba4dab5SXin Li device_.disable_create = device_disable_create;
320*7ba4dab5SXin Li device_.write_space = device_write_space;
321*7ba4dab5SXin Li device_.read_space = device_read_space;
322*7ba4dab5SXin Li device_.enable_write_lock = device_enable_write_lock;
323*7ba4dab5SXin Li device_.enable_read_lock = device_enable_read_lock;
324*7ba4dab5SXin Li }
325*7ba4dab5SXin Li
326*7ba4dab5SXin Li } // namespace nvram
327