Various things that make OFW-driver kernels work on my Firepower LX MP

again:
- Special-case the attachment of CPUs, and logically attach them to
  "mainbus", attaching them before any other devices.  Otherwise,
  CPUs would be found very late in the game on my Firepower.
- Sanity check the timebase-frequency property, printing a warning if
  it's not the same on each CPU.
- Pass the correct CPU ID to cpu_attach_subr().
- Fetch the platform name from the OFW root node.  We can key off this
  later when we implement support for native drivers in the ofppc port.
- Use a table of "special" toplevel OFW nodes ... we skip these nodes
  during the device configuration phase.  This generally includes the
  "options", "packages", etc. nodes.  Inspired by sparc & sparc64 ports.
This commit is contained in:
thorpej 2001-10-22 14:46:08 +00:00
parent 2bc9b4e2be
commit 783ea940e5
4 changed files with 128 additions and 29 deletions

View File

@ -1,11 +1,11 @@
# $NetBSD: GENERIC,v 1.43 2001/09/12 21:05:37 manu Exp $
# $NetBSD: GENERIC,v 1.44 2001/10/22 14:46:08 thorpej Exp $
#
# GENERIC -- everything that's currently supported
#
include "arch/ofppc/conf/std.ofppc"
#ident "GENERIC-$Revision: 1.43 $"
#ident "GENERIC-$Revision: 1.44 $"
maxusers 32
@ -113,8 +113,8 @@ mainbus* at root
ofbus* at mainbus?
ofbus* at ofbus?
# CPU
cpu* at ofbus?
# CPUs
cpu* at mainbus?
# Generic OpenFirmware disk support
ofdisk* at ofbus?

View File

@ -1,4 +1,4 @@
# $NetBSD: files.ofppc,v 1.14 2001/08/26 02:47:40 matt Exp $
# $NetBSD: files.ofppc,v 1.15 2001/10/22 14:46:08 thorpej Exp $
#
# First try for ofppc-specific configuration info
#
@ -59,7 +59,7 @@ attach mainbus at root
file arch/ofppc/ofppc/mainbus.c mainbus
device cpu
attach cpu at ofbus
attach cpu at mainbus
file arch/ofppc/ofppc/cpu.c cpu
# RAIDframe

View File

@ -1,11 +1,11 @@
/* $NetBSD: cpu.c,v 1.2 2001/10/20 08:22:58 billc Exp $ */
/* $NetBSD: cpu.c,v 1.3 2001/10/22 14:46:09 thorpej Exp $ */
/*-
* Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by NONAKA Kimihiro.
* by NONAKA Kimihiro; by Jason R. Thorpe.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -56,10 +56,16 @@ cpu_match(struct device *parent, struct cfdata *cfdata, void *aux)
struct ofbus_attach_args *oba = aux;
char name[32];
if (OF_getprop(oba->oba_phandle, "device_type", name, sizeof name) <= 3)
if (strcmp(oba->oba_busname, "cpu") != 0)
return (0);
if (!strcmp(name, "cpu"))
if (OF_getprop(oba->oba_phandle, "device_type", name,
sizeof(name)) <= 3)
return (0);
if (strcmp(name, "cpu") == 0)
return (1);
return (0);
}
@ -69,12 +75,29 @@ cpu_attach(struct device *parent, struct device *self, void *aux)
struct cpu_softc *sc = (struct cpu_softc *) self;
struct ofbus_attach_args *oba = aux;
unsigned char data[4];
int tbase, cpunum;
sc->sc_ofnode = oba->oba_phandle;
cpu_attach_common(self, 0);
if (OF_getprop(oba->oba_phandle, "timebase-frequency",
data, sizeof data) >= sizeof(int)) {
cpu_timebase = of_decode_int(data);
if (OF_getprop(sc->sc_ofnode, "reg",
data, sizeof(data)) < sizeof(data)) {
printf(": unable to get CPU ID\n");
return;
}
cpunum = of_decode_int(data);
cpu_attach_common(self, cpunum);
if (OF_getprop(oba->oba_phandle, "timebase-frequency",
data, sizeof(data)) < sizeof(data))
printf("%s: unable to get timebase-frequence property\n",
sc->sc_dev.dv_xname);
else {
tbase = of_decode_int(data);
if (cpu_timebase == 0)
cpu_timebase = tbase;
else if (tbase != cpu_timebase)
printf("%s: WARNING: timebase %d != %d\n",
sc->sc_dev.dv_xname, tbase, cpu_timebase);
}
}

View File

@ -1,11 +1,11 @@
/* $NetBSD: mainbus.c,v 1.3 2001/08/26 02:47:41 matt Exp $ */
/* $NetBSD: mainbus.c,v 1.4 2001/10/22 14:46:09 thorpej Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
* Copyright (c) 1998, 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Charles M. Hannum.
* by Charles M. Hannum; by Jason R. Thorpe.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -42,24 +42,26 @@
#include <dev/ofw/openfirm.h>
int mainbus_match __P((struct device *, struct cfdata *, void *));
void mainbus_attach __P((struct device *, struct device *, void *));
int mainbus_match(struct device *, struct cfdata *, void *);
void mainbus_attach(struct device *, struct device *, void *);
struct cfattach mainbus_ca = {
sizeof(struct device), mainbus_match, mainbus_attach
};
int mainbus_print(void *, const char *);
extern struct cfdriver mainbus_cd;
char platform_type[64];
/*
* Probe for the mainbus; always succeeds.
*/
int
mainbus_match(parent, cf, aux)
struct device *parent;
struct cfdata *cf;
void *aux;
mainbus_match(struct device *parent, struct cfdata *cf, void *aux)
{
return (1);
}
@ -67,19 +69,93 @@ mainbus_match(parent, cf, aux)
* Attach the mainbus.
*/
void
mainbus_attach(parent, self, aux)
struct device *parent, *self;
void *aux;
mainbus_attach(struct device *parent, struct device *self, void *aux)
{
struct ofbus_attach_args oba;
char buf[32];
const char * const *ssp, *sp = NULL;
int node;
printf("\n");
static const char * const openfirmware_special[] = {
/*
* These are _root_ devices to ignore. Others must be
* handled elsewhere, if at all.
*/
"virtual-memory",
"mmu",
"aliases",
"memory",
"openprom",
"options",
"packages",
"chosen",
/*
* This one is extra-special .. we make a special case
* and attach CPUs early.
*/
"cpus",
NULL
};
node = OF_peer(0);
if (node) {
if (node == 0) {
printf("\n");
panic("mainbus_attach: no OpenFirmware root node\n");
}
/*
* Display the type of system we are running on. Eventually,
* this can be used to look up methods to handle native hardware
* devices.
*/
OF_getprop(node, "name", platform_type, sizeof(platform_type));
printf(": %s\n", platform_type);
/*
* Before we do anything else, attach CPUs. We do this early,
* because we might need to make CPU dependent decisions during
* the autoconfiguration process. Also, it's a little weird to
* see CPUs after other devices in the boot messages.
*/
node = OF_finddevice("/cpus");
if (node != -1) {
for (node = OF_child(node); node != 0; node = OF_peer(node)) {
oba.oba_busname = "cpu";
oba.oba_phandle = node;
(void) config_found(self, &oba, mainbus_print);
}
}
/*
* Now attach the rest of the devices on the system.
*/
for (node = OF_child(OF_peer(0)); node != 0; node = OF_peer(node)) {
OF_getprop(node, "name", buf, sizeof(buf));
for (ssp = openfirmware_special; (sp = *ssp) != NULL; ssp++) {
if (strcmp(buf, sp) == 0)
break;
}
if (sp != NULL)
continue;
oba.oba_busname = "ofw";
oba.oba_phandle = node;
config_found(self, &oba, NULL);
(void) config_found(self, &oba, mainbus_print);
}
}
int
mainbus_print(void *aux, const char *pnp)
{
struct ofbus_attach_args *oba = aux;
char name[64];
if (pnp) {
OF_getprop(oba->oba_phandle, "name", name, sizeof(name));
printf("%s at %s", name, pnp);
}
return (UNCONF);
}