Add support for working on in-memory CMOS data (eg.

as loaded from a file).

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@6284 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Patrick Georgi 2011-01-21 07:19:59 +00:00 committed by Patrick Georgi
parent be5a178de7
commit 9cd7eba118
2 changed files with 60 additions and 1 deletions

View File

@ -37,20 +37,36 @@
#include "cmos_lowlevel.h" #include "cmos_lowlevel.h"
/* Hardware Abstraction Layer: lowlevel byte-wise write access */ /* Hardware Abstraction Layer: lowlevel byte-wise write access */
typedef struct { typedef struct {
void (*init)(void* data); void (*init)(void* data);
unsigned char (*read)(unsigned addr); unsigned char (*read)(unsigned addr);
void (*write)(unsigned addr, unsigned char value); void (*write)(unsigned addr, unsigned char value);
void (*set_iopl)(int level);
} cmos_access_t; } cmos_access_t;
static void cmos_hal_init(void* data); static void cmos_hal_init(void* data);
static unsigned char cmos_hal_read(unsigned addr); static unsigned char cmos_hal_read(unsigned addr);
static void cmos_hal_write(unsigned addr, unsigned char value); static void cmos_hal_write(unsigned addr, unsigned char value);
static void cmos_set_iopl(int level);
static cmos_access_t cmos_hal = { static cmos_access_t cmos_hal = {
.init = cmos_hal_init, .init = cmos_hal_init,
.read = cmos_hal_read, .read = cmos_hal_read,
.write = cmos_hal_write .write = cmos_hal_write,
.set_iopl = cmos_set_iopl,
};
static void mem_hal_init(void* data);
static unsigned char mem_hal_read(unsigned addr);
static void mem_hal_write(unsigned addr, unsigned char value);
static void mem_set_iopl(int level);
static cmos_access_t memory_hal = {
.init = mem_hal_init,
.read = mem_hal_read,
.write = mem_hal_write,
.set_iopl = mem_set_iopl,
}; };
static cmos_access_t *current_access = &cmos_hal; static cmos_access_t *current_access = &cmos_hal;
@ -96,6 +112,37 @@ static void cmos_hal_write(unsigned index, unsigned char value)
OUTB(value, port_1); OUTB(value, port_1);
} }
static unsigned char* mem_hal_data = (unsigned char*)-1;
static void mem_hal_init(void *data)
{
mem_hal_data = data;
}
static unsigned char mem_hal_read(unsigned index)
{
assert(mem_hal_data != (unsigned char*)-1);
return mem_hal_data[index];
}
static void mem_hal_write(unsigned index, unsigned char value)
{
assert(mem_hal_data != (unsigned char*)-1);
mem_hal_data[index] = value;
}
void select_hal(hal_t hal, void *data)
{
switch(hal) {
case HAL_CMOS:
current_access = &cmos_hal;
break;
case HAL_MEMORY:
current_access = &memory_hal;
break;
}
current_access->init(data);
}
/* Bit-level access */ /* Bit-level access */
typedef struct { typedef struct {
unsigned byte_index; unsigned byte_index;
@ -302,6 +349,11 @@ void cmos_write_all(unsigned char data[])
* level is therefore somewhat dangerous. * level is therefore somewhat dangerous.
****************************************************************************/ ****************************************************************************/
void set_iopl(int level) void set_iopl(int level)
{
current_access->set_iopl(level);
}
static void cmos_set_iopl(int level)
{ {
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
static int io_fd = -1; static int io_fd = -1;
@ -333,6 +385,10 @@ void set_iopl(int level)
#endif #endif
} }
static void mem_set_iopl(__attribute__ ((unused)) int level)
{
}
/**************************************************************************** /****************************************************************************
* verify_cmos_op * verify_cmos_op
* *

View File

@ -34,6 +34,9 @@
#include "common.h" #include "common.h"
#include "layout.h" #include "layout.h"
typedef enum { HAL_CMOS, HAL_MEMORY } hal_t;
void select_hal(hal_t hal, void *data);
#define CMOS_AREA_OUT_OF_RANGE (CMOS_RESULT_START + 0) #define CMOS_AREA_OUT_OF_RANGE (CMOS_RESULT_START + 0)
#define CMOS_AREA_OVERLAPS_RTC (CMOS_RESULT_START + 1) #define CMOS_AREA_OVERLAPS_RTC (CMOS_RESULT_START + 1)
#define CMOS_AREA_TOO_WIDE (CMOS_RESULT_START + 2) #define CMOS_AREA_TOO_WIDE (CMOS_RESULT_START + 2)