google/chromeos: Add a library to get DSM calibration data

On ChromeOS, there will be VPD values for dynamic speaker management (DSM)
calibration data. They are resistor calibration values and temperature
during calibration.

These VPD fields use "dsm_calib_" prefix.

Known keys are:

"dsm_calib_r0_0"
"dsm_calib_r0_1"
"dsm_calib_r0_2"
"dsm_calib_r0_3"
"dsm_calib_temp_0"

For now these values are unsigned decimal numbers greater than 0.
This library will be used for RT1011 device driver in the patch series.

Note that in the future we may encode more values into this VPD field if
needed. We retain the flexibility for coreboot device driver or codec
driver to decode/parse the VPD values based on the needed use case
per-board.

BUG=b:140397934
BRANCH=none
TEST=On Helios, with patch series, check realtek,r0_calib and
realtek,temperature_calib are available to rt1011 codec driver.

Signed-off-by: Cheng-Yi Chiang <cychiang@chromium.org>
Change-Id: Ib9579a5cc055f8f438cb30a8acaf250a343db19e
Reviewed-on: https://review.coreboot.org/c/coreboot/+/36028
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Cheng-Yi Chiang 2019-10-14 12:10:51 +08:00 committed by Patrick Georgi
parent fcdb03358d
commit cfde82c1d7
4 changed files with 73 additions and 0 deletions

View File

@ -95,5 +95,14 @@ config CHROMEOS_USE_EC_WATCHDOG_FLAG
help help
Use the AP watchdog flag stored in EC. Use the AP watchdog flag stored in EC.
config CHROMEOS_DSM_CALIB
bool
default n
help
On some boards, there are calibrated parameters for Dynamic Speaker Management(DSM)
stored in VPD. Enable this config to read and parse these VPD values and write them
to ACPI DSD table in device driver. These parameters will be applied by kernel driver
through device property at boot.
endif # CHROMEOS endif # CHROMEOS
endmenu endmenu

View File

@ -21,6 +21,7 @@ ramstage-y += vpd_mac.c vpd_serialno.c vpd_calibration.c
ramstage-$(CONFIG_CHROMEOS_DISABLE_PLATFORM_HIERARCHY_ON_RESUME) += tpm2.c ramstage-$(CONFIG_CHROMEOS_DISABLE_PLATFORM_HIERARCHY_ON_RESUME) += tpm2.c
ramstage-$(CONFIG_HAVE_REGULATORY_DOMAIN) += wrdd.c ramstage-$(CONFIG_HAVE_REGULATORY_DOMAIN) += wrdd.c
ramstage-$(CONFIG_USE_SAR) += sar.c ramstage-$(CONFIG_USE_SAR) += sar.c
ramstage-$(CONFIG_CHROMEOS_DSM_CALIB) += dsm_calib.c
ramstage-$(CONFIG_TPM_CR50) += cr50_enable_update.c ramstage-$(CONFIG_TPM_CR50) += cr50_enable_update.c
ifeq ($(CONFIG_ARCH_MIPS),) ifeq ($(CONFIG_ARCH_MIPS),)
bootblock-y += watchdog.c bootblock-y += watchdog.c

View File

@ -23,6 +23,7 @@
#include <rules.h> #include <rules.h>
#include <security/vboot/misc.h> #include <security/vboot/misc.h>
#include <security/vboot/vboot_common.h> #include <security/vboot/vboot_common.h>
#include <types.h>
#if CONFIG(CHROMEOS) #if CONFIG(CHROMEOS)
/* functions implemented in watchdog.c */ /* functions implemented in watchdog.c */
@ -58,6 +59,16 @@ static inline void chromeos_reserve_ram_oops(struct device *dev, int idx) {}
void cbmem_add_vpd_calibration_data(void); void cbmem_add_vpd_calibration_data(void);
/**
* get_dsm_calibration_from_key - Gets value related to DSM calibration from VPD
* @key: The key in RO_VPD. The valid prefix is "dsm_calib_". The valid keys are
* documented in https://chromeos.google.com/partner/dlm/docs/factory/vpd.html.
* @value: Output value. The value read from VPD parsed into uint64_t integer.
*
* Returns CB_SUCCESS on success or CB_ERR on failure.
*/
enum cb_err get_dsm_calibration_from_key(const char *key, uint64_t *value);
/* /*
* Create the OIPG package containing the Chrome OS gpios described by * Create the OIPG package containing the Chrome OS gpios described by
* the chromeos_gpio array. * the chromeos_gpio array.

View File

@ -0,0 +1,52 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2019 Google Inc.
*
* 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 <console/console.h>
#include <drivers/vpd/vpd.h>
#include <stdint.h>
#include <string.h>
#include <types.h>
#include <vendorcode/google/chromeos/chromeos.h>
#define DSM_BUF_LEN 128
#define DSM_PREFIX "dsm_calib_"
enum cb_err get_dsm_calibration_from_key(const char *key, uint64_t *value)
{
static char buf[DSM_BUF_LEN];
char *ret;
long value_from_vpd;
if (strncmp(key, DSM_PREFIX, strlen(DSM_PREFIX))) {
printk(BIOS_ERR, "got invalid dsm_calib key: %s\n", key);
return CB_ERR;
}
ret = vpd_gets(key, buf, DSM_BUF_LEN, VPD_RO);
if (!ret) {
printk(BIOS_ERR, "failed to find key in VPD: %s\n", key);
return CB_ERR;
}
value_from_vpd = atol(buf);
if (value_from_vpd <= 0) {
printk(BIOS_ERR, "got invalid dsm_calib from VPD: %ld\n", value_from_vpd);
return CB_ERR;
}
*value = value_from_vpd;
return CB_SUCCESS;
}