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:
parent
2bc9b4e2be
commit
783ea940e5
@ -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?
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user