ec/lenovo/h8: Add function to query sense state

* Add function to wait for sense registers to become valid.
* Add function to retrieve Fn-Key state.

Tested on Lenovo T500:
* It takes about 700msec for the registers to become valid.

Tested on Lenovo T520:
* It takes less than 150msec for the registers to become valid.

Change-Id: Ie27e2881a256c4efb3def11f05070c446db6e5fc
Signed-off-by: Patrick Rudolph <siro@das-labor.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/29204
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
Reviewed-by: Nico Huber <nico.h@gmx.de>
This commit is contained in:
Patrick Rudolph 2018-10-20 17:10:04 +02:00 committed by Patrick Georgi
parent 1d3b3c3c09
commit 2dc00fab7c
3 changed files with 66 additions and 0 deletions

View File

@ -1,5 +1,12 @@
ifeq ($(CONFIG_EC_LENOVO_H8),y)
ramstage-y += sense.c
verstage-y += sense.c
romstage-y += sense.c
bootblock-y += sense.c
postcar-y += sense.c
smm-y += sense.c
ifneq ($(filter y,$(CONFIG_H8_BEEP_ON_DEATH) $(CONFIG_H8_FLASH_LEDS_ON_DEATH)),)
romstage-y += panic.c
ramstage-y += panic.c

View File

@ -38,6 +38,9 @@ void h8_usb_always_on(void);
void h8_mainboard_init_dock (void);
int h8_get_fn_key(void);
int h8_get_sense_ready(void);
void h8_bluetooth_enable(int on);
bool h8_bluetooth_nv_enable(void);
bool h8_has_bdc(struct device *dev);
@ -135,8 +138,10 @@ void h8_ssdt_generator(struct device *dev);
#define H8_EVENT_FN_PRESS 0x39
#define H8_STATUS0 0x46
#define H8_STATUS0_FN_KEY_DOWN 0x01
#define H8_STATUS1 0x47
#define H8_STATUS2 0x48
#define H8_STATUS3 0x49
#define H8_EVENT_BAT0 0x4a
#define H8_EVENT_BAT0_STATE 0x4b

54
src/ec/lenovo/h8/sense.c Normal file
View File

@ -0,0 +1,54 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2018 Patrick Rudolph <siro@das-labor.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <ec/acpi/ec.h>
#include "h8.h"
/**
* Return the EC sense status register state.
*
* Observations showed the sense registers are all zero until the EC populates
* them after some time. Likely the EC sets all bits to it's valid state at
* once, but there's no prove as the firmware isn't available.
*
* Wait for any register having at least one bit set.
* Unlikely that all register will be zero after booting has finished.
*
* @return 1 if the EC provides valid data in sense status registers
*/
int h8_get_sense_ready(void)
{
static const u8 regs[] = { H8_STATUS0, H8_STATUS1, H8_STATUS2,
H8_STATUS3};
for (size_t i = 0; i < ARRAY_SIZE(regs); i++) {
if (ec_read(regs[i]))
return 1;
}
return 0;
}
/**
* Return the state of Fn key.
* Only valid if h8_get_sense_ready (see above) returns true.
*
* @return 1 if the key is pressed.
*/
int h8_get_fn_key(void)
{
return ec_read(H8_STATUS0) & H8_STATUS0_FN_KEY_DOWN;
}