loadcam_entry(index);
  }
  
 -void invalidate_tlbcam_entry(int index)
 -{
 -      TLBCAM[index].MAS0 = MAS0_TLBSEL(1) | MAS0_ESEL(index);
 -      TLBCAM[index].MAS1 = ~MAS1_VALID;
 -
 -      loadcam_entry(index);
 -}
 -
 -unsigned long __init mmu_mapin_ram(unsigned long top)
 +unsigned long map_mem_in_cams(unsigned long ram, int max_cam_idx)
  {
 +      int i;
        unsigned long virt = PAGE_OFFSET;
        phys_addr_t phys = memstart_addr;
 +      unsigned long amount_mapped = 0;
 +      unsigned long max_cam = (mfspr(SPRN_TLB1CFG) >> 16) & 0xf;
 +
 +      /* Convert (4^max) kB to (2^max) bytes */
 +      max_cam = max_cam * 2 + 10;
  
 -      while (tlbcam_index < ARRAY_SIZE(cam) && cam[tlbcam_index]) {
 -              settlbcam(tlbcam_index, virt, phys, cam[tlbcam_index], PAGE_KERNEL_X, 0);
 -              virt += cam[tlbcam_index];
 -              phys += cam[tlbcam_index];
 -              tlbcam_index++;
 +      /* Calculate CAM values */
 +      for (i = 0; ram && i < max_cam_idx; i++) {
 +              unsigned int camsize = __ilog2(ram) & ~1U;
 +              unsigned int align = __ffs(virt | phys) & ~1U;
 +              unsigned long cam_sz;
 +
 +              if (camsize > align)
 +                      camsize = align;
 +              if (camsize > max_cam)
 +                      camsize = max_cam;
 +
 +              cam_sz = 1UL << camsize;
 +              settlbcam(i, virt, phys, cam_sz, PAGE_KERNEL_X, 0);
 +
 +              ram -= cam_sz;
 +              amount_mapped += cam_sz;
 +              virt += cam_sz;
 +              phys += cam_sz;
        }
 +      tlbcam_index = i;
 +
 +      return amount_mapped;
 +}
  
- unsigned long __init mmu_mapin_ram(void)
 -      return virt - PAGE_OFFSET;
++unsigned long __init mmu_mapin_ram(unsigned long top)
 +{
 +      return tlbcam_addrs[tlbcam_index - 1].limit - PAGE_OFFSET + 1;
  }
  
  /*
 
  extern int map_page(unsigned long va, phys_addr_t pa, int flags);
  extern void setbat(int index, unsigned long virt, phys_addr_t phys,
                   unsigned int size, int flags);
 -extern void settlbcam(int index, unsigned long virt, phys_addr_t phys,
 -                    unsigned int size, int flags, unsigned int pid);
 -extern void invalidate_tlbcam_entry(int index);
  
  extern int __map_without_bats;
+ extern int __allow_ioremap_reserved;
  extern unsigned long ioremap_base;
  extern unsigned int rtas_data, rtas_size;