/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include #include #define VPD_KEY_FEATURE_DEVICE_INFO "feature_device_info" /* * Extracts the "feature_level" from the "feature_device_info" VPD key. * This key holds a base64-encoded protobuf where "feature_level" is the first entry. */ uint8_t vpd_get_feature_level(void) { const uint8_t *device_info; int device_info_size, feature_level = 0; uint8_t *decoded_device_info; size_t decoded_size; device_info = vpd_find(VPD_KEY_FEATURE_DEVICE_INFO, &device_info_size, VPD_RW); if (!device_info) return feature_level; decoded_size = B64_DECODED_SIZE(device_info_size); decoded_device_info = malloc(decoded_size); if (!decoded_device_info) { printk(BIOS_ERR, "%s: failed allocating %zd bytes\n", __func__, decoded_size); return feature_level; } /* The index 1 of the decoded data is the "feature level" value */ if (b64_decode(device_info, device_info_size, decoded_device_info)) feature_level = decoded_device_info[1]; free(decoded_device_info); return feature_level; }