]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge commit 'kumar/next' into next
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 11 Feb 2009 02:37:44 +0000 (13:37 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Wed, 11 Feb 2009 02:37:44 +0000 (13:37 +1100)
1  2 
arch/powerpc/mm/fsl_booke_mmu.c
include/linux/pci_ids.h

index ea6e41e39d9fc60ff38c2cb911952f9f013d3ef3,0b9ba6be49d9155ed8c7c1864efa16ba42393a24..3d8cf01582f5615ac26e0fd92564e18cf96ca477
  
  extern void loadcam_entry(unsigned int index);
  unsigned int tlbcam_index;
- static unsigned long __cam0, __cam1, __cam2;
+ static unsigned long cam[CONFIG_LOWMEM_CAM_NUM];
  
  #define NUM_TLBCAMS   (16)
  
+ #if defined(CONFIG_LOWMEM_CAM_NUM_BOOL) && (CONFIG_LOWMEM_CAM_NUM >= NUM_TLBCAMS)
+ #error "LOWMEM_CAM_NUM must be less than NUM_TLBCAMS"
+ #endif
  struct tlbcam TLBCAM[NUM_TLBCAMS];
  
  struct tlbcamrange {
@@@ -73,7 -77,7 +77,7 @@@ extern unsigned int tlbcam_index
  /*
   * Return PA for this VA if it is mapped by a CAM, or 0
   */
 -unsigned long v_mapped_by_tlbcam(unsigned long va)
 +phys_addr_t v_mapped_by_tlbcam(unsigned long va)
  {
        int b;
        for (b = 0; b < tlbcam_index; ++b)
@@@ -85,7 -89,7 +89,7 @@@
  /*
   * Return VA for a given PA or 0 if not mapped
   */
 -unsigned long p_mapped_by_tlbcam(unsigned long pa)
 +unsigned long p_mapped_by_tlbcam(phys_addr_t pa)
  {
        int b;
        for (b = 0; b < tlbcam_index; ++b)
@@@ -152,19 -156,19 +156,19 @@@ void invalidate_tlbcam_entry(int index
        loadcam_entry(index);
  }
  
- void __init cam_mapin_ram(unsigned long cam0, unsigned long cam1,
-               unsigned long cam2)
+ unsigned long __init mmu_mapin_ram(void)
  {
-       settlbcam(0, PAGE_OFFSET, memstart_addr, cam0, _PAGE_KERNEL, 0);
-       tlbcam_index++;
-       if (cam1) {
-               tlbcam_index++;
-               settlbcam(1, PAGE_OFFSET+cam0, memstart_addr+cam0, cam1, _PAGE_KERNEL, 0);
-       }
-       if (cam2) {
+       unsigned long virt = PAGE_OFFSET;
+       phys_addr_t phys = memstart_addr;
+       while (cam[tlbcam_index] && tlbcam_index < ARRAY_SIZE(cam)) {
+               settlbcam(tlbcam_index, virt, phys, cam[tlbcam_index], _PAGE_KERNEL, 0);
+               virt += cam[tlbcam_index];
+               phys += cam[tlbcam_index];
                tlbcam_index++;
-               settlbcam(2, PAGE_OFFSET+cam0+cam1, memstart_addr+cam0+cam1, cam2, _PAGE_KERNEL, 0);
        }
+       return virt - PAGE_OFFSET;
  }
  
  /*
@@@ -175,51 -179,46 +179,46 @@@ void __init MMU_init_hw(void
        flush_instruction_cache();
  }
  
- unsigned long __init mmu_mapin_ram(void)
- {
-       cam_mapin_ram(__cam0, __cam1, __cam2);
-       return __cam0 + __cam1 + __cam2;
- }
  void __init
  adjust_total_lowmem(void)
  {
-       phys_addr_t max_lowmem_size = __max_low_memory;
-       phys_addr_t cam_max_size = 0x10000000;
        phys_addr_t ram;
+       unsigned int max_cam = (mfspr(SPRN_TLB1CFG) >> 16) & 0xff;
+       char buf[ARRAY_SIZE(cam) * 5 + 1], *p = buf;
+       int i;
+       unsigned long virt = PAGE_OFFSET & 0xffffffffUL;
+       unsigned long phys = memstart_addr & 0xffffffffUL;
  
-       /* adjust CAM size to max_lowmem_size */
-       if (max_lowmem_size < cam_max_size)
-               cam_max_size = max_lowmem_size;
+       /* Convert (4^max) kB to (2^max) bytes */
+       max_cam = max_cam * 2 + 10;
  
-       /* adjust lowmem size to max_lowmem_size */
-       ram = min(max_lowmem_size, total_lowmem);
+       /* adjust lowmem size to __max_low_memory */
+       ram = min((phys_addr_t)__max_low_memory, (phys_addr_t)total_lowmem);
  
        /* Calculate CAM values */
-       __cam0 = 1UL << 2 * (__ilog2(ram) / 2);
-       if (__cam0 > cam_max_size)
-               __cam0 = cam_max_size;
-       ram -= __cam0;
-       if (ram) {
-               __cam1 = 1UL << 2 * (__ilog2(ram) / 2);
-               if (__cam1 > cam_max_size)
-                       __cam1 = cam_max_size;
-               ram -= __cam1;
-       }
-       if (ram) {
-               __cam2 = 1UL << 2 * (__ilog2(ram) / 2);
-               if (__cam2 > cam_max_size)
-                       __cam2 = cam_max_size;
-               ram -= __cam2;
+       __max_low_memory = 0;
+       for (i = 0; ram && i < ARRAY_SIZE(cam); i++) {
+               unsigned int camsize = __ilog2(ram) & ~1U;
+               unsigned int align = __ffs(virt | phys) & ~1U;
+               if (camsize > align)
+                       camsize = align;
+               if (camsize > max_cam)
+                       camsize = max_cam;
+               cam[i] = 1UL << camsize;
+               ram -= cam[i];
+               __max_low_memory += cam[i];
+               virt += cam[i];
+               phys += cam[i];
+               p += sprintf(p, "%lu/", cam[i] >> 20);
        }
+       for (; i < ARRAY_SIZE(cam); i++)
+               p += sprintf(p, "0/");
+       p[-1] = '\0';
  
-       printk(KERN_INFO "Memory CAM mapping: CAM0=%ldMb, CAM1=%ldMb,"
-                       " CAM2=%ldMb residual: %ldMb\n",
-                       __cam0 >> 20, __cam1 >> 20, __cam2 >> 20,
-                       (long int)((total_lowmem - __cam0 - __cam1 - __cam2)
-                                  >> 20));
-       __max_low_memory = __cam0 + __cam1 + __cam2;
+       pr_info("Memory CAM mapping: %s Mb, residual: %ldMb\n", buf,
+               (total_lowmem - __max_low_memory) >> 20);
        __initial_memory_limit_addr = memstart_addr + __max_low_memory;
  }
diff --combined include/linux/pci_ids.h
index 52a9fe08451cfa105c733099350355a8b89dc028,ff9b7be2b7910e13082a30bcfb10c4cce3ad3ca7..b20ab9d642dc0a932a73f33498985a28cc85c1e9
  #define PCI_DEVICE_ID_TDI_EHCI          0x0101
  
  #define PCI_VENDOR_ID_FREESCALE               0x1957
+ #define PCI_DEVICE_ID_MPC8315E                0x00b4
+ #define PCI_DEVICE_ID_MPC8315         0x00b5
+ #define PCI_DEVICE_ID_MPC8314E                0x00b6
+ #define PCI_DEVICE_ID_MPC8314         0x00b7
+ #define PCI_DEVICE_ID_MPC8378E                0x00c4
+ #define PCI_DEVICE_ID_MPC8378         0x00c5
+ #define PCI_DEVICE_ID_MPC8377E                0x00c6
+ #define PCI_DEVICE_ID_MPC8377         0x00c7
  #define PCI_DEVICE_ID_MPC8548E                0x0012
  #define PCI_DEVICE_ID_MPC8548         0x0013
  #define PCI_DEVICE_ID_MPC8543E                0x0014
  #define PCI_DEVICE_ID_INTEL_ICH7_0    0x27b8
  #define PCI_DEVICE_ID_INTEL_ICH7_1    0x27b9
  #define PCI_DEVICE_ID_INTEL_ICH7_30   0x27b0
 +#define PCI_DEVICE_ID_INTEL_TGP_LPC   0x27bc
  #define PCI_DEVICE_ID_INTEL_ICH7_31   0x27bd
  #define PCI_DEVICE_ID_INTEL_ICH7_17   0x27da
  #define PCI_DEVICE_ID_INTEL_ICH7_19   0x27dd