core/pcisig/tdisp/tdisp_tdi_context_manager.h (74 lines of code) (raw):
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
#ifndef TDISP_TDI_CONTEXT_MANAGER_H_
#define TDISP_TDI_CONTEXT_MANAGER_H_
#include <stddef.h>
#include <stdint.h>
#include "tdisp_protocol.h"
#include "status/rot_status.h"
/**
* TDISP TDI context bit mask for each supported field
*/
enum {
TDISP_TDI_CONTEXT_MASK_NONCE = 0x0001, /**< TDI start nonce field */
TDISP_TDI_CONTEXT_MASK_LOCK_FLAGS = 0x0002, /**< TDI lock flags field */
TDISP_TDI_CONTEXT_MASK_DEFAULT_IDE_STREAM_ID = 0x0004, /**< TDI default IDE stream ID field */
TDISP_TDI_CONTEXT_MASK_MMIO_REPORTING_OFFSET = 0x0008, /**< TDI MMIO reporting offset field */
TDISP_TDI_CONTEXT_MASK_BIND_P2P_ADDRESS_MASK = 0x0010, /**< TDI bind P2P address mask field */
TDISP_TDI_CONTEXT_MASK_RESERVED_0 = 0x0020, /**< TDI reserved[0] field */
TDISP_TDI_CONTEXT_MASK_RESERVED_1 = 0x0040, /**< TDI reserved[1] field */
TDISP_TDI_CONTEXT_MASK_RESERVED_2 = 0x0080, /**< TDI reserved[2] field */
TDISP_TDI_CONTEXT_MASK_RESERVED_3 = 0x0100, /**< TDI reserved[3] field */
};
/**
* TDI interface context
*/
struct tdisp_tdi_context {
uint32_t tdi_context_mask; /**< TDI context mask indicating validity of each field */
uint8_t start_interface_nonce[TDISP_START_INTERFACE_NONCE_SIZE]; /**< Start interface nonce. */
uint16_t lock_flags; /**< interface lock flags */
uint8_t default_ide_stream_id; /**< default IDE stream ID */
uint64_t mmio_reporting_offset; /**< MMIO reporting offset */
uint64_t bind_p2p_address_mask; /**< P2P binding address mask */
uint32_t reserved[4]; /**< Reserved */
};
/**
* Abstract interface for managing TDI contexts. This interface will be shared between
* TDISP responder and TDISP driver and any other entities which would require access
* to TDI context. Implementation is supposed to hide any details where and how this
* information will be stored.
*/
struct tdisp_tdi_context_manager {
/**
* Clears context for specific TDI
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
*
* @return 0 on success, error code otherwise
*/
int (*clear_tdi_context) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id);
/**
* Clears all TDI contexts
*
* @param mgr - TDI context manager
*
* @return 0 on success, error code otherwise
*/
int (*clear_all_tdi_context) (const struct tdisp_tdi_context_manager *mgr);
/**
* Gets context for specific TDI
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
* @param context_mask - Specifies context mask which indicates which fields should be
* populated in the context struct
* @param context - Output struct to receive context information
*
* @return 0 on success, error code otherwise
*/
int (*get_tdi_context) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id,
uint32_t context_mask, struct tdisp_tdi_context *context);
/**
* Sets TDI start nonce
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
* @param nonce - array representing TDI start nonce
* @param nonce_size - nonce size
*
* @return 0 on success, error code otherwise
*/
int (*set_start_nonce) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id,
const uint8_t *nonce, size_t nonce_size);
/**
* Sets TDI lock flags
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
* @param lock_flags - TDI lock flags
*
* @return 0 on success, error code otherwise
*/
int (*set_lock_flags) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id,
uint16_t lock_flags);
/**
* Sets TDI default IDE stream ID
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
* @param ide_stream_id Default IDE stream ID
*
* @return 0 on success, error code otherwise
*/
int (*set_default_ide_stream) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id,
uint8_t ide_stream_id);
/**
* Sets TDI MMIO reporting offset
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
* @param mmio_reporting_offset - MMIO reporting offset for this TDI
*
* @return 0 on success, error code otherwise
*/
int (*set_mmio_reporting_offset) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id,
uint64_t mmio_reporting_offset);
/**
* Sets TDI bind P2P address mask
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
* @param bind_p2p_address_mask - Bind P2P address mask
*
* @return 0 on success, error code otherwise
*/
int (*set_bind_p2p_address_mask) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id,
uint64_t bind_p2p_address_mask);
/**
* Sets reserved field
*
* @param mgr TDI context manager
* @param tdi_id TDI interface id
* @param index - reserved value index
* @param value - reserved value
*
* @return 0 on success, error code otherwise
*/
int (*set_reserved) (const struct tdisp_tdi_context_manager *mgr, uint32_t tdi_id,
uint8_t index, uint32_t value);
};
int tdisp_tdi_context_clear (struct tdisp_tdi_context *context);
int tdisp_tdi_context_set_start_nonce (struct tdisp_tdi_context *context, const uint8_t *nonce,
size_t nonce_size);
int tdisp_tdi_context_set_lock_flags (struct tdisp_tdi_context *context, uint32_t lock_flags);
int tdisp_tdi_context_set_default_ide_stream (struct tdisp_tdi_context *context,
uint8_t ide_stream_id);
int tdisp_tdi_context_set_mmio_reporting_offset (struct tdisp_tdi_context *context,
uint64_t mmio_reporting_offset);
int tdisp_tdi_context_set_bind_p2p_address_mask (struct tdisp_tdi_context *context,
uint64_t bind_p2p_address_mask);
int tdisp_tdi_context_set_reserved (struct tdisp_tdi_context *context, uint32_t index,
uint32_t value);
#define TDISP_TDI_CONTEXT_MANAGER_ERROR(code) \
ROT_ERROR (ROT_MODULE_TDISP_TDI_CONTEXT_MANAGER, code)
/**
* Error codes that can be generated by the TDISP TDI context manager interface.
*/
enum {
TDISP_TDI_CONTEXT_MANAGER_INVALID_ARGUMENT = TDISP_TDI_CONTEXT_MANAGER_ERROR (0x00), /**< Input parameter is null or not valid. */
TDISP_TDI_CONTEXT_MANAGER_NO_MEMORY = TDISP_TDI_CONTEXT_MANAGER_ERROR (0x01), /**< Memory allocation failed. */
TDISP_TDI_CONTEXT_MANAGER_CLEAR_TDI_CONTEXT_FAILED = TDISP_TDI_CONTEXT_MANAGER_ERROR (0x02), /**< Failure to clear TDI context */
TDISP_TDI_CONTEXT_MANAGER_CLEAR_ALL_TDI_CONTEXT_FAILED = TDISP_TDI_CONTEXT_MANAGER_ERROR (0x03), /**< Failure to clear all TDI contexts */
TDISP_TDI_CONTEXT_MANAGER_GET_TDI_CONTEXT_FAILED = TDISP_TDI_CONTEXT_MANAGER_ERROR (0x04), /**< Failure to get TDI contexts */
TDISP_TDI_CONTEXT_MANAGER_SET_START_NONCE_FAILED = TDISP_TDI_CONTEXT_MANAGER_ERROR (0x05), /**< Failure to set TDI start nonce */
TDISP_TDI_CONTEXT_MANAGER_SET_LOCK_FLAGS_FAILED = TDISP_TDI_CONTEXT_MANAGER_ERROR (0x06), /**< Failure to set TDI lock flags */
TDISP_TDI_CONTEXT_MANAGER_SET_DEFAULT_IDE_STREAM_ID_FAILED =
TDISP_TDI_CONTEXT_MANAGER_ERROR (0x07), /**< Failure to set default IDE stream ID */
TDISP_TDI_CONTEXT_MANAGER_SET_MMIO_REPORTING_OFFSET_FAILED =
TDISP_TDI_CONTEXT_MANAGER_ERROR (0x08), /**< Failure to set TDI MMIO reporting offset */
TDISP_TDI_CONTEXT_MANAGER_SET_BIND_P2P_ADDRESS_MAKS_FAILED =
TDISP_TDI_CONTEXT_MANAGER_ERROR (0x09), /**< Failure to set TDI bind P2P address mask */
};
#endif // TDISP_TDI_CONTEXT_MANAGER_H_