Merge commit 'kumar/next' into next

This commit is contained in:
Benjamin Herrenschmidt
2009-02-11 13:37:44 +11:00
förälder 1db8508cf4 a0e8618c71
incheckning edbc29d76d
36 ändrade filer med 3172 tillägg och 150 borttagningar

Visa fil

@@ -56,10 +56,14 @@
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 {
@@ -152,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) {
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(1, PAGE_OFFSET+cam0, memstart_addr+cam0, cam1, _PAGE_KERNEL, 0);
}
if (cam2) {
tlbcam_index++;
settlbcam(2, PAGE_OFFSET+cam0+cam1, memstart_addr+cam0+cam1, cam2, _PAGE_KERNEL, 0);
}
return virt - PAGE_OFFSET;
}
/*
@@ -175,51 +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;
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;
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';
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;
}