/* * This file is part of the coreboot project. * * Copyright 2018 Google LLC * * 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 #include #include #include #include #include #define GBB_FMAP_REGION_NAME "GBB" /* Copy of GBB header read from boot media. */ static GoogleBinaryBlockHeader gbb_header; /* * Read "GBB" region from SPI flash to obtain GBB header and validate * signature. * * Return value: * Success = 0 * Error = 1 */ static int gbb_init(void) { static bool init_done = false; struct region_device gbb_rdev; if (init_done != false) return 0; if (fmap_locate_area_as_rdev(GBB_FMAP_REGION_NAME, &gbb_rdev)) return 1; if (rdev_readat(&gbb_rdev, &gbb_header, 0, sizeof(GoogleBinaryBlockHeader)) != sizeof(GoogleBinaryBlockHeader)) { printk(BIOS_ERR, "%s: Failure to read GBB header!\n", __func__); return 1; } if (memcmp(gbb_header.signature, GBB_SIGNATURE, GBB_SIGNATURE_SIZE)) { printk(BIOS_ERR, "%s: Signature check failed!\n", __func__); return 1; } init_done = true; return 0; } uint32_t gbb_get_flags(void) { if (gbb_init()) { printk(BIOS_ERR, "%s: Failure to initialize GBB. Returning flags as 0!\n", __func__); return 0; } return gbb_header.flags; } bool gbb_is_flag_set(uint32_t flag) { return !!(gbb_get_flags() & flag); }