/* SPDX-License-Identifier: Apache-2.0 */ /* Copyright (C) 2018 IBM Corp. */ #ifndef PROTOCOL_H #define PROTOCOL_H struct mbox_context; struct transport_ops; /* * The GET_MBOX_INFO command is special as it can change the interface based on * negotiation. As such we need to accommodate all response types */ struct protocol_get_info { struct { uint8_t api_version; } req; struct { uint8_t api_version; union { struct { uint16_t read_window_size; uint16_t write_window_size; } v1; struct { uint8_t block_size_shift; uint16_t timeout; } v2; }; } resp; }; struct protocol_get_flash_info { struct { union { struct { uint32_t flash_size; uint32_t erase_size; } v1; struct { uint16_t flash_size; uint16_t erase_size; } v2; }; } resp; }; struct protocol_create_window { struct { uint16_t offset; uint16_t size; uint8_t id; bool ro; } req; struct { uint16_t lpc_address; uint16_t size; uint16_t offset; } resp; }; struct protocol_mark_dirty { struct { union { struct { uint16_t offset; uint32_t size; } v1; struct { uint16_t offset; uint16_t size; } v2; }; } req; }; struct protocol_erase { struct { uint16_t offset; uint16_t size; } req; }; struct protocol_flush { struct { uint16_t offset; uint32_t size; } req; }; struct protocol_close { struct { uint8_t flags; } req; }; struct protocol_ack { struct { uint8_t flags; } req; }; struct protocol_ops { int (*reset)(struct mbox_context *context); int (*get_info)(struct mbox_context *context, struct protocol_get_info *io); int (*get_flash_info)(struct mbox_context *context, struct protocol_get_flash_info *io); int (*create_window)(struct mbox_context *context, struct protocol_create_window *io); int (*mark_dirty)(struct mbox_context *context, struct protocol_mark_dirty *io); int (*erase)(struct mbox_context *context, struct protocol_erase *io); int (*flush)(struct mbox_context *context, struct protocol_flush *io); int (*close)(struct mbox_context *context, struct protocol_close *io); int (*ack)(struct mbox_context *context, struct protocol_ack *io); }; int protocol_init(struct mbox_context *context); void protocol_free(struct mbox_context *context); /* Sneaky reset: Don't tell the host */ int __protocol_reset(struct mbox_context *context); /* Noisy reset: Tell the host */ int protocol_reset(struct mbox_context *context); int protocol_events_put(struct mbox_context *context, const struct transport_ops *ops); int protocol_events_set(struct mbox_context *context, uint8_t bmc_event); int protocol_events_clear(struct mbox_context *context, uint8_t bmc_event); #endif /* PROTOCOL_H */