summaryrefslogtreecommitdiffstats
path: root/mbox.h
blob: d9a8d03264566acfd26cb840c4d56f724f3e4307 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/*
 * Copyright 2016 IBM
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */

#ifndef MBOX_H
#define MBOX_H

#include <mtd/mtd-abi.h>
#include <systemd/sd-bus.h>

enum api_version {
	API_VERSION_INVAL	= 0,
	API_VERSION_1		= 1,
	API_VERSION_2		= 2
};

#define API_MIN_VERSION			API_VERSION_1
#define API_MAX_VERSION			API_VERSION_2

#define THIS_NAME			"Mailbox Daemon"
#define SUB_VERSION			0

/* Command Values */
#define MBOX_C_RESET_STATE		0x01
#define MBOX_C_GET_MBOX_INFO		0x02
#define MBOX_C_GET_FLASH_INFO		0x03
#define MBOX_C_READ_WINDOW		0x04
#define MBOX_C_CLOSE_WINDOW		0x05
#define MBOX_C_WRITE_WINDOW		0x06
#define MBOX_C_WRITE_DIRTY		0x07
#define MBOX_C_WRITE_FLUSH		0x08
#define MBOX_C_ACK			0x09
#define MBOX_C_WRITE_ERASE		0x0a
#define NUM_MBOX_CMDS			MBOX_C_WRITE_ERASE

/* Response Values */
#define MBOX_R_SUCCESS			0x01
#define MBOX_R_PARAM_ERROR		0x02
#define MBOX_R_WRITE_ERROR		0x03
#define MBOX_R_SYSTEM_ERROR		0x04
#define MBOX_R_TIMEOUT			0x05
#define MBOX_R_BUSY			0x06
#define MBOX_R_WINDOW_ERROR		0x07

/* Argument Flags */
#define FLAGS_NONE			0x00
#define FLAGS_SHORT_LIFETIME		0x01

/* BMC Event Notification */
#define BMC_EVENT_REBOOT		0x01
#define BMC_EVENT_WINDOW_RESET		0x02
#define BMC_EVENT_ACK_MASK		(BMC_EVENT_REBOOT | \
					BMC_EVENT_WINDOW_RESET)
#define BMC_EVENT_FLASH_CTRL_LOST	0x40
#define BMC_EVENT_DAEMON_READY		0x80
#define BMC_EVENT_V1_MASK		BMC_EVENT_REBOOT
#define BMC_EVENT_V2_MASK		(BMC_EVENT_REBOOT | \
					BMC_EVENT_WINDOW_RESET | \
					BMC_EVENT_FLASH_CTRL_LOST | \
					BMC_EVENT_DAEMON_READY)

/* MBOX Registers */
#define MBOX_HOST_PATH			"/dev/aspeed-mbox"
#define MBOX_HOST_TIMEOUT_SEC		1
#define MBOX_ARGS_BYTES			11
#define MBOX_REG_BYTES			16
#define MBOX_HOST_EVENT			14
#define MBOX_BMC_EVENT			15

#define BLOCK_SIZE_SHIFT_V1		12 /* 4K */

/* Window Dirty/Erase bytemap masks */
#define WINDOW_CLEAN			0x00
#define WINDOW_DIRTY			0x01
#define WINDOW_ERASED			0x02

/* Put polled file descriptors first */
#define DBUS_FD			0
#define MBOX_FD			1
#define SIG_FD			2
#define POLL_FDS		3 /* Number of FDs we poll on */
#define LPC_CTRL_FD		3
#define MTD_FD			4
#define TOTAL_FDS		5

#define MAPS_FLASH		(1 << 0)
#define MAPS_MEM		(1 << 1)
#define STATE_SUSPENDED		(1 << 7)
enum mbox_state {
	/* Still Initing */
	UNINITIALISED = 0,
	/* Active and LPC Maps Flash */
	ACTIVE_MAPS_FLASH = MAPS_FLASH,
	/* Suspended and LPC Maps Flash */
	SUSPEND_MAPS_FLASH = STATE_SUSPENDED | MAPS_FLASH,
	/* Active and LPC Maps Memory */
	ACTIVE_MAPS_MEM = MAPS_MEM,
	/* Suspended and LPC Maps Memory */
	SUSPEND_MAPS_MEM = STATE_SUSPENDED | MAPS_MEM
};

#define FLASH_OFFSET_UNINIT	0xFFFFFFFF

struct window_context {
	void *mem;			/* Portion of Reserved Memory Region */
	uint32_t flash_offset;		/* Flash area the window maps (bytes) */
	uint32_t size;			/* Window Size (bytes) power-of-2 */
	uint8_t *dirty_bmap;		/* Bytemap of the dirty/erased state */
	uint32_t age;			/* Used for LRU eviction scheme */
};

struct window_list {
	uint32_t num;
	uint32_t max_age;
	uint32_t default_size;
	struct window_context *window;
};

struct mbox_context {
/* System State */
	enum mbox_state state;
	enum api_version version;
	struct pollfd fds[TOTAL_FDS];
	sd_bus *bus;
	bool terminate;
	uint8_t bmc_events;

/* Window State */
	/* The window list struct containing all current "windows" */
	struct window_list windows;
	/* The window the host is currently pointed at */
	struct window_context *current;
	/* Is the current window a write one */
	bool current_is_write;

/* Memory & Flash State */
	/* Reserved Memory Region */
	void *mem;
	/* Reserved Mem Size (bytes) */
	uint32_t mem_size;
	/* LPC Bus Base Address (bytes) */
	uint32_t lpc_base;
	/* Flash size from command line (bytes) */
	uint32_t flash_size;
	/* Bytemap of the erased state of the entire flash */
	uint8_t *flash_bmap;
	/* Erase size (as a shift) */
	uint32_t erase_size_shift;
	/* Block size (as a shift) */
	uint32_t block_size_shift;
	/* Actual Flash Info */
	struct mtd_info_user mtd_info;
};

#endif /* MBOX_H */
OpenPOWER on IntegriCloud