Module Name: src Committed By: matt Date: Thu Jun 23 01:27:21 UTC 2011
Modified Files: src/sys/arch/evbppc/mpc85xx: machdep.c src/sys/arch/powerpc/booke: booke_stubs.c e500_tlb.c src/sys/arch/powerpc/include: types.h src/sys/arch/powerpc/include/booke: cpuvar.h pte.h src/sys/common/pmap/tlb: pmap_tlb.c Log Message: Switch to using the common <common/pmap/tlb/tlb.h> To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbppc/mpc85xx/machdep.c cvs rdiff -u -r1.6 -r1.7 src/sys/arch/powerpc/booke/booke_stubs.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/powerpc/booke/e500_tlb.c cvs rdiff -u -r1.44 -r1.45 src/sys/arch/powerpc/include/types.h cvs rdiff -u -r1.9 -r1.10 src/sys/arch/powerpc/include/booke/cpuvar.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/powerpc/include/booke/pte.h cvs rdiff -u -r1.4 -r1.5 src/sys/common/pmap/tlb/pmap_tlb.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbppc/mpc85xx/machdep.c diff -u src/sys/arch/evbppc/mpc85xx/machdep.c:1.11 src/sys/arch/evbppc/mpc85xx/machdep.c:1.12 --- src/sys/arch/evbppc/mpc85xx/machdep.c:1.11 Wed Jun 15 15:18:20 2011 +++ src/sys/arch/evbppc/mpc85xx/machdep.c Thu Jun 23 01:27:20 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.11 2011/06/15 15:18:20 matt Exp $ */ +/* $NetBSD: machdep.c,v 1.12 2011/06/23 01:27:20 matt Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -821,8 +821,8 @@ * We know the GUR is mapped via a TLB1 entry so we add a limited * mapiodev which allows mappings in GUR space. */ - CTASSERT(offsetof(struct tlb_md_ops, md_tlb_mapiodev) == 0); - cpu_md_ops.md_tlb_ops = (const void *)&early_tlb_mapiodev; + CTASSERT(offsetof(struct tlb_md_io_ops, md_tlb_mapiodev) == 0); + cpu_md_ops.md_tlb_io_ops = (const void *)&early_tlb_mapiodev; bus_space_init(&gur_bst, NULL, NULL, 0); bus_space_init(&gur_le_bst, NULL, NULL, 0); cpu->cpu_bst = &gur_bst; Index: src/sys/arch/powerpc/booke/booke_stubs.c diff -u src/sys/arch/powerpc/booke/booke_stubs.c:1.6 src/sys/arch/powerpc/booke/booke_stubs.c:1.7 --- src/sys/arch/powerpc/booke/booke_stubs.c:1.6 Wed Jun 15 15:22:56 2011 +++ src/sys/arch/powerpc/booke/booke_stubs.c Thu Jun 23 01:27:20 2011 @@ -35,7 +35,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: booke_stubs.c,v 1.6 2011/06/15 15:22:56 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: booke_stubs.c,v 1.7 2011/06/23 01:27:20 matt Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -45,17 +45,17 @@ #define __stub __section(".stub") __noprofile -void tlb_set_asid(uint32_t) __stub; +void tlb_set_asid(tlb_asid_t) __stub; void -tlb_set_asid(uint32_t asid) +tlb_set_asid(tlb_asid_t asid) { (*cpu_md_ops.md_tlb_ops->md_tlb_set_asid)(asid); } -uint32_t tlb_get_asid(void) __stub; +tlb_asid_t tlb_get_asid(void) __stub; -uint32_t +tlb_asid_t tlb_get_asid(void) { return (*cpu_md_ops.md_tlb_ops->md_tlb_get_asid)(); @@ -77,26 +77,26 @@ (*cpu_md_ops.md_tlb_ops->md_tlb_invalidate_globals)(); } -void tlb_invalidate_asids(uint32_t, uint32_t) __stub; +void tlb_invalidate_asids(tlb_asid_t, tlb_asid_t) __stub; void -tlb_invalidate_asids(uint32_t asid_lo, uint32_t asid_hi) +tlb_invalidate_asids(tlb_asid_t asid_lo, tlb_asid_t asid_hi) { (*cpu_md_ops.md_tlb_ops->md_tlb_invalidate_asids)(asid_lo, asid_hi); } -void tlb_invalidate_addr(vaddr_t, uint32_t) __stub; +void tlb_invalidate_addr(vaddr_t, tlb_asid_t) __stub; void -tlb_invalidate_addr(vaddr_t va, uint32_t asid) +tlb_invalidate_addr(vaddr_t va, tlb_asid_t asid) { (*cpu_md_ops.md_tlb_ops->md_tlb_invalidate_addr)(va, asid); } -bool tlb_update_addr(vaddr_t, uint32_t, uint32_t, bool) __stub; +bool tlb_update_addr(vaddr_t, tlb_asid_t, pt_entry_t, bool) __stub; bool -tlb_update_addr(vaddr_t va, uint32_t asid, uint32_t pte, bool insert_p) +tlb_update_addr(vaddr_t va, tlb_asid_t asid, pt_entry_t pte, bool insert_p) { return (*cpu_md_ops.md_tlb_ops->md_tlb_update_addr)(va, asid, pte, insert_p); } @@ -109,12 +109,37 @@ (*cpu_md_ops.md_tlb_ops->md_tlb_read_entry)(pos, tlb); } -u_int tlb_record_asids(u_long *, uint32_t) __stub; +void tlb_write_entry(size_t, const struct tlbmask *) __stub; + +void +tlb_write_entry(size_t pos, const struct tlbmask *tlb) +{ + (*cpu_md_ops.md_tlb_ops->md_tlb_write_entry)(pos, tlb); +} + +u_int tlb_record_asids(u_long *) __stub; u_int -tlb_record_asids(u_long *bitmap, uint32_t start) +tlb_record_asids(u_long *bitmap) +{ + return (*cpu_md_ops.md_tlb_ops->md_tlb_record_asids)(bitmap); +} + +void tlb_dump(void (*)(const char *, ...)) __stub; + +void +tlb_dump(void (*pr)(const char *, ...)) { - return (*cpu_md_ops.md_tlb_ops->md_tlb_record_asids)(bitmap, start); + (*cpu_md_ops.md_tlb_ops->md_tlb_dump)(pr); +} + +void tlb_walk(void *, bool (*)(void *, vaddr_t, uint32_t, uint32_t)) + __stub; + +void +tlb_walk(void *ctx, bool (*func)(void *, vaddr_t, uint32_t, uint32_t)) +{ + (*cpu_md_ops.md_tlb_ops->md_tlb_walk)(ctx, func); } void *tlb_mapiodev(paddr_t, psize_t) __stub; @@ -122,7 +147,7 @@ void * tlb_mapiodev(paddr_t pa, psize_t len) { - return (*cpu_md_ops.md_tlb_ops->md_tlb_mapiodev)(pa, len); + return (*cpu_md_ops.md_tlb_io_ops->md_tlb_mapiodev)(pa, len); } void tlb_unmapiodev(vaddr_t, vsize_t) __stub; @@ -130,7 +155,7 @@ void tlb_unmapiodev(vaddr_t va, vsize_t len) { - (*cpu_md_ops.md_tlb_ops->md_tlb_unmapiodev)(va, len); + (*cpu_md_ops.md_tlb_io_ops->md_tlb_unmapiodev)(va, len); } int tlb_ioreserve(vaddr_t, vsize_t, uint32_t) __stub; @@ -138,7 +163,7 @@ int tlb_ioreserve(vaddr_t va, vsize_t len, uint32_t pte) { - return (*cpu_md_ops.md_tlb_ops->md_tlb_ioreserve)(va, len, pte); + return (*cpu_md_ops.md_tlb_io_ops->md_tlb_ioreserve)(va, len, pte); } int tlb_iorelease(vaddr_t) __stub; @@ -146,22 +171,5 @@ int tlb_iorelease(vaddr_t va) { - return (*cpu_md_ops.md_tlb_ops->md_tlb_iorelease)(va); -} - -void tlb_dump(void (*)(const char *, ...)) __stub; - -void -tlb_dump(void (*pr)(const char *, ...)) -{ - (*cpu_md_ops.md_tlb_ops->md_tlb_dump)(pr); -} - -void tlb_walk(void *, bool (*)(void *, vaddr_t, uint32_t, uint32_t)) - __stub; - -void -tlb_walk(void *ctx, bool (*func)(void *, vaddr_t, uint32_t, uint32_t)) -{ - (*cpu_md_ops.md_tlb_ops->md_tlb_walk)(ctx, func); + return (*cpu_md_ops.md_tlb_io_ops->md_tlb_iorelease)(va); } Index: src/sys/arch/powerpc/booke/e500_tlb.c diff -u src/sys/arch/powerpc/booke/e500_tlb.c:1.3 src/sys/arch/powerpc/booke/e500_tlb.c:1.4 --- src/sys/arch/powerpc/booke/e500_tlb.c:1.3 Sun Jun 5 16:52:24 2011 +++ src/sys/arch/powerpc/booke/e500_tlb.c Thu Jun 23 01:27:20 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: e500_tlb.c,v 1.3 2011/06/05 16:52:24 matt Exp $ */ +/* $NetBSD: e500_tlb.c,v 1.4 2011/06/23 01:27:20 matt Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: e500_tlb.c,v 1.3 2011/06/05 16:52:24 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: e500_tlb.c,v 1.4 2011/06/23 01:27:20 matt Exp $"); #include <sys/param.h> @@ -335,12 +335,20 @@ wrtee(msr); } -static void e500_tlb_set_asid(uint32_t asid) +static tlb_asid_t +e500_tlb_get_asid(void) +{ + return mfspr(SPR_PID0); +} + +static void +e500_tlb_set_asid(tlb_asid_t asid) { mtspr(SPR_PID0, asid); } -static void e500_tlb_invalidate_all(void) +static void +e500_tlb_invalidate_all(void) { /* * This does a flash invalidate of all entries in TLB0. @@ -405,7 +413,7 @@ } static void -e500_tlb_invalidate_asids(uint32_t asid_lo, uint32_t asid_hi) +e500_tlb_invalidate_asids(tlb_asid_t asid_lo, tlb_asid_t asid_hi) { const size_t tlbassoc = TLBCFG_ASSOC(mftlb0cfg()); const size_t tlbentries = TLBCFG_NENTRY(mftlb0cfg()); @@ -443,7 +451,7 @@ } static u_int -e500_tlb_record_asids(u_long *bitmap, uint32_t start_slot) +e500_tlb_record_asids(u_long *bitmap) { const size_t tlbassoc = TLBCFG_ASSOC(mftlb0cfg()); const size_t tlbentries = TLBCFG_NENTRY(mftlb0cfg()); @@ -480,7 +488,7 @@ } static void -e500_tlb_invalidate_addr(vaddr_t va, uint32_t asid) +e500_tlb_invalidate_addr(vaddr_t va, tlb_asid_t asid) { KASSERT((va & PAGE_MASK) == 0); /* @@ -492,7 +500,7 @@ } static bool -e500_tlb_update_addr(vaddr_t va, uint32_t asid, uint32_t pte, bool insert) +e500_tlb_update_addr(vaddr_t va, tlb_asid_t asid, pt_entry_t pte, bool insert) { struct e500_hwtlb hwtlb = tlb_to_hwtlb( (struct e500_tlb){ .tlb_va = va, .tlb_asid = asid, @@ -529,6 +537,11 @@ } static void +e500_tlb_write_entry(size_t index, const struct tlbmask *tlb) +{ +} + +static void e500_tlb_read_entry(size_t index, struct tlbmask *tlb) { } @@ -696,7 +709,7 @@ } static int -e500_tlb_ioreserve(vaddr_t va, vsize_t len, uint32_t pte) +e500_tlb_ioreserve(vaddr_t va, vsize_t len, pt_entry_t pte) { struct e500_tlb1 * const tlb1 = &e500_tlb1; struct e500_xtlb *xtlb; @@ -786,6 +799,7 @@ return nextslot; } static const struct tlb_md_ops e500_tlb_ops = { + .md_tlb_get_asid = e500_tlb_get_asid, .md_tlb_set_asid = e500_tlb_set_asid, .md_tlb_invalidate_all = e500_tlb_invalidate_all, .md_tlb_invalidate_globals = e500_tlb_invalidate_globals, @@ -793,13 +807,17 @@ .md_tlb_invalidate_addr = e500_tlb_invalidate_addr, .md_tlb_update_addr = e500_tlb_update_addr, .md_tlb_record_asids = e500_tlb_record_asids, + .md_tlb_write_entry = e500_tlb_write_entry, .md_tlb_read_entry = e500_tlb_read_entry, + .md_tlb_dump = e500_tlb_dump, + .md_tlb_walk = e500_tlb_walk, +}; + +static const struct tlb_md_io_ops e500_tlb_io_ops = { .md_tlb_mapiodev = e500_tlb_mapiodev, .md_tlb_unmapiodev = e500_tlb_unmapiodev, .md_tlb_ioreserve = e500_tlb_ioreserve, .md_tlb_iorelease = e500_tlb_iorelease, - .md_tlb_dump = e500_tlb_dump, - .md_tlb_walk = e500_tlb_walk, }; void @@ -882,6 +900,7 @@ } cpu_md_ops.md_tlb_ops = &e500_tlb_ops; + cpu_md_ops.md_tlb_io_ops = &e500_tlb_io_ops; if (__predict_false(memmapped < memsize)) { /* Index: src/sys/arch/powerpc/include/types.h diff -u src/sys/arch/powerpc/include/types.h:1.44 src/sys/arch/powerpc/include/types.h:1.45 --- src/sys/arch/powerpc/include/types.h:1.44 Tue Jun 14 03:12:43 2011 +++ src/sys/arch/powerpc/include/types.h Thu Jun 23 01:27:20 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: types.h,v 1.44 2011/06/14 03:12:43 matt Exp $ */ +/* $NetBSD: types.h,v 1.45 2011/06/23 01:27:20 matt Exp $ */ /*- * Copyright (C) 1995 Wolfgang Solfrank. @@ -64,6 +64,8 @@ typedef struct label_t { register_t val[40]; /* double check this XXX */ } label_t; + +typedef __uint32_t tlb_asid_t; /* for booke */ #endif typedef volatile int __cpu_simple_lock_t; Index: src/sys/arch/powerpc/include/booke/cpuvar.h diff -u src/sys/arch/powerpc/include/booke/cpuvar.h:1.9 src/sys/arch/powerpc/include/booke/cpuvar.h:1.10 --- src/sys/arch/powerpc/include/booke/cpuvar.h:1.9 Mon Jun 20 06:00:46 2011 +++ src/sys/arch/powerpc/include/booke/cpuvar.h Thu Jun 23 01:27:20 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: cpuvar.h,v 1.9 2011/06/20 06:00:46 matt Exp $ */ +/* $NetBSD: cpuvar.h,v 1.10 2011/06/23 01:27:20 matt Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -102,9 +102,14 @@ int ga_irq; }; -struct tlbmask; +#ifndef __BSD_PT_ENTRY_T +#define __BSD_PT_ENTRY_T __uint32_t +typedef __BSD_PT_ENTRY_T pt_entry_t; +#endif + +#include <common/pmap/tlb/tlb.h> -struct tlb_md_ops { +struct tlb_md_io_ops { /* * We need mapiodev to be first so we can easily override it in * early boot by doing cpu_md_ops.tlb_md_ops = (const struct @@ -112,20 +117,8 @@ */ void *(*md_tlb_mapiodev)(paddr_t, psize_t); void (*md_tlb_unmapiodev)(vaddr_t, vsize_t); - void (*md_tlb_set_asid)(uint32_t); - uint32_t (*md_tlb_get_asid)(void); - void (*md_tlb_invalidate_all)(void); - void (*md_tlb_invalidate_globals)(void); - void (*md_tlb_invalidate_asids)(uint32_t, uint32_t); - void (*md_tlb_invalidate_addr)(vaddr_t, uint32_t); - bool (*md_tlb_update_addr)(vaddr_t, uint32_t, uint32_t, bool); - void (*md_tlb_read_entry)(size_t, struct tlbmask *); - u_int (*md_tlb_record_asids)(u_long *, uint32_t); int (*md_tlb_ioreserve)(vaddr_t, vsize_t, uint32_t); int (*md_tlb_iorelease)(vaddr_t); - void (*md_tlb_dump)(void (*)(const char *, ...)); - void (*md_tlb_walk)(void *, bool (*)(void *, vaddr_t, uint32_t, - uint32_t)); }; struct cpu_md_ops { @@ -138,6 +131,7 @@ void (*md_cpunode_attach)(device_t, device_t, void *); const struct tlb_md_ops *md_tlb_ops; + const struct tlb_md_io_ops *md_tlb_io_ops; }; @@ -178,22 +172,10 @@ struct intrsw; void exception_init(const struct intrsw *); -uint32_t tlb_get_asid(void); -void tlb_set_asid(uint32_t); -void tlb_invalidate_all(void); -void tlb_invalidate_globals(void); -void tlb_invalidate_asids(uint32_t, uint32_t); -void tlb_invalidate_addr(vaddr_t, uint32_t); -bool tlb_update_addr(vaddr_t, uint32_t, uint32_t, bool); -u_int tlb_record_asids(u_long *, uint32_t); -void tlb_enter_addr(size_t, const struct tlbmask *); -void tlb_read_entry(size_t, struct tlbmask *); void *tlb_mapiodev(paddr_t, psize_t); void tlb_unmapiodev(vaddr_t, vsize_t); -int tlb_ioreserve(vaddr_t, vsize_t, uint32_t); +int tlb_ioreserve(vaddr_t, vsize_t, pt_entry_t); int tlb_iorelease(vaddr_t); -void tlb_dump(void (*)(const char *, ...)); -void tlb_walk(void *, bool (*)(void *, vaddr_t, uint32_t, uint32_t)); extern struct cpu_md_ops cpu_md_ops; Index: src/sys/arch/powerpc/include/booke/pte.h diff -u src/sys/arch/powerpc/include/booke/pte.h:1.3 src/sys/arch/powerpc/include/booke/pte.h:1.4 --- src/sys/arch/powerpc/include/booke/pte.h:1.3 Mon Jun 20 20:24:28 2011 +++ src/sys/arch/powerpc/include/booke/pte.h Thu Jun 23 01:27:20 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pte.h,v 1.3 2011/06/20 20:24:28 matt Exp $ */ +/* $NetBSD: pte.h,v 1.4 2011/06/23 01:27:20 matt Exp $ */ /*- * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc. * All rights reserved. @@ -38,7 +38,10 @@ #define _POWERPC_BOOKE_PTE_H_ #ifndef _LOCORE -typedef __uint32_t pt_entry_t; +#ifndef __BSD_PT_ENTRY_T +#define __BSD_PT_ENTRY_T __uint32_t +typedef __BSD_PT_ENTRY_T pt_entry_t; +#endif #endif #include <powerpc/booke/spr.h> Index: src/sys/common/pmap/tlb/pmap_tlb.c diff -u src/sys/common/pmap/tlb/pmap_tlb.c:1.4 src/sys/common/pmap/tlb/pmap_tlb.c:1.5 --- src/sys/common/pmap/tlb/pmap_tlb.c:1.4 Sun Jun 5 16:52:27 2011 +++ src/sys/common/pmap/tlb/pmap_tlb.c Thu Jun 23 01:27:21 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_tlb.c,v 1.4 2011/06/05 16:52:27 matt Exp $ */ +/* $NetBSD: pmap_tlb.c,v 1.5 2011/06/23 01:27:21 matt Exp $ */ /*- * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.4 2011/06/05 16:52:27 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_tlb.c,v 1.5 2011/06/23 01:27:21 matt Exp $"); /* * Manages address spaces in a TLB. @@ -335,8 +335,7 @@ * and clear the ASID bitmap. That will force everyone to * allocate a new ASID. */ - const u_int asids_found = tlb_record_asids(ti->ti_asid_bitmap, - ti->ti_asid_mask); + const u_int asids_found = tlb_record_asids(ti->ti_asid_bitmap); KASSERT(asids_found == pmap_tlb_asid_count(ti)); if (__predict_false(asids_found >= ti->ti_asid_max / 2)) { tlb_invalidate_asids(KERNEL_PID + 1, ti->ti_asid_mask);