Iru Cai has uploaded a new change for review. ( https://review.coreboot.org/19072 )
Change subject: [WIP] ec: add support for KBC1126 in HP laptops ......................................................................
[WIP] ec: add support for KBC1126 in HP laptops
- let the coreboot build system insert the two blobs to the coreboot image - fan control support (only works on hp/2760p)
Change-Id: I6b16eb7e26303eda740f52d667dedb7cc04b4ef0 Signed-off-by: Iru Cai mytbk920423@gmail.com --- A src/ec/hp/kbc1126/Kconfig A src/ec/hp/kbc1126/Makefile.inc A src/ec/hp/kbc1126/ec.c A src/ec/hp/kbc1126/ec.h 4 files changed, 253 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/72/19072/1
diff --git a/src/ec/hp/kbc1126/Kconfig b/src/ec/hp/kbc1126/Kconfig new file mode 100644 index 0000000..823d4e1 --- /dev/null +++ b/src/ec/hp/kbc1126/Kconfig @@ -0,0 +1,69 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2017 Iru Cai +## +## 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. +## + +config EC_HP_KBC1126 + bool + help + Interface to SMSC KBC1126 embedded controller in HP laptops. + +if EC_HP_KBC1126 + +config RESERVED_SPACE_BEFORE_RESET_VECTOR + hex + default 0x8f0 + +config KBC1126_FIRMWARE + bool "Add firmware images for KBC1126 firmware" + depends on EC_HP_KBC1126 + help + Select this option to add the two firmware blobs for KBC1126. + You need these two blobs to power on your machine. + +config KBC1126_FW1 + string "KBC1126 firmware #1 path and filename" + depends on KBC1126_FIRMWARE + default "fw1.bin" + help + The path and filename of the file to use as KBC1126 firmware #1. + +config KBC1126_FW1_OFFSET + string "KBC1126 firmware #1 offset" + depends on KBC1126_FIRMWARE + default "-0x900" + help + The offset of KBC1126 firmware #1. + If this value is negative, the absolute value of it means + the distance to the end of file. + If unsure, keep the default value -0x900 because the space + starting at this position is reserved by default to place this blob. + +config KBC1126_FW2 + string "KBC1126 filename #2 path and filename" + depends on KBC1126_FIRMWARE + default "fw2.bin" + help + The path and filename of the file to use as KBC1126 firmware #2. + +config KBC1126_FW2_OFFSET + string "KBC1126 firmware #2 offset" + depends on KBC1126_FIRMWARE + default "-0x300000" + help + The offset of KBC1126 firmware #2. + If this value is negative, the absolute value of it means + the distance to the end of file. + You should place KBC1126 firmware #2 (about 64K) outside of CBFS. + +endif diff --git a/src/ec/hp/kbc1126/Makefile.inc b/src/ec/hp/kbc1126/Makefile.inc new file mode 100644 index 0000000..5ae38c1 --- /dev/null +++ b/src/ec/hp/kbc1126/Makefile.inc @@ -0,0 +1,36 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2017 Iru Cai +## +## 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. +## + +ifeq ($(CONFIG_EC_HP_KBC1126),y) + +KBC1126_EC_INSERT:=$(top)/util/kbc1126/kbc1126_ec_insert + +ifeq ($(CONFIG_KBC1126_FIRMWARE),y) +INTERMEDIATE+=kbc1126_ec_insert +endif + +kbc1126_ec_insert: $(obj)/coreboot.pre + printf " Building kbc1126_ec_insert.\n" + $(MAKE) -C util/kbc1126 + printf " KBC1126 Inserting KBC1126 firmware blobs.\n" + $(KBC1126_EC_INSERT) $(obj)/coreboot.pre \ + $(CONFIG_KBC1126_FW1) $(CONFIG_KBC1126_FW2) \ + $(CONFIG_KBC1126_FW1_OFFSET) $(CONFIG_KBC1126_FW2_OFFSET) + +PHONY+=kbc1126_ec_insert + +ramstage-y += ec.c + +endif diff --git a/src/ec/hp/kbc1126/ec.c b/src/ec/hp/kbc1126/ec.c new file mode 100644 index 0000000..8627e67 --- /dev/null +++ b/src/ec/hp/kbc1126/ec.c @@ -0,0 +1,124 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2009 coresystems GmbH + * Copyright (C) 2017 Iru Cai + * + * 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 <arch/io.h> +#include <console/console.h> +#include <device/device.h> +#include <delay.h> + +#include "ec.h" + +#define KBD_DATA 0x60 +#define KBD_SC 0x64 + +#define KBD_IBF (1 << 1) /* 1: input buffer full (data ready for ec) */ +#define KBD_OBF (1 << 0) /* 1: output buffer full (data ready for host) */ + +static int send_kbd_command(u8 command) +{ + int timeout; + + timeout = 0x7ff; + while ((inb(KBD_SC) & KBD_IBF) && --timeout) { + udelay(10); + if ((timeout & 0xff) == 0) + printk(BIOS_SPEW, "."); + } + if (!timeout) { + printk(BIOS_DEBUG, "Timeout while sending command 0x%02x to EC!\n", + command); + return -1; + } + + outb(command, KBD_SC); + return 0; +} + +static int send_kbd_data(u8 data) +{ + int timeout; + + timeout = 0x7ff; + while ((inb(KBD_SC) & KBD_IBF) && --timeout) { /* wait for IBF = 0 */ + udelay(10); + if ((timeout & 0xff) == 0) + printk(BIOS_SPEW, "."); + } + if (!timeout) { + printk(BIOS_DEBUG, "Timeout while sending data 0x%02x to EC!\n", + data); + return -1; + } + + outb(data, KBD_DATA); + return 0; +} + +#if 0 +static u8 recv_kbd_data(void) +{ + int timeout; + u8 data; + + timeout = 0x7fff; + while (--timeout) { /* Wait for OBF = 1 */ + if (inb(KBD_SC) & KBD_OBF) { + break; + } + udelay(10); + if ((timeout & 0xff) == 0) + printk(BIOS_SPEW, "."); + } + if (!timeout) { + printk(BIOS_DEBUG, "\nTimeout while receiving data from EC!\n"); + } + + data = inb(KBD_DATA); + return data; +} +#endif + +void kbc1126_thermalinit(u8 cmd) +{ + if (send_kbd_command(cmd)<0) + goto fail; + + if (send_kbd_data(0x27)<0) + goto fail; + + if (send_kbd_data(0x01)<0) + goto fail; + + /* + * TODO: The following is not needed for fan control, + * but it's found in OEM firmware + */ + + if (send_kbd_command(cmd)<0) + goto fail; + + if (send_kbd_data(0xd5)<0) + goto fail; + + if (send_kbd_data(0xff)<0) + goto fail; + + return; +fail: + printk(BIOS_DEBUG, "Fail to init EC\n"); + return; +} diff --git a/src/ec/hp/kbc1126/ec.h b/src/ec/hp/kbc1126/ec.h new file mode 100644 index 0000000..55003ca --- /dev/null +++ b/src/ec/hp/kbc1126/ec.h @@ -0,0 +1,24 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2017 Iru Cai + * + * 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. + * + */ + +#ifndef _EC_HP_KBC1126_EC_H + +void kbc1126_thermalinit(u8 cmd); + +#define _EC_HP_KBC1126_EC_H + + +#endif /* _EC_HP_KBC1126_EC_H */