@@ -282,9 +282,61 @@ void radix__flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
282
282
}
283
283
EXPORT_SYMBOL (radix__flush_tlb_range );
284
284
285
+ static int radix_get_mmu_psize (int page_size )
286
+ {
287
+ int psize ;
288
+
289
+ if (page_size == (1UL << mmu_psize_defs [mmu_virtual_psize ].shift ))
290
+ psize = mmu_virtual_psize ;
291
+ else if (page_size == (1UL << mmu_psize_defs [MMU_PAGE_2M ].shift ))
292
+ psize = MMU_PAGE_2M ;
293
+ else if (page_size == (1UL << mmu_psize_defs [MMU_PAGE_1G ].shift ))
294
+ psize = MMU_PAGE_1G ;
295
+ else
296
+ return -1 ;
297
+ return psize ;
298
+ }
285
299
286
300
void radix__tlb_flush (struct mmu_gather * tlb )
287
301
{
288
302
struct mm_struct * mm = tlb -> mm ;
289
303
radix__flush_tlb_mm (mm );
290
304
}
305
+
306
+ void radix__flush_tlb_lpid_va (unsigned long lpid , unsigned long gpa ,
307
+ unsigned long page_size )
308
+ {
309
+ unsigned long rb ,rs ,prs ,r ;
310
+ unsigned long ap ;
311
+ unsigned long ric = RIC_FLUSH_TLB ;
312
+
313
+ ap = mmu_get_ap (radix_get_mmu_psize (page_size ));
314
+ rb = gpa & ~(PPC_BITMASK (52 , 63 ));
315
+ rb |= ap << PPC_BITLSHIFT (58 );
316
+ rs = lpid & ((1UL << 32 ) - 1 );
317
+ prs = 0 ; /* process scoped */
318
+ r = 1 ; /* raidx format */
319
+
320
+ asm volatile ("ptesync" : : :"memory" );
321
+ asm volatile (PPC_TLBIE_5 (%0 , %4 , %3 , %2 , %1 )
322
+ : : "r" (rb ), "i" (r ), "i" (prs ), "i" (ric ), "r" (rs ) : "memory ");
323
+ asm volatile ("eieio; tlbsync; ptesync" : : :"memory" );
324
+ }
325
+ EXPORT_SYMBOL (radix__flush_tlb_lpid_va );
326
+
327
+ void radix__flush_tlb_lpid (unsigned long lpid )
328
+ {
329
+ unsigned long rb ,rs ,prs ,r ;
330
+ unsigned long ric = RIC_FLUSH_ALL ;
331
+
332
+ rb = 0x2 << PPC_BITLSHIFT (53 ); /* IS = 2 */
333
+ rs = lpid & ((1UL << 32 ) - 1 );
334
+ prs = 0 ; /* partition scoped */
335
+ r = 1 ; /* raidx format */
336
+
337
+ asm volatile ("ptesync" : : :"memory" );
338
+ asm volatile (PPC_TLBIE_5 (%0 , %4 , %3 , %2 , %1 )
339
+ : : "r" (rb ), "i" (r ), "i" (prs ), "i" (ric ), "r" (rs ) : "memory ");
340
+ asm volatile ("eieio; tlbsync; ptesync" : : :"memory" );
341
+ }
342
+ EXPORT_SYMBOL (radix__flush_tlb_lpid );
0 commit comments