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:
committed by
Patrick Georgi
parent
1d3b3c3c09
commit
2dc00fab7c
@@ -1,5 +1,12 @@
|
|||||||
ifeq ($(CONFIG_EC_LENOVO_H8),y)
|
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)),)
|
ifneq ($(filter y,$(CONFIG_H8_BEEP_ON_DEATH) $(CONFIG_H8_FLASH_LEDS_ON_DEATH)),)
|
||||||
romstage-y += panic.c
|
romstage-y += panic.c
|
||||||
ramstage-y += panic.c
|
ramstage-y += panic.c
|
||||||
|
@@ -38,6 +38,9 @@ void h8_usb_always_on(void);
|
|||||||
|
|
||||||
void h8_mainboard_init_dock (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);
|
void h8_bluetooth_enable(int on);
|
||||||
bool h8_bluetooth_nv_enable(void);
|
bool h8_bluetooth_nv_enable(void);
|
||||||
bool h8_has_bdc(struct device *dev);
|
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_EVENT_FN_PRESS 0x39
|
||||||
|
|
||||||
#define H8_STATUS0 0x46
|
#define H8_STATUS0 0x46
|
||||||
|
#define H8_STATUS0_FN_KEY_DOWN 0x01
|
||||||
#define H8_STATUS1 0x47
|
#define H8_STATUS1 0x47
|
||||||
#define H8_STATUS2 0x48
|
#define H8_STATUS2 0x48
|
||||||
|
#define H8_STATUS3 0x49
|
||||||
|
|
||||||
#define H8_EVENT_BAT0 0x4a
|
#define H8_EVENT_BAT0 0x4a
|
||||||
#define H8_EVENT_BAT0_STATE 0x4b
|
#define H8_EVENT_BAT0_STATE 0x4b
|
||||||
|
54
src/ec/lenovo/h8/sense.c
Normal file
54
src/ec/lenovo/h8/sense.c
Normal 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;
|
||||||
|
}
|
Reference in New Issue
Block a user