blob: 4b73efafadbf40badd7014cc4e3941283af70a07 [file] [log] [blame]
Andrew Jeffery68023072018-08-06 10:08:11 +09301// SPDX-License-Identifier: Apache-2.0
2// Copyright (C) 2018 IBM Corp.
3#include <errno.h>
4#include <stdlib.h>
5
Andrew Jeffery5320f6e2019-03-15 12:40:41 +10306#include "backend.h"
Andrew Jeffery26558db2018-08-10 00:22:38 +09307#include "common.h"
Andrew Jeffery68023072018-08-06 10:08:11 +09308#include "dbus.h"
Andrew Jefferycd186112018-08-08 10:47:55 +09309#include "lpc.h"
Andrew Jeffery5320f6e2019-03-15 12:40:41 +103010#include "mboxd.h"
11#include "protocol.h"
Andrew Jefferyf593b1b2018-08-08 11:01:04 +093012#include "windows.h"
Andrew Jeffery68023072018-08-06 10:08:11 +093013
14int control_ping(struct mbox_context *context)
15{
16 return 0;
17}
18
19int control_daemon_state(struct mbox_context *context)
20{
21 return (context->state & STATE_SUSPENDED) ?
22 DAEMON_STATE_SUSPENDED : DAEMON_STATE_ACTIVE;
23}
24
25int control_lpc_state(struct mbox_context *context)
26{
27 if ((context->state & MAPS_MEM) && !(context->state & MAPS_FLASH)) {
28 return LPC_STATE_MEM;
29 } else if (!(context->state & MAPS_MEM) &&
30 (context->state & MAPS_FLASH)) {
31 return LPC_STATE_FLASH;
32 }
33
34 return LPC_STATE_INVALID;
35}
36
37int control_reset(struct mbox_context *context)
38{
Andrew Jeffery68023072018-08-06 10:08:11 +093039 /* We don't let the host access flash if the daemon is suspened */
40 if (context->state & STATE_SUSPENDED) {
41 return -EBUSY;
42 }
43
Andrew Jefferycda29642018-08-30 12:01:40 +093044 /* FIXME: Comment below is wrong: windows_reset_all() does not flush! */
Andrew Jeffery68023072018-08-06 10:08:11 +093045 /*
46 * This will close (and flush) the current window and reset the lpc bus
47 * mapping back to flash, or memory in case we're using a virtual pnor.
48 * Better set the bmc event to notify the host of this.
49 */
Andrew Jefferyf69760d2019-03-14 16:54:13 +103050 return protocol_reset(context);
Andrew Jeffery68023072018-08-06 10:08:11 +093051}
52
53int control_kill(struct mbox_context *context)
54{
55 context->terminate = 1;
56
57 MSG_INFO("DBUS Kill - Exiting...\n");
58
59 return 0;
60}
61
62int control_modified(struct mbox_context *context)
63{
64 /* Flash has been modified - can no longer trust our erased bytemap */
Andrew Jeffery0297e5b2019-03-14 16:36:27 +103065 backend_set_bytemap(&context->backend, 0, context->backend.flash_size,
Evan Lojewskif1e547c2019-03-14 14:34:33 +103066 FLASH_DIRTY);
Andrew Jeffery68023072018-08-06 10:08:11 +093067
68 /* Force daemon to reload all windows -> Set BMC event to notify host */
Andrew Jeffery2ebfd202018-08-20 11:46:28 +093069 if (windows_reset_all(context)) {
70 protocol_events_set(context, BMC_EVENT_WINDOW_RESET);
71 }
Andrew Jeffery68023072018-08-06 10:08:11 +093072
73 return 0;
74}
75
76int control_suspend(struct mbox_context *context)
77{
78 int rc;
79
80 if (context->state & STATE_SUSPENDED) {
81 /* Already Suspended */
Andrew Jefferyef9e62d2018-08-08 15:48:27 +093082 return 0;
Andrew Jeffery68023072018-08-06 10:08:11 +093083 }
84
85 /* Nothing to check - Just set the bit to notify the host */
Andrew Jeffery2ebfd202018-08-20 11:46:28 +093086 rc = protocol_events_set(context, BMC_EVENT_FLASH_CTRL_LOST);
Andrew Jeffery68023072018-08-06 10:08:11 +093087 if (rc < 0) {
88 return rc;
89 }
90
91 context->state |= STATE_SUSPENDED;
92
93 return rc;
94}
95
96int control_resume(struct mbox_context *context, bool modified)
97{
98 int rc;
99
100 if (!(context->state & STATE_SUSPENDED)) {
101 /* We weren't suspended... */
Andrew Jefferyef9e62d2018-08-08 15:48:27 +0930102 return 0;
Andrew Jeffery68023072018-08-06 10:08:11 +0930103 }
104
105 if (modified) {
106 /* Call the flash modified handler */
107 control_modified(context);
108 }
109
110 /* Clear the bit and send the BMC Event to the host */
Andrew Jeffery2ebfd202018-08-20 11:46:28 +0930111 rc = protocol_events_clear(context, BMC_EVENT_FLASH_CTRL_LOST);
Andrew Jeffery68023072018-08-06 10:08:11 +0930112 if (rc < 0) {
Andrew Jefferyef9e62d2018-08-08 15:48:27 +0930113 return rc;
Andrew Jeffery68023072018-08-06 10:08:11 +0930114 }
115 context->state &= ~STATE_SUSPENDED;
116
117 return rc;
118}
Andrew Jeffery5320f6e2019-03-15 12:40:41 +1030119
120int control_set_backend(struct mbox_context *context, struct backend *backend,
121 void *data)
122{
123 int rc;
124
125 if (context->state & STATE_SUSPENDED)
126 return -EINVAL;
127
128 rc = protocol_events_clear(context, BMC_EVENT_DAEMON_READY);
129 if (rc < 0)
130 return rc;
131
132 backend_free(&context->backend);
133
134 rc = backend_init(&context->backend, backend, data);
135 if (rc < 0)
136 return rc;
137
138 rc = __protocol_reset(context);
139 if (rc < 0)
140 return rc;
141
142 return protocol_events_set(context,
143 BMC_EVENT_DAEMON_READY | BMC_EVENT_PROTOCOL_RESET);
144}