[OpenBIOS] r147 - in openbios-devel: arch/sparc32 drivers

svn at openbios.org svn at openbios.org
Thu May 17 21:16:06 CEST 2007


Author: blueswirl
Date: 2007-05-17 21:16:06 +0200 (Thu, 17 May 2007)
New Revision: 147

Modified:
   openbios-devel/arch/sparc32/tree.fs
   openbios-devel/drivers/esp.c
   openbios-devel/drivers/obio.c
   openbios-devel/drivers/sbus.c
Log:
NetBSD and OpenBSD fixes:
 - Correct timer and interrupt controller mappings
 - Add ESP clock frequency to avoid division by zero
 - CS4231 exists only in SS5
 - Disable BPP for now, it's not emulated by Qemu anyway
With these fixes, one NetBSD kernel even got to root device prompt on SS5.


Modified: openbios-devel/arch/sparc32/tree.fs
===================================================================
--- openbios-devel/arch/sparc32/tree.fs	2007-05-17 19:07:21 UTC (rev 146)
+++ openbios-devel/arch/sparc32/tree.fs	2007-05-17 19:16:06 UTC (rev 147)
@@ -56,22 +56,14 @@
   : decode-unit decode-unit-sbus ;
 finish-device
 
+[IFDEF] CONFIG_BPP
 " /iommu/sbus" find-device
 new-device
-  " SUNW,CS4231" device-name
-  " serial" device-type
-  5 encode-int 0 encode-int encode+ " intr" property
-  5 encode-int " interrupts" property
-  h# 3 encode-int h# 0c000000 encode-int encode+ h# 00000040 encode-int encode+ " reg" property
-  " audio" encode-string " alias" property
-finish-device
-
-" /iommu/sbus" find-device
-new-device
   " SUNW,bpp" device-name
   h# 4 encode-int h# 0c800000 encode-int encode+ h# 0000001c encode-int encode+ " reg" property
   h# 33 encode-int 0 encode-int encode+ " intr" property
 finish-device
+[THEN]
 
 " /iommu/sbus" find-device
 new-device

Modified: openbios-devel/drivers/esp.c
===================================================================
--- openbios-devel/drivers/esp.c	2007-05-17 19:07:21 UTC (rev 146)
+++ openbios-devel/drivers/esp.c	2007-05-17 19:16:06 UTC (rev 147)
@@ -491,6 +491,11 @@
     push_str("reg");
     fword("property");
 
+    PUSH(0x02625a00);
+    fword("encode-int");
+    push_str("clock-frequency");
+    fword("property");
+
     for (id = 0; id < 8; id++) {
         if (!esp->sd[id].present)
             continue;

Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c	2007-05-17 19:07:21 UTC (rev 146)
+++ openbios-devel/drivers/obio.c	2007-05-17 19:16:06 UTC (rev 147)
@@ -859,8 +859,15 @@
     regs->l10_timer_limit = (((1000000/100) + 1) << 10);
     regs->cpu_timers[0].l14_timer_limit = 0;
 
-    PUSH((unsigned long)regs);
+    for (i = 0; i < SUN4M_NCPU; i++) {
+        PUSH((unsigned long)&regs->cpu_timers[i]);
+        fword("encode-int");
+        if (i != 0)
+            fword("encode+");
+    }
+    PUSH((unsigned long)&regs->l10_timer_limit);
     fword("encode-int");
+    fword("encode+");
     push_str("address");
     fword("property");
 
@@ -905,11 +912,14 @@
     intregs->set = ~SUN4M_INT_MASKALL;
     intregs->cpu_intregs[0].clear = ~0x17fff;
 
-    // Is this correct? It works for NetBSD at least
-    PUSH((int)intregs);
+    for (i = 0; i < SUN4M_NCPU; i++) {
+        PUSH((unsigned long)&intregs->cpu_intregs[i]);
+        fword("encode-int");
+        if (i != 0)
+            fword("encode+");
+    }
+    PUSH((unsigned long)&intregs->tbt);
     fword("encode-int");
-    PUSH((int)intregs);
-    fword("encode-int");
     fword("encode+");
     push_str("address");
     fword("property");

Modified: openbios-devel/drivers/sbus.c
===================================================================
--- openbios-devel/drivers/sbus.c	2007-05-17 19:07:21 UTC (rev 146)
+++ openbios-devel/drivers/sbus.c	2007-05-17 19:16:06 UTC (rev 147)
@@ -22,6 +22,8 @@
 #define SBUS_SLOTS       16
 #define POWER_REGS       0x10
 #define POWER_OFFSET     0x0a000000
+#define CS4231_REGS      0x40
+#define CS4231_OFFSET    0x0c000000
 
 static void
 ob_sbus_node_init(unsigned long bus, unsigned long base)
@@ -297,6 +299,51 @@
 }
 
 static void
+ob_cs4231_init(unsigned int slot, unsigned long base)
+{
+    push_str("/iommu/sbus");
+    fword("find-device");
+    fword("new-device");
+
+    push_str("SUNW,CS4231");
+    fword("device-name");
+
+    push_str("serial");
+    fword("device-type");
+
+    PUSH(slot);
+    fword("encode-int");
+    PUSH(CS4231_OFFSET);
+    fword("encode-int");
+    fword("encode+");
+    PUSH(CS4231_REGS);
+    fword("encode-int");
+    fword("encode+");
+    push_str("reg");
+    fword("property");
+
+    PUSH(5);
+    fword("encode-int");
+    PUSH(0);
+    fword("encode-int");
+    fword("encode+");
+    push_str("intr");
+    fword("property");
+
+    PUSH(5);
+    fword("encode-int");
+    push_str("interrupts");
+    fword("property");
+
+    push_str("audio");
+    fword("encode-string");
+    push_str("alias");
+    fword("property");
+
+    fword("finish-device");
+}
+
+static void
 ob_macio_init(unsigned int slot, unsigned long base, unsigned long offset)
 {
     // All devices were integrated to NCR89C100, see
@@ -327,7 +374,7 @@
         ob_tcx_init(slot, base);
         break;
     case 4: // SUNW,CS4231
-        //ob_cs4231_init(slot, base);
+        ob_cs4231_init(slot, base);
         break;
     case 5: // MACIO: le, esp, bpp, power-management
         ob_macio_init(slot, base, 0x08000000);




More information about the OpenBIOS mailing list