[OpenBIOS] [commit] r1263 - in trunk/openbios-devel: arch/sparc32 drivers

repository service svn at openbios.org
Sun Feb 16 17:26:29 CET 2014


Author: mcayland
Date: Sun Feb 16 17:26:28 2014
New Revision: 1263
URL: http://tracker.coreboot.org/trac/openbios/changeset/1263

Log:
SPARC32: implement romvec.pv_ticks counter

romvec.pv_ticks is a pointer to an 'uptime' counter, calibrated in
milliseconds.

We use the [1st] CPU timer, running at 100Hz, to increment (+10) the counter.
This counter is used by NextStep to measure the 10 seconds delay during boot,
when asking about boot options.

Signed-off-by: Olivier Danet <odanet at caramail.com>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>

Modified:
   trunk/openbios-devel/arch/sparc32/openbios.c
   trunk/openbios-devel/arch/sparc32/openprom.h
   trunk/openbios-devel/arch/sparc32/romvec.c
   trunk/openbios-devel/arch/sparc32/romvec.h
   trunk/openbios-devel/arch/sparc32/vectors.S
   trunk/openbios-devel/drivers/obio.c
   trunk/openbios-devel/drivers/obio.h

Modified: trunk/openbios-devel/arch/sparc32/openbios.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/openbios.c	Sun Feb 16 17:26:25 2014	(r1262)
+++ trunk/openbios-devel/arch/sparc32/openbios.c	Sun Feb 16 17:26:28 2014	(r1263)
@@ -23,6 +23,7 @@
 #include "boot.h"
 #include "romvec.h"
 #include "openprom.h"
+#include "psr.h"
 #include "libopenbios/video.h"
 #define NO_QEMU_PROTOS
 #include "arch/common/fw_cfg.h"
@@ -916,6 +917,11 @@
         fword("find-device");
 
         setup_uuid();
+
+	/* Enable interrupts */
+	temp = get_psr();
+	temp = (temp & ~PSR_PIL) | (13 << 8); /* Enable CPU timer interrupt (level 14) */
+	put_psr(temp);
 }
 
 extern struct _console_ops arch_console_ops;

Modified: trunk/openbios-devel/arch/sparc32/openprom.h
==============================================================================
--- trunk/openbios-devel/arch/sparc32/openprom.h	Sun Feb 16 17:26:25 2014	(r1262)
+++ trunk/openbios-devel/arch/sparc32/openprom.h	Sun Feb 16 17:26:28 2014	(r1263)
@@ -117,7 +117,7 @@
 	void (*pv_reboot)(char *bootstr);
 	void (*pv_printf)(__const__ char *fmt, ...);
 	void (*pv_abort)(void);
-	__volatile__ int *pv_ticks;
+	__volatile__ unsigned int *pv_ticks;
 	void (*pv_halt)(void);
 	void (**pv_synchook)(void);
 

Modified: trunk/openbios-devel/arch/sparc32/romvec.c
==============================================================================
--- trunk/openbios-devel/arch/sparc32/romvec.c	Sun Feb 16 17:26:25 2014	(r1262)
+++ trunk/openbios-devel/arch/sparc32/romvec.c	Sun Feb 16 17:26:28 2014	(r1263)
@@ -449,6 +449,8 @@
   dstackcnt = dstacktmp;
 }
 
+volatile uint32_t obp_ticks;
+
 void *
 init_openprom(void)
 {
@@ -479,6 +481,11 @@
     romvec0.pv_reboot = obp_reboot_handler;
     romvec0.pv_printf = obp_printf_handler;
     romvec0.pv_abort = obp_abort_handler;
+    
+    /* Reset the tick counter */
+    obp_ticks = 0;
+    romvec0.pv_ticks = &obp_ticks;
+    
     romvec0.pv_halt = obp_halt_handler;
     romvec0.pv_synchook = &sync_hook;
     romvec0.pv_v0bootargs = &obp_argp;

Modified: trunk/openbios-devel/arch/sparc32/romvec.h
==============================================================================
--- trunk/openbios-devel/arch/sparc32/romvec.h	Sun Feb 16 17:26:25 2014	(r1262)
+++ trunk/openbios-devel/arch/sparc32/romvec.h	Sun Feb 16 17:26:28 2014	(r1263)
@@ -2,6 +2,7 @@
  * romvec main C function and handler declarations
  */
 
+extern volatile uint32_t obp_ticks;
 void *init_openprom(void);
 
 int obp_devopen(char *str);

Modified: trunk/openbios-devel/arch/sparc32/vectors.S
==============================================================================
--- trunk/openbios-devel/arch/sparc32/vectors.S	Sun Feb 16 17:26:25 2014	(r1262)
+++ trunk/openbios-devel/arch/sparc32/vectors.S	Sun Feb 16 17:26:28 2014	(r1263)
@@ -207,6 +207,10 @@
         sethi   %hi(counter_regs), %l7
         ld      [%l7 + %lo(counter_regs)], %l7
         ld      [%l7], %g0
+        sethi   %hi(obp_ticks), %l7
+        ld      [%l7 + %lo(obp_ticks)], %l6
+        add     %l6, 10, %l6
+        st      %l6, [%l7 + %lo(obp_ticks)]
         jmp     %l1
          rett  %l2
 

Modified: trunk/openbios-devel/drivers/obio.c
==============================================================================
--- trunk/openbios-devel/drivers/obio.c	Sun Feb 16 17:26:25 2014	(r1262)
+++ trunk/openbios-devel/drivers/obio.c	Sun Feb 16 17:26:28 2014	(r1263)
@@ -287,7 +287,7 @@
 
 
     counter_regs = (struct sun4m_timer_regs *)ofmem_map_io(base + (uint64_t)offset, sizeof(*counter_regs));
-    counter_regs->cfg = 0xffffffff;
+    counter_regs->cfg = 0xfffffffe;
     counter_regs->l10_timer_limit = 0;
     counter_regs->cpu_timers[0].l14_timer_limit = 0x9c4000;    /* see comment in obio.h */
     counter_regs->cpu_timers[0].cntrl = 1;

Modified: trunk/openbios-devel/drivers/obio.h
==============================================================================
--- trunk/openbios-devel/drivers/obio.h	Sun Feb 16 17:26:25 2014	(r1262)
+++ trunk/openbios-devel/drivers/obio.h	Sun Feb 16 17:26:28 2014	(r1263)
@@ -88,7 +88,7 @@
  * Registers of hardware timer in sun4m.
  */
 struct sun4m_timer_percpu {
-    volatile unsigned int l14_timer_limit; /* Initial value is 0x009c4000 */
+    volatile unsigned int l14_timer_limit; /* Initial value is 0x009c4000 = 10ms period*/
     volatile unsigned int l14_cur_count;
 };
 



More information about the OpenBIOS mailing list