[coreboot] [PATCH] Move cmos.default handling to bootblock

Stefan Reinauer stefan.reinauer at coreboot.org
Fri Mar 4 09:32:33 CET 2011


On 2/1/11 2:50 AM, Patrick Georgi wrote:
> The cmos.default code wasn't actually used so far, due to an oversight
> when forward-porting this feature from an old branch.
>
> - Extend walkcbfs' use by factoring out the stage handling into C code.
> - New sanitize_cmos() function that looks if CMOS data is invalid and
>    cmos.default exists and if so overwrites CMOS with cmos.default data.
> - Use sanitize_cmos() in both bootblock implementations.
> - Drop the need to reboot after writing CMOS: CMOS wasn't used so far,
>    so we can go on without a reboot.
> - Remove the restriction that cmos.default only works on CAR boards.
> - Always build in cmos.default support on boards that USE_OPTION_TABLE.
>
> Signed-off-by: Patrick Georgi<patrick.georgi at secunet.com>
>

Acked-by: Stefan Reinauer <stefan.reinauer at coreboot.org>

with some optional comments below

> index 895a185..a808cec 100644
> --- a/src/arch/x86/include/bootblock_common.h
> +++ b/src/arch/x86/include/bootblock_common.h
> @@ -17,17 +17,45 @@ static void bootblock_northbridge_init(void) { }
>   static void bootblock_southbridge_init(void) { }
>   #endif
>
> -static unsigned long findstage(char* target)
> +static void *walkcbfs(char *target)
>   {
> -	unsigned long entry;
> +	void *entry;
>   	asm volatile (
>   		"mov $1f, %%esp\n\t"
> -		"jmp walkcbfs\n\t"
> +		"jmp walkcbfs_asm\n\t"
maybe just call it _walkcbfs ?
> +/* just enough to support findstage. copied because the original version doesn't easily pass through romcc */
> +struct cbfs_stage {
> +	unsigned long compression;
> +	unsigned long entry; // this is really 64bit, but properly endianized
Would it make sense to add an unsigned long entry_high after this, in 
this case? Or use a union or uint64_t for entry?

> +#if CONFIG_USE_OPTION_TABLE
> +#include<pc80/mc146818rtc.h>
Since you start using cmos in the bootblock, you might have to consider 
enabling RCBA and the upper 128 bytes of CMOS in some Intel 
southbridges' bootblock.c

> +static void sanitize_cmos(void)
> +{
> +	if (cmos_error() || !cmos_chksum_valid()) {
Is this reliably working on hardware? I remember cmos_error being flaky 
on ICH7 early on at some point.

> diff --git a/src/pc80/mc146818rtc_early.c b/src/pc80/mc146818rtc_early.c
> index 920deda..d09d6b9 100644
> --- a/src/pc80/mc146818rtc_early.c
> +++ b/src/pc80/mc146818rtc_early.c
> @@ -11,15 +11,6 @@
>   #error "CONFIG_MAX_REBOOT_CNT too high"
>   #endif
>
> -#if CONFIG_USE_CMOS_RECOVERY
> -#include<cbfs.h>
> -#include<console/loglevel.h>
> -
> -int do_printk(int msg_level, const char *fmt, ...) __attribute__((format(printf, 2, 3)));
> -#define printk_warning(fmt, arg...) do_printk(BIOS_WARNING ,fmt, ##arg)
> -#define printk_debug(fmt, arg...) do_printk(BIOS_DEBUG ,fmt, ##arg)
> -#endif
> -
>   static int cmos_error(void)
>   {
>   	unsigned char reg_d;
> @@ -63,25 +54,6 @@ static inline int do_normal_boot(void)
>   	unsigned char byte;
>
>   	if (cmos_error() || !cmos_chksum_valid()) {
> -#if CONFIG_USE_CMOS_RECOVERY
> -		char *cmos_default = cbfs_find_file("cmos.default", CBFS_COMPONENT_CMOS_DEFAULT);
> -		if (cmos_default) {
> -			int i;
> -			printk_warning("WARNING - CMOS CORRUPTED. RESTORING DEFAULTS.\n");
> -			/* First 14 bytes are reserved for
> -			   RTC and ignored by nvramtool, too.
> -			   Only 128 bytes: 128+ requires cmos configuration and
> -			   contains only suspend-to-ram data, which isn't part
> -			   of the recovery procedure. */
> -			for (i = 14; i<  128; i++) {
> -				cmos_write(cmos_default[i], i);
> -			}
> -			/* Now reboot to run with default cmos. */
> -			outb(0x06, 0xcf9);
> -			for (;;) asm("hlt"); /* Wait for reset! */
> -		}
> -#endif
> -
How does cmos recovery behave on non-CAR systems if this is removed? It 
would be nice to if we could make sure it works everywhere



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.coreboot.org/pipermail/coreboot/attachments/20110304/2fe5b0ab/attachment.html>


More information about the coreboot mailing list