core/mctp/mctp_interface.h (70 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. #ifndef MCTP_INTERFACE_H_ #define MCTP_INTERFACE_H_ #include <stdbool.h> #include <stdint.h> #include "mctp_base_protocol.h" #include "platform_api.h" #include "cmd_interface/cmd_channel.h" #include "cmd_interface/cmd_interface_multi_handler.h" #include "cmd_interface/device_manager.h" #include "cmd_interface/msg_transport.h" /** * MCTP interface state for transactions started by device */ enum mctp_interface_response_state { MCTP_INTERFACE_RESPONSE_IDLE, /**< No active transaction started by device. */ MCTP_INTERFACE_RESPONSE_WAITING, /**< Request sent, waiting for a response. */ MCTP_INTERFACE_RESPONSE_PENDING, /**< Request sent, not waiting for a response. */ MCTP_INTERFACE_RESPONSE_TOO_BIG, /**< Received response was too large for the buffer. */ MCTP_INTERFACE_RESPONSE_SUCCESS, /**< Successfully received response from the target. */ MCTP_INTERFACE_RESPONSE_WAITING_DEPRECATED, /**< Using the deprecated workflow to wait for a response. */ MCTP_INTERFACE_RESPONSE_ERROR_DEPRECATED, /**< Deprecated indication of an error response. */ MCTP_INTERFACE_RESPONSE_FAIL_DEPRECATED, /**< Deprecated indication of a response processing failure. */ }; /** * Variable context for an SMBus MCTP handler. */ struct mctp_interface_state { uint8_t msg_buffer[MCTP_BASE_PROTOCOL_MAX_MESSAGE_LEN]; /**< Buffer for MCTP messages */ struct cmd_message resp_buffer; /**< Buffer for transmitting responses */ struct cmd_interface_msg req_buffer; /**< Buffer for request processing */ size_t start_packet_len; /**< Length of MCTP start packet */ uint8_t packet_seq; /**< Current MCTP exchange packet sequence */ uint8_t msg_tag; /**< Current MCTP exchange message tag */ uint8_t tag_owner; /**< Tag owner for the current message. */ uint8_t msg_type; /**< Current MCTP exchange message type */ int channel_id; /**< Channel ID associated with the interface. */ #ifdef CMD_ENABLE_ISSUE_REQUEST uint8_t response_msg_tag; /**< MCTP message tag for transaction we expect response for. */ uint8_t response_msg_type; /**< Expected message type of the response message. */ struct cmd_interface_msg *response_msg; /**< Descriptor for handling response messages. */ uint8_t next_msg_tag; /**< MCTP message tag for the next request. */ enum mctp_interface_response_state rsp_state; /**< State of transactions started by device */ platform_semaphore wait_for_response; /**< Semaphore used by requester to wait for response. */ platform_mutex request_lock; /**< Synchronization te serialize outgoing requests. */ platform_mutex response_lock; /**< Synchronization for internal response handling. */ #endif }; /** * Handler for MCTP messages using the SMBus binding to transport packets. * * TODO: Since the focus of this module really should be MCTP transport layer handling, the type * name should be changed to be more descriptive. At minimum, it should be mctp_transport, but even * better would be msg_transport_mctp_smbus. */ struct mctp_interface { #ifdef CMD_ENABLE_ISSUE_REQUEST struct msg_transport base; /**< Base transport API for sending requests. */ const struct cmd_channel *channel; /**< Command channel to use for sending requests. */ const struct cmd_interface *cmd_cerberus; /**< Deprecated handler for Cerberus responses. */ const struct cmd_interface *cmd_mctp; /**< Deprecated handler for MCTP responses. */ const struct cmd_interface *cmd_spdm; /**< Deprecated handler for SPDM responses. */ #endif struct mctp_interface_state *state; /**< Variable context for the handler. */ const struct cmd_interface_multi_handler *req_handler; /**< Handler for processing MCTP requests. */ struct device_manager *device_manager; /**< Device manager linked to command interface */ }; int mctp_interface_init (struct mctp_interface *mctp, struct mctp_interface_state *state, const struct cmd_interface_multi_handler *req_handler, struct device_manager *device_mgr, const struct cmd_channel *channel, const struct cmd_interface *cmd_cerberus, const struct cmd_interface *cmd_mctp, const struct cmd_interface *cmd_spdm); int mctp_interface_init_state (const struct mctp_interface *mctp); void mctp_interface_release (const struct mctp_interface *mctp); int mctp_interface_set_channel_id (const struct mctp_interface *mctp, int channel_id); int mctp_interface_process_packet (const struct mctp_interface *mctp, struct cmd_packet *rx_packet, struct cmd_message **tx_message); #ifdef CMD_ENABLE_ISSUE_REQUEST int mctp_interface_issue_request (const struct mctp_interface *mctp, const struct cmd_channel *channel, uint8_t dest_addr, uint8_t dest_eid, uint8_t *request, size_t length, uint8_t *msg_buffer, size_t max_buffer, uint32_t timeout_ms); int mctp_interface_send_discovery_notify (const struct mctp_interface *mctp, uint32_t timeout_ms, struct cmd_interface_msg *response); #endif #endif /* MCTP_INTERFACE_H_ */