linux-mips
[Top] [All Lists]

Re: [patch] blast_scache nop for sc cpus without scache

To: "Maciej W. Rozycki" <macro@linux-mips.org>
Subject: Re: [patch] blast_scache nop for sc cpus without scache
From: peter fuerst <pf@net.alphadv.de>
Date: Tue, 28 Jun 2005 09:20:43 +0200 (CEST)
Cc: linux-mips@linux-mips.org
In-reply-to: <Pine.LNX.4.61L.0506272035290.23903@blysk.ds.pg.gda.pl>
Original-recipient: rfc822;linux-mips@linux-mips.org
Reply-to: pf@net.alphadv.de
Sender: linux-mips-bounce@linux-mips.org
Hi !


On Mon, 27 Jun 2005, Maciej W. Rozycki wrote:
>  How about using these prom_printf()s to implement a real early printk()?  
> You'd save yourself and perhaps others a lot of hassle.

Here's what helped me *a lot* when debugging. It's rather ugly, polluting
printk.c with platform/driver-(cross-)dependent hacks, but output is available
immediately on kernel startup, and on some machines you just can't do without
that ;)
(perhaps someone sometimes will create a clean implementation...)

--- kernel/printk.c     Tue Apr 19 21:43:47 2005
+++ kernel/printk.c     Mon Jun 13 22:13:09 2005
@@ -33,6 +33,7 @@
 #include <linux/syscalls.h>
 
 #include <asm/uaccess.h>
+#define early_log_by_prom_write 1
 
 #define __LOG_BUF_LEN  (1 << CONFIG_LOG_BUF_SHIFT)
 
@@ -403,12 +403,27 @@
        }
 }
 
+static void inline __call_prom_write(unsigned long start, unsigned long end)
+{
+       static int prom_write(const char *s, int n);
+       prom_write(&LOG_BUF(start), end - start);
+}
+
 /*
  * Write out chars from start to end - 1 inclusive
  */
 static void _call_console_drivers(unsigned long start,
                                unsigned long end, int msg_log_level)
 {
+       if (/*msg_log_level < console_loglevel &&*/ start != end) {
+               if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
+                       /* wrapped write */
+                       __call_prom_write(start & LOG_BUF_MASK, log_buf_len);
+                       __call_prom_write(0, end & LOG_BUF_MASK);
+               } else {
+                       __call_prom_write(start, end);
+               }
+       }
        if (msg_log_level < console_loglevel &&
                        console_drivers && start != end) {
                if ((start & LOG_BUF_MASK) > (end & LOG_BUF_MASK)) {
@@ -892,6 +907,7 @@
                 * for us.
                 */
                spin_lock_irqsave(&logbuf_lock, flags);
+/*if(!early_log_by_prom_write)*/
                con_start = log_start;
                spin_unlock_irqrestore(&logbuf_lock, flags);
        }
@@ -994,3 +1010,27 @@
                                printk_ratelimit_burst);
 }
 EXPORT_SYMBOL(printk_ratelimit);
+
+#include <asm/sgialib.h>
+static int prom_write(const char *s, int n)
+{
+#ifdef CONFIG_SGI_IP28
+       extern int ip22zilog_is_active(void);
+       extern int impactgfx_is_active(void);
+       if (n > 0 && early_log_by_prom_write)
+               if(!ip22zilog_is_active() && !impactgfx_is_active())
+               {       unsigned long oldstate;
+                       int i;
+                       romvec = ROMVECTOR;
+                       oldstate = ip2628_enable_ucmem();
+                       for (i = 0; i < n; ++i, ++s)
+                       {       if ('\n' == *s)
+                                       prom_putchar('\r');
+                               prom_putchar(*s);
+                       }
+                       ip2628_return_ucmem(oldstate);
+                       return 1;
+               }
+#endif
+       return 0;
+}

kind regards

pf



<Prev in Thread] Current Thread [Next in Thread>