Switch to the sparc prom library.

This commit is contained in:
pk 2004-03-21 14:10:08 +00:00
parent fb7560550b
commit 6521621036
3 changed files with 10 additions and 311 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.h,v 1.20 2004/03/19 15:22:43 pk Exp $ */
/* $NetBSD: autoconf.h,v 1.21 2004/03/21 14:10:08 pk Exp $ */
/*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@ -81,7 +81,7 @@
*/
#include <machine/bus.h>
/*notyet:#include <machine/promlib.h>*/
#include <machine/promlib.h>
#include <dev/sbus/sbusvar.h>
/* This is used to map device classes to IPLs */
@ -125,20 +125,6 @@ struct mainbus_attach_args {
int ma_pri; /* priority (IPL) */
};
/*
* length; the others convert or make some other guarantee.
*/
long prom_getproplen __P((int node, char *name));
int prom_getprop __P((int, char *, size_t, int *, void *));
char *prom_getpropstring __P((int node, char *name));
int prom_getpropint __P((int node, char *name, int deflt));
/* new interfaces: */
char *prom_getpropstringA __P((int, char *, char *, size_t));
struct idprom *prom_getidprom(void);
void prom_getether(int, u_char *);
/*
* The matchbyname function is useful in drivers that are matched
* by romaux name, i.e., all `mainbus attached' devices. It expects
@ -172,16 +158,5 @@ void mountroot_hook_establish __P((void (*) __P((struct device *)),
struct device *));
void bootstrap __P((int));
int firstchild __P((int));
int nextsibling __P((int));
void callrom __P((void));
struct device *getdevunit __P((char *, int));
void *findzs __P((int));
void rominterpret __P((char *));
int romgetcursoraddr __P((int **, int **));
int findroot __P((void));
int findnode __P((int, const char *));
int node_has_property __P((int, const char *));
int prom_getoptionsnode __P((void));
int prom_getoption __P((const char *name, char *buf, int buflen));

View File

@ -1,4 +1,4 @@
/* $NetBSD: sparc64.h,v 1.6 2004/03/14 18:18:54 chs Exp $ */
/* $NetBSD: sparc64.h,v 1.7 2004/03/21 14:10:08 pk Exp $ */
/*
* Copyright (C) 1996 Wolfgang Solfrank.
@ -53,9 +53,4 @@ u_int64_t prom_get_msgbuf (int, int);
void prom_stopself(void);
void prom_startcpu(u_int, void *, u_long);
/*
* Debug
*/
void prom_printf (const char *, ...);
#endif /* _MACHINE_SPARC64_H_ */

View File

