blob: 44fb9f0fefddb216320f8e9fbd796441a2d6d5d5 [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0-only */
#include <assert.h>
#include <console/console.h>
#include <security/tpm/tss.h>
#include <types.h>
#include <vendorcode/google/chromeos/chromeos.h>
#define CHROMEBOOK_PLUS_HARD_BRANDED BIT(4)
#define CHROMEBOOK_PLUS_SOFT_BRANDED BIT(0)
#define CHROMEBOOK_PLUS_DEVICE (CHROMEBOOK_PLUS_HARD_BRANDED | CHROMEBOOK_PLUS_SOFT_BRANDED)
uint64_t chromeos_get_factory_config(void)
{
static uint64_t factory_config = UNDEFINED_FACTORY_CONFIG;
if (factory_config != UNDEFINED_FACTORY_CONFIG)
return factory_config;
/* Initialize TPM driver. */
tpm_result_t rc = tlcl_lib_init();
if (rc != TPM_SUCCESS) {
printk(BIOS_ERR, "%s:%d - tlcl_lib_init() failed: %#x\n",
__func__, __LINE__, rc);
return UNDEFINED_FACTORY_CONFIG;
}
rc = tlcl_cr50_get_factory_config(&factory_config);
if (rc != TPM_SUCCESS) {
printk(BIOS_ERR, "%s:%d - tlcl_cr50_get_factory_config() failed: %#x\n",
__func__, __LINE__, rc);
return UNDEFINED_FACTORY_CONFIG;
}
assert(factory_config != UNDEFINED_FACTORY_CONFIG);
return factory_config;
}
/*
* Determines whether a ChromeOS device is branded as a Chromebook Plus
* based on specific bit flags:
*
* - Bit 4 (0x10): Indicates whether the device chassis has the
* "chromebook-plus" branding.
* - Bits 3-0 (0x1): Must be 0x1 to signify compliance with Chromebook Plus
* hardware specifications.
*
* To be considered a Chromebook Plus, either of these conditions needs to be met.
*/
bool chromeos_device_branded_plus(void)
{
uint64_t factory_config = chromeos_get_factory_config();
if (factory_config == UNDEFINED_FACTORY_CONFIG)
return false;
return factory_config & CHROMEBOOK_PLUS_DEVICE;
}