diff --git a/config/coreboot/default/patches/0042-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch b/config/coreboot/default/patches/0042-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch index f6bd1940..37353e20 100644 --- a/config/coreboot/default/patches/0042-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch +++ b/config/coreboot/default/patches/0042-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch @@ -1,13 +1,13 @@ -From f6340f3fe21e948ba94d0429467882c2fb90b77e Mon Sep 17 00:00:00 2001 +From c58e0fea2a4e591e5ecd8a1f376c3b3af0fbb306 Mon Sep 17 00:00:00 2001 From: Mate Kukri -Date: Sat, 6 Apr 2024 23:25:15 +0100 +Date: Thu, 18 Apr 2024 20:28:45 +0100 Subject: [PATCH 1/1] mb/dell/optiplex_9020: Implement late HWM initialization There are 4 different chassis types specified by vendor firmware, each with a slightly different HWM configuration. The chassis type to use is determined at runtime by reading a set of -4 PCH GPIOs: 70, 38, 17, and 0. +4 PCH GPIOs: 70, 38, 17, and 1. Additionally vendor firmware also provides an option to run the fans at full speed. This is substituted with a coreboot nvram option in this @@ -26,10 +26,10 @@ Signed-off-by: Mate Kukri src/mainboard/dell/optiplex_9020/bootblock.c | 25 +- src/mainboard/dell/optiplex_9020/cmos.default | 1 + src/mainboard/dell/optiplex_9020/cmos.layout | 5 +- - src/mainboard/dell/optiplex_9020/mainboard.c | 382 ++++++++++++++++++ + src/mainboard/dell/optiplex_9020/mainboard.c | 387 ++++++++++++++++++ src/mainboard/dell/optiplex_9020/sch5555_ec.c | 54 +++ - src/mainboard/dell/optiplex_9020/sch5555_ec.h | 7 + - 7 files changed, 455 insertions(+), 22 deletions(-) + src/mainboard/dell/optiplex_9020/sch5555_ec.h | 10 + + 7 files changed, 463 insertions(+), 22 deletions(-) create mode 100644 src/mainboard/dell/optiplex_9020/sch5555_ec.c create mode 100644 src/mainboard/dell/optiplex_9020/sch5555_ec.h @@ -119,7 +119,7 @@ index 72ff9c4bee..4a1496a878 100644 # coreboot config options: check sums 984 16 h 0 check_sum diff --git a/src/mainboard/dell/optiplex_9020/mainboard.c b/src/mainboard/dell/optiplex_9020/mainboard.c -index c834fea5d3..10b8aaca0e 100644 +index c834fea5d3..0b7829c736 100644 --- a/src/mainboard/dell/optiplex_9020/mainboard.c +++ b/src/mainboard/dell/optiplex_9020/mainboard.c @@ -1,7 +1,12 @@ @@ -130,18 +130,19 @@ index c834fea5d3..10b8aaca0e 100644 #include #include +#include -+#include ++#include +#include "sch5555_ec.h" static void mainboard_enable(struct device *dev) { -@@ -13,3 +18,380 @@ static void mainboard_enable(struct device *dev) +@@ -13,3 +18,385 @@ static void mainboard_enable(struct device *dev) struct chip_operations mainboard_ops = { .enable_dev = mainboard_enable, }; + -+#define HWM_TAB_ADD_TEMP_TARGET 1 ++#define HWM_TAB_ADD_TEMP_TARGET 1 +#define HWM_TAB_PKG_POWER_ANY 0xffff ++#define CHASSIS_TYPE_UNKNOWN 0xff + +struct hwm_tab_entry { + uint16_t addr; @@ -390,7 +391,7 @@ index c834fea5d3..10b8aaca0e 100644 + + // Read chassis type from GPIO + gpio_chassis_type = get_gpio(70) << 3 | get_gpio(38) << 2 | -+ get_gpio(17) << 1 | get_gpio(0); ++ get_gpio(17) << 1 | get_gpio(1); + + printk(BIOS_DEBUG, "GPIO chassis type = %#x\n", gpio_chassis_type); + @@ -408,7 +409,7 @@ index c834fea5d3..10b8aaca0e 100644 + case 0x0f: + return 6; + default: -+ die("Unknown GPIO chassis type\n"); ++ return CHASSIS_TYPE_UNKNOWN; + } + +} @@ -469,9 +470,15 @@ index c834fea5d3..10b8aaca0e 100644 + ec_write(1, 0x2fc, 0xa0); + ec_write(1, 0x2fd, 0x32); + -+ // Apply HWM table based on chassis type + chassis_type = get_chassis_type(); -+ printk(BIOS_DEBUG, "Chassis type = %#x\n", chassis_type); ++ ++ if (chassis_type != CHASSIS_TYPE_UNKNOWN) { ++ printk(BIOS_DEBUG, "Chassis type = %#x\n", chassis_type); ++ } else { ++ printk(BIOS_DEBUG, "WARNING: Unknown chassis type\n"); ++ } ++ ++ // Apply HWM table based on chassis type + switch (chassis_type) { + case 3: + apply_hwm_tab(HWM_TAB3, ARRAY_SIZE(HWM_TAB3)); @@ -485,19 +492,17 @@ index c834fea5d3..10b8aaca0e 100644 + case 6: + apply_hwm_tab(HWM_TAB6, ARRAY_SIZE(HWM_TAB6)); + break; -+ default: -+ die("Unknown chassis type\n"); + } + -+ if (CONFIG_MAX_CPUS > 2) { -+ ec_write(1, 0x9e, 0x30); -+ ec_write(1, 0xeb, ec_read(1, 0xea)); -+ } ++ // NOTE: vendor firmware applies these when "max core address" > 2 ++ // i think this is always the case ++ ec_write(1, 0x9e, 0x30); ++ ec_write(1, 0xeb, ec_read(1, 0xea)); + + ec_write(1, 0x2fc, saved_2fc); + -+ // Apply full speed fan config if requested -+ if (get_uint_option("fan_full_speed", 0)) { ++ // Apply full speed fan config if requested or if the chassis type is unknown ++ if (chassis_type == CHASSIS_TYPE_UNKNOWN || get_uint_option("fan_full_speed", 0)) { + printk(BIOS_DEBUG, "Setting full fan speed\n"); + ec_write(1, 0x80, 0x60 | ec_read(1, 0x80)); + ec_write(1, 0x81, 0x60 | ec_read(1, 0x81)); @@ -518,7 +523,7 @@ index c834fea5d3..10b8aaca0e 100644 +BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_EXIT, sch5555_ec_hwm_init, NULL); diff --git a/src/mainboard/dell/optiplex_9020/sch5555_ec.c b/src/mainboard/dell/optiplex_9020/sch5555_ec.c new file mode 100644 -index 0000000000..92244da9ab +index 0000000000..a1067ac063 --- /dev/null +++ b/src/mainboard/dell/optiplex_9020/sch5555_ec.c @@ -0,0 +1,54 @@ @@ -546,7 +551,7 @@ index 0000000000..92244da9ab + outb(1, SCH555x_EMI_IOBASE); + + // wait for ack -+ for (size_t timeout = 0; timeout < 0xfff; ++timeout) ++ for (size_t retry = 0; retry < 0xfff; ++retry) + if (inb(SCH555x_EMI_IOBASE + 1) & 1) + break; + @@ -572,23 +577,26 @@ index 0000000000..92244da9ab + outb(1, SCH555x_EMI_IOBASE); + + // wait for ack -+ for (size_t timeout = 0; timeout < 0xfff; ++timeout) ++ for (size_t retry = 0; retry < 0xfff; ++retry) + if (inb(SCH555x_EMI_IOBASE + 1) & 1) + break; +} diff --git a/src/mainboard/dell/optiplex_9020/sch5555_ec.h b/src/mainboard/dell/optiplex_9020/sch5555_ec.h new file mode 100644 -index 0000000000..6e703ff865 +index 0000000000..7e399e8e74 --- /dev/null +++ b/src/mainboard/dell/optiplex_9020/sch5555_ec.h -@@ -0,0 +1,7 @@ +@@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + -+#pragma once ++#ifndef __SCH5555_EC_H__ ++#define __SCH5555_EC_H__ + +uint8_t ec_read(uint8_t addr1, uint16_t addr2); + +void ec_write(uint8_t addr1, uint16_t addr2, uint8_t val); ++ ++#endif -- 2.39.2 diff --git a/config/coreboot/haswell/patches/0023-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch b/config/coreboot/haswell/patches/0023-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch index 527c18d3..e2db6a17 100644 --- a/config/coreboot/haswell/patches/0023-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch +++ b/config/coreboot/haswell/patches/0023-mb-dell-optiplex_9020-Implement-late-HWM-initializat.patch @@ -1,13 +1,13 @@ -From 08bae51a77c2c92fefef79e9c9b6ff963b3812cc Mon Sep 17 00:00:00 2001 +From 05cc767d1398f91533e87db5ceaa0aabb7918425 Mon Sep 17 00:00:00 2001 From: Mate Kukri -Date: Sat, 6 Apr 2024 23:25:15 +0100 -Subject: [PATCH 3/4] mb/dell/optiplex_9020: Implement late HWM initialization +Date: Thu, 18 Apr 2024 20:28:45 +0100 +Subject: [PATCH 1/1] mb/dell/optiplex_9020: Implement late HWM initialization There are 4 different chassis types specified by vendor firmware, each with a slightly different HWM configuration. The chassis type to use is determined at runtime by reading a set of -4 PCH GPIOs: 70, 38, 17, and 0. +4 PCH GPIOs: 70, 38, 17, and 1. Additionally vendor firmware also provides an option to run the fans at full speed. This is substituted with a coreboot nvram option in this @@ -26,10 +26,10 @@ Signed-off-by: Mate Kukri src/mainboard/dell/optiplex_9020/bootblock.c | 25 +- src/mainboard/dell/optiplex_9020/cmos.default | 1 + src/mainboard/dell/optiplex_9020/cmos.layout | 5 +- - src/mainboard/dell/optiplex_9020/mainboard.c | 382 ++++++++++++++++++ + src/mainboard/dell/optiplex_9020/mainboard.c | 387 ++++++++++++++++++ src/mainboard/dell/optiplex_9020/sch5555_ec.c | 54 +++ - src/mainboard/dell/optiplex_9020/sch5555_ec.h | 7 + - 7 files changed, 455 insertions(+), 22 deletions(-) + src/mainboard/dell/optiplex_9020/sch5555_ec.h | 10 + + 7 files changed, 463 insertions(+), 22 deletions(-) create mode 100644 src/mainboard/dell/optiplex_9020/sch5555_ec.c create mode 100644 src/mainboard/dell/optiplex_9020/sch5555_ec.h @@ -119,7 +119,7 @@ index 72ff9c4bee..4a1496a878 100644 # coreboot config options: check sums 984 16 h 0 check_sum diff --git a/src/mainboard/dell/optiplex_9020/mainboard.c b/src/mainboard/dell/optiplex_9020/mainboard.c -index c834fea5d3..10b8aaca0e 100644 +index c834fea5d3..0b7829c736 100644 --- a/src/mainboard/dell/optiplex_9020/mainboard.c +++ b/src/mainboard/dell/optiplex_9020/mainboard.c @@ -1,7 +1,12 @@ @@ -130,18 +130,19 @@ index c834fea5d3..10b8aaca0e 100644 #include #include +#include -+#include ++#include +#include "sch5555_ec.h" static void mainboard_enable(struct device *dev) { -@@ -13,3 +18,380 @@ static void mainboard_enable(struct device *dev) +@@ -13,3 +18,385 @@ static void mainboard_enable(struct device *dev) struct chip_operations mainboard_ops = { .enable_dev = mainboard_enable, }; + -+#define HWM_TAB_ADD_TEMP_TARGET 1 ++#define HWM_TAB_ADD_TEMP_TARGET 1 +#define HWM_TAB_PKG_POWER_ANY 0xffff ++#define CHASSIS_TYPE_UNKNOWN 0xff + +struct hwm_tab_entry { + uint16_t addr; @@ -390,7 +391,7 @@ index c834fea5d3..10b8aaca0e 100644 + + // Read chassis type from GPIO + gpio_chassis_type = get_gpio(70) << 3 | get_gpio(38) << 2 | -+ get_gpio(17) << 1 | get_gpio(0); ++ get_gpio(17) << 1 | get_gpio(1); + + printk(BIOS_DEBUG, "GPIO chassis type = %#x\n", gpio_chassis_type); + @@ -408,7 +409,7 @@ index c834fea5d3..10b8aaca0e 100644 + case 0x0f: + return 6; + default: -+ die("Unknown GPIO chassis type\n"); ++ return CHASSIS_TYPE_UNKNOWN; + } + +} @@ -469,9 +470,15 @@ index c834fea5d3..10b8aaca0e 100644 + ec_write(1, 0x2fc, 0xa0); + ec_write(1, 0x2fd, 0x32); + -+ // Apply HWM table based on chassis type + chassis_type = get_chassis_type(); -+ printk(BIOS_DEBUG, "Chassis type = %#x\n", chassis_type); ++ ++ if (chassis_type != CHASSIS_TYPE_UNKNOWN) { ++ printk(BIOS_DEBUG, "Chassis type = %#x\n", chassis_type); ++ } else { ++ printk(BIOS_DEBUG, "WARNING: Unknown chassis type\n"); ++ } ++ ++ // Apply HWM table based on chassis type + switch (chassis_type) { + case 3: + apply_hwm_tab(HWM_TAB3, ARRAY_SIZE(HWM_TAB3)); @@ -485,19 +492,17 @@ index c834fea5d3..10b8aaca0e 100644 + case 6: + apply_hwm_tab(HWM_TAB6, ARRAY_SIZE(HWM_TAB6)); + break; -+ default: -+ die("Unknown chassis type\n"); + } + -+ if (CONFIG_MAX_CPUS > 2) { -+ ec_write(1, 0x9e, 0x30); -+ ec_write(1, 0xeb, ec_read(1, 0xea)); -+ } ++ // NOTE: vendor firmware applies these when "max core address" > 2 ++ // i think this is always the case ++ ec_write(1, 0x9e, 0x30); ++ ec_write(1, 0xeb, ec_read(1, 0xea)); + + ec_write(1, 0x2fc, saved_2fc); + -+ // Apply full speed fan config if requested -+ if (get_uint_option("fan_full_speed", 0)) { ++ // Apply full speed fan config if requested or if the chassis type is unknown ++ if (chassis_type == CHASSIS_TYPE_UNKNOWN || get_uint_option("fan_full_speed", 0)) { + printk(BIOS_DEBUG, "Setting full fan speed\n"); + ec_write(1, 0x80, 0x60 | ec_read(1, 0x80)); + ec_write(1, 0x81, 0x60 | ec_read(1, 0x81)); @@ -518,7 +523,7 @@ index c834fea5d3..10b8aaca0e 100644 +BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_EXIT, sch5555_ec_hwm_init, NULL); diff --git a/src/mainboard/dell/optiplex_9020/sch5555_ec.c b/src/mainboard/dell/optiplex_9020/sch5555_ec.c new file mode 100644 -index 0000000000..92244da9ab +index 0000000000..a1067ac063 --- /dev/null +++ b/src/mainboard/dell/optiplex_9020/sch5555_ec.c @@ -0,0 +1,54 @@ @@ -546,7 +551,7 @@ index 0000000000..92244da9ab + outb(1, SCH555x_EMI_IOBASE); + + // wait for ack -+ for (size_t timeout = 0; timeout < 0xfff; ++timeout) ++ for (size_t retry = 0; retry < 0xfff; ++retry) + if (inb(SCH555x_EMI_IOBASE + 1) & 1) + break; + @@ -572,23 +577,26 @@ index 0000000000..92244da9ab + outb(1, SCH555x_EMI_IOBASE); + + // wait for ack -+ for (size_t timeout = 0; timeout < 0xfff; ++timeout) ++ for (size_t retry = 0; retry < 0xfff; ++retry) + if (inb(SCH555x_EMI_IOBASE + 1) & 1) + break; +} diff --git a/src/mainboard/dell/optiplex_9020/sch5555_ec.h b/src/mainboard/dell/optiplex_9020/sch5555_ec.h new file mode 100644 -index 0000000000..6e703ff865 +index 0000000000..7e399e8e74 --- /dev/null +++ b/src/mainboard/dell/optiplex_9020/sch5555_ec.h -@@ -0,0 +1,7 @@ +@@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + -+#pragma once ++#ifndef __SCH5555_EC_H__ ++#define __SCH5555_EC_H__ + +uint8_t ec_read(uint8_t addr1, uint16_t addr2); + +void ec_write(uint8_t addr1, uint16_t addr2, uint8_t val); ++ ++#endif -- 2.39.2