@ -1,4 +1,4 @@
/* $NetBSD: autoconf.c,v 1.94 2004/03/19 15:22:43 pk Exp $ */
/* $NetBSD: autoconf.c,v 1.95 2004/03/21 14:10:08 pk Exp $ */
/*
* Copyright (c) 1996
@ -48,7 +48,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.94 2004/03/19 15:22:43 pk Exp $");
__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.95 2004/03/21 14:10:08 pk Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@ -78,7 +78,6 @@ __KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.94 2004/03/19 15:22:43 pk Exp $");
#include <machine/bus.h>
#include <machine/autoconf.h>
#include <machine/openfirm.h>
#include <machine/idprom.h>
#include <machine/sparc64.h>
#include <machine/cpu.h>
#include <machine/pmap.h>
@ -102,7 +101,6 @@ int printspl = 0;
extern int kgdb_debug_panic;
#endif
static int rootnode;
char machine_model[100];
static char *str2hex __P((char *, int *));
@ -235,6 +233,8 @@ bootstrap(nctx)
extern void OF_val2sym32 __P((void *));
#endif
prom_init();
/* Initialize the PROM console so printf will not panic */
(*cn_tab->cn_init)(cn_tab);
#if NKSYMS || defined(DDB) || defined(LKM)
@ -552,37 +552,6 @@ mbprint(aux, name)
return (UNCONF);
}
int
findroot()
{
register int node;
if ((node = rootnode) == 0 && (node = OF_peer(0)) == 0)
panic("no PROM root device");
rootnode = node;
return (node);
}
/*
* Given a `first child' node number, locate the node with the given name.
* Return the node number, or 0 if not found.
*/
int
findnode(first, name)
int first;
register const char *name;
{
int node;
char buf[32];
for (node = first; node; node = OF_peer(node)) {
if ((OF_getprop(node, "name", buf, sizeof(buf)) > 0) &&
(strcmp(buf, name) == 0))
return (node);
}
return (0);
}
int
mainbus_match(parent, cf, aux)
struct device *parent;
@ -755,247 +724,6 @@ extern struct sparc_bus_space_tag mainbus_space_tag;
CFATTACH_DECL(mainbus, sizeof(struct device),
mainbus_match, mainbus_attach, NULL, NULL);
int
prom_getprop(node, name, size, nitem, bufp)
int node;
char *name;
size_t size;
int *nitem;
void *bufp;
{
void *buf;
long len;
len = prom_getproplen(node, name);
if (len <= 0)
return (ENOENT);
if ((len % size) != 0)
return (EINVAL);
buf = *(void **)bufp;
if (buf == NULL) {
/* No storage provided, so we allocate some */
buf = malloc(len, M_DEVBUF, M_NOWAIT);
if (buf == NULL)
return (ENOMEM);
} else {
if (size * (*nitem) < len)
return (ENOMEM);
}
OF_getprop(node, name, buf, len);
*(void **)bufp = buf;
*nitem = len / size;
return (0);
}
/*
* Internal form of proplen(). Returns the property length.
*/
long
prom_getproplen(node, name)
int node;
char *name;
{
return (OF_getproplen(node, name));
}
/*
* Return a string property. There is a (small) limit on the length;
* the string is fetched into a static buffer which is overwritten on
* subsequent calls.
*/
char *
prom_getpropstring(node, name)
int node;
char *name;
{
static char stringbuf[32];
return (prom_getpropstringA(node, name, stringbuf, sizeof stringbuf));
}
/* Alternative prom_getpropstring(), where caller provides the buffer */
char *
prom_getpropstringA(node, name, buffer, bufsize)
int node;
char *name;
char *buffer;
size_t bufsize;
{
int blen = bufsize - 1;
if (prom_getprop(node, name, 1, &blen, &buffer) != 0)
blen = 0;
buffer[blen] = '\0'; /* usually unnecessary */
return (buffer);
}
/*
* Fetch an integer (or pointer) property.
* The return value is the property, or the default if there was none.
*/
int
prom_getpropint(node, name, deflt)
int node;
char *name;
int deflt;
{
int intbuf;
if (OF_getprop(node, name, &intbuf, sizeof(intbuf)) != sizeof(intbuf))
return (deflt);
return (intbuf);
}
/*
* OPENPROM functions. These are here mainly to hide the OPENPROM interface
* from the rest of the kernel.
*/
int
firstchild(node)
int node;
{
return OF_child(node);
}
int
nextsibling(node)
int node;
{
return OF_peer(node);
}
/* The following are used primarily in consinit() */
int
node_has_property(node, prop) /* returns 1 if node has given property */
register int node;
register const char *prop;
{
return (OF_getproplen(node, (caddr_t)prop) != -1);
}
/*
* Get the global "options" node Id.
*/
int prom_getoptionsnode()
{
static int optionsnode;
if (optionsnode == 0) {
optionsnode = findnode(firstchild(findroot()), "options");
}
return optionsnode;
}
/*
* Return a property string value from the global "options" node.
*/
int prom_getoption(const char *name, char *buf, int buflen)
{
int node = prom_getoptionsnode();
int error, len;
if (buflen == 0)
return (EINVAL);
if (node == 0)
return (ENOENT);
len = buflen - 1;
if ((error = prom_getprop(node, (char *)name, 1, &len, &buf)) != 0)
return error;
buf[len] = '\0';
return (0);
}
struct idprom *
prom_getidprom(void)
{
static struct idprom idprom;
int node, len;
u_long h;
u_char *dst;
if (idprom.id_format != 0)
/* Already got it */
return (&idprom);
/*
* Fetch the `idprom' property at the root node.
*/
dst = (char *)&idprom;
len = sizeof(struct idprom);
node = findroot();
if (prom_getprop(node, "idprom", 1, &len, &dst) != 0) {
printf("`idprom' property cannot be read: "
"cannot get ethernet address");
}
/* Establish hostid */
h = idprom.id_machine << 24;
h |= idprom.id_hostid[0] << 16;
h |= idprom.id_hostid[1] << 8;
h |= idprom.id_hostid[2];
hostid = h;
return (&idprom);
}
void prom_getether(node, cp)
int node;
u_char *cp;
{
struct idprom *idp = prom_getidprom();
char buf[6+1], *bp;
int nitem;
if (node == 0)
goto read_idprom;
/*
* First, try the node's "mac-address" property.
* This property is set by the adapter's firmware if the
* device has already been opened for traffic, e.g. for
* net booting. Its value might be `0-terminated', probably
* because the Forth ROMs uses `xdrstring' instead of `xdrbytes'
* to construct the property.
*/
nitem = 6+1;
bp = buf;
if (prom_getprop(node, "mac-address", 1, &nitem, &bp) == 0 &&
nitem >= 6) {
memcpy(cp, bp, 6);
return;
}
/*
* Next, check the global "local-mac-address?" switch to see
* if we should try to extract the node's "local-mac-address"
* property.
*/
if (prom_getoption("local-mac-address?", buf, sizeof buf) != 0 ||
strcmp(buf, "true") != 0)
goto read_idprom;
/* Retrieve the node's "local-mac-address" property, if any */
nitem = 6;
if (prom_getprop(node, "local-mac-address", 1, &nitem, &cp) == 0 &&
nitem == 6)
return;
/* Fall back on the machine's global ethernet address */
read_idprom:
memcpy(cp, idp->id_ether, 6);
}
#ifdef RASTERCONSOLE
/*
@ -1021,13 +749,14 @@ romgetcursoraddr(rowp, colp)
}
#endif /* RASTERCONSOLE */
void
callrom()
#if 0
void callrom()
{
__asm __volatile("wrpr %%g0, 0, %%tl" : );
OF_enter();
}
#endif
/*
* find a device matching "name" and unit number