2012-03-30 21:01:06 +02:00
|
|
|
/*
|
|
|
|
* This file is part of the coreboot project.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2011 The ChromiumOS Authors. All rights reserved.
|
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2016-01-27 01:30:36 +01:00
|
|
|
#include <bootstate.h>
|
|
|
|
#include <console/console.h>
|
2012-03-30 21:01:06 +02:00
|
|
|
#include <types.h>
|
|
|
|
#include <pc80/mc146818rtc.h>
|
2016-07-25 20:48:03 +02:00
|
|
|
#include <vboot/vbnv.h>
|
|
|
|
#include <vboot/vbnv_layout.h>
|
2012-03-30 21:01:06 +02:00
|
|
|
|
2016-01-26 02:13:27 +01:00
|
|
|
void read_vbnv_cmos(uint8_t *vbnv_copy)
|
2012-03-30 21:01:06 +02:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2016-07-25 20:48:03 +02:00
|
|
|
for (i = 0; i < VBOOT_VBNV_BLOCK_SIZE; i++)
|
|
|
|
vbnv_copy[i] = cmos_read(CONFIG_VBOOT_VBNV_OFFSET + 14 + i);
|
2016-01-27 01:30:36 +01:00
|
|
|
|
2016-07-25 20:48:03 +02:00
|
|
|
if (IS_ENABLED(CONFIG_VBOOT_VBNV_CMOS_BACKUP_TO_FLASH)) {
|
2016-01-27 01:30:36 +01:00
|
|
|
if (verify_vbnv(vbnv_copy))
|
|
|
|
return;
|
|
|
|
|
|
|
|
printk(BIOS_INFO, "VBNV: CMOS invalid, restoring from flash\n");
|
|
|
|
read_vbnv_flash(vbnv_copy);
|
|
|
|
|
|
|
|
if (verify_vbnv(vbnv_copy)) {
|
|
|
|
save_vbnv_cmos(vbnv_copy);
|
|
|
|
printk(BIOS_INFO, "VBNV: Flash backup restored\n");
|
|
|
|
} else {
|
|
|
|
printk(BIOS_INFO, "VBNV: Restore from flash failed\n");
|
|
|
|
}
|
|
|
|
}
|
2013-03-02 00:12:26 +01:00
|
|
|
}
|
|
|
|
|
2016-01-26 02:13:27 +01:00
|
|
|
void save_vbnv_cmos(const uint8_t *vbnv_copy)
|
2013-03-02 00:12:26 +01:00
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
2016-07-25 20:48:03 +02:00
|
|
|
for (i = 0; i < VBOOT_VBNV_BLOCK_SIZE; i++)
|
|
|
|
cmos_write(vbnv_copy[i], CONFIG_VBOOT_VBNV_OFFSET + 14 + i);
|
2013-03-02 00:12:26 +01:00
|
|
|
}
|
2016-01-27 01:30:36 +01:00
|
|
|
|
2016-05-19 00:18:58 +02:00
|
|
|
void init_vbnv_cmos(int rtc_fail)
|
|
|
|
{
|
2016-07-25 20:48:03 +02:00
|
|
|
uint8_t vbnv[VBOOT_VBNV_BLOCK_SIZE];
|
2016-05-19 00:18:58 +02:00
|
|
|
|
|
|
|
if (rtc_fail)
|
|
|
|
read_vbnv_cmos(vbnv);
|
|
|
|
|
|
|
|
cmos_init(rtc_fail);
|
|
|
|
|
|
|
|
if (rtc_fail)
|
|
|
|
save_vbnv_cmos(vbnv);
|
|
|
|
}
|
|
|
|
|
2016-07-25 20:48:03 +02:00
|
|
|
#if IS_ENABLED(CONFIG_VBOOT_VBNV_CMOS_BACKUP_TO_FLASH)
|
2016-02-09 14:01:08 +01:00
|
|
|
static void back_up_vbnv_cmos(void *unused)
|
2016-01-27 01:30:36 +01:00
|
|
|
{
|
2016-07-25 20:48:03 +02:00
|
|
|
uint8_t vbnv_cmos[VBOOT_VBNV_BLOCK_SIZE];
|
2016-01-27 01:30:36 +01:00
|
|
|
|
|
|
|
/* Read current VBNV from CMOS. */
|
|
|
|
read_vbnv_cmos(vbnv_cmos);
|
|
|
|
|
|
|
|
/* Save to flash, will only be saved if different. */
|
|
|
|
save_vbnv_flash(vbnv_cmos);
|
|
|
|
}
|
2016-02-09 14:01:08 +01:00
|
|
|
BOOT_STATE_INIT_ENTRY(BS_POST_DEVICE, BS_ON_EXIT, back_up_vbnv_cmos, NULL);
|
2016-01-27 01:30:36 +01:00
|
|
|
#endif
|