11e531afdSAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 */ 21e531afdSAndrew Jeffery /* Copyright (C) 2018 IBM Corp. */ 31e531afdSAndrew Jeffery 41e531afdSAndrew Jeffery #ifndef PROTOCOL_H 51e531afdSAndrew Jeffery #define PROTOCOL_H 61e531afdSAndrew Jeffery 71e531afdSAndrew Jeffery struct mbox_context; 8fe0c9e86SAndrew Jeffery struct transport_ops; 91e531afdSAndrew Jeffery 101e531afdSAndrew Jeffery /* 111e531afdSAndrew Jeffery * The GET_MBOX_INFO command is special as it can change the interface based on 121e531afdSAndrew Jeffery * negotiation. As such we need to accommodate all response types 131e531afdSAndrew Jeffery */ 141e531afdSAndrew Jeffery struct protocol_get_info { 151e531afdSAndrew Jeffery struct { 161e531afdSAndrew Jeffery uint8_t api_version; 171e531afdSAndrew Jeffery } req; 181e531afdSAndrew Jeffery struct { 191e531afdSAndrew Jeffery uint8_t api_version; 201e531afdSAndrew Jeffery union { 211e531afdSAndrew Jeffery struct { 221e531afdSAndrew Jeffery uint16_t read_window_size; 231e531afdSAndrew Jeffery uint16_t write_window_size; 241e531afdSAndrew Jeffery } v1; 251e531afdSAndrew Jeffery struct { 261e531afdSAndrew Jeffery uint8_t block_size_shift; 271e531afdSAndrew Jeffery uint16_t timeout; 281e531afdSAndrew Jeffery } v2; 291e531afdSAndrew Jeffery }; 301e531afdSAndrew Jeffery } resp; 311e531afdSAndrew Jeffery }; 321e531afdSAndrew Jeffery 3391a87454SAndrew Jeffery struct protocol_get_flash_info { 3491a87454SAndrew Jeffery struct { 3591a87454SAndrew Jeffery union { 3691a87454SAndrew Jeffery struct { 3791a87454SAndrew Jeffery uint32_t flash_size; 3891a87454SAndrew Jeffery uint32_t erase_size; 3991a87454SAndrew Jeffery } v1; 4091a87454SAndrew Jeffery struct { 4191a87454SAndrew Jeffery uint16_t flash_size; 4291a87454SAndrew Jeffery uint16_t erase_size; 4391a87454SAndrew Jeffery } v2; 4491a87454SAndrew Jeffery }; 4591a87454SAndrew Jeffery } resp; 4691a87454SAndrew Jeffery }; 4791a87454SAndrew Jeffery 4822fa5009SAndrew Jeffery struct protocol_create_window { 4922fa5009SAndrew Jeffery struct { 5022fa5009SAndrew Jeffery uint16_t offset; 5122fa5009SAndrew Jeffery uint16_t size; 5222fa5009SAndrew Jeffery uint8_t id; 534bcec8efSAndrew Jeffery bool ro; 5422fa5009SAndrew Jeffery } req; 5522fa5009SAndrew Jeffery struct { 5622fa5009SAndrew Jeffery uint16_t lpc_address; 5722fa5009SAndrew Jeffery uint16_t size; 5822fa5009SAndrew Jeffery uint16_t offset; 5922fa5009SAndrew Jeffery } resp; 6022fa5009SAndrew Jeffery }; 6122fa5009SAndrew Jeffery 62a336e43aSAndrew Jeffery struct protocol_mark_dirty { 63a336e43aSAndrew Jeffery struct { 64a336e43aSAndrew Jeffery union { 65a336e43aSAndrew Jeffery struct { 66a336e43aSAndrew Jeffery uint16_t offset; 67a336e43aSAndrew Jeffery uint32_t size; 68a336e43aSAndrew Jeffery } v1; 69a336e43aSAndrew Jeffery struct { 70a336e43aSAndrew Jeffery uint16_t offset; 71a336e43aSAndrew Jeffery uint16_t size; 72a336e43aSAndrew Jeffery } v2; 73a336e43aSAndrew Jeffery }; 74a336e43aSAndrew Jeffery } req; 75a336e43aSAndrew Jeffery }; 76a336e43aSAndrew Jeffery 7762a3daaeSAndrew Jeffery struct protocol_erase { 7862a3daaeSAndrew Jeffery struct { 7962a3daaeSAndrew Jeffery uint16_t offset; 8062a3daaeSAndrew Jeffery uint16_t size; 8162a3daaeSAndrew Jeffery } req; 8262a3daaeSAndrew Jeffery }; 8362a3daaeSAndrew Jeffery 849b920cf4SAndrew Jeffery struct protocol_flush { 859b920cf4SAndrew Jeffery struct { 869b920cf4SAndrew Jeffery uint16_t offset; 879b920cf4SAndrew Jeffery uint32_t size; 889b920cf4SAndrew Jeffery } req; 899b920cf4SAndrew Jeffery }; 9062a3daaeSAndrew Jeffery 91093eda5cSAndrew Jeffery struct protocol_close { 92093eda5cSAndrew Jeffery struct { 93093eda5cSAndrew Jeffery uint8_t flags; 94093eda5cSAndrew Jeffery } req; 95093eda5cSAndrew Jeffery }; 96093eda5cSAndrew Jeffery 97c5c83048SAndrew Jeffery struct protocol_ack { 98c5c83048SAndrew Jeffery struct { 99c5c83048SAndrew Jeffery uint8_t flags; 100c5c83048SAndrew Jeffery } req; 101c5c83048SAndrew Jeffery }; 102c5c83048SAndrew Jeffery 1031e531afdSAndrew Jeffery struct protocol_ops { 104ab666a57SAndrew Jeffery int (*reset)(struct mbox_context *context); 1051e531afdSAndrew Jeffery int (*get_info)(struct mbox_context *context, 1061e531afdSAndrew Jeffery struct protocol_get_info *io); 10791a87454SAndrew Jeffery int (*get_flash_info)(struct mbox_context *context, 10891a87454SAndrew Jeffery struct protocol_get_flash_info *io); 1094bcec8efSAndrew Jeffery int (*create_window)(struct mbox_context *context, 11022fa5009SAndrew Jeffery struct protocol_create_window *io); 111a336e43aSAndrew Jeffery int (*mark_dirty)(struct mbox_context *context, 112a336e43aSAndrew Jeffery struct protocol_mark_dirty *io); 11362a3daaeSAndrew Jeffery int (*erase)(struct mbox_context *context, struct protocol_erase *io); 1149b920cf4SAndrew Jeffery int (*flush)(struct mbox_context *context, struct protocol_flush *io); 115093eda5cSAndrew Jeffery int (*close)(struct mbox_context *context, struct protocol_close *io); 116c5c83048SAndrew Jeffery int (*ack)(struct mbox_context *context, struct protocol_ack *io); 1171e531afdSAndrew Jeffery }; 1181e531afdSAndrew Jeffery 1191e531afdSAndrew Jeffery int protocol_init(struct mbox_context *context); 1201e531afdSAndrew Jeffery void protocol_free(struct mbox_context *context); 1211e531afdSAndrew Jeffery 122*f69760daSAndrew Jeffery /* Sneaky reset: Don't tell the host */ 123*f69760daSAndrew Jeffery int __protocol_reset(struct mbox_context *context); 124*f69760daSAndrew Jeffery 125*f69760daSAndrew Jeffery /* Noisy reset: Tell the host */ 126*f69760daSAndrew Jeffery int protocol_reset(struct mbox_context *context); 127*f69760daSAndrew Jeffery 128fe0c9e86SAndrew Jeffery int protocol_events_put(struct mbox_context *context, 129fe0c9e86SAndrew Jeffery const struct transport_ops *ops); 1302ebfd20fSAndrew Jeffery int protocol_events_set(struct mbox_context *context, uint8_t bmc_event); 1312ebfd20fSAndrew Jeffery int protocol_events_clear(struct mbox_context *context, uint8_t bmc_event); 1325335f093SAndrew Jeffery 1331e531afdSAndrew Jeffery #endif /* PROTOCOL_H */ 134