summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mainboard/google/brya/bootblock.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/mainboard/google/brya/bootblock.c b/src/mainboard/google/brya/bootblock.c
index 1651337c49..bd7100a8dc 100644
--- a/src/mainboard/google/brya/bootblock.c
+++ b/src/mainboard/google/brya/bootblock.c
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
+#include <arch/mmio.h>
#include <baseboard/variants.h>
#include <bootblock_common.h>
#include <console/console.h>
@@ -13,6 +14,32 @@
#define SI_DESC_REGION_SZ 4096
#define PMC_DESC_7_BYTE3 0xc32
+/* Flash Master 1 : HOST/BIOS */
+#define FLMSTR1 0x80
+
+/* Flash signature Offset */
+#define FLASH_SIGN_OFFSET 0x10
+#define FLMSTR_WR_SHIFT_V2 20
+#define FLASH_VAL_SIGN 0xFF0A55A
+
+/* It checks whether host(Flash Master 1) has write access to the Descriptor Region or not */
+static int is_descriptor_writeable(uint8_t *desc)
+{
+ /* Check flash has valid signature */
+ if (read32((void *)(desc + FLASH_SIGN_OFFSET)) != FLASH_VAL_SIGN) {
+ printk(BIOS_DEBUG, "Flash Descriptor is not valid\n");
+ return 0;
+ }
+
+ /* Check host has write access to the Descriptor Region */
+ if (!((read32((void *)(desc + FLMSTR1)) >> FLMSTR_WR_SHIFT_V2) & BIT(0))) {
+ printk(BIOS_DEBUG, "Host doesn't have write access to Descriptor Region\n");
+ return 0;
+ }
+
+ return 1;
+}
+
/* It updates PMC Descriptor in the Descriptor Region */
static void configure_pmc_descriptor(void)
{
@@ -29,6 +56,9 @@ static void configure_pmc_descriptor(void)
return;
}
+ if (!is_descriptor_writeable(si_desc_buf))
+ return;
+
if (si_desc_buf[PMC_DESC_7_BYTE3] != 0x40) {
printk(BIOS_DEBUG, "Update of PMC Descriptor is not required!\n");
return;