xref: /aosp_15_r20/system/nvram/hal/nvram_device_adapter.cpp (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/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