summaryrefslogtreecommitdiff
path: root/include/host_command.h
blob: 511e1369eeb6ecbe302ad08b29bdab3c701f1c94 (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
/* Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/* Host command module for Chrome EC */

#ifndef __CROS_EC_HOST_COMMAND_H
#define __CROS_EC_HOST_COMMAND_H

#include "common.h"
#include "ec_commands.h"

/* Host command */
struct host_command {
	/* Command code. */
	int command;
	/* Handler for the command; data points to parameters/response.
	 * returns negative error code if case of failure (using EC_LPC_STATUS
	 * codes). sets <response_size> if it returns a payload to the host. */
	int (*handler)(uint8_t *data, int *response_size);
};

/**
 * Return a pointer to the memory-mapped buffer.
 *
 * This buffer is EC_MEMMAP_SIZE bytes long, is writable at any time, and the
 * host can read it at any time.
 *
 * @param offset        Offset within the range to return
 * @return pointer to the buffer at that offset
 */
uint8_t *host_get_memmap(int offset);

/**
 * Process a host command and return its response
 *
 * @param command	The command code
 * @param data		Buffer holding the command, and used for the
 * 			response payload.
 * @param response_size	Returns the size of the response
 * @return resulting status
 */
enum ec_status host_command_process(int command, uint8_t *data,
				    int *response_size);

/**
 * Set one or more host event bits.
 *
 * @param mask          Event bits to set (use EC_HOST_EVENT_MASK()).
 */
void host_set_events(uint32_t mask);

/**
 * Set a single host event.
 *
 * @param event         Event to set (EC_HOST_EVENT_*).
 */
static inline void host_set_single_event(int event)
{
	host_set_events(EC_HOST_EVENT_MASK(event));
}

/**
 * Clear one or more host event bits.
 *
 * @param mask          Event bits to clear (use EC_HOST_EVENT_MASK()).
 *                      Write 1 to a bit to clear it.
 */
void host_clear_events(uint32_t mask);

/**
 * Return the raw SCI/SMI event state.
 */
uint32_t host_get_events(void);

/**
 * Called by host interface module when a command is received.
 */
void host_command_received(int command);

/**
 * Send a successful result code along with response data to a host command.
 *
 * @param result        Result code for the command (EC_RES_...)
 * @param data          Buffer with the response payload.
 * @param size          Size of the response buffer.
 */
void host_send_response(enum ec_status result, const uint8_t *data, int size);

/* Return a pointer to the host command data buffer.  This buffer must
 * only be accessed between a notification to host_command_received()
 * and a subsequent call to lpc_SendHostResponse(). */
uint8_t *host_get_buffer(void);

/* Register a host command handler */
#define DECLARE_HOST_COMMAND(command, routine)				\
	const struct host_command __host_cmd_##command			\
	__attribute__((section(".rodata.hcmds")))			\
	     = {command, routine}

#endif  /* __CROS_EC_HOST_COMMAND_H */