summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainboard/google/brya/Kconfig.name1
-rw-r--r--src/mainboard/google/brya/variants/crota/variant.c57
2 files changed, 58 insertions, 0 deletions
diff --git a/src/mainboard/google/brya/Kconfig.name b/src/mainboard/google/brya/Kconfig.name
index e5091e6a4c..f2f3082657 100644
--- a/src/mainboard/google/brya/Kconfig.name
+++ b/src/mainboard/google/brya/Kconfig.name
@@ -206,6 +206,7 @@ config BOARD_GOOGLE_CROTA
select CHROMEOS_WIFI_SAR if CHROMEOS
select DRIVERS_GENESYSLOGIC_GL9750
select DRIVERS_I2C_CS42L42
+ select VPD
config BOARD_GOOGLE_MOLI
bool "-> Moli"
diff --git a/src/mainboard/google/brya/variants/crota/variant.c b/src/mainboard/google/brya/variants/crota/variant.c
index e8c62ebdc2..cb4935b1df 100644
--- a/src/mainboard/google/brya/variants/crota/variant.c
+++ b/src/mainboard/google/brya/variants/crota/variant.c
@@ -4,12 +4,23 @@
#include <chip.h>
#include <fw_config.h>
#include <baseboard/variants.h>
+#include <acpi/acpi.h>
+#include <acpi/acpigen.h>
+#include <drivers/vpd/vpd.h>
+#include <stdio.h>
const char *get_wifi_sar_cbfs_filename(void)
{
return "wifi_sar_0.hex";
}
+static const char *get_dock_mac_from_vpd(char *buf, int size)
+{
+ /* Support MAC address pass-through */
+ /* Read value of 'dock_mac' from RO VPD */
+ return vpd_gets("dock_mac", buf, size, VPD_RO);
+}
+
void variant_update_soc_chip_config(struct soc_intel_alderlake_config *config)
{
if (fw_config_probe(FW_CONFIG(DB_LTE, LTE_USB))) {
@@ -26,3 +37,49 @@ void variant_update_soc_chip_config(struct soc_intel_alderlake_config *config)
config->ext_fivr_settings.vnn_sx_voltage_mv = 1250;
}
}
+
+void variant_fill_ssdt(const struct device *unused)
+{
+ /* Write MAC address to SSDT for Linux kernel r8152 driver */
+ /* enable pass-through support */
+ /* and read ACPI object name: "\_SB.AMAC" */
+
+ /* ASL code like this */
+ // Scope (\_SB)
+ // {
+ // Method (AMAC, 0, Serialized)
+ // {
+ // Return (ToBuffer (STRING))
+ // }
+ // }
+
+ char buf[32], acpi_buf[32];
+ if (get_dock_mac_from_vpd(buf, sizeof(buf)) != NULL) {
+ printk(BIOS_INFO, "RO_VPD, dock_mac=%s\n", buf);
+
+ /* remove ':' from mac address string */
+ size_t len = strlen(buf);
+ int i, j;
+ for (i = 0; i < len; i++) {
+ if (buf[i] == ':') {
+ for (j = i; j < len; j++)
+ buf[j] = buf[j+1];
+ len--;
+ i--;
+ }
+ }
+ buf[len] = '\0';
+
+ /* Format expected by the Linux kernel r8152 driver */
+ /* "_AUXMAC_#XXXXXXXXXXXX#" */
+ int acpi_buf_len = snprintf(acpi_buf, sizeof(acpi_buf), "_AUXMAC_#%s#", buf);
+
+ acpigen_write_scope("\\_SB");
+ acpigen_write_method_serialized("AMAC", 0);
+
+ acpigen_write_return_byte_buffer((uint8_t *)acpi_buf, acpi_buf_len);
+
+ acpigen_write_method_end();
+ acpigen_write_scope_end();
+ }
+}