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