linux/arch/sparc/prom/console_64.c
David S. Miller e62cac1fd0 sparc: Pass buffer pointer all the way down to prom_{get,put}char().
This gets us closer to being able to eliminate the use
of dynamic and stack based buffers, so that we can adhere
to the "no buffer addresses above 4GB" rule for PROM calls.

Signed-off-by: David S. Miller <davem@davemloft.net>
2010-11-30 14:33:29 -08:00

82 lines
1.6 KiB
C

/* console.c: Routines that deal with sending and receiving IO
* to/from the current console device using the PROM.
*
* Copyright (C) 1995 David S. Miller (davem@davemloft.net)
* Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <asm/openprom.h>
#include <asm/oplib.h>
#include <asm/system.h>
#include <linux/string.h>
extern int prom_stdin, prom_stdout;
/* Non blocking get character from console input device, returns -1
* if no input was taken. This can be used for polling.
*/
static int prom_nbgetchar(char *buf)
{
unsigned long args[7];
args[0] = (unsigned long) "read";
args[1] = 3;
args[2] = 1;
args[3] = (unsigned int) prom_stdin;
args[4] = (unsigned long) buf;
args[5] = 1;
args[6] = (unsigned long) -1;
p1275_cmd_direct(args);
if (args[6] == 1)
return 0;
return -1;
}
/* Non blocking put character to console device, returns -1 if
* unsuccessful.
*/
static int prom_nbputchar(const char *buf)
{
unsigned long args[7];
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[6] = (unsigned long) -1;
p1275_cmd_direct(args);
if (args[6] == 1)
return 0;
else
return -1;
}
/* Blocking version of get character routine above. */
void prom_getchar(char *buf)
{
while (1) {
int err = prom_nbgetchar(buf);
if (!err)
break;
}
}
/* Blocking version of put character routine above. */
void prom_putchar(const char *buf)
{
while (1) {
int err = prom_nbputchar(buf);
if (!err)
break;
}
}