[OpenBIOS] r56 - openbios-devel/drivers
svn@openbios.org
svn at openbios.org
Sat Jun 10 03:27:12 CEST 2006
Author: stepan
Date: 2006-06-10 03:27:11 +0200 (Sat, 10 Jun 2006)
New Revision: 56
Modified:
openbios-devel/drivers/iommu.c
openbios-devel/drivers/obio.c
openbios-devel/drivers/sbus.c
Log:
-25 driver updates
Modified: openbios-devel/drivers/iommu.c
===================================================================
--- openbios-devel/drivers/iommu.c 2006-06-09 15:55:34 UTC (rev 55)
+++ openbios-devel/drivers/iommu.c 2006-06-10 01:27:11 UTC (rev 56)
@@ -18,6 +18,9 @@
#include "pgtsrmmu.h"
#include "iommu.h"
+#define IOMMU_REGS 0x300
+#define NCTX_SWIFT 0x100
+
#define IOPERM (IOPTE_CACHE | IOPTE_WRITE | IOPTE_VALID)
#define MKIOPTE(phys) (((((phys)>>4) & IOPTE_PAGE) | IOPERM) & ~IOPTE_WAZ)
#define LOWMEMSZ 32 * 1024 * 1024
@@ -57,14 +60,14 @@
};
struct iommu ciommu;
+static struct iommu_regs *regs;
-#define NCTX_SWIFT 0x100
-
static void iommu_init(struct iommu *t, unsigned long base);
static void
-iommu_invalidate(struct iommu_regs *regs) {
- regs->tlbflush = 0;
+iommu_invalidate(struct iommu_regs *iregs)
+{
+ iregs->tlbflush = 0;
}
/*
@@ -233,7 +236,7 @@
PUSH(base);
fword("encode-int");
fword("encode+");
- PUSH(0x300);
+ PUSH(IOMMU_REGS);
fword("encode-int");
fword("encode+");
push_str("reg");
@@ -259,8 +262,16 @@
fword("encode+");
push_str("available");
fword("property");
+
+ push_str("/iommu");
+ fword("find-device");
+ PUSH((unsigned long)regs);
+ fword("encode-int");
+ push_str("address");
+ fword("property");
}
+
/*
* Switch page tables.
*/
@@ -381,11 +392,11 @@
{
unsigned int *ptab;
int ptsize;
- struct iommu_regs *regs =NULL;
unsigned int impl, vers;
unsigned int tmp;
- if ((regs = map_io(base, sizeof(struct iommu_regs))) == 0) {
+ regs = map_io(base, IOMMU_REGS);
+ if (regs == 0) {
DPRINTF("Cannot map IOMMU\n");
for (;;) { }
}
Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c 2006-06-09 15:55:34 UTC (rev 55)
+++ openbios-devel/drivers/obio.c 2006-06-10 01:27:11 UTC (rev 56)
@@ -537,6 +537,9 @@
ob_obio_init(unsigned long slavio_base)
{
+ // All devices were integrated to NCR89C105, see
+ // http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
+
//printk("Initializing OBIO devices...\n");
#if 0 // XXX
REGISTER_NAMED_NODE(ob_obio, "/obio");
@@ -544,13 +547,16 @@
ob_set_obio_ranges(slavio_base);
#endif
+ // Zilog Z8530 serial ports, see http://www.zilog.com
// Must be before zs at 0,0 or Linux won't boot
ob_zs_init(slavio_base, SLAVIO_ZS1, ZS_INTR, 0, 0);
ob_zs_init(slavio_base, SLAVIO_ZS, ZS_INTR, 1, 1);
+ // M48T08 NVRAM, see http://www.st.com
ob_nvram_init(slavio_base, SLAVIO_NVRAM);
+ // 82078 FDC
ob_fd_init(slavio_base, SLAVIO_FD, FD_INTR);
ob_sconfig_init(slavio_base, SLAVIO_SCONFIG);
Modified: openbios-devel/drivers/sbus.c
===================================================================
--- openbios-devel/drivers/sbus.c 2006-06-09 15:55:34 UTC (rev 55)
+++ openbios-devel/drivers/sbus.c 2006-06-10 01:27:11 UTC (rev 56)
@@ -18,7 +18,77 @@
#include "openbios/drivers.h"
+#define SBUS_REGS 0x28
+#define SBUS_SLOTS 5
+
static void
+ob_sbus_node_init(unsigned long base)
+{
+ void *regs;
+
+ push_str("/iommu/sbus");
+ fword("find-device");
+
+ PUSH(0);
+ fword("encode-int");
+ PUSH(base);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(SBUS_REGS);
+ fword("encode-int");
+ fword("encode+");
+ push_str("reg");
+ fword("property");
+
+ regs = map_io(base, SBUS_REGS);
+ PUSH((unsigned long)regs);
+ fword("encode-int");
+ push_str("address");
+ fword("property");
+}
+
+static void
+ob_macio_init(unsigned int slot, unsigned long base)
+{
+ // All devices were integrated to NCR89C100, see
+ // http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C100.txt
+
+ // NCR 53c9x, aka ESP. See
+ // http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR53C9X.txt
+#ifdef CONFIG_DRIVER_ESP
+ ob_esp_init(base);
+#endif
+
+ // NCR 92C990, Am7990, Lance. See http://www.amd.com
+ //ob_le_init(base);
+
+ // Parallel port
+ //ob_bpp_init(base);
+
+ // Power management
+ //ob_power_init(base);
+}
+
+static void
+sbus_probe_slot(unsigned int slot, unsigned long base)
+{
+ // OpenBIOS and Qemu don't know how to do Sbus probing
+ switch(slot) {
+ case 2: // SUNW,tcx
+ //ob_tcx_init(slot, base);
+ break;
+ case 3: // SUNW,CS4231
+ //ob_cs4231_init(slot, base);
+ break;
+ case 4: // MACIO: le, esp, bpp, power-management
+ ob_macio_init(slot, base);
+ break;
+ default:
+ break;
+ }
+}
+
+static void
ob_sbus_open(int *idx)
{
int ret=1;
@@ -43,10 +113,23 @@
{ "close", ob_sbus_close },
};
+static const unsigned long sbus_offset[SBUS_SLOTS] = {
+ 0x30000000,
+ 0x40000000,
+ 0x50000000,
+ 0x60000000,
+ 0x70000000,
+};
-int ob_sbus_init(void)
+int ob_sbus_init(unsigned long base)
{
- //printk("Initializing SBus devices...\n");
-
- return 0;
+ unsigned int slot;
+
+ ob_sbus_node_init(base);
+
+ for (slot = 0; slot < SBUS_SLOTS; slot++) {
+ sbus_probe_slot(slot, sbus_offset[slot]);
+ }
+
+ return 0;
}
More information about the OpenBIOS
mailing list