| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #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) |
| |
| int64_t chromeos_get_factory_config(void) |
| { |
| static int64_t factory_config = -1; |
| |
| if (factory_config >= 0) |
| 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 -1; |
| } |
| |
| rc = tlcl_cr50_get_factory_config((uint64_t *)&factory_config); |
| |
| if (rc != TPM_SUCCESS) { |
| printk(BIOS_ERR, "%s:%d - tlcl_cr50_get_factory_config() failed: %#x\n", |
| __func__, __LINE__, rc); |
| return -1; |
| } |
| |
| 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) |
| { |
| int64_t factory_config = chromeos_get_factory_config(); |
| |
| if (factory_config < 0) |
| return false; |
| |
| return factory_config & CHROMEBOOK_PLUS_DEVICE; |
| } |