blob: aeab9ff7224b257578c4fc64faad5833dbf02309 [file] [log] [blame]
/*
* 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 unsigned long long data_block_t;
/**
* 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);
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;
};