diff options
author | grehan <grehan@FreeBSD.org> | 2005-11-08 06:48:08 +0000 |
---|---|---|
committer | grehan <grehan@FreeBSD.org> | 2005-11-08 06:48:08 +0000 |
commit | eff5b98fc40055bf85d38836cdcfebf6486cf0d2 (patch) | |
tree | c090032365f12df1f06212e900d4fe33ca492b60 /sys/powerpc/include | |
parent | bf6d4253ee61e7325d3cd61086924ae203e9726c (diff) | |
download | FreeBSD-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.h | 96 | ||||
-rw-r--r-- | sys/powerpc/include/pmap.h | 10 |
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_ */ |