blob: f28c07f17ce56608dd0cf74380bc41640c9c2122 [file] [log] [blame]
Aaron Durbin7e35efa2013-04-24 15:14:01 -05001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2013 Google, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 */
19#ifndef BOOTSTATE_H
20#define BOOTSTATE_H
21
22#include <string.h>
23
24/* Control debugging of the boot state machine. */
25#define BOOT_STATE_DEBUG 0
26
27/*
28 * The boot state machine provides a mechanism for calls to be made through-
29 * out the main boot process. The boot process is separated into discrete
30 * states. Upon a state's entry and exit and callbacks can be made. For
31 * example:
32 *
33 * Enter State
34 * +
35 * |
36 * V
37 * +-----------------+
38 * | Entry callbacks |
39 * +-----------------+
40 * | State Actions |
41 * +-----------------+
42 * | Exit callbacks |
43 * +-------+---------+
44 * |
45 * V
46 * Next State
47 *
48 * Below is the current flow from top to bottom:
49 *
50 * start
51 * |
52 * BS_PRE_DEVICE
53 * |
54 * BS_DEV_INIT_CHIPS
55 * |
56 * BS_DEV_ENUMERATE
57 * |
58 * BS_DEV_RESOURCES
59 * |
60 * BS_DEV_ENABLE
61 * |
62 * BS_DEV_INIT
63 * |
64 * BS_POST_DEVICE
65 * |
66 * BS_OS_RESUME_CHECK -------- BS_OS_RESUME
67 * | |
68 * BS_WRITE_TABLES os handoff
69 * |
70 * BS_PAYLOAD_LOAD
71 * |
72 * BS_PAYLOAD_BOOT
73 * |
74 * payload run
75 *
76 * Brief description of states:
77 * BS_PRE_DEVICE - before any device tree actions take place
78 * BS_DEV_INIT_CHIPS - init all chips in device tree
79 * BS_DEV_ENUMERATE - device tree probing
80 * BS_DEV_RESOURCES - device tree resource allocation and assignment
81 * BS_DEV_ENABLE - device tree enabling/disabling of devices
82 * BS_DEV_INIT - device tree device initialization
83 * BS_POST_DEVICE - all device tree actions performed
84 * BS_OS_RESUME_CHECK - check for OS resume
85 * BS_OS_RESUME - resume to OS
86 * BS_WRITE_TABLES - write coreboot tables
87 * BS_PAYLOAD_LOAD - Load payload into memory
88 * BS_PAYLOAD_BOOT - Boot to payload
89 */
90
91typedef enum {
92 BS_PRE_DEVICE,
93 BS_DEV_INIT_CHIPS,
94 BS_DEV_ENUMERATE,
95 BS_DEV_RESOURCES,
96 BS_DEV_ENABLE,
97 BS_DEV_INIT,
98 BS_POST_DEVICE,
99 BS_OS_RESUME,
100 BS_WRITE_TABLES,
101 BS_PAYLOAD_LOAD,
102 BS_PAYLOAD_BOOT,
103} boot_state_t;
104
105/* The boot_state_sequence_t describes when a callback is to be made. It is
106 * called either before a state is entered or when a state is exited. */
107typedef enum {
108 BS_ON_ENTRY,
109 BS_ON_EXIT
110} boot_state_sequence_t;
111
112struct boot_state_callback {
113 void *arg;
114 void (*callback)(void *arg);
115 /* For use internal to the boot state machine. */
116 struct boot_state_callback *next;
117#if BOOT_STATE_DEBUG
118 const char *location;
119#endif
120};
121
122#if BOOT_STATE_DEBUG
123#define BOOT_STATE_CALLBACK_LOC __FILE__ ":" STRINGIFY(__LINE__)
124#define BOOT_STATE_CALLBACK_INIT_DEBUG .location = BOOT_STATE_CALLBACK_LOC,
125#define INIT_BOOT_STATE_CALLBACK_DEBUG(bscb_) \
126 bscb_->location = BOOT_STATE_CALLBACK_LOC;
127#else
128#define BOOT_STATE_CALLBACK_INIT_DEBUG
129#define INIT_BOOT_STATE_CALLBACK_DEBUG(bscb_)
130#endif
131
132#define BOOT_STATE_CALLBACK_INIT(func_, arg_) \
133 { \
134 .arg = arg_, \
135 .callback = func_, \
136 .next = NULL, \
137 BOOT_STATE_CALLBACK_INIT_DEBUG \
138 }
139
140#define BOOT_STATE_CALLBACK(name_, func_, arg_) \
141 struct boot_state_callback name_ = BOOT_STATE_CALLBACK_INIT(func_, arg_)
142
143/* Initialize an allocated boot_state_callback. */
144#define INIT_BOOT_STATE_CALLBACK(bscb_, func_, arg_) \
145 INIT_BOOT_STATE_CALLBACK_DEBUG(bscb_) \
146 bscb_->callback = func_; \
147 bscb_->arg = arg_
148
149/* The following 2 functions schedule a callback to be called on entry/exit
150 * to a given state. Note that thare are no ordering guarantees between the
151 * individual callbacks on a given state. 0 is returned on success < 0 on
152 * error. */
153int boot_state_sched_on_entry(struct boot_state_callback *bscb,
154 boot_state_t state);
155int boot_state_sched_on_exit(struct boot_state_callback *bscb,
156 boot_state_t state);
157
158/* Entry into the boot state machine. */
159void hardwaremain(int boot_complete);
160
Aaron Durbina4feddf2013-04-24 16:12:52 -0500161/* In order to schedule boot state callbacks at compile-time specify the
162 * entries in an array using the BOOT_STATE_INIT_ENTRIES and
163 * BOOT_STATE_INIT_ENTRY macros below. */
164struct boot_state_init_entry {
165 boot_state_t state;
166 boot_state_sequence_t when;
167 struct boot_state_callback bscb;
168};
169
170#define BOOT_STATE_INIT_ATTR __attribute__ ((used,section (".bs_init")))
171
172#define BOOT_STATE_INIT_ENTRIES(name_) \
173 static struct boot_state_init_entry name_[] BOOT_STATE_INIT_ATTR
174
175#define BOOT_STATE_INIT_ENTRY(state_, when_, func_, arg_) \
176 { \
177 .state = state_, \
178 .when = when_, \
179 .bscb = BOOT_STATE_CALLBACK_INIT(func_, arg_), \
180 }
181
Aaron Durbin7e35efa2013-04-24 15:14:01 -0500182#endif /* BOOTSTATE_H */