summaryrefslogtreecommitdiffstats
path: root/sys/powerpc/include
diff options
context:
space:
mode:
authorgrehan <grehan@FreeBSD.org>2005-11-08 06:48:08 +0000
committergrehan <grehan@FreeBSD.org>2005-11-08 06:48:08 +0000
commiteff5b98fc40055bf85d38836cdcfebf6486cf0d2 (patch)
treec090032365f12df1f06212e900d4fe33ca492b60 /sys/powerpc/include
parentbf6d4253ee61e7325d3cd61086924ae203e9726c (diff)
downloadFreeBSD-src-eff5b98fc40055bf85d38836cdcfebf6486cf0d2.zip
FreeBSD-src-eff5b98fc40055bf85d38836cdcfebf6486cf0d2.tar.gz
Insert a layer of indirection to the pmap code, using a kobj for
the interface. This allows run-time selection of MMU code, based on CPU-type detection, or tunable-overrides when testing new code. Pre-requisite for G5 support. conf/files.powerpc - remove pmap.c - add mmu_if.h, mmu_oea.c, pmap_dispatch.c powerpc/include/mmuvar.h - definitions for MMU implementations powerpc/include/pmap.h - remove pmap_pte_spill declaration - add pmap_mmu_install declaration - size the phys_avail array - pmap_bootstrapped is now global-scope powerpc/powerpc/machdep.c - call kobj_machdep_init early in the boot sequence to allow kobj usage prior to SI_SUB_LOCK - install the OEA pmap code. This will be moved to CPU-specific init code in the future. powerpc/powerpc/mmu_if.m - Kobj MMU interface definitions powerpc/powerpc/pmap_dispatch.c - central dispatch for pmap calls - contains the global mmu kobj and the routine to locate the the mmu implementation and init the kobj
Diffstat (limited to 'sys/powerpc/include')
-rw-r--r--sys/powerpc/include/mmuvar.h96
-rw-r--r--sys/powerpc/include/pmap.h10
2 files changed, 102 insertions, 4 deletions
diff --git a/sys/powerpc/include/mmuvar.h b/sys/powerpc/include/mmuvar.h
new file mode 100644
index 0000000..fc2f8d5
--- /dev/null
+++ b/sys/powerpc/include/mmuvar.h
@@ -0,0 +1,96 @@
+/*-
+ * Copyright (c) 2005 Peter Grehan
+ * All rights reserved.
+ *
+ * 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 AND CONTRIBUTORS ``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 THE AUTHOR OR CONTRIBUTORS 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.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_MMUVAR_H_
+#define _MACHINE_MMUVAR_H_
+
+/*
+ * A PowerPC MMU implementation is declared with a kernel object and
+ * an associated method table, similar to a device driver.
+ *
+ * e.g.
+ *
+ * static mmu_method_t ppc8xx_methods[] = {
+ * MMUMETHOD(mmu_change_wiring, ppc8xx_mmu_change_wiring),
+ * MMUMETHOD(mmu_clear_modify, ppc8xx_mmu_clear_modify),
+ * MMUMETHOD(mmu_clear_reference, ppc8xx_mmu_clear_reference),
+ * ...
+ * MMUMETHOD(mmu_dev_direct_mapped, ppc8xx_mmu_dev_direct_mapped),
+ * { 0, 0 }
+ * };
+ *
+ * static mmu_def_t ppc8xx_mmu = {
+ * "ppc8xx",
+ * ppc8xx_methods,
+ * sizeof(ppc8xx_mmu_softc), // or 0 if no softc
+ * };
+ *
+ * MMU_DEF(ppc8xx_mmu);
+ */
+
+#include <sys/kobj.h>
+
+struct mmu_kobj {
+ /*
+ * An MMU instance is a kernel object
+ */
+ KOBJ_FIELDS;
+
+ /*
+ * Utility elements that an instance may use
+ */
+ struct mtx mmu_mtx; /* available for instance use */
+ void *mmu_iptr; /* instance data pointer */
+
+ /*
+ * Opaque data that can be overlaid with an instance-private
+ * structure. MMU code can test that this is large enough at
+ * compile time with a sizeof() test againt it's softc. There
+ * is also a run-time test when the MMU kernel object is
+ * registered.
+ */
+#define MMU_OPAQUESZ 64
+ u_int mmu_opaque[MMU_OPAQUESZ];
+};
+
+typedef struct mmu_kobj *mmu_t;
+typedef struct kobj_class mmu_def_t;
+#define mmu_method_t kobj_method_t
+
+#define MMUMETHOD KOBJMETHOD
+
+#define MMU_DEF(name) DATA_SET(mmu_set, name)
+
+/*
+ * Known MMU names
+ */
+#define MMU_TYPE_OEA "mmu_oea" /* 32-bit OEA */
+#define MMU_TYPE_G5 "mmu_g5" /* 64-bit bridge (ibm 970) */
+#define MMU_TYPE_8xx "mmu_8xx" /* 8xx quicc TLB */
+
+#endif /* _MACHINE_MMUVAR_H_ */
diff --git a/sys/powerpc/include/pmap.h b/sys/powerpc/include/pmap.h
index e28042c..57c6f61 100644
--- a/sys/powerpc/include/pmap.h
+++ b/sys/powerpc/include/pmap.h
@@ -94,19 +94,21 @@ void *pmap_mapdev(vm_offset_t, vm_size_t);
void pmap_unmapdev(vm_offset_t, vm_size_t);
void pmap_deactivate(struct thread *);
vm_offset_t pmap_kextract(vm_offset_t);
-
-int pmap_pte_spill(vm_offset_t);
-
int pmap_dev_direct_mapped(vm_offset_t, vm_size_t);
+boolean_t pmap_mmu_install(char *name, int prio);
+
#define vtophys(va) pmap_kextract(((vm_offset_t)(va)))
-extern vm_offset_t phys_avail[];
+#define PHYS_AVAIL_SZ 128
+extern vm_offset_t phys_avail[PHYS_AVAIL_SZ];
extern vm_offset_t virtual_avail;
extern vm_offset_t virtual_end;
extern vm_offset_t msgbuf_phys;
+extern int pmap_bootstrapped;
+
#endif
#endif /* !_MACHINE_PMAP_H_ */
OpenPOWER on IntegriCloud