From 7691ebc379bd3d1ca0f92bd25db974ec7dfff4b3 Mon Sep 17 00:00:00 2001 From: Iru Cai Date: Sat, 11 Apr 2020 22:05:50 +0800 Subject: Doc/mb/hp: rename the document about HP laptops with KBC1126 Later EliteBooks use different EC chips and have different EC firmware interfaces, so rename the document elitebook_series.md to a more precise name and also do some rewriting. A link to the code review page for 8760w is also added because the port for this laptop is not merged yet. Change-Id: I2f9b8c4e52ed760c16977d16838cca9e490cda05 Signed-off-by: Iru Cai Reviewed-on: https://review.coreboot.org/c/coreboot/+/40315 Tested-by: build bot (Jenkins) Reviewed-by: Angel Pons --- Documentation/mainboard/hp/8760w.md | 6 +- Documentation/mainboard/hp/elitebook_series.md | 111 ----------------------- Documentation/mainboard/hp/hp_kbc1126_laptops.md | 109 ++++++++++++++++++++++ Documentation/mainboard/index.md | 2 +- 4 files changed, 115 insertions(+), 113 deletions(-) delete mode 100644 Documentation/mainboard/hp/elitebook_series.md create mode 100644 Documentation/mainboard/hp/hp_kbc1126_laptops.md diff --git a/Documentation/mainboard/hp/8760w.md b/Documentation/mainboard/hp/8760w.md index 714745aa04..071d35e251 100644 --- a/Documentation/mainboard/hp/8760w.md +++ b/Documentation/mainboard/hp/8760w.md @@ -2,6 +2,9 @@ This page describes how to run coreboot on the [HP EliteBook 8760w]. +The coreboot code for this laptop is still not merged, you need to +checkout the [code on gerrit] to build coreboot for the laptop. + ## Flashing coreboot ```eval_rst @@ -29,7 +32,7 @@ This page describes how to run coreboot on the [HP EliteBook 8760w]. ## Required proprietary blobs - Intel Firmware Descriptor, ME and GbE firmware -- EC: please read [EliteBook Series](elitebook_series) +- EC: please read [HP Laptops with KBC1126 Embedded Controller](hp_kbc1126_laptops) ## Flashing instructions @@ -80,3 +83,4 @@ clip to read and flash the chip. ``` [HP EliteBook 8760w]: https://support.hp.com/us-en/product/hp-elitebook-8760w-mobile-workstation/5071180 +[code on gerrit]: https://review.coreboot.org/c/coreboot/+/30936 diff --git a/Documentation/mainboard/hp/elitebook_series.md b/Documentation/mainboard/hp/elitebook_series.md deleted file mode 100644 index 6668928008..0000000000 --- a/Documentation/mainboard/hp/elitebook_series.md +++ /dev/null @@ -1,111 +0,0 @@ -# HP EliteBook series - -This document is about HP EliteBook series laptops up to Ivy Bridge era -which use SMSC KBC1126 as embedded controller. - -## EC - -SMSC KBC1098/KBC1126 has been used in HP EliteBooks for many generations. -They use similar EC firmware that will load other code and data from the -SPI flash chip, so we need to put some firmware blobs to the coreboot image. - -The following document takes EliteBook 2760p as an example. - -First, you need to extract the blobs needed by EC firmware using util/kbc1126. -You can extract them from your backup firmware image, or firmware update -provided by HP with [unar] as follows: - -```bash -wget https://ftp.hp.com/pub/softpaq/sp79501-80000/sp79710.exe -unar sp79710.exe -${COREBOOT_DIR}/util/kbc1126/kbc1126_ec_dump sp79710/Rompaq/68SOU.BIN -mv 68SOU.BIN.fw1 ${COREBOOT_DIR}/2760p-fw1.bin -mv 68SOU.BIN.fw2 ${COREBOOT_DIR}/2760p-fw2.bin -``` - -When you config coreboot, select: - -```text -Chipset ---> - [*] Add firmware images for KBC1126 EC - (2760p-fw1.bin) KBC1126 firmware #1 path and filename - (2760p-fw2.bin) KBC1126 filename #2 path and filename -``` - -## Super I/O - -EliteBook 8000 series laptops have SMSC LPC47n217 Super I/O to provide -a serial port and a parallel port, you can debug the laptop via this -serial port. - -## porting - -To port coreboot to an HP EliteBook laptop, you need to do the following: - -- select Kconfig option `EC_HP_KBC1126` -- select Kconfig option `SUPERIO_SMSC_LPC47N217` if there is LPC47n217 Super I/O -- initialize EC and Super I/O in romstage -- add EC and Super I/O support to devicetree.cb - -To get the related values for EC in devicetree.cb, you need to extract the EFI -module EcThermalInit from the vendor UEFI firmware with [UEFITool]. Usually, -`ec_data_port`, `ec_cmd_port` and `ec_ctrl_reg` has the following values: - -- For xx60 series: 0x60, 0x64, 0xca -- For xx70 series: 0x62, 0x66, 0x81 - -You can use [radare2] and the following [r2pipe] Python script to find -these values from the EcThermalInit EFI module: - -```python -#!/usr/bin/env python - -# install radare2 and use `pip3 install --user r2pipe` to install r2pipe - -import r2pipe -import sys - -if len(sys.argv) < 2: - fn = "ecthermalinit.efi" -else: - fn = sys.argv[1] - -r2 = r2pipe.open(fn) -r2.cmd("aa") -entryf = r2.cmdj("pdfj") - -for insn in entryf["ops"]: - if "lea r8" in insn["opcode"]: - _callback = insn["ptr"] - break - -r2.cmd("af @ {}".format(_callback)) -callbackf_insns = r2.cmdj("pdfj @ {}".format(_callback))["ops"] - -def find_port(addr): - ops = r2.cmdj("pdfj @ {}".format(addr))["ops"] - for insn in ops: - if "lea r8d" in insn["opcode"]: - return insn["ptr"] - -ctrl_reg_found = False - -for i in range(0, len(callbackf_insns)): - if not ctrl_reg_found and "mov cl" in callbackf_insns[i]["opcode"]: - ctrl_reg_found = True - ctrl_reg = callbackf_insns[i]["ptr"] - print("ec_ctrl_reg = 0x%02x" % ctrl_reg) - cmd_port = find_port(callbackf_insns[i+1]["jump"]) - data_port = find_port(callbackf_insns[i+3]["jump"]) - print("ec_cmd_port = 0x%02x\nec_data_port = 0x%02x" % (cmd_port, data_port)) - - if "mov bl" in callbackf_insns[i]["opcode"]: - ctrl_value = callbackf_insns[i]["ptr"] - print("ec_fan_ctrl_value = 0x%02x" % ctrl_value) -``` - - -[unar]: https://theunarchiver.com/command-line -[UEFITool]: https://github.com/LongSoft/UEFITool -[radare2]: https://radare.org/ -[r2pipe]: https://github.com/radare/radare2-r2pipe diff --git a/Documentation/mainboard/hp/hp_kbc1126_laptops.md b/Documentation/mainboard/hp/hp_kbc1126_laptops.md new file mode 100644 index 0000000000..357af4fb42 --- /dev/null +++ b/Documentation/mainboard/hp/hp_kbc1126_laptops.md @@ -0,0 +1,109 @@ +# HP Laptops with KBC1126 Embedded Controller + +This document is about HP EliteBook series laptops up to Ivy Bridge era +which use SMSC KBC1126 as embedded controller. + +SMSC KBC1126 (and older similar chips like KBC1098) has been used in +HP EliteBooks for many generations. BIOS and EC firmware share an SPI +flash chip in these laptops, so we need to put firmware blobs for the +EC to the coreboot image. + +## EC firmware extraction and coreboot building + +The following document takes EliteBook 2760p as an example. + +First, you need to extract the blobs needed by EC firmware using util/kbc1126. +You can extract them from your backup firmware image, or firmware update +provided by HP with [unar] as follows: + +```bash +wget https://ftp.hp.com/pub/softpaq/sp79501-80000/sp79710.exe +unar sp79710.exe +${COREBOOT_DIR}/util/kbc1126/kbc1126_ec_dump sp79710/Rompaq/68SOU.BIN +mv 68SOU.BIN.fw1 ${COREBOOT_DIR}/2760p-fw1.bin +mv 68SOU.BIN.fw2 ${COREBOOT_DIR}/2760p-fw2.bin +``` + +When you config coreboot, select: + +```text +Chipset ---> + [*] Add firmware images for KBC1126 EC + (2760p-fw1.bin) KBC1126 firmware #1 path and filename + (2760p-fw2.bin) KBC1126 filename #2 path and filename +``` + +## Porting guide for HP laptops with KBC1126 + +To port coreboot to an HP laptop with KBC1126, you need to do the +following: + +- select Kconfig option `EC_HP_KBC1126` +- select Kconfig option `SUPERIO_SMSC_LPC47N217` if there is LPC47n217 + Super I/O, usually in EliteBook 8000 series, which can be used for + debugging via serial port +- initialize EC and Super I/O in romstage +- add EC and Super I/O support to devicetree.cb + +To get the related values for EC in devicetree.cb, you need to extract the EFI +module EcThermalInit from the vendor UEFI firmware with [UEFITool]. Usually, +`ec_data_port`, `ec_cmd_port` and `ec_ctrl_reg` has the following values: + +- For EliteBook xx60 series: 0x60, 0x64, 0xca +- For EliteBook xx70 series: 0x62, 0x66, 0x81 + +You can use [radare2] and the following [r2pipe] Python script to find +these values from the EcThermalInit EFI module: + +```python +#!/usr/bin/env python + +# install radare2 and use `pip3 install --user r2pipe` to install r2pipe + +import r2pipe +import sys + +if len(sys.argv) < 2: + fn = "ecthermalinit.efi" +else: + fn = sys.argv[1] + +r2 = r2pipe.open(fn) +r2.cmd("aa") +entryf = r2.cmdj("pdfj") + +for insn in entryf["ops"]: + if "lea r8" in insn["opcode"]: + _callback = insn["ptr"] + break + +r2.cmd("af @ {}".format(_callback)) +callbackf_insns = r2.cmdj("pdfj @ {}".format(_callback))["ops"] + +def find_port(addr): + ops = r2.cmdj("pdfj @ {}".format(addr))["ops"] + for insn in ops: + if "lea r8d" in insn["opcode"]: + return insn["ptr"] + +ctrl_reg_found = False + +for i in range(0, len(callbackf_insns)): + if not ctrl_reg_found and "mov cl" in callbackf_insns[i]["opcode"]: + ctrl_reg_found = True + ctrl_reg = callbackf_insns[i]["ptr"] + print("ec_ctrl_reg = 0x%02x" % ctrl_reg) + cmd_port = find_port(callbackf_insns[i+1]["jump"]) + data_port = find_port(callbackf_insns[i+3]["jump"]) + print("ec_cmd_port = 0x%02x\nec_data_port = 0x%02x" % (cmd_port, data_port)) + + if "mov bl" in callbackf_insns[i]["opcode"]: + ctrl_value = callbackf_insns[i]["ptr"] + print("ec_fan_ctrl_value = 0x%02x" % ctrl_value) +``` + + +[unar]: https://theunarchiver.com/command-line +[UEFITool]: https://github.com/LongSoft/UEFITool +[radare2]: https://radare.org/ +[r2pipe]: https://github.com/radare/radare2-r2pipe diff --git a/Documentation/mainboard/index.md b/Documentation/mainboard/index.md index 7637f7bcbe..57df302986 100644 --- a/Documentation/mainboard/index.md +++ b/Documentation/mainboard/index.md @@ -58,7 +58,7 @@ The boards in this section are not real mainboards, but emulators. ### EliteBook series -- [EliteBook common](hp/elitebook_series.md) +- [HP Laptops with KBC1126 EC](hp/hp_kbc1126_laptops.md) - [EliteBook 8760w](hp/8760w.md) ## Intel -- cgit v1.2.3