Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 223269
b: refs/heads/master
c: 595a251
h: refs/heads/master
i:
  223267: 2f51b9e
v: v3
  • Loading branch information
David S. Miller committed Dec 1, 2010
1 parent 5d43105 commit e60de88
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 30 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 12c7a35ee6a1c605e740733f2cbd5b5079f09f0f
refs/heads/master: 595a251c0740785fd3c0d2156d78578c7479811e
4 changes: 2 additions & 2 deletions trunk/arch/sparc/include/asm/oplib_32.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ extern int prom_getrev(void);
/* Get the prom firmware revision. */
extern int prom_getprev(void);

/* Blocking put character to console. */
extern void prom_putchar(const char *buf);
/* Write a buffer of characters to the console. */
extern void prom_console_write_buf(const char *buf, int len);

/* Prom's internal routines, don't use in kernel/boot code. */
extern void prom_printf(const char *fmt, ...);
Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/sparc/include/asm/oplib_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ extern void prom_halt_power_off(void) __attribute__ ((noreturn));
*/
extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size);

/* Blocking put character to console. */
extern void prom_putchar(const char *buf);
/* Write a buffer of characters to the console. */
extern void prom_console_write_buf(const char *buf, int len);

/* Prom's internal routines, don't use in kernel/boot code. */
extern void prom_printf(const char *fmt, ...);
Expand Down
14 changes: 8 additions & 6 deletions trunk/arch/sparc/prom/console_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,14 @@ static int prom_nbputchar(const char *buf)
return i; /* Ugh, we could spin forever on unsupported proms ;( */
}

/* Blocking version of put character routine above. */
void prom_putchar(const char *buf)
void prom_console_write_buf(const char *buf, int len)
{
while (1) {
int err = prom_nbputchar(buf);
if (!err)
break;
while (len) {
int n = prom_nbputchar(buf);
if (n)
continue;
len--;
buf++;
}
}

27 changes: 13 additions & 14 deletions trunk/arch/sparc/prom/console_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,35 +15,34 @@

extern int prom_stdin, prom_stdout;

/* Non blocking put character to console device, returns -1 if
* unsuccessful.
*/
static int prom_nbputchar(const char *buf)
static int __prom_console_write_buf(const char *buf, int len)
{
unsigned long args[7];
int ret;

args[0] = (unsigned long) "write";
args[1] = 3;
args[2] = 1;
args[3] = (unsigned int) prom_stdout;
args[4] = (unsigned long) buf;
args[5] = 1;
args[5] = (unsigned int) len;
args[6] = (unsigned long) -1;

p1275_cmd_direct(args);

if (args[6] == 1)
return 0;
else
ret = (int) args[6];
if (ret < 0)
return -1;
return ret;
}

/* Blocking version of put character routine above. */
void prom_putchar(const char *buf)
void prom_console_write_buf(const char *buf, int len)
{
while (1) {
int err = prom_nbputchar(buf);
if (!err)
break;
while (len) {
int n = __prom_console_write_buf(buf, len);
if (n < 0)
continue;
len -= n;
buf += len;
}
}
32 changes: 27 additions & 5 deletions trunk/arch/sparc/prom/printf.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,45 @@

#include <linux/kernel.h>
#include <linux/compiler.h>
#include <linux/spinlock.h>

#include <asm/openprom.h>
#include <asm/oplib.h>

#define CONSOLE_WRITE_BUF_SIZE 1024

static char ppbuf[1024];
static char console_write_buf[CONSOLE_WRITE_BUF_SIZE];
static DEFINE_RAW_SPINLOCK(console_write_lock);

void notrace prom_write(const char *buf, unsigned int n)
{
unsigned int dest_len;
unsigned long flags;
char *dest;

dest = console_write_buf;
raw_spin_lock_irqsave(&console_write_lock, flags);

dest_len = 0;
while (n-- != 0) {
char ch = *buf;
char ch = *buf++;
if (ch == '\n') {
char tmp = '\r';
prom_putchar(&tmp);
*dest++ = '\r';
dest_len++;
}
*dest++ = ch;
dest_len++;
if (dest_len >= CONSOLE_WRITE_BUF_SIZE - 1) {
prom_console_write_buf(console_write_buf, dest_len);
dest = console_write_buf;
dest_len = 0;
}
prom_putchar(buf);
buf++;
}
if (dest_len)
prom_console_write_buf(console_write_buf, dest_len);

raw_spin_unlock_irqrestore(&console_write_lock, flags);
}

void notrace prom_printf(const char *fmt, ...)
Expand Down

0 comments on commit e60de88

Please sign in to comment.