[OpenBIOS] [PATCH] ppc: Implement NVRAM support for PReP
Andreas Färber
andreas.faerber at web.de
Sun Aug 25 00:06:28 CEST 2013
Signed-off-by: Andreas Färber <andreas.faerber at web.de>
---
arch/ppc/qemu/qemu.c | 18 ++++++++++--
config/examples/ppc64_config.xml | 1 +
config/examples/ppc_config.xml | 1 +
drivers/build.xml | 1 +
drivers/m48t59.c | 60 ++++++++++++++++++++++++++++++++++++++++
include/drivers/drivers.h | 3 ++
6 files changed, 81 insertions(+), 3 deletions(-)
create mode 100644 drivers/m48t59.c
diff --git a/arch/ppc/qemu/qemu.c b/arch/ppc/qemu/qemu.c
index 381affb..1e3994c 100644
--- a/arch/ppc/qemu/qemu.c
+++ b/arch/ppc/qemu/qemu.c
@@ -80,9 +80,13 @@ printk( const char *fmt, ... )
int arch_nvram_size(void)
{
if (is_apple()) {
+#ifdef CONFIG_DRIVER_MACIO
return macio_get_nvram_size();
+#endif
} else {
- // not implemented
+#ifdef CONFIG_DRIVER_M48T59
+ return m48t59_nvram_size();
+#endif
}
return 0;
}
@@ -90,17 +94,25 @@ int arch_nvram_size(void)
void arch_nvram_put(char *buf)
{
if (is_apple()) {
+#ifdef CONFIG_DRIVER_MACIO
macio_nvram_put(buf);
+#endif
} else {
- // not implemented
+#ifdef CONFIG_DRIVER_M48T59
+ m48t59_nvram_put(buf);
+#endif
}
}
void arch_nvram_get(char *buf)
{
if (is_apple()) {
+#ifdef CONFIG_DRIVER_MACIO
macio_nvram_get(buf);
+#endif
} else {
- // not implemented
+#ifdef CONFIG_DRIVER_M48T59
+ m48t59_nvram_get(buf);
+#endif
}
}
diff --git a/config/examples/ppc64_config.xml b/config/examples/ppc64_config.xml
index 5f79c21..04343b4 100644
--- a/config/examples/ppc64_config.xml
+++ b/config/examples/ppc64_config.xml
@@ -75,3 +75,4 @@
<option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/>
<option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/>
<option name="CONFIG_FW_CFG_ADDR" type="integer" value="0xf0000510"/>
+ <option name="CONFIG_DRIVER_M48T59" type="boolean" value="false"/>
diff --git a/config/examples/ppc_config.xml b/config/examples/ppc_config.xml
index 5bb789f..2229f00 100644
--- a/config/examples/ppc_config.xml
+++ b/config/examples/ppc_config.xml
@@ -78,3 +78,4 @@
<option name="CONFIG_DRIVER_ESCC" type="boolean" value="true"/>
<option name="CONFIG_DRIVER_FW_CFG" type="boolean" value="true"/>
<option name="CONFIG_FW_CFG_ADDR" type="integer" value="0xf0000510"/>
+ <option name="CONFIG_DRIVER_M48T59" type="boolean" value="true"/>
diff --git a/drivers/build.xml b/drivers/build.xml
index edec6b5..bcb21ae 100644
--- a/drivers/build.xml
+++ b/drivers/build.xml
@@ -22,6 +22,7 @@
<object source="pc_serial.c" condition="DRIVER_PC_SERIAL"/>
<object source="escc.c" condition="DRIVER_ESCC"/>
<object source="fw_cfg.c" condition="DRIVER_FW_CFG"/>
+ <object source="m48t59.c" condition="DRIVER_M48T59"/>
</library>
<dictionary name="openbios" target="forth">
diff --git a/drivers/m48t59.c b/drivers/m48t59.c
new file mode 100644
index 0000000..cd9e9f6
--- /dev/null
+++ b/drivers/m48t59.c
@@ -0,0 +1,60 @@
+/*
+ * OpenBIOS PReP m48t59 driver
+ *
+ * Copyright (c) 2013 Andreas Färber
+ */
+
+#include "config.h"
+
+#include "drivers/drivers.h"
+#include "asm/io.h"
+
+#define PREP_NVRAM_SIZE 0x2000
+#define PREP_NVRAM_ADDR_LO 0x74
+#define PREP_NVRAM_ADDR_HI 0x75
+#define PREP_NVRAM_DATA 0x77
+
+static uint8_t m48t59_nvram_read_byte(uint16_t offset)
+{
+ outb(offset & 0xff, PREP_NVRAM_ADDR_LO);
+ outb(offset >> 8, PREP_NVRAM_ADDR_HI);
+ return inb(PREP_NVRAM_DATA);
+}
+
+static void m48t59_nvram_read(uint16_t offset, char *buf, unsigned int len)
+{
+ unsigned int i;
+ for (i = 0; i < len; i++) {
+ buf[i] = m48t59_nvram_read_byte(offset);
+ }
+}
+
+static void m48t59_nvram_write_byte(uint16_t offset, uint8_t value)
+{
+ outb(offset & 0xff, PREP_NVRAM_ADDR_LO);
+ outb(offset >> 8, PREP_NVRAM_ADDR_HI);
+ outb(value, PREP_NVRAM_DATA);
+}
+
+static void m48t59_nvram_write(uint16_t offset, const char *buf, unsigned int len)
+{
+ unsigned int i;
+ for (i = 0; i < len; i++) {
+ m48t59_nvram_write_byte(offset, buf[i]);
+ }
+}
+
+int m48t59_nvram_size(void)
+{
+ return PREP_NVRAM_SIZE;
+}
+
+void m48t59_nvram_put(char *buf)
+{
+ m48t59_nvram_write(0, buf, PREP_NVRAM_SIZE);
+}
+
+void m48t59_nvram_get(char *buf)
+{
+ m48t59_nvram_read(0, buf, PREP_NVRAM_SIZE);
+}
diff --git a/include/drivers/drivers.h b/include/drivers/drivers.h
index 47d730f..73da6a2 100644
--- a/include/drivers/drivers.h
+++ b/include/drivers/drivers.h
@@ -125,6 +125,9 @@ unsigned char keyboard_readdata(void);
int macio_get_nvram_size(void);
void macio_nvram_put(char *buf);
void macio_nvram_get(char *buf);
+int m48t59_nvram_size(void);
+void m48t59_nvram_put(char *buf);
+void m48t59_nvram_get(char *buf);
/* drivers/timer.c */
void setup_timers(void);
--
1.8.1.4
More information about the OpenBIOS
mailing list