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);