1 /* SPDX-License-Identifier: Apache-2.0 */ 2 /* Copyright (C) 2018 IBM Corp. */ 3 4 #ifndef PROTOCOL_H 5 #define PROTOCOL_H 6 7 struct mbox_context; 8 9 /* 10 * The GET_MBOX_INFO command is special as it can change the interface based on 11 * negotiation. As such we need to accommodate all response types 12 */ 13 struct protocol_get_info { 14 struct { 15 uint8_t api_version; 16 } req; 17 struct { 18 uint8_t api_version; 19 union { 20 struct { 21 uint16_t read_window_size; 22 uint16_t write_window_size; 23 } v1; 24 struct { 25 uint8_t block_size_shift; 26 uint16_t timeout; 27 } v2; 28 }; 29 } resp; 30 }; 31 32 struct protocol_get_flash_info { 33 struct { 34 union { 35 struct { 36 uint32_t flash_size; 37 uint32_t erase_size; 38 } v1; 39 struct { 40 uint16_t flash_size; 41 uint16_t erase_size; 42 } v2; 43 }; 44 } resp; 45 }; 46 47 struct protocol_create_window { 48 struct { 49 uint16_t offset; 50 uint16_t size; 51 uint8_t id; 52 bool ro; 53 } req; 54 struct { 55 uint16_t lpc_address; 56 uint16_t size; 57 uint16_t offset; 58 } resp; 59 }; 60 61 struct protocol_mark_dirty { 62 struct { 63 union { 64 struct { 65 uint16_t offset; 66 uint32_t size; 67 } v1; 68 struct { 69 uint16_t offset; 70 uint16_t size; 71 } v2; 72 }; 73 } req; 74 }; 75 76 struct protocol_erase { 77 struct { 78 uint16_t offset; 79 uint16_t size; 80 } req; 81 }; 82 83 struct protocol_flush { 84 struct { 85 uint16_t offset; 86 uint32_t size; 87 } req; 88 }; 89 90 struct protocol_close { 91 struct { 92 uint8_t flags; 93 } req; 94 }; 95 96 struct protocol_ack { 97 struct { 98 uint8_t flags; 99 } req; 100 }; 101 102 struct protocol_ops { 103 int (*reset)(struct mbox_context *context); 104 int (*get_info)(struct mbox_context *context, 105 struct protocol_get_info *io); 106 int (*get_flash_info)(struct mbox_context *context, 107 struct protocol_get_flash_info *io); 108 int (*create_window)(struct mbox_context *context, 109 struct protocol_create_window *io); 110 int (*mark_dirty)(struct mbox_context *context, 111 struct protocol_mark_dirty *io); 112 int (*erase)(struct mbox_context *context, struct protocol_erase *io); 113 int (*flush)(struct mbox_context *context, struct protocol_flush *io); 114 int (*close)(struct mbox_context *context, struct protocol_close *io); 115 int (*ack)(struct mbox_context *context, struct protocol_ack *io); 116 }; 117 118 int protocol_init(struct mbox_context *context); 119 void protocol_free(struct mbox_context *context); 120 121 int protocol_negotiate_version(struct mbox_context *context, uint8_t requested); 122 123 /* Protocol v1 */ 124 int protocol_v1_reset(struct mbox_context *context); 125 int protocol_v1_get_info(struct mbox_context *context, 126 struct protocol_get_info *io); 127 int protocol_v1_get_flash_info(struct mbox_context *context, 128 struct protocol_get_flash_info *io); 129 int protocol_v1_create_window(struct mbox_context *context, 130 struct protocol_create_window *io); 131 int protocol_v1_mark_dirty(struct mbox_context *context, 132 struct protocol_mark_dirty *io); 133 int protocol_v1_flush(struct mbox_context *context, struct protocol_flush *io); 134 int protocol_v1_close(struct mbox_context *context, struct protocol_close *io); 135 int protocol_v1_ack(struct mbox_context *context, struct protocol_ack *io); 136 137 /* Protocol v2 */ 138 int protocol_v2_get_info(struct mbox_context *context, 139 struct protocol_get_info *io); 140 int protocol_v2_get_flash_info(struct mbox_context *context, 141 struct protocol_get_flash_info *io); 142 int protocol_v2_create_window(struct mbox_context *context, 143 struct protocol_create_window *io); 144 int protocol_v2_mark_dirty(struct mbox_context *context, 145 struct protocol_mark_dirty *io); 146 int protocol_v2_erase(struct mbox_context *context, 147 struct protocol_erase *io); 148 int protocol_v2_flush(struct mbox_context *context, struct protocol_flush *io); 149 int protocol_v2_close(struct mbox_context *context, struct protocol_close *io); 150 151 #endif /* PROTOCOL_H */ 152