Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 91557
b: refs/heads/master
c: 0aef996
h: refs/heads/master
i:
  91555: 9b98552
v: v3
  • Loading branch information
Kumar Gala authored and Paul Mackerras committed Apr 16, 2008
1 parent 9910e33 commit 59aea00
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d7917ba7051e3fd12ebe2d5a09b29fb3a2b38190
refs/heads/master: 0aef996b37d08757562ecf0bb0c1f6998e634c8b
34 changes: 27 additions & 7 deletions trunk/arch/powerpc/kernel/head_fsl_booke.S
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,9 @@ _ENTRY(_start);
mr r29,r5
mr r28,r6
mr r27,r7
li r25,0 /* phys kernel start (low) */
li r24,0 /* CPU number */
li r23,0 /* phys kernel start (high) */

/* We try to not make any assumptions about how the boot loader
* setup or used the TLBs. We invalidate all mappings from the
Expand Down Expand Up @@ -167,7 +169,28 @@ skpinv: addi r6,r6,1 /* Increment */
mtspr SPRN_MAS0,r7
tlbre

/* Just modify the entry ID, EPN and RPN for the temp mapping */
/* grab and fixup the RPN */
mfspr r6,SPRN_MAS1 /* extract MAS1[SIZE] */
rlwinm r6,r6,25,27,30
li r8,-1
addi r6,r6,10
slw r6,r8,r6 /* convert to mask */

bl 1f /* Find our address */
1: mflr r7

mfspr r8,SPRN_MAS3
#ifdef CONFIG_PHYS_64BIT
mfspr r23,SPRN_MAS7
#endif
and r8,r6,r8
subfic r9,r6,-4096
and r9,r9,r7

or r25,r8,r9
ori r8,r25,(MAS3_SX|MAS3_SW|MAS3_SR)

/* Just modify the entry ID and EPN for the temp mapping */
lis r7,0x1000 /* Set MAS0(TLBSEL) = 1 */
rlwimi r7,r5,16,4,15 /* Setup MAS0 = TLBSEL | ESEL(r5) */
mtspr SPRN_MAS0,r7
Expand All @@ -177,12 +200,10 @@ skpinv: addi r6,r6,1 /* Increment */
ori r6,r6,(MAS1_TSIZE(BOOKE_PAGESZ_4K))@l
mtspr SPRN_MAS1,r6
mfspr r6,SPRN_MAS2
lis r7,PHYSICAL_START@h
li r7,0 /* temp EPN = 0 */
rlwimi r7,r6,0,20,31
mtspr SPRN_MAS2,r7
mfspr r6,SPRN_MAS3
rlwimi r7,r6,0,20,31
mtspr SPRN_MAS3,r7
mtspr SPRN_MAS3,r8
tlbwe

xori r6,r4,1
Expand Down Expand Up @@ -232,8 +253,7 @@ skpinv: addi r6,r6,1 /* Increment */
ori r6,r6,PAGE_OFFSET@l
rlwimi r6,r7,0,20,31
mtspr SPRN_MAS2,r6
li r7,(MAS3_SX|MAS3_SW|MAS3_SR)
mtspr SPRN_MAS3,r7
mtspr SPRN_MAS3,r8
tlbwe

/* 7. Jump to KERNELBASE mapping */
Expand Down
37 changes: 16 additions & 21 deletions trunk/arch/powerpc/mm/fsl_booke_mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
#include <asm/mmu.h>
#include <asm/uaccess.h>
#include <asm/smp.h>
#include <asm/bootx.h>
#include <asm/machdep.h>
#include <asm/setup.h>

Expand All @@ -59,7 +58,6 @@ extern void loadcam_entry(unsigned int index);
unsigned int tlbcam_index;
unsigned int num_tlbcam_entries;
static unsigned long __cam0, __cam1, __cam2;
#define MAX_LOW_MEM CONFIG_LOWMEM_SIZE

#define NUM_TLBCAMS (16)

Expand Down Expand Up @@ -195,42 +193,39 @@ unsigned long __init mmu_mapin_ram(void)
void __init
adjust_total_lowmem(void)
{
unsigned long max_low_mem = MAX_LOW_MEM;
unsigned long cam_max = 0x10000000;
unsigned long ram;
phys_addr_t max_lowmem_size = __max_low_memory;
phys_addr_t cam_max_size = 0x10000000;
phys_addr_t ram;

/* adjust CAM size to max_low_mem */
if (max_low_mem < cam_max)
cam_max = max_low_mem;
/* adjust CAM size to max_lowmem_size */
if (max_lowmem_size < cam_max_size)
cam_max_size = max_lowmem_size;

/* adjust lowmem size to max_low_mem */
if (max_low_mem < total_lowmem)
ram = max_low_mem;
else
ram = total_lowmem;
/* adjust lowmem size to max_lowmem_size */
ram = min(max_lowmem_size, total_lowmem);

/* Calculate CAM values */
__cam0 = 1UL << 2 * (__ilog2(ram) / 2);
if (__cam0 > cam_max)
__cam0 = cam_max;
if (__cam0 > cam_max_size)
__cam0 = cam_max_size;
ram -= __cam0;
if (ram) {
__cam1 = 1UL << 2 * (__ilog2(ram) / 2);
if (__cam1 > cam_max)
__cam1 = cam_max;
if (__cam1 > cam_max_size)
__cam1 = cam_max_size;
ram -= __cam1;
}
if (ram) {
__cam2 = 1UL << 2 * (__ilog2(ram) / 2);
if (__cam2 > cam_max)
__cam2 = cam_max;
if (__cam2 > cam_max_size)
__cam2 = cam_max_size;
ram -= __cam2;
}

printk(KERN_INFO "Memory CAM mapping: CAM0=%ldMb, CAM1=%ldMb,"
" CAM2=%ldMb residual: %ldMb\n",
__cam0 >> 20, __cam1 >> 20, __cam2 >> 20,
(total_lowmem - __cam0 - __cam1 - __cam2) >> 20);
__max_low_memory = max_low_mem = __cam0 + __cam1 + __cam2;
__initial_memory_limit = __max_low_memory;
__max_low_memory = __cam0 + __cam1 + __cam2;
__initial_memory_limit = memstart_addr + __max_low_memory;
}

0 comments on commit 59aea00

Please sign in to comment.