Date: Thu, 19 Mar 2009 14:15:11 +0000 (UTC) From: Marius Strobl <marius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r190055 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/cxgb sparc64/include sparc64/sparc64 Message-ID: <200903191415.n2JEFBfU064531@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marius Date: Thu Mar 19 14:15:11 2009 New Revision: 190055 URL: http://svn.freebsd.org/changeset/base/190055 Log: MFC: r182878 For cheetah-class CPUs ensure that the dt512_0 is set to hold 8k pages for all three contexts and configure the dt512_1 to hold 4MB pages for them (e.g. for direct mappings). This might allow for additional optimization by using the faulting page sizes provided by AA_DMMU_TAG_ACCESS_EXT for bypassing the page size walker for the dt512 in the superpage support code. Submitted by: nwhitehorn (initial patch) Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/cxgb/ (props changed) stable/7/sys/sparc64/include/asi.h stable/7/sys/sparc64/include/tlb.h stable/7/sys/sparc64/sparc64/cheetah.c stable/7/sys/sparc64/sparc64/genassym.c stable/7/sys/sparc64/sparc64/pmap.c stable/7/sys/sparc64/sparc64/swtch.S Modified: stable/7/sys/sparc64/include/asi.h ============================================================================== --- stable/7/sys/sparc64/include/asi.h Thu Mar 19 14:14:21 2009 (r190054) +++ stable/7/sys/sparc64/include/asi.h Thu Mar 19 14:15:11 2009 (r190055) @@ -140,6 +140,7 @@ #define AA_DMMU_TSB_PEXT_REG 0x48 #define AA_DMMU_TSB_SEXT_REG 0x50 #define AA_DMMU_TSB_NEXT_REG 0x58 +#define AA_DMMU_TAG_ACCESS_EXT 0x60 /* US-III family */ #define ASI_DMMU_TSB_8KB_PTR_REG 0x59 #define ASI_DMMU_TSB_64KB_PTR_REG 0x5a Modified: stable/7/sys/sparc64/include/tlb.h ============================================================================== --- stable/7/sys/sparc64/include/tlb.h Thu Mar 19 14:14:21 2009 (r190054) +++ stable/7/sys/sparc64/include/tlb.h Thu Mar 19 14:15:11 2009 (r190055) @@ -51,6 +51,34 @@ #define TLB_TAR_VA(va) ((va) & ~TAR_CTX_MASK) #define TLB_TAR_CTX(ctx) ((ctx) & TAR_CTX_MASK) +#define TLB_CXR_CTX_BITS (13) +#define TLB_CXR_CTX_MASK \ + (((1UL << TLB_CXR_CTX_BITS) - 1) << TLB_CXR_CTX_SHIFT) +#define TLB_CXR_CTX_SHIFT (0) +#define TLB_CXR_PGSZ_BITS (3) +#define TLB_PCXR_PGSZ_MASK \ + ((((1UL << TLB_CXR_PGSZ_BITS) - 1) << TLB_PCXR_N_PGSZ0_SHIFT) | \ + (((1UL << TLB_CXR_PGSZ_BITS) - 1) << TLB_PCXR_N_PGSZ1_SHIFT) | \ + (((1UL << TLB_CXR_PGSZ_BITS) - 1) << TLB_PCXR_P_PGSZ0_SHIFT) | \ + (((1UL << TLB_CXR_PGSZ_BITS) - 1) << TLB_PCXR_P_PGSZ1_SHIFT)) +#define TLB_PCXR_N_PGSZ0_SHIFT (61) +#define TLB_PCXR_N_PGSZ1_SHIFT (58) +#define TLB_PCXR_P_PGSZ0_SHIFT (16) +#define TLB_PCXR_P_PGSZ1_SHIFT (19) +#define TLB_SCXR_PGSZ_MASK \ + ((((1UL << TLB_CXR_PGSZ_BITS) - 1) << TLB_SCXR_S_PGSZ0_SHIFT) | \ + (((1UL << TLB_CXR_PGSZ_BITS) - 1) << TLB_SCXR_S_PGSZ1_SHIFT)) +#define TLB_SCXR_S_PGSZ1_SHIFT (19) +#define TLB_SCXR_S_PGSZ0_SHIFT (16) + +#define TLB_TAE_PGSZ_BITS (3) +#define TLB_TAE_PGSZ0_MASK \ + (((1UL << TLB_TAE_PGSZ_BITS) - 1) << TLB_TAE_PGSZ0_SHIFT) +#define TLB_TAE_PGSZ1_MASK \ + (((1UL << TLB_TAE_PGSZ_BITS) - 1) << TLB_TAE_PGSZ1_SHIFT) +#define TLB_TAE_PGSZ0_SHIFT (16) +#define TLB_TAE_PGSZ1_SHIFT (19) + #define TLB_DEMAP_ID_SHIFT (4) #define TLB_DEMAP_ID_PRIMARY (0) #define TLB_DEMAP_ID_SECONDARY (1) @@ -59,8 +87,7 @@ #define TLB_DEMAP_TYPE_SHIFT (6) #define TLB_DEMAP_TYPE_PAGE (0) #define TLB_DEMAP_TYPE_CONTEXT (1) -/* US-III and greater only */ -#define TLB_DEMAP_TYPE_ALL (2) +#define TLB_DEMAP_TYPE_ALL (2) /* USIII and beyond only */ #define TLB_DEMAP_VA(va) ((va) & ~PAGE_MASK) #define TLB_DEMAP_ID(id) ((id) << TLB_DEMAP_ID_SHIFT) Modified: stable/7/sys/sparc64/sparc64/cheetah.c ============================================================================== --- stable/7/sys/sparc64/sparc64/cheetah.c Thu Mar 19 14:14:21 2009 (r190054) +++ stable/7/sys/sparc64/sparc64/cheetah.c Thu Mar 19 14:15:11 2009 (r190055) @@ -92,6 +92,26 @@ cheetah_init(void) stxa(AA_IMMU_TSB_NEXT_REG, ASI_IMMU, 0); membar(Sync); + /* + * Ensure that the dt512_0 is set to hold 8k pages for all three + * contexts and configure the dt512_1 to hold 4MB pages for them + * (e.g. for direct mappings). + * NB: according to documentation, this requires a contex demap + * _before_ changing the corresponding page size, but we hardly + * can flush our locked pages here, so we use a demap all instead. + */ + stxa(TLB_DEMAP_ALL, ASI_DMMU_DEMAP, 0); + membar(Sync); + stxa(AA_DMMU_PCXR, ASI_DMMU, + (TS_8K << TLB_PCXR_N_PGSZ0_SHIFT) | + (TS_4M << TLB_PCXR_N_PGSZ1_SHIFT) | + (TS_8K << TLB_PCXR_P_PGSZ0_SHIFT) | + (TS_4M << TLB_PCXR_P_PGSZ1_SHIFT)); + stxa(AA_DMMU_SCXR, ASI_DMMU, + (TS_8K << TLB_SCXR_S_PGSZ0_SHIFT) | + (TS_4M << TLB_SCXR_S_PGSZ1_SHIFT)); + flush(KERNBASE); + intr_restore(s); } Modified: stable/7/sys/sparc64/sparc64/genassym.c ============================================================================== --- stable/7/sys/sparc64/sparc64/genassym.c Thu Mar 19 14:14:21 2009 (r190054) +++ stable/7/sys/sparc64/sparc64/genassym.c Thu Mar 19 14:15:11 2009 (r190055) @@ -132,6 +132,7 @@ ASSYM(TD_W, TD_W); ASSYM(TS_MIN, TS_MIN); ASSYM(TS_MAX, TS_MAX); +ASSYM(TLB_PCXR_PGSZ_MASK, TLB_PCXR_PGSZ_MASK); ASSYM(TLB_DIRECT_TO_TTE_MASK, TLB_DIRECT_TO_TTE_MASK); ASSYM(TV_SIZE_BITS, TV_SIZE_BITS); #endif Modified: stable/7/sys/sparc64/sparc64/pmap.c ============================================================================== --- stable/7/sys/sparc64/sparc64/pmap.c Thu Mar 19 14:14:21 2009 (r190054) +++ stable/7/sys/sparc64/sparc64/pmap.c Thu Mar 19 14:15:11 2009 (r190055) @@ -545,7 +545,6 @@ pmap_map_tsb(void) pa = tsb_kernel_phys + i; data = TD_V | TD_4M | TD_PA(pa) | TD_L | TD_CP | TD_CV | TD_P | TD_W; - /* XXX - cheetah */ stxa(AA_DMMU_TAR, ASI_DMMU, TLB_TAR_VA(va) | TLB_TAR_CTX(TLB_CTX_KERNEL)); stxa_sync(0, ASI_DTLB_DATA_IN_REG, data); @@ -555,7 +554,8 @@ pmap_map_tsb(void) * Set the secondary context to be the kernel context (needed for * FP block operations in the kernel). */ - stxa(AA_DMMU_SCXR, ASI_DMMU, TLB_CTX_KERNEL); + stxa(AA_DMMU_SCXR, ASI_DMMU, (ldxa(AA_DMMU_SCXR, ASI_DMMU) & + TLB_SCXR_PGSZ_MASK) | TLB_CTX_KERNEL); flush(KERNBASE); intr_restore(s); @@ -1960,7 +1960,8 @@ pmap_activate(struct thread *td) stxa(AA_DMMU_TSB, ASI_DMMU, pm->pm_tsb); stxa(AA_IMMU_TSB, ASI_IMMU, pm->pm_tsb); - stxa(AA_DMMU_PCXR, ASI_DMMU, context); + stxa(AA_DMMU_PCXR, ASI_DMMU, (ldxa(AA_DMMU_PCXR, ASI_DMMU) & + TLB_PCXR_PGSZ_MASK) | context); flush(KERNBASE); mtx_unlock_spin(&sched_lock); Modified: stable/7/sys/sparc64/sparc64/swtch.S ============================================================================== --- stable/7/sys/sparc64/sparc64/swtch.S Thu Mar 19 14:14:21 2009 (r190054) +++ stable/7/sys/sparc64/sparc64/swtch.S Thu Mar 19 14:15:11 2009 (r190055) @@ -236,7 +236,11 @@ ENTRY(cpu_switch) stxa %i4, [%i5] ASI_DMMU mov AA_IMMU_TSB, %i5 stxa %i4, [%i5] ASI_IMMU + setx TLB_PCXR_PGSZ_MASK, %i5, %i4 mov AA_DMMU_PCXR, %i5 + ldxa [%i5] ASI_DMMU, %i2 + and %i2, %i4, %i2 + or %i3, %i2, %i3 sethi %hi(KERNBASE), %i4 stxa %i3, [%i5] ASI_DMMU flush %i4
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903191415.n2JEFBfU064531>