Files
OpenCellular/include/lpc.h
Furquan Shaikh 5bd5f1b1fa host_event_commands: Add support for always reporting masks
Add a new mask type (ALWAYS_REPORT mask) that is set by default to
certain host events that should always be reported to the host
irrespective of the state of SCI, SMI and wake masks. This mask
includes host events like critical events resulting in shutdown or
reboot, events that are consumed by BIOS, etc.

Now that ALWAYS_REPORT mask is added, this change also updates the way
EC manages set/query operations for host events:
1. During set operation, EC will check if the host event is present in
any of the 4 masks - SCI, SMI, wake and always report. If yes, then it
is set in hostevents.
2. During query operation, EC will extract the lowest set event from
hostevents, clear it and return it back to the host.

In order to reflect the above change in EC behavior, a new feature bit
is used EC_FEATURE_UNIFIED_WAKE_MASKS. This allows the host to decide
when wake mask needs to be set before checking for host events.

BUG=None
BRANCH=None
TEST=make -j buildall. Also verified following:
1. Wake from S3 works as expected. Host is able to log correct wake
sources (Verified power button, lid open, base key press and tablet
mode change on soraka).
2. Wake from S5 works as expected. Host is able to log correct wake
sources (Verified power button, lid open on soraka).
3. Wake from S0ix works as expected (Verified power button, lid open
on soraka).
4. Software method to trigger recovery still works fine:
    reboot ap-off
    hostevent set 0x4000
    powerb

Change-Id: I62e5c1f82247c82348cd019e082883d86ec2688f
Signed-off-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/719578
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2017-10-18 23:14:18 -07:00

153 lines
3.4 KiB
C

/* 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.
*/
/* LPC module for Chrome EC */
#ifndef __CROS_EC_LPC_H
#define __CROS_EC_LPC_H
#include "common.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);
/**
* 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.
*/
uint32_t lpc_get_host_events(void);
/**
* Get host events that are set based on the type provided.
*
* @param type Event type
*/
uint32_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, uint32_t mask);
/**
* Get host event mask based on the type provided.
*
* @param type Event type
*/
uint32_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);
/**
* Reset the host with KBRST# or RCIN#
*/
void lpc_host_reset(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.
*/
uint32_t lpc_override_always_report_mask(void);
#endif /* __CROS_EC_LPC_H */