[coreboot-gerrit] Patch set updated for coreboot: drivers/pc80: Rework normal / fallback selector code

Timothy Pearson (tpearson@raptorengineeringinc.com) gerrit at coreboot.org
Mon Nov 2 19:56:45 CET 2015


Timothy Pearson (tpearson at raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/12289

-gerrit

commit 32cbe28e4e5e2ffc8b913d5a423ef35954f4bf58
Author: Timothy Pearson <tpearson at raptorengineeringinc.com>
Date:   Sun Nov 1 02:13:17 2015 -0600

    drivers/pc80: Rework normal / fallback selector code
    
    Per IRC and Gerrit discussion, the normal / fallback
    selector code is a rather weak spot in coreboot, and
    did not function correctly for certain use cases.
    
    Rework the selector to more clearly indicate proper
    operation, and also remove dead code.  Also tentatively
    abandon use of RTC bit 385; a follow-up patch will
    remove said bit from all affected mainboards.
    
    The correct operation of the fallback code selector
    approximates that of a power line recloser, with
    a user option to attempt normal boot that can be
    cleared by firmware, but never set by firmware.
    Additionally, if cleared by user, the fallback
    path should always be used on the next reboot.
    
    Change-Id: I753ae9f0710c524875a85354ac2547df0c305569
    Signed-off-by: Timothy Pearson <tpearson at raptorengineeringinc.com>
---
 src/drivers/pc80/mc146818rtc_early.c | 50 +++++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 20 deletions(-)

diff --git a/src/drivers/pc80/mc146818rtc_early.c b/src/drivers/pc80/mc146818rtc_early.c
index 421af2f..1bc641e 100644
--- a/src/drivers/pc80/mc146818rtc_early.c
+++ b/src/drivers/pc80/mc146818rtc_early.c
@@ -12,6 +12,8 @@
 #error "CONFIG_MAX_REBOOT_CNT too high"
 #endif
 
+#define RTC_BOOT_NORMAL 0x1
+
 static int cmos_error(void)
 {
 	unsigned char reg_d;
@@ -41,12 +43,28 @@ static int cmos_chksum_valid(void)
 #endif
 }
 
+static inline __attribute__((unused)) int boot_count(void)
+{
+	unsigned char byte;
+	byte = cmos_read(RTC_BOOT_BYTE);
+	return byte >> 4;
+}
+
+static inline __attribute__((unused)) void increment_boot_count(uint8_t &rtc_byte)
+{
+	rtc_byte += (1 << 4);
+}
+
+static inline __attribute__((unused)) void boot_use_fallback(uint8_t &rtc_byte)
+{
+	rtc_byte &= ~RTC_BOOT_NORMAL;
+}
 
 static inline __attribute__((unused)) int last_boot_normal(void)
 {
 	unsigned char byte;
 	byte = cmos_read(RTC_BOOT_BYTE);
-	return (byte & (1 << 1));
+	return (byte & RTC_BOOT_NORMAL);
 }
 
 static inline __attribute__((unused)) int do_normal_boot(void)
@@ -59,7 +77,7 @@ static inline __attribute__((unused)) int do_normal_boot(void)
 		 * but clear the fallback bit.
 		 */
 		byte = cmos_read(RTC_BOOT_BYTE);
-		byte &= 0x0c;
+		byte &= RTC_BOOT_NORMAL;
 		byte |= CONFIG_MAX_REBOOT_CNT << 4;
 		cmos_write(byte, RTC_BOOT_BYTE);
 	}
@@ -67,29 +85,21 @@ static inline __attribute__((unused)) int do_normal_boot(void)
 	/* The RTC_BOOT_BYTE is now o.k. see where to go. */
 	byte = cmos_read(RTC_BOOT_BYTE);
 
-	if (!IS_ENABLED(CONFIG_SKIP_MAX_REBOOT_CNT_CLEAR))
-		/* Are we in normal mode? */
-		if (byte & 1)
-			byte &= 0x0f; /* yes, clear the boot count */
-
-	/* Properly set the last boot flag */
-	byte &= 0xfc;
-	if ((byte >> 4) < CONFIG_MAX_REBOOT_CNT) {
-		byte |= (1<<1);
-	}
-
-	/* Are we already at the max count? */
-	if ((byte >> 4) < CONFIG_MAX_REBOOT_CNT) {
-		byte += 1 << 4; /* No, add 1 to the count */
-	}
-	else {
-		byte &= 0xfc;	/* Yes, put in fallback mode */
+	/* Are we attempting to boot normally? */
+	if (byte & RTC_BOOT_NORMAL) {
+		/* Are we already at the max count? */
+		if (boot_count() < CONFIG_MAX_REBOOT_CNT) {
+			increment_boot_count(byte)
+		} else {
+			boot_use_fallback(byte);
+		}
 	}
 
 	/* Save the boot byte */
 	cmos_write(byte, RTC_BOOT_BYTE);
 
-	return (byte & (1<<1));
+	/* Return selected code path for this boot attempt */
+	return (byte & RTC_BOOT_NORMAL);
 }
 
 unsigned read_option_lowlevel(unsigned start, unsigned size, unsigned def)



More information about the coreboot-gerrit mailing list