diff options
author | Patrick Georgi <patrick.georgi@secunet.com> | 2011-01-21 07:18:20 +0000 |
---|---|---|
committer | Patrick Georgi <patrick.georgi@coresystems.de> | 2011-01-21 07:18:20 +0000 |
commit | be5a178de731dd6b255c38c1e63b3de8b3008a14 (patch) | |
tree | 0dd2355ea5b840af525d11d894bc17c216f7ae3f | |
parent | 0d4f6536b0b61ead20b4a8c2e1600dec513218e8 (diff) |
Abstract CMOS accesses a bit more in preparation of using
files for CMOS data.
Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com>
Acked-by: Stefan Reinauer <stepan@coreboot.org>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6283 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r-- | util/nvramtool/cmos_lowlevel.c | 91 |
1 files 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); } /**************************************************************************** |