126558dbbSAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 */ 226558dbbSAndrew Jeffery /* Copyright (C) 2018 IBM Corp. */ 326558dbbSAndrew Jeffery 426558dbbSAndrew Jeffery #ifndef MBOX_H 526558dbbSAndrew Jeffery #define MBOX_H 626558dbbSAndrew Jeffery 7f1e547c7SEvan Lojewski #include <assert.h> 8*ef0c8360SStewart Smith #include <linux/blktrace_api.h> 926558dbbSAndrew Jeffery #include <mtd/mtd-abi.h> 1026558dbbSAndrew Jeffery #include <systemd/sd-bus.h> 1126558dbbSAndrew Jeffery #include <poll.h> 1226558dbbSAndrew Jeffery #include <stdbool.h> 1326558dbbSAndrew Jeffery 14f1e547c7SEvan Lojewski #include "backend.h" 1526558dbbSAndrew Jeffery #include "protocol.h" 1626558dbbSAndrew Jeffery #include "transport.h" 17f4bc335bSAndrew Jeffery #include "vpnor/backend.h" 1826558dbbSAndrew Jeffery #include "windows.h" 1926558dbbSAndrew Jeffery 2026558dbbSAndrew Jeffery enum api_version { 2126558dbbSAndrew Jeffery API_VERSION_INVAL = 0, 2226558dbbSAndrew Jeffery API_VERSION_1 = 1, 2326558dbbSAndrew Jeffery API_VERSION_2 = 2 2426558dbbSAndrew Jeffery }; 2526558dbbSAndrew Jeffery 2626558dbbSAndrew Jeffery #define API_MIN_VERSION API_VERSION_1 2726558dbbSAndrew Jeffery #define API_MAX_VERSION API_VERSION_2 2826558dbbSAndrew Jeffery 2926558dbbSAndrew Jeffery #define THIS_NAME "Mailbox Daemon" 3026558dbbSAndrew Jeffery 3126558dbbSAndrew Jeffery /* Argument Flags */ 3226558dbbSAndrew Jeffery #define FLAGS_NONE 0x00 3326558dbbSAndrew Jeffery #define FLAGS_SHORT_LIFETIME 0x01 3426558dbbSAndrew Jeffery 3526558dbbSAndrew Jeffery /* BMC Event Notification */ 36fab672bdSAndrew Jeffery #define BMC_EVENT_PROTOCOL_RESET 0x01 3726558dbbSAndrew Jeffery #define BMC_EVENT_WINDOW_RESET 0x02 38fab672bdSAndrew Jeffery #define BMC_EVENT_ACK_MASK (BMC_EVENT_PROTOCOL_RESET | \ 3926558dbbSAndrew Jeffery BMC_EVENT_WINDOW_RESET) 4026558dbbSAndrew Jeffery #define BMC_EVENT_FLASH_CTRL_LOST 0x40 4126558dbbSAndrew Jeffery #define BMC_EVENT_DAEMON_READY 0x80 42fab672bdSAndrew Jeffery #define BMC_EVENT_V1_MASK BMC_EVENT_PROTOCOL_RESET 43fab672bdSAndrew Jeffery #define BMC_EVENT_V2_MASK (BMC_EVENT_PROTOCOL_RESET | \ 4426558dbbSAndrew Jeffery BMC_EVENT_WINDOW_RESET | \ 4526558dbbSAndrew Jeffery BMC_EVENT_FLASH_CTRL_LOST | \ 4626558dbbSAndrew Jeffery BMC_EVENT_DAEMON_READY) 4726558dbbSAndrew Jeffery 4826558dbbSAndrew Jeffery /* Put polled file descriptors first */ 4926558dbbSAndrew Jeffery #define DBUS_FD 0 5026558dbbSAndrew Jeffery #define MBOX_FD 1 5126558dbbSAndrew Jeffery #define SIG_FD 2 5226558dbbSAndrew Jeffery #define POLL_FDS 3 /* Number of FDs we poll on */ 5326558dbbSAndrew Jeffery #define LPC_CTRL_FD 3 54f1e547c7SEvan Lojewski #define TOTAL_FDS 4 5526558dbbSAndrew Jeffery 5626558dbbSAndrew Jeffery #define MAPS_FLASH (1 << 0) 5726558dbbSAndrew Jeffery #define MAPS_MEM (1 << 1) 5826558dbbSAndrew Jeffery #define STATE_SUSPENDED (1 << 7) 5926558dbbSAndrew Jeffery 6026558dbbSAndrew Jeffery enum mbox_state { 6126558dbbSAndrew Jeffery /* Still Initing */ 6226558dbbSAndrew Jeffery UNINITIALISED = 0, 6326558dbbSAndrew Jeffery /* Active and LPC Maps Flash */ 6426558dbbSAndrew Jeffery ACTIVE_MAPS_FLASH = MAPS_FLASH, 6526558dbbSAndrew Jeffery /* Suspended and LPC Maps Flash */ 6626558dbbSAndrew Jeffery SUSPEND_MAPS_FLASH = STATE_SUSPENDED | MAPS_FLASH, 6726558dbbSAndrew Jeffery /* Active and LPC Maps Memory */ 6826558dbbSAndrew Jeffery ACTIVE_MAPS_MEM = MAPS_MEM, 6926558dbbSAndrew Jeffery /* Suspended and LPC Maps Memory */ 7026558dbbSAndrew Jeffery SUSPEND_MAPS_MEM = STATE_SUSPENDED | MAPS_MEM 7126558dbbSAndrew Jeffery }; 7226558dbbSAndrew Jeffery 7326558dbbSAndrew Jeffery struct mbox_context { 7426558dbbSAndrew Jeffery enum api_version version; 7526558dbbSAndrew Jeffery const struct protocol_ops *protocol; 7626558dbbSAndrew Jeffery const struct transport_ops *transport; 77f1e547c7SEvan Lojewski struct backend backend; 78f1e547c7SEvan Lojewski 79f1e547c7SEvan Lojewski /* Commandline parameters */ 805320f6e0SAndrew Jeffery const char *source; 8126558dbbSAndrew Jeffery 8226558dbbSAndrew Jeffery /* System State */ 8326558dbbSAndrew Jeffery enum mbox_state state; 8426558dbbSAndrew Jeffery struct pollfd fds[TOTAL_FDS]; 8526558dbbSAndrew Jeffery sd_bus *bus; 8626558dbbSAndrew Jeffery bool terminate; 8726558dbbSAndrew Jeffery uint8_t bmc_events; 8826558dbbSAndrew Jeffery uint8_t prev_seq; 8926558dbbSAndrew Jeffery 9026558dbbSAndrew Jeffery /* Window State */ 9126558dbbSAndrew Jeffery /* The window list struct containing all current "windows" */ 9226558dbbSAndrew Jeffery struct window_list windows; 9326558dbbSAndrew Jeffery /* The window the host is currently pointed at */ 9426558dbbSAndrew Jeffery struct window_context *current; 9526558dbbSAndrew Jeffery /* Is the current window a write one */ 9626558dbbSAndrew Jeffery bool current_is_write; 9726558dbbSAndrew Jeffery 9826558dbbSAndrew Jeffery /* Memory & Flash State */ 9926558dbbSAndrew Jeffery /* Reserved Memory Region */ 10026558dbbSAndrew Jeffery void *mem; 10126558dbbSAndrew Jeffery /* Reserved Mem Size (bytes) */ 10226558dbbSAndrew Jeffery uint32_t mem_size; 10326558dbbSAndrew Jeffery /* LPC Bus Base Address (bytes) */ 10426558dbbSAndrew Jeffery uint32_t lpc_base; 105*ef0c8360SStewart Smith 106*ef0c8360SStewart Smith /* Tracing */ 107*ef0c8360SStewart Smith int blktracefd; 108*ef0c8360SStewart Smith struct blk_io_trace trace; 109*ef0c8360SStewart Smith int64_t blktrace_start; 11026558dbbSAndrew Jeffery }; 11126558dbbSAndrew Jeffery 11226558dbbSAndrew Jeffery #endif /* MBOX_H */ 113