/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <lk/list.h> #include <stdint.h> typedef uint64_t data_block_t; #define DATA_BLOCK_MAX (UINT64_MAX - 1) #define DATA_BLOCK_INVALID (UINT64_MAX) /** * struct block_device - Block device functions and state * @start_read: Function to start a read operation from block device. * @start_write: Function to start a write operation to block device. * @wait_for_io: Function to wait for read or write operations to * complete. If @start_read and @start_write always call * block_cache_complete_read and block_cache_complete_write * this can be %NULL. * @block_count: Number of blocks in block device. * @block_size: Number of bytes per block. * @block_num_size: Number of bytes used to store block numbers. * @mac_size: Number of bytes used to store mac values. * Must be 16 if @tamper_detecting is %false. * @tamper_detecting: %true if block device detects tampering of read and * write opeartions. %false otherwise. If %true, when a * write operation is reported as successfully completed * it should not be possible for non-secure code to modify * the stored data. * @io_ops: List os active read or write operations. Once * initialized, this list is managed by block cache, not by * the block device. */ struct block_device { void (*start_read)(struct block_device* dev, data_block_t block); void (*start_write)(struct block_device* dev, data_block_t block, const void* data, size_t data_size, bool sync); void (*wait_for_io)(struct block_device* dev); data_block_t block_count; size_t block_size; size_t block_num_size; size_t mac_size; bool tamper_detecting; struct list_node io_ops; };