[coreboot] [commit] r6283 - trunk/util/nvramtool

repository service svn at coreboot.org
Fri Jan 21 08:18:28 CET 2011


Author: oxygene
Date: Fri Jan 21 08:18:20 2011
New Revision: 6283
URL: https://tracker.coreboot.org/trac/coreboot/changeset/6283

Log:
Abstract CMOS accesses a bit more in preparation of using
files for CMOS data.

Signed-off-by: Patrick Georgi <patrick.georgi at secunet.com>
Acked-by: Stefan Reinauer <stepan at coreboot.org>

Modified:
   trunk/util/nvramtool/cmos_lowlevel.c

Modified: trunk/util/nvramtool/cmos_lowlevel.c
==============================================================================
--- trunk/util/nvramtool/cmos_lowlevel.c	Fri Jan 21 08:04:05 2011	(r6282)
+++ trunk/util/nvramtool/cmos_lowlevel.c	Fri Jan 21 08:18:20 2011	(r6283)
@@ -36,6 +36,67 @@
 #include "common.h"
 #include "cmos_lowlevel.h"
 
+/* Hardware Abstraction Layer: lowlevel byte-wise write access */
+typedef struct {
+	void (*init)(void* data);
+	unsigned char (*read)(unsigned addr);
+	void (*write)(unsigned addr, unsigned char value);
+} cmos_access_t;
+
+static void cmos_hal_init(void* data);
+static unsigned char cmos_hal_read(unsigned addr);
+static void cmos_hal_write(unsigned addr, unsigned char value);
+
+static cmos_access_t cmos_hal = {
+	.init = cmos_hal_init,
+	.read = cmos_hal_read,
+	.write = cmos_hal_write
+};
+
+static cmos_access_t *current_access = &cmos_hal;
+
+/* no need to initialize anything */
+static void cmos_hal_init(__attribute__((unused)) void *data)
+{
+}
+
+static unsigned char cmos_hal_read(unsigned index)
+{
+	unsigned short port_0, port_1;
+
+	assert(!verify_cmos_byte_index(index));
+
+	if (index < 128) {
+		port_0 = 0x70;
+		port_1 = 0x71;
+	} else {
+		port_0 = 0x72;
+		port_1 = 0x73;
+	}
+
+	OUTB(index, port_0);
+	return INB(port_1);
+}
+
+static void cmos_hal_write(unsigned index, unsigned char value)
+{
+	unsigned short port_0, port_1;
+
+	assert(!verify_cmos_byte_index(index));
+
+	if (index < 128) {
+		port_0 = 0x70;
+		port_1 = 0x71;
+	} else {
+		port_0 = 0x72;
+		port_1 = 0x73;
+	}
+
+	OUTB(index, port_0);
+	OUTB(value, port_1);
+}
+
+/* Bit-level access */
 typedef struct {
 	unsigned byte_index;
 	unsigned bit_offset;
@@ -181,20 +242,7 @@
  ****************************************************************************/
 unsigned char cmos_read_byte(unsigned index)
 {
-	unsigned short port_0, port_1;
-
-	assert(!verify_cmos_byte_index(index));
-
-	if (index < 128) {
-		port_0 = 0x70;
-		port_1 = 0x71;
-	} else {
-		port_0 = 0x72;
-		port_1 = 0x73;
-	}
-
-	OUTB(index, port_0);
-	return INB(port_1);
+	return current_access->read(index);
 }
 
 /****************************************************************************
@@ -209,20 +257,7 @@
  ****************************************************************************/
 void cmos_write_byte(unsigned index, unsigned char value)
 {
-	unsigned short port_0, port_1;
-
-	assert(!verify_cmos_byte_index(index));
-
-	if (index < 128) {
-		port_0 = 0x70;
-		port_1 = 0x71;
-	} else {
-		port_0 = 0x72;
-		port_1 = 0x73;
-	}
-
-	OUTB(index, port_0);
-	OUTB(value, port_1);
+	current_access->write(index, value);
 }
 
 /****************************************************************************




More information about the coreboot mailing list