Page MenuHomeFreeBSD

D15705.1775715966.diff
No OneTemporary

Size
5 KB
Referenced Files
None
Subscribers
None

D15705.1775715966.diff

Index: head/sys/conf/files.powerpc
===================================================================
--- head/sys/conf/files.powerpc
+++ head/sys/conf/files.powerpc
@@ -163,6 +163,7 @@
powerpc/ofw/ofwcall64.S optional aim powerpc64
powerpc/ofw/openpic_ofw.c standard
powerpc/ofw/rtas.c optional aim
+powerpc/ofw/ofw_initrd.c optional md_root_mem powerpc64
powerpc/powermac/ata_kauai.c optional powermac ata | powermac atamacio
powerpc/powermac/ata_macio.c optional powermac ata | powermac atamacio
powerpc/powermac/ata_dbdma.c optional powermac ata | powermac atamacio
Index: head/sys/powerpc/ofw/ofw_initrd.c
===================================================================
--- head/sys/powerpc/ofw/ofw_initrd.c
+++ head/sys/powerpc/ofw/ofw_initrd.c
@@ -0,0 +1,159 @@
+/*-
+ * Copyright (C) 2018 Breno Leitao
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+#include <sys/module.h>
+#include <sys/types.h>
+#include <sys/proc.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <machine/bus.h>
+
+#include <dev/ofw/openfirm.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+#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
+
+/* 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);
+
+struct ofw_initrd_softc {
+ device_t sc_dev;
+ vm_paddr_t start;
+ vm_paddr_t end;
+};
+
+static int
+ofw_initrd_probe(device_t dev)
+{
+ 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);
+
+ chosen = OF_finddevice("/chosen");
+ if (chosen <= 0) {
+ device_printf(dev, "/chosen not found\n");
+ return (ENXIO);
+ }
+
+ 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);
+ }
+
+ size = OF_getencprop(chosen, "linux,initrd-end", cell, sizeof(cell));
+ if (size == 4)
+ end = cell[0];
+ else if (size == 8)
+ end = (uint64_t)cell[0] << 32 | cell[1];
+ else{
+ device_printf(dev, "Wrong linux,initrd-end size\n");
+ return (ENXIO);
+ }
+
+ if (end - start > 0) {
+ mfs_root = (u_char *) PHYS_TO_DMAP(start);
+ mfs_root_size = end - start;
+
+ return (0);
+ }
+
+ 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);

File Metadata

Mime Type
text/plain
Expires
Thu, Apr 9, 6:26 AM (1 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28307053
Default Alt Text
D15705.1775715966.diff (5 KB)

Event Timeline