mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-06 17:18:32 +00:00
Rework handling of ofw_quiesce(), making it the responsibility of the
platform modules. Whether to call this function or not is highly machine dependent: on some systems, it is required, while on others it breaks everything. Platform modules are in a better position to figure this out. This is required for POWER hypervisor SCSI to work correctly. There are no functional changes on Powermac systems. Approved by: re (kib)
This commit is contained in:
parent
91a01b9161
commit
9f70672718
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=255910
|
@ -46,5 +46,6 @@ boolean_t OF_bootstrap(void);
|
|||
void OF_reboot(void);
|
||||
|
||||
void ofw_mem_regions(struct mem_region **, int *, struct mem_region **, int *);
|
||||
void ofw_quiesce(void); /* Must be called before VM is up! */
|
||||
|
||||
#endif /* _MACHINE_OFW_MACHDEP_H_ */
|
||||
|
|
|
@ -69,7 +69,6 @@ static void *fdt;
|
|||
int ofw_real_mode;
|
||||
|
||||
int ofwcall(void *);
|
||||
static void ofw_quiesce(void);
|
||||
static int openfirmware(void *args);
|
||||
|
||||
/*
|
||||
|
@ -472,12 +471,6 @@ OF_bootstrap()
|
|||
return status;
|
||||
|
||||
OF_init(openfirmware);
|
||||
|
||||
/*
|
||||
* On some machines, we need to quiesce OF to turn off
|
||||
* background processes.
|
||||
*/
|
||||
ofw_quiesce();
|
||||
} else if (fdt != NULL) {
|
||||
status = OF_install(OFW_FDT, 0);
|
||||
|
||||
|
@ -490,37 +483,21 @@ OF_bootstrap()
|
|||
return (status);
|
||||
}
|
||||
|
||||
static void
|
||||
void
|
||||
ofw_quiesce(void)
|
||||
{
|
||||
phandle_t rootnode;
|
||||
char model[32];
|
||||
struct {
|
||||
cell_t name;
|
||||
cell_t nargs;
|
||||
cell_t nreturns;
|
||||
} args;
|
||||
|
||||
/*
|
||||
* Only quiesce Open Firmware on PowerMac11,2 and 12,1. It is
|
||||
* necessary there to shut down a background thread doing fan
|
||||
* management, and is harmful on other machines.
|
||||
*
|
||||
* Note: we don't need to worry about which OF module we are
|
||||
* using since this is called only from very early boot, within
|
||||
* OF's boot context.
|
||||
*/
|
||||
KASSERT(!pmap_bootstrapped, ("Cannot call ofw_quiesce after VM is up"));
|
||||
|
||||
rootnode = OF_finddevice("/");
|
||||
if (OF_getprop(rootnode, "model", model, sizeof(model)) > 0) {
|
||||
if (strcmp(model, "PowerMac11,2") == 0 ||
|
||||
strcmp(model, "PowerMac12,1") == 0) {
|
||||
args.name = (cell_t)(uintptr_t)"quiesce";
|
||||
args.nargs = 0;
|
||||
args.nreturns = 0;
|
||||
openfirmware(&args);
|
||||
}
|
||||
}
|
||||
args.name = (cell_t)(uintptr_t)"quiesce";
|
||||
args.nargs = 0;
|
||||
args.nreturns = 0;
|
||||
openfirmware(&args);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -56,6 +56,7 @@ extern void *ap_pcpu;
|
|||
#endif
|
||||
|
||||
static int powermac_probe(platform_t);
|
||||
static int powermac_attach(platform_t);
|
||||
void powermac_mem_regions(platform_t, struct mem_region **phys, int *physsz,
|
||||
struct mem_region **avail, int *availsz);
|
||||
static u_long powermac_timebase_freq(platform_t, struct cpuref *cpuref);
|
||||
|
@ -67,6 +68,7 @@ static void powermac_reset(platform_t);
|
|||
|
||||
static platform_method_t powermac_methods[] = {
|
||||
PLATFORMMETHOD(platform_probe, powermac_probe),
|
||||
PLATFORMMETHOD(platform_attach, powermac_attach),
|
||||
PLATFORMMETHOD(platform_mem_regions, powermac_mem_regions),
|
||||
PLATFORMMETHOD(platform_timebase_freq, powermac_timebase_freq),
|
||||
|
||||
|
@ -118,6 +120,35 @@ powermac_mem_regions(platform_t plat, struct mem_region **phys, int *physsz,
|
|||
ofw_mem_regions(phys,physsz,avail,availsz);
|
||||
}
|
||||
|
||||
static int
|
||||
powermac_attach(platform_t plat)
|
||||
{
|
||||
phandle_t rootnode;
|
||||
char model[32];
|
||||
|
||||
|
||||
/*
|
||||
* Quiesce Open Firmware on PowerMac11,2 and 12,1. It is
|
||||
* necessary there to shut down a background thread doing fan
|
||||
* management, and is harmful on other machines (it will make OF
|
||||
* shut off power to various system components it had turned on).
|
||||
*
|
||||
* Note: we don't need to worry about which OF module we are
|
||||
* using since this is called only from very early boot, within
|
||||
* OF's boot context.
|
||||
*/
|
||||
|
||||
rootnode = OF_finddevice("/");
|
||||
if (OF_getprop(rootnode, "model", model, sizeof(model)) > 0) {
|
||||
if (strcmp(model, "PowerMac11,2") == 0 ||
|
||||
strcmp(model, "PowerMac12,1") == 0) {
|
||||
ofw_quiesce();
|
||||
}
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
static u_long
|
||||
powermac_timebase_freq(platform_t plat, struct cpuref *cpuref)
|
||||
{
|
||||
|
|
|
@ -151,6 +151,9 @@ chrp_attach(platform_t plat)
|
|||
}
|
||||
#endif
|
||||
|
||||
/* Some systems (e.g. QEMU) need Open Firmware to stand down */
|
||||
ofw_quiesce();
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue