xref: /openbmc/hiomapd/protocol.h (revision cb93504ed0fefa23186415accca6c0812174f274)
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