blob: ceada6bdccacd1c67896270abc7e4228aec9ef36 [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 Jeffery26558db2018-08-10 00:22:38 +09306#include "common.h"
Andrew Jeffery68023072018-08-06 10:08:11 +09307#include "dbus.h"
Andrew Jeffery26558db2018-08-10 00:22:38 +09308#include "mboxd.h"
Andrew Jefferyeebc6bd2018-08-08 10:38:19 +09309#include "flash.h"
Andrew Jefferycd186112018-08-08 10:47:55 +093010#include "lpc.h"
Andrew Jeffery457a6e52018-08-08 11:21:08 +093011#include "transport_mbox.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{
39 int rc;
40
41 /* We don't let the host access flash if the daemon is suspened */
42 if (context->state & STATE_SUSPENDED) {
43 return -EBUSY;
44 }
45
Andrew Jefferycda29642018-08-30 12:01:40 +093046 /* FIXME: Comment below is wrong: windows_reset_all() does not flush! */
Andrew Jeffery68023072018-08-06 10:08:11 +093047 /*
48 * This will close (and flush) the current window and reset the lpc bus
49 * mapping back to flash, or memory in case we're using a virtual pnor.
50 * Better set the bmc event to notify the host of this.
51 */
Andrew Jeffery2ebfd202018-08-20 11:46:28 +093052 if (windows_reset_all(context)) {
53 rc = protocol_events_set(context, BMC_EVENT_WINDOW_RESET);
54 if (rc < 0) {
55 return rc;
56 }
57 }
Andrew Jeffery17971e42018-08-08 16:36:10 +093058 rc = lpc_reset(context);
Andrew Jeffery68023072018-08-06 10:08:11 +093059 if (rc < 0) {
60 return rc;
61 }
62
63 return 0;
64}
65
66int control_kill(struct mbox_context *context)
67{
68 context->terminate = 1;
69
70 MSG_INFO("DBUS Kill - Exiting...\n");
71
72 return 0;
73}
74
75int control_modified(struct mbox_context *context)
76{
77 /* Flash has been modified - can no longer trust our erased bytemap */
Andrew Jefferyf953f792018-08-08 16:56:03 +093078 flash_set_bytemap(context, 0, context->flash_size, FLASH_DIRTY);
Andrew Jeffery68023072018-08-06 10:08:11 +093079
80 /* Force daemon to reload all windows -> Set BMC event to notify host */
Andrew Jeffery2ebfd202018-08-20 11:46:28 +093081 if (windows_reset_all(context)) {
82 protocol_events_set(context, BMC_EVENT_WINDOW_RESET);
83 }
Andrew Jeffery68023072018-08-06 10:08:11 +093084
85 return 0;
86}
87
88int control_suspend(struct mbox_context *context)
89{
90 int rc;
91
92 if (context->state & STATE_SUSPENDED) {
93 /* Already Suspended */
Andrew Jefferyef9e62d2018-08-08 15:48:27 +093094 return 0;
Andrew Jeffery68023072018-08-06 10:08:11 +093095 }
96
97 /* Nothing to check - Just set the bit to notify the host */
Andrew Jeffery2ebfd202018-08-20 11:46:28 +093098 rc = protocol_events_set(context, BMC_EVENT_FLASH_CTRL_LOST);
Andrew Jeffery68023072018-08-06 10:08:11 +093099 if (rc < 0) {
100 return rc;
101 }
102
103 context->state |= STATE_SUSPENDED;
104
105 return rc;
106}
107
108int control_resume(struct mbox_context *context, bool modified)
109{
110 int rc;
111
112 if (!(context->state & STATE_SUSPENDED)) {
113 /* We weren't suspended... */
Andrew Jefferyef9e62d2018-08-08 15:48:27 +0930114 return 0;
Andrew Jeffery68023072018-08-06 10:08:11 +0930115 }
116
117 if (modified) {
118 /* Call the flash modified handler */
119 control_modified(context);
120 }
121
122 /* Clear the bit and send the BMC Event to the host */
Andrew Jeffery2ebfd202018-08-20 11:46:28 +0930123 rc = protocol_events_clear(context, BMC_EVENT_FLASH_CTRL_LOST);
Andrew Jeffery68023072018-08-06 10:08:11 +0930124 if (rc < 0) {
Andrew Jefferyef9e62d2018-08-08 15:48:27 +0930125 return rc;
Andrew Jeffery68023072018-08-06 10:08:11 +0930126 }
127 context->state &= ~STATE_SUSPENDED;
128
129 return rc;
130}