]> Pileus Git - ~andy/linux/blobdiff - arch/powerpc/mm/tlb_nohash.c
[media] vpx3220: fix querystd
[~andy/linux] / arch / powerpc / mm / tlb_nohash.c
index df32a838dcfa7609d66614b2215814f9c1f4be2f..6888cad5103dedfe78755f2267fda7cf0cf664ab 100644 (file)
@@ -414,9 +414,9 @@ static void setup_page_sizes(void)
 
 #ifdef CONFIG_PPC_FSL_BOOK3E
        unsigned int mmucfg = mfspr(SPRN_MMUCFG);
+       int fsl_mmu = mmu_has_feature(MMU_FTR_TYPE_FSL_E);
 
-       if (((mmucfg & MMUCFG_MAVN) == MMUCFG_MAVN_V1) &&
-               (mmu_has_feature(MMU_FTR_TYPE_FSL_E))) {
+       if (fsl_mmu && (mmucfg & MMUCFG_MAVN) == MMUCFG_MAVN_V1) {
                unsigned int tlb1cfg = mfspr(SPRN_TLB1CFG);
                unsigned int min_pg, max_pg;
 
@@ -442,6 +442,20 @@ static void setup_page_sizes(void)
 
                goto no_indirect;
        }
+
+       if (fsl_mmu && (mmucfg & MMUCFG_MAVN) == MMUCFG_MAVN_V2) {
+               u32 tlb1ps = mfspr(SPRN_TLB1PS);
+
+               for (psize = 0; psize < MMU_PAGE_COUNT; ++psize) {
+                       struct mmu_psize_def *def = &mmu_psize_defs[psize];
+
+                       if (tlb1ps & (1U << (def->shift - 10))) {
+                               def->flags |= MMU_PAGE_SIZE_DIRECT;
+                       }
+               }
+
+               goto no_indirect;
+       }
 #endif
 
        tlb0cfg = mfspr(SPRN_TLB0CFG);