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