summaryrefslogtreecommitdiff
path: root/src/ec/google/chromeec
diff options
context:
space:
mode:
authorSumeet Pawnikar <sumeet.r.pawnikar@intel.com>2022-06-08 17:43:36 +0530
committerFelix Held <felix-coreboot@felixheld.de>2023-04-12 14:11:45 +0000
commit2f7fa5543308e83787b7cef6e83e20e1e3f379d9 (patch)
tree94a4d6dbe8092e729392ae1459b150f060fc4109 /src/ec/google/chromeec
parent0c06dbb1a4aaf6506b769fb36e8a694e91ab411b (diff)
Reland "drivers/intel/dptf: Add multiple fan support under dptf"
This reverts commit 4dba71fd25c91a9e610287c61238a8fe24452e4e. Add multiple fan support for dptf policies. This also fixes the Google Meet resolution drop issue as per b:246535768 comment#12. When system starts Google Meet video call, it uses the hardware accelerated encoder as expected. But, as soon as another system connects to the call, an immediate fallback is observed from hardware to software encoder. Due to this, Google Meet resolution dropped from 720p to 180p. This issue is observed on Alder Lake-N SoC based fanless platforms. This same issue was not seen on fan based systems. With the fix in dptf driver where fan configures appropriate setting for only fan participant, not for other device participants, able to see consistent 720p resolution. BUG=b:246535768,b:235254828 BRANCH=None TEST=Built and tested on Alder Lake-P Redrix system for two fans support and on Alder Lake-N fanless systems. With this code change Google Meet resolution drop not observed. Signed-off-by: Sumeet Pawnikar <sumeet.r.pawnikar@intel.com> Change-Id: Id07d279ff962253c22be9d395ed7be0d732aeaa7 Reviewed-on: https://review.coreboot.org/c/coreboot/+/73249 Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com> Reviewed-by: Paul Menzel <paulepanter@mailbox.org> Reviewed-by: Reka Norman <rekanorman@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/ec/google/chromeec')
-rw-r--r--src/ec/google/chromeec/acpi/emem.asl1
-rw-r--r--src/ec/google/chromeec/chip.h1
-rw-r--r--src/ec/google/chromeec/ec_acpi.c2
-rw-r--r--src/ec/google/chromeec/ec_dptf_helpers.c35
4 files changed, 31 insertions, 8 deletions
diff --git a/src/ec/google/chromeec/acpi/emem.asl b/src/ec/google/chromeec/acpi/emem.asl
index 3f9a457e18..59395f3bc5 100644
--- a/src/ec/google/chromeec/acpi/emem.asl
+++ b/src/ec/google/chromeec/acpi/emem.asl
@@ -16,6 +16,7 @@ TIN8, 8, // Temperature 8
TIN9, 8, // Temperature 9
Offset (0x10),
FAN0, 16, // Fan Speed 0
+FAN1, 16, // Fan Speed 1
Offset (0x24),
BTVR, 8, // Battery structure version
Offset (0x30),
diff --git a/src/ec/google/chromeec/chip.h b/src/ec/google/chromeec/chip.h
index bb03e5731d..77851d1d3d 100644
--- a/src/ec/google/chromeec/chip.h
+++ b/src/ec/google/chromeec/chip.h
@@ -12,6 +12,7 @@ struct ec_google_chromeec_config {
/* Pointer to PMC Mux connector for each Type-C port */
DEVTREE_CONST struct device *mux_conn[MAX_TYPEC_PORTS];
DEVTREE_CONST struct device *retimer_conn[MAX_TYPEC_PORTS];
+ bool ec_multifan_support;
};
#endif /* EC_GOOGLE_CHROMEEC_CHIP_H */
diff --git a/src/ec/google/chromeec/ec_acpi.c b/src/ec/google/chromeec/ec_acpi.c
index 02b6394f04..53a4e75e59 100644
--- a/src/ec/google/chromeec/ec_acpi.c
+++ b/src/ec/google/chromeec/ec_acpi.c
@@ -276,7 +276,7 @@ void google_chromeec_fill_ssdt_generator(const struct device *dev)
ec->ops = &ec_ops;
if (CONFIG(DRIVERS_INTEL_DPTF))
- ec_fill_dptf_helpers(ec);
+ ec_fill_dptf_helpers(ec, dev);
fill_ssdt_typec_device(dev);
fill_ssdt_ps2_keyboard(dev);
diff --git a/src/ec/google/chromeec/ec_dptf_helpers.c b/src/ec/google/chromeec/ec_dptf_helpers.c
index 1238bcfbec..c44138f587 100644
--- a/src/ec/google/chromeec/ec_dptf_helpers.c
+++ b/src/ec/google/chromeec/ec_dptf_helpers.c
@@ -3,7 +3,9 @@
#include <acpi/acpigen.h>
#include <acpi/acpigen_dptf.h>
#include <ec/google/common/dptf.h>
+#include <drivers/intel/dptf/chip.h>
+#include "chip.h"
/*
* The Chrome EC is typically in charge of many system functions, including battery charging and
* fan PWM control. This places it in the middle of a DPTF implementation and therefore, many of
@@ -22,6 +24,19 @@ enum {
EC_FAN_DUTY_AUTO = 0xFF,
};
+/* Return the fan number as a string for the FAN participant */
+static const char *fan_num_namestring_of(enum dptf_participant participant)
+{
+ switch (participant) {
+ case DPTF_FAN:
+ return "FAN0";
+ case DPTF_FAN_2:
+ return "FAN1";
+ default:
+ return "";
+ }
+}
+
static void write_charger_PPPC(const struct device *ec)
{
acpigen_write_method_serialized("PPPC", 0);
@@ -91,7 +106,7 @@ static void write_charger_SPPC(const struct device *ec)
acpigen_pop_len(); /* Method */
}
-static void write_fan_fst(const struct device *ec)
+static void write_fan_fst(const struct device *ec, int participant)
{
/* TFST is a package that is used to store data from FAND */
acpigen_write_name("TFST");
@@ -110,7 +125,7 @@ static void write_fan_fst(const struct device *ec)
acpigen_write_integer(1);
acpigen_emit_byte(ZERO_OP); /* 3rd arg to Index */
acpigen_write_store();
- acpigen_emit_namestring(acpi_device_path_join(ec, "FAN0"));
+ acpigen_emit_namestring(acpi_device_path_join(ec, fan_num_namestring_of(participant)));
acpigen_emit_byte(INDEX_OP);
acpigen_emit_namestring("TFST");
acpigen_write_integer(2);
@@ -300,11 +315,11 @@ static void write_charger_methods(const struct device *ec)
acpigen_pop_len(); /* Scope */
}
-static void write_fan_methods(const struct device *ec)
+static void write_fan_methods(const struct device *ec, int participant)
{
- dptf_write_scope(DPTF_FAN);
+ dptf_write_scope(participant);
write_fan_fsl(ec);
- write_fan_fst(ec);
+ write_fan_fst(ec, participant);
acpigen_pop_len(); /* Scope */
}
@@ -352,14 +367,20 @@ static void write_thermal_methods(const struct device *ec, enum dptf_participant
acpigen_pop_len(); /* Scope */
}
-void ec_fill_dptf_helpers(const struct device *ec)
+void ec_fill_dptf_helpers(const struct device *ec, const struct device *fan_dev)
{
enum dptf_participant p;
int i;
+ struct ec_google_chromeec_config *config = fan_dev->chip_info;
write_dppm_methods(ec);
write_charger_methods(ec);
- write_fan_methods(ec);
+
+ if (config->ec_multifan_support) {
+ for (p = DPTF_FAN; p <= DPTF_FAN_2; ++p)
+ write_fan_methods(ec, p);
+ } else
+ write_fan_methods(ec, DPTF_FAN);
for (p = DPTF_TEMP_SENSOR_0, i = 0; p <= DPTF_TEMP_SENSOR_4; ++p, ++i)
write_thermal_methods(ec, p, i);