diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-06 20:12:03 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-11-06 20:12:03 -0500 |
commit | 1197ab2942f920f261952de0c392ac749a35796b (patch) | |
tree | 4922ccc8a6061e5ece6ac7420001f3bf4524ea92 /arch/powerpc/mm/fsl_booke_mmu.c | |
parent | ec773e99ab4abce07b1ae23117179c2861831964 (diff) | |
parent | 96cc017c5b7ec095ef047d3c1952b6b6bbf98943 (diff) |
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc: (106 commits)
powerpc/p3060qds: Add support for P3060QDS board
powerpc/83xx: Add shutdown request support to MCU handling on MPC8349 MITX
powerpc/85xx: Make kexec to interate over online cpus
powerpc/fsl_booke: Fix comment in head_fsl_booke.S
powerpc/85xx: issue 15 EOI after core reset for FSL CoreNet devices
powerpc/8xxx: Fix interrupt handling in MPC8xxx GPIO driver
powerpc/85xx: Add 'fsl,pq3-gpio' compatiable for GPIO driver
powerpc/86xx: Correct Gianfar support for GE boards
powerpc/cpm: Clear muram before it is in use.
drivers/virt: add ioctl for 32-bit compat on 64-bit to fsl-hv-manager
powerpc/fsl_msi: add support for "msi-address-64" property
powerpc/85xx: Setup secondary cores PIR with hard SMP id
powerpc/fsl-booke: Fix settlbcam for 64-bit
powerpc/85xx: Adding DCSR node to dtsi device trees
powerpc/85xx: clean up FPGA device tree nodes for Freecsale QorIQ boards
powerpc/85xx: fix PHYS_64BIT selection for P1022DS
powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map
powerpc: respect mem= setting for early memory limit setup
powerpc: Update corenet64_smp_defconfig
powerpc: Update mpc85xx/corenet 32-bit defconfigs
...
Fix up trivial conflicts in:
- arch/powerpc/configs/40x/hcu4_defconfig
removed stale file, edited elsewhere
- arch/powerpc/include/asm/udbg.h, arch/powerpc/kernel/udbg.c:
added opal and gelic drivers vs added ePAPR driver
- drivers/tty/serial/8250.c
moved UPIO_TSI to powerpc vs removed UPIO_DWAPB support
Diffstat (limited to 'arch/powerpc/mm/fsl_booke_mmu.c')
-rw-r--r-- | arch/powerpc/mm/fsl_booke_mmu.c | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c index f7802c8bba0..66a6fd38e9c 100644 --- a/arch/powerpc/mm/fsl_booke_mmu.c +++ b/arch/powerpc/mm/fsl_booke_mmu.c | |||
@@ -101,17 +101,17 @@ unsigned long p_mapped_by_tlbcam(phys_addr_t pa) | |||
101 | 101 | ||
102 | /* | 102 | /* |
103 | * Set up a variable-size TLB entry (tlbcam). The parameters are not checked; | 103 | * Set up a variable-size TLB entry (tlbcam). The parameters are not checked; |
104 | * in particular size must be a power of 4 between 4k and 256M (or 1G, for cpus | 104 | * in particular size must be a power of 4 between 4k and the max supported by |
105 | * that support extended page sizes). Note that while some cpus support a | 105 | * an implementation; max may further be limited by what can be represented in |
106 | * page size of 4G, we don't allow its use here. | 106 | * an unsigned long (for example, 32-bit implementations cannot support a 4GB |
107 | * size). | ||
107 | */ | 108 | */ |
108 | static void settlbcam(int index, unsigned long virt, phys_addr_t phys, | 109 | static void settlbcam(int index, unsigned long virt, phys_addr_t phys, |
109 | unsigned long size, unsigned long flags, unsigned int pid) | 110 | unsigned long size, unsigned long flags, unsigned int pid) |
110 | { | 111 | { |
111 | unsigned int tsize, lz; | 112 | unsigned int tsize; |
112 | 113 | ||
113 | asm (PPC_CNTLZL "%0,%1" : "=r" (lz) : "r" (size)); | 114 | tsize = __ilog2(size) - 10; |
114 | tsize = 21 - lz; | ||
115 | 115 | ||
116 | #ifdef CONFIG_SMP | 116 | #ifdef CONFIG_SMP |
117 | if ((flags & _PAGE_NO_CACHE) == 0) | 117 | if ((flags & _PAGE_NO_CACHE) == 0) |
@@ -146,29 +146,36 @@ static void settlbcam(int index, unsigned long virt, phys_addr_t phys, | |||
146 | loadcam_entry(index); | 146 | loadcam_entry(index); |
147 | } | 147 | } |
148 | 148 | ||
149 | unsigned long calc_cam_sz(unsigned long ram, unsigned long virt, | ||
150 | phys_addr_t phys) | ||
151 | { | ||
152 | unsigned int camsize = __ilog2(ram) & ~1U; | ||
153 | unsigned int align = __ffs(virt | phys) & ~1U; | ||
154 | unsigned long max_cam = (mfspr(SPRN_TLB1CFG) >> 16) & 0xf; | ||
155 | |||
156 | /* Convert (4^max) kB to (2^max) bytes */ | ||
157 | max_cam = max_cam * 2 + 10; | ||
158 | |||
159 | if (camsize > align) | ||
160 | camsize = align; | ||
161 | if (camsize > max_cam) | ||
162 | camsize = max_cam; | ||
163 | |||
164 | return 1UL << camsize; | ||
165 | } | ||
166 | |||
149 | unsigned long map_mem_in_cams(unsigned long ram, int max_cam_idx) | 167 | unsigned long map_mem_in_cams(unsigned long ram, int max_cam_idx) |
150 | { | 168 | { |
151 | int i; | 169 | int i; |
152 | unsigned long virt = PAGE_OFFSET; | 170 | unsigned long virt = PAGE_OFFSET; |
153 | phys_addr_t phys = memstart_addr; | 171 | phys_addr_t phys = memstart_addr; |
154 | unsigned long amount_mapped = 0; | 172 | unsigned long amount_mapped = 0; |
155 | unsigned long max_cam = (mfspr(SPRN_TLB1CFG) >> 16) & 0xf; | ||
156 | |||
157 | /* Convert (4^max) kB to (2^max) bytes */ | ||
158 | max_cam = max_cam * 2 + 10; | ||
159 | 173 | ||
160 | /* Calculate CAM values */ | 174 | /* Calculate CAM values */ |
161 | for (i = 0; ram && i < max_cam_idx; i++) { | 175 | for (i = 0; ram && i < max_cam_idx; i++) { |
162 | unsigned int camsize = __ilog2(ram) & ~1U; | ||
163 | unsigned int align = __ffs(virt | phys) & ~1U; | ||
164 | unsigned long cam_sz; | 176 | unsigned long cam_sz; |
165 | 177 | ||
166 | if (camsize > align) | 178 | cam_sz = calc_cam_sz(ram, virt, phys); |
167 | camsize = align; | ||
168 | if (camsize > max_cam) | ||
169 | camsize = max_cam; | ||
170 | |||
171 | cam_sz = 1UL << camsize; | ||
172 | settlbcam(i, virt, phys, cam_sz, PAGE_KERNEL_X, 0); | 179 | settlbcam(i, virt, phys, cam_sz, PAGE_KERNEL_X, 0); |
173 | 180 | ||
174 | ram -= cam_sz; | 181 | ram -= cam_sz; |