From be5a178de731dd6b255c38c1e63b3de8b3008a14 Mon Sep 17 00:00:00 2001 From: Patrick Georgi Date: Fri, 21 Jan 2011 07:18:20 +0000 Subject: [PATCH] Abstract CMOS accesses a bit more in preparation of using files for CMOS data. Signed-off-by: Patrick Georgi Acked-by: Stefan Reinauer git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6283 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/nvramtool/cmos_lowlevel.c | 91 +++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 28 deletions(-) diff --git a/util/nvramtool/cmos_lowlevel.c b/util/nvramtool/cmos_lowlevel.c index ecfc99b74f..9f44a0b18a 100644 --- a/util/nvramtool/cmos_lowlevel.c +++ b/util/nvramtool/cmos_lowlevel.c @@ -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 @@ void cmos_write(const cmos_entry_t * e, unsigned long long value) ****************************************************************************/ 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 @@ unsigned char cmos_read_byte(unsigned index) ****************************************************************************/ 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); } /****************************************************************************