1 #ifndef FW_CFG_H 2 #define FW_CFG_H 3 4 #include "exec/hwaddr.h" 5 #include "standard-headers/linux/qemu_fw_cfg.h" 6 #include "hw/sysbus.h" 7 #include "sysemu/dma.h" 8 9 #define TYPE_FW_CFG "fw_cfg" 10 #define TYPE_FW_CFG_IO "fw_cfg_io" 11 #define TYPE_FW_CFG_MEM "fw_cfg_mem" 12 13 #define FW_CFG(obj) OBJECT_CHECK(FWCfgState, (obj), TYPE_FW_CFG) 14 #define FW_CFG_IO(obj) OBJECT_CHECK(FWCfgIoState, (obj), TYPE_FW_CFG_IO) 15 #define FW_CFG_MEM(obj) OBJECT_CHECK(FWCfgMemState, (obj), TYPE_FW_CFG_MEM) 16 17 typedef struct fw_cfg_file FWCfgFile; 18 19 #define FW_CFG_ORDER_OVERRIDE_VGA 70 20 #define FW_CFG_ORDER_OVERRIDE_NIC 80 21 #define FW_CFG_ORDER_OVERRIDE_USER 100 22 #define FW_CFG_ORDER_OVERRIDE_DEVICE 110 23 24 void fw_cfg_set_order_override(FWCfgState *fw_cfg, int order); 25 void fw_cfg_reset_order_override(FWCfgState *fw_cfg); 26 27 typedef struct FWCfgFiles { 28 uint32_t count; 29 FWCfgFile f[]; 30 } FWCfgFiles; 31 32 typedef struct fw_cfg_dma_access FWCfgDmaAccess; 33 34 typedef void (*FWCfgCallback)(void *opaque); 35 typedef void (*FWCfgWriteCallback)(void *opaque, off_t start, size_t len); 36 37 struct FWCfgState { 38 /*< private >*/ 39 SysBusDevice parent_obj; 40 /*< public >*/ 41 42 uint16_t file_slots; 43 FWCfgEntry *entries[2]; 44 int *entry_order; 45 FWCfgFiles *files; 46 uint16_t cur_entry; 47 uint32_t cur_offset; 48 Notifier machine_ready; 49 50 int fw_cfg_order_override; 51 52 bool dma_enabled; 53 dma_addr_t dma_addr; 54 AddressSpace *dma_as; 55 MemoryRegion dma_iomem; 56 57 /* restore during migration */ 58 bool acpi_mr_restore; 59 uint64_t table_mr_size; 60 uint64_t linker_mr_size; 61 uint64_t rsdp_mr_size; 62 }; 63 64 struct FWCfgIoState { 65 /*< private >*/ 66 FWCfgState parent_obj; 67 /*< public >*/ 68 69 MemoryRegion comb_iomem; 70 }; 71 72 struct FWCfgMemState { 73 /*< private >*/ 74 FWCfgState parent_obj; 75 /*< public >*/ 76 77 MemoryRegion ctl_iomem, data_iomem; 78 uint32_t data_width; 79 MemoryRegionOps wide_data_ops; 80 }; 81 82 /** 83 * fw_cfg_add_bytes: 84 * @s: fw_cfg device being modified 85 * @key: selector key value for new fw_cfg item 86 * @data: pointer to start of item data 87 * @len: size of item data 88 * 89 * Add a new fw_cfg item, available by selecting the given key, as a raw 90 * "blob" of the given size. The data referenced by the starting pointer 91 * is only linked, NOT copied, into the data structure of the fw_cfg device. 92 */ 93 void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len); 94 95 /** 96 * fw_cfg_add_string: 97 * @s: fw_cfg device being modified 98 * @key: selector key value for new fw_cfg item 99 * @value: NUL-terminated ascii string 100 * 101 * Add a new fw_cfg item, available by selecting the given key. The item 102 * data will consist of a dynamically allocated copy of the provided string, 103 * including its NUL terminator. 104 */ 105 void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value); 106 107 /** 108 * fw_cfg_modify_string: 109 * @s: fw_cfg device being modified 110 * @key: selector key value for new fw_cfg item 111 * @value: NUL-terminated ascii string 112 * 113 * Replace the fw_cfg item available by selecting the given key. The new 114 * data will consist of a dynamically allocated copy of the provided string, 115 * including its NUL terminator. The data being replaced, assumed to have 116 * been dynamically allocated during an earlier call to either 117 * fw_cfg_add_string() or fw_cfg_modify_string(), is freed before returning. 118 */ 119 void fw_cfg_modify_string(FWCfgState *s, uint16_t key, const char *value); 120 121 /** 122 * fw_cfg_add_i16: 123 * @s: fw_cfg device being modified 124 * @key: selector key value for new fw_cfg item 125 * @value: 16-bit integer 126 * 127 * Add a new fw_cfg item, available by selecting the given key. The item 128 * data will consist of a dynamically allocated copy of the given 16-bit 129 * value, converted to little-endian representation. 130 */ 131 void fw_cfg_add_i16(FWCfgState *s, uint16_t key, uint16_t value); 132 133 /** 134 * fw_cfg_modify_i16: 135 * @s: fw_cfg device being modified 136 * @key: selector key value for new fw_cfg item 137 * @value: 16-bit integer 138 * 139 * Replace the fw_cfg item available by selecting the given key. The new 140 * data will consist of a dynamically allocated copy of the given 16-bit 141 * value, converted to little-endian representation. The data being replaced, 142 * assumed to have been dynamically allocated during an earlier call to 143 * either fw_cfg_add_i16() or fw_cfg_modify_i16(), is freed before returning. 144 */ 145 void fw_cfg_modify_i16(FWCfgState *s, uint16_t key, uint16_t value); 146 147 /** 148 * fw_cfg_add_i32: 149 * @s: fw_cfg device being modified 150 * @key: selector key value for new fw_cfg item 151 * @value: 32-bit integer 152 * 153 * Add a new fw_cfg item, available by selecting the given key. The item 154 * data will consist of a dynamically allocated copy of the given 32-bit 155 * value, converted to little-endian representation. 156 */ 157 void fw_cfg_add_i32(FWCfgState *s, uint16_t key, uint32_t value); 158 159 /** 160 * fw_cfg_modify_i32: 161 * @s: fw_cfg device being modified 162 * @key: selector key value for new fw_cfg item 163 * @value: 32-bit integer 164 * 165 * Replace the fw_cfg item available by selecting the given key. The new 166 * data will consist of a dynamically allocated copy of the given 32-bit 167 * value, converted to little-endian representation. The data being replaced, 168 * assumed to have been dynamically allocated during an earlier call to 169 * either fw_cfg_add_i32() or fw_cfg_modify_i32(), is freed before returning. 170 */ 171 void fw_cfg_modify_i32(FWCfgState *s, uint16_t key, uint32_t value); 172 173 /** 174 * fw_cfg_add_i64: 175 * @s: fw_cfg device being modified 176 * @key: selector key value for new fw_cfg item 177 * @value: 64-bit integer 178 * 179 * Add a new fw_cfg item, available by selecting the given key. The item 180 * data will consist of a dynamically allocated copy of the given 64-bit 181 * value, converted to little-endian representation. 182 */ 183 void fw_cfg_add_i64(FWCfgState *s, uint16_t key, uint64_t value); 184 185 /** 186 * fw_cfg_modify_i64: 187 * @s: fw_cfg device being modified 188 * @key: selector key value for new fw_cfg item 189 * @value: 64-bit integer 190 * 191 * Replace the fw_cfg item available by selecting the given key. The new 192 * data will consist of a dynamically allocated copy of the given 64-bit 193 * value, converted to little-endian representation. The data being replaced, 194 * assumed to have been dynamically allocated during an earlier call to 195 * either fw_cfg_add_i64() or fw_cfg_modify_i64(), is freed before returning. 196 */ 197 void fw_cfg_modify_i64(FWCfgState *s, uint16_t key, uint64_t value); 198 199 /** 200 * fw_cfg_add_file: 201 * @s: fw_cfg device being modified 202 * @filename: name of new fw_cfg file item 203 * @data: pointer to start of item data 204 * @len: size of item data 205 * 206 * Add a new NAMED fw_cfg item as a raw "blob" of the given size. The data 207 * referenced by the starting pointer is only linked, NOT copied, into the 208 * data structure of the fw_cfg device. 209 * The next available (unused) selector key starting at FW_CFG_FILE_FIRST 210 * will be used; also, a new entry will be added to the file directory 211 * structure residing at key value FW_CFG_FILE_DIR, containing the item name, 212 * data size, and assigned selector key value. 213 */ 214 void fw_cfg_add_file(FWCfgState *s, const char *filename, void *data, 215 size_t len); 216 217 /** 218 * fw_cfg_add_file_callback: 219 * @s: fw_cfg device being modified 220 * @filename: name of new fw_cfg file item 221 * @select_cb: callback function when selecting 222 * @write_cb: callback function after a write 223 * @callback_opaque: argument to be passed into callback function 224 * @data: pointer to start of item data 225 * @len: size of item data 226 * @read_only: is file read only 227 * 228 * Add a new NAMED fw_cfg item as a raw "blob" of the given size. The data 229 * referenced by the starting pointer is only linked, NOT copied, into the 230 * data structure of the fw_cfg device. 231 * The next available (unused) selector key starting at FW_CFG_FILE_FIRST 232 * will be used; also, a new entry will be added to the file directory 233 * structure residing at key value FW_CFG_FILE_DIR, containing the item name, 234 * data size, and assigned selector key value. 235 * Additionally, set a callback function (and argument) to be called each 236 * time this item is selected (by having its selector key either written to 237 * the fw_cfg control register, or passed to QEMU in FWCfgDmaAccess.control 238 * with FW_CFG_DMA_CTL_SELECT). 239 */ 240 void fw_cfg_add_file_callback(FWCfgState *s, const char *filename, 241 FWCfgCallback select_cb, 242 FWCfgWriteCallback write_cb, 243 void *callback_opaque, 244 void *data, size_t len, bool read_only); 245 246 /** 247 * fw_cfg_modify_file: 248 * @s: fw_cfg device being modified 249 * @filename: name of new fw_cfg file item 250 * @data: pointer to start of item data 251 * @len: size of item data 252 * 253 * Replace a NAMED fw_cfg item. If an existing item is found, its callback 254 * information will be cleared, and a pointer to its data will be returned 255 * to the caller, so that it may be freed if necessary. If an existing item 256 * is not found, this call defaults to fw_cfg_add_file(), and NULL is 257 * returned to the caller. 258 * In either case, the new item data is only linked, NOT copied, into the 259 * data structure of the fw_cfg device. 260 * 261 * Returns: pointer to old item's data, or NULL if old item does not exist. 262 */ 263 void *fw_cfg_modify_file(FWCfgState *s, const char *filename, void *data, 264 size_t len); 265 266 FWCfgState *fw_cfg_init_io_dma(uint32_t iobase, uint32_t dma_iobase, 267 AddressSpace *dma_as); 268 FWCfgState *fw_cfg_init_io(uint32_t iobase); 269 FWCfgState *fw_cfg_init_mem(hwaddr ctl_addr, hwaddr data_addr); 270 FWCfgState *fw_cfg_init_mem_wide(hwaddr ctl_addr, 271 hwaddr data_addr, uint32_t data_width, 272 hwaddr dma_addr, AddressSpace *dma_as); 273 274 FWCfgState *fw_cfg_find(void); 275 bool fw_cfg_dma_enabled(void *opaque); 276 277 /** 278 * fw_cfg_arch_key_name: 279 * 280 * @key: The uint16 selector key. 281 * 282 * The key is architecture-specific (the FW_CFG_ARCH_LOCAL mask is expected 283 * to be set in the key). 284 * 285 * Returns: The stringified architecture-specific name if the selector 286 * refers to a well-known numerically defined item, or NULL on 287 * key lookup failure. 288 */ 289 const char *fw_cfg_arch_key_name(uint16_t key); 290 291 #endif 292