summaryrefslogtreecommitdiff
path: root/include/lpc.h
blob: 7222fa5e7357ab4f171a5746735093755f2f20c5 (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
/* Copyright 2012 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/* LPC module for Chrome EC */

#ifndef __CROS_EC_LPC_H
#define __CROS_EC_LPC_H

#include "common.h"
#include "host_command.h"

/**
 * Return a pointer to the memory-mapped buffer.
 *
 * This buffer is writable at any time, and the host can read it at any time.
 */
uint8_t *lpc_get_memmap_range(void);

/**
 * Return true if keyboard data is waiting for the host to read (TOH is still
 * set).
 */
int lpc_keyboard_has_char(void);

/* Return true if the FRMH is still set */
int lpc_keyboard_input_pending(void);

/**
 * Send a byte to host via keyboard port 0x60.
 *
 * @param chr		Byte to send
 * @param send_irq	If non-zero, asserts IRQ
 */
void lpc_keyboard_put_char(uint8_t chr, int send_irq);

/**
 * Send an aux byte to host via keyboard port 0x60.
 *
 * @param chr		Byte to send
 * @param send_irq	If non-zero, asserts IRQ
 */
void lpc_aux_put_char(uint8_t chr, int send_irq);

/**
 * Clear the keyboard buffer.
 */
void lpc_keyboard_clear_buffer(void);

/**
 * Send an IRQ to host if there is a byte in buffer already.
 */
void lpc_keyboard_resume_irq(void);

/**
 * Return non-zero if the COMx interface has received a character.
 */
int lpc_comx_has_char(void);

/**
 * Return the next character pending on the COMx interface.
 */
int lpc_comx_get_char(void);

/**
 * Put a character to the COMx LPC interface.
 */
void lpc_comx_put_char(int c);

/*
 * Low-level LPC interface for host events.
 *
 * For use by host_event_commands.c.  Other modules should use the methods
 * provided in host_command.h.
 */

/* Types of host events */
enum lpc_host_event_type {
	LPC_HOST_EVENT_SMI = 0,
	LPC_HOST_EVENT_SCI,
	LPC_HOST_EVENT_WAKE,
	LPC_HOST_EVENT_ALWAYS_REPORT,
	LPC_HOST_EVENT_COUNT,
};

/**
 * Get current state of host events.
 */
host_event_t lpc_get_host_events(void);

/**
 * Get host events that are set based on the type provided.
 *
 * @param type		Event type
 */
host_event_t lpc_get_host_events_by_type(enum lpc_host_event_type type);

/**
 * Set the event mask for the specified event type.
 *
 * @param type		Event type
 * @param mask		New event mask
 */
void lpc_set_host_event_mask(enum lpc_host_event_type type, host_event_t mask);

/**
 * Get host event mask based on the type provided.
 *
 * @param type		Event type
 */
host_event_t lpc_get_host_event_mask(enum lpc_host_event_type type);

/**
 * Clear and return the lowest host event.
 */
int lpc_get_next_host_event(void);

/**
 * Set the EC_LPC_STATUS_* mask for the specified status.
 */
void lpc_set_acpi_status_mask(uint8_t mask);

/**
 * Clear the EC_LPC_STATUS_* mask for the specified status.
 */
void lpc_clear_acpi_status_mask(uint8_t mask);

/**
 * Return the state of platform reset.
 *
 * @return non-zero if PLTRST# is asserted (low); 0 if not asserted (high).
 */
int lpc_get_pltrst_asserted(void);

/* Disable LPC ACPI interrupts */
void lpc_disable_acpi_interrupts(void);

/* Enable LPC ACPI interrupts */
void lpc_enable_acpi_interrupts(void);

/**
 * Update host event status. This function is called whenever host event bits
 * need to be updated based on initialization complete or host event mask
 * update or when a new host event is set or cleared.
 */
void lpc_update_host_event_status(void);

/*
 * This is a weak function defined in host_events_commands.c to override the
 * LPC_HOST_EVENT_ALWAYS_REPORT mask. It can be implemented by boards if there
 * is a need to use custom mask.
 */
host_event_t lpc_override_always_report_mask(void);

/* Initialize LPC masks. */
void lpc_init_mask(void);

/*
 * Clear LPC masks for SMI, SCI and wake upon resume from S3. This is done to
 * mask these events until host unmasks them itself.
 */
void lpc_s3_resume_clear_masks(void);

#endif  /* __CROS_EC_LPC_H */