Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=721fdf34167580ff98263c74cead8871d76936e6
Commit:     721fdf34167580ff98263c74cead8871d76936e6
Parent:     ac6aecbf0541ca277e6492fdf7c91e46e1fc4171
Author:     Kyle McMartin <[EMAIL PROTECTED]>
AuthorDate: Thu Dec 6 09:32:15 2007 -0800
Committer:  Kyle McMartin <[EMAIL PROTECTED]>
CommitDate: Thu Dec 6 09:32:15 2007 -0800

    [PARISC] print more than one character at a time for pdc console
    
    There's really no reason not to print more than one character at a
    time to the PDC console... Booting is measurably speedier, and now I don't
    have to watch individual characters get drawn.
    
    Signed-off-by: Kyle McMartin <[EMAIL PROTECTED]>
---
 arch/parisc/kernel/firmware.c |   88 ++++++++++++++++-------------------------
 arch/parisc/kernel/pdc_cons.c |   11 +----
 include/asm-parisc/pdc.h      |    3 +-
 3 files changed, 37 insertions(+), 65 deletions(-)

diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c
index fd6552c..4ab83d5 100644
--- a/arch/parisc/kernel/firmware.c
+++ b/arch/parisc/kernel/firmware.c
@@ -1082,76 +1082,56 @@ void pdc_io_reset_devices(void)
 
 
 /**
- * pdc_iodc_putc - Console character print using IODC.
- * @c: the character to output.
+ * pdc_iodc_print - Console print using IODC.
+ * @str: the string to output.
+ * @count: length of str
  *
  * Note that only these special chars are architected for console IODC io:
  * BEL, BS, CR, and LF. Others are passed through.
  * Since the HP console requires CR+LF to perform a 'newline', we translate
  * "\n" to "\r\n".
  */
-void pdc_iodc_putc(unsigned char c)
+int pdc_iodc_print(unsigned char *str, unsigned count)
 {
-        /* XXX Should we spinlock posx usage */
-        static int posx;        /* for simple TAB-Simulation... */
-        static int __attribute__((aligned(8)))   iodc_retbuf[32];
-        static char __attribute__((aligned(64))) iodc_dbuf[4096];
-        unsigned int n;
+       /* XXX Should we spinlock posx usage */
+       static int posx;        /* for simple TAB-Simulation... */
+       int __attribute__((aligned(8)))   iodc_retbuf[32];
+       char __attribute__((aligned(64))) iodc_dbuf[4096];
+       unsigned int i;
        unsigned long flags;
 
-        switch (c) {
-        case '\n':
-                iodc_dbuf[0] = '\r';
-                iodc_dbuf[1] = '\n';
-                n = 2;
-                posx = 0;
-                break;
-        case '\t':
-                pdc_iodc_putc(' ');
-                while (posx & 7)        /* expand TAB */
-                        pdc_iodc_putc(' ');
-                return;         /* return since IODC can't handle this */
-        case '\b':
-                posx-=2;                /* BS */
-        default:
-                iodc_dbuf[0] = c;
-                n = 1;
-                posx++;
-                break;
-        }
+       memset(iodc_dbuf, 0, 4096);
+       for (i = 0; i < count && i < 2048;) {
+               switch(str[i]) {
+               case '\n':
+                       iodc_dbuf[i+0] = '\r';
+                       iodc_dbuf[i+1] = '\n';
+                       i += 2;
+                       posx = 0;
+                       break;
+               case '\t':
+                       while (posx & 7) {
+                               iodc_dbuf[i] = ' ';
+                               i++, posx++;
+                       }
+                       break;
+               case '\b':      /* BS */
+                       posx -= 2;
+               default:
+                       iodc_dbuf[i] = str[i];
+                       i++, posx++;
+                       break;
+               }
+       }
 
         spin_lock_irqsave(&pdc_lock, flags);
         real32_call(PAGE0->mem_cons.iodc_io,
                     (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
                     PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers),
-                    __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0);
+                    __pa(iodc_retbuf), 0, __pa(iodc_dbuf), i, 0);
         spin_unlock_irqrestore(&pdc_lock, flags);
-}
 
-/**
- * pdc_iodc_outc - Console character print using IODC (without conversions).
- * @c: the character to output.
- *
- * Write the character directly to the IODC console.
- */
-void pdc_iodc_outc(unsigned char c)
-{
-       unsigned int n;
-       unsigned long flags;
-
-       /* fill buffer with one caracter and print it */
-        static int __attribute__((aligned(8)))   iodc_retbuf[32];
-        static char __attribute__((aligned(64))) iodc_dbuf[4096];
-
-       n = 1;
-       iodc_dbuf[0] = c;
-
-       spin_lock_irqsave(&pdc_lock, flags);
-       real32_call(PAGE0->mem_cons.iodc_io,
-                   (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
-                   PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers),
-                   __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0);
-       spin_unlock_irqrestore(&pdc_lock, flags);
+       return i;
 }
 
 /**
diff --git a/arch/parisc/kernel/pdc_cons.c b/arch/parisc/kernel/pdc_cons.c
index aab0576..33b1f84 100644
--- a/arch/parisc/kernel/pdc_cons.c
+++ b/arch/parisc/kernel/pdc_cons.c
@@ -55,13 +55,7 @@
 
 static void pdc_console_write(struct console *co, const char *s, unsigned 
count)
 {
-       while(count--)
-               pdc_iodc_putc(*s++);
-}
-
-void pdc_outc(unsigned char c)
-{
-       pdc_iodc_outc(c);
+       pdc_iodc_print(s, count);
 }
 
 void pdc_printf(const char *fmt, ...)
@@ -74,8 +68,7 @@ void pdc_printf(const char *fmt, ...)
        len = vscnprintf(buf, sizeof(buf), fmt, args);
        va_end(args);
 
-       for (i = 0; i < len; i++)
-               pdc_iodc_outc(buf[i]);
+       pdc_iodc_print(buf, len);
 }
 
 int pdc_console_poll_key(struct console *co)
diff --git a/include/asm-parisc/pdc.h b/include/asm-parisc/pdc.h
index 5e0c3ca..deda8c3 100644
--- a/include/asm-parisc/pdc.h
+++ b/include/asm-parisc/pdc.h
@@ -645,8 +645,7 @@ int pdc_soft_power_button(int sw_control);
 void pdc_io_reset(void);
 void pdc_io_reset_devices(void);
 int pdc_iodc_getc(void);
-void pdc_iodc_putc(unsigned char c);
-void pdc_iodc_outc(unsigned char c);
+int pdc_iodc_print(unsigned char *str, unsigned count);
 void pdc_printf(const char *fmt, ...);
 
 void pdc_emergency_unlock(void);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to