Move the parser for cmos.layout text files to accessors
[coreboot.git] / util / nvramtool / cmos_lowlevel.c
index ecfc99b74f2851b79871bc91a6481e3eb565c97c..8e19f515aa70743dadd57c0cd48111f30cd6abcd 100644 (file)
 #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);
+       void (*set_iopl)(int level);
+} 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 void cmos_set_iopl(int level);
+
+static cmos_access_t cmos_hal = {
+       .init = cmos_hal_init,
+       .read = cmos_hal_read,
+       .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;
+
+/* 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);
+}
+
+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 */
 typedef struct {
        unsigned byte_index;
        unsigned bit_offset;
@@ -181,20 +289,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 +304,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);
 }
 
 /****************************************************************************
@@ -267,6 +349,11 @@ void cmos_write_all(unsigned char data[])
  * level is therefore somewhat dangerous.
  ****************************************************************************/
 void set_iopl(int level)
+{
+       current_access->set_iopl(level);
+}
+
+static void cmos_set_iopl(int level)
 {
 #if defined(__FreeBSD__)
        static int io_fd = -1;
@@ -298,6 +385,10 @@ void set_iopl(int level)
 #endif
 }
 
+static void mem_set_iopl(__attribute__ ((unused)) int level)
+{
+}
+
 /****************************************************************************
  * verify_cmos_op
  *