return ;
 }
 
+static void tlbsx (const volatile unsigned *addr)
+{
+       __asm__ __volatile__ ("tlbsx 0,%0" : : "r" (addr), "m" (*addr));
+}
+
+/* return -1 if we didn't find anything */
+int find_tlb_idx(void *addr, u8 tlbsel)
+{
+       u32 _mas0, _mas1;
+
+       /* zero out Search PID, AS */
+       mtspr(MAS6, 0);
+
+       tlbsx(addr);
+
+       _mas0 = mfspr(MAS0);
+       _mas1 = mfspr(MAS1);
+
+       /* we found something, and its in the TLB we expect */
+       if ((MAS1_VALID & _mas1) &&
+               (MAS0_TLBSEL(tlbsel) == (_mas0 & MAS0_TLBSEL_MSK))) {
+               return ((_mas0 & MAS0_ESEL_MSK) >> 16);
+       }
+
+       return -1;
+}
+
 #ifdef CONFIG_ADDR_MAP
 void init_addr_map(void)
 {
 
  * FSL Book-E support
  */
 
-#define MAS0_TLBSEL(x) ((x << 28) & 0x30000000)
-#define MAS0_ESEL(x)   ((x << 16) & 0x0FFF0000)
+#define MAS0_TLBSEL_MSK        0x30000000
+#define MAS0_TLBSEL(x) ((x << 28) & MAS0_TLBSEL_MSK)
+#define MAS0_ESEL_MSK  0x0FFF0000
+#define MAS0_ESEL(x)   ((x << 16) & MAS0_ESEL_MSK)
 #define MAS0_NV(x)     ((x) & 0x00000FFF)
 
 #define MAS1_VALID     0x80000000
 extern void disable_tlb(u8 esel);
 extern void invalidate_tlb(u8 tlb);
 extern void init_tlbs(void);
+extern int find_tlb_idx(void *addr, u8 tlbsel);
 
 extern unsigned int setup_ddr_tlbs(unsigned int memsize_in_meg);