svn commit: r348899 - head/sys/powerpc/ofw
Leandro Lupori
luporl at FreeBSD.org
Tue Jun 11 11:16:43 UTC 2019
Author: luporl
Date: Tue Jun 11 11:16:41 2019
New Revision: 348899
URL: https://svnweb.freebsd.org/changeset/base/348899
Log:
[PPC64] Fix ofw_initrd
Before this change, OFW initrd (as md) handling code was simulating an ofwbus
device. But as there isn't really a Device Tree (DT) node representing OFW
initrd (it is specified in 2 properties under /chosen), its driver was in fact
stealing other driver's DT node. This was noticed after MD_ROOT_MEM became
default and QEMU's USB keyboard stopped working under VNC.
This change consists in simplifying the process of detection and mapping of
initrd memory, turning it into a simple startup step, instead of trying to
simulate a device.
Reviewed by: jhibbits
Differential Revision: https://reviews.freebsd.org/D20553
Modified:
head/sys/powerpc/ofw/ofw_initrd.c
Modified: head/sys/powerpc/ofw/ofw_initrd.c
==============================================================================
--- head/sys/powerpc/ofw/ofw_initrd.c Tue Jun 11 10:41:39 2019 (r348898)
+++ head/sys/powerpc/ofw/ofw_initrd.c Tue Jun 11 11:16:41 2019 (r348899)
@@ -43,71 +43,41 @@ __FBSDID("$FreeBSD$");
#include "opt_md.h"
-#ifdef MD_ROOT_MEM
extern u_char *mfs_root;
-extern uint32_t mfs_root_size;
-#else
-#warning "MD_ROOT_MEM should be set to use ofw initrd as a md device"
-#endif
+extern int mfs_root_size;
-/* bus entry points */
-static int ofw_initrd_probe(device_t dev);
-static int ofw_initrd_attach(device_t dev);
-static void ofw_initrd_identify(driver_t *driver, device_t parent);
+static void ofw_initrd_probe_and_attach(void *junk);
-struct ofw_initrd_softc {
- device_t sc_dev;
- vm_paddr_t start;
- vm_paddr_t end;
-};
+SYSINIT(ofw_initrd_probe_and_attach, SI_SUB_KMEM, SI_ORDER_ANY,
+ ofw_initrd_probe_and_attach, NULL);
-static int
-ofw_initrd_probe(device_t dev)
+static void
+ofw_initrd_probe_and_attach(void *junk)
{
phandle_t chosen;
-
- /* limit this device to one unit */
- if (device_get_unit(dev) != 0)
- return (ENXIO);
-
- chosen = OF_finddevice("/chosen");
- if (chosen <= 0) {
- return (ENXIO);
- }
-
- if (!OF_hasprop(chosen, "linux,initrd-start") ||
- !OF_hasprop(chosen, "linux,initrd-end"))
- return (ENXIO);
-
- device_set_desc(dev, "OFW initrd memregion loader");
- return (BUS_PROBE_DEFAULT);
-}
-
-static int
-ofw_initrd_attach(device_t dev)
-{
- struct ofw_initrd_softc *sc;
vm_paddr_t start, end;
- phandle_t chosen;
pcell_t cell[2];
ssize_t size;
- sc = device_get_softc(dev);
+ if (!hw_direct_map)
+ return;
chosen = OF_finddevice("/chosen");
- if (chosen <= 0) {
- device_printf(dev, "/chosen not found\n");
- return (ENXIO);
- }
+ if (chosen <= 0)
+ return;
+ if (!OF_hasprop(chosen, "linux,initrd-start") ||
+ !OF_hasprop(chosen, "linux,initrd-end"))
+ return;
+
size = OF_getencprop(chosen, "linux,initrd-start", cell, sizeof(cell));
if (size == 4)
start = cell[0];
else if (size == 8)
start = (uint64_t)cell[0] << 32 | cell[1];
else {
- device_printf(dev, "Wrong linux,initrd-start size\n");
- return (ENXIO);
+ printf("ofw_initrd: Wrong linux,initrd-start size\n");
+ return;
}
size = OF_getencprop(chosen, "linux,initrd-end", cell, sizeof(cell));
@@ -116,44 +86,15 @@ ofw_initrd_attach(device_t dev)
else if (size == 8)
end = (uint64_t)cell[0] << 32 | cell[1];
else{
- device_printf(dev, "Wrong linux,initrd-end size\n");
- return (ENXIO);
+ printf("ofw_initrd: Wrong linux,initrd-end size\n");
+ return;
}
if (end - start > 0) {
mfs_root = (u_char *) PHYS_TO_DMAP(start);
mfs_root_size = end - start;
-
- return (0);
+ printf("ofw_initrd: initrd loaded at 0x%08lx-0x%08lx\n",
+ start, end);
}
-
- return (ENXIO);
}
-static void
-ofw_initrd_identify(driver_t *driver, device_t parent)
-{
- if (device_find_child(parent, "initrd", -1) != NULL)
- return;
-
- if (BUS_ADD_CHILD(parent, 10, "initrd", -1) == NULL)
- device_printf(parent, "add ofw_initrd child failed\n");
-}
-
-static device_method_t ofw_initrd_methods[] = {
- DEVMETHOD(device_identify, ofw_initrd_identify),
- DEVMETHOD(device_probe, ofw_initrd_probe),
- DEVMETHOD(device_attach, ofw_initrd_attach),
- DEVMETHOD_END
-};
-
-static driver_t ofw_initrd_driver = {
- "ofw_initrd",
- ofw_initrd_methods,
- sizeof(struct ofw_initrd_softc)
-};
-
-static devclass_t ofw_initrd_devclass;
-
-DRIVER_MODULE(ofw_initrd, ofwbus, ofw_initrd_driver, ofw_initrd_devclass,
- NULL, NULL);
More information about the svn-src-all
mailing list