* [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup @ 2011-09-16 15:39 Kumar Gala 2011-09-16 15:39 ` [PATCH 2/2] powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map Kumar Gala 2011-10-12 4:29 ` [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup Kumar Gala 0 siblings, 2 replies; 4+ messages in thread From: Kumar Gala @ 2011-09-16 15:39 UTC (permalink / raw) To: linuxppc-dev For those MMUs that have some form of bolt'd linear mapping (TLB) required its rare that one ever sets mem= smaller than the size of that mapping. However, on Book-E 64 parts the initial linear mapping is quite large (1G) so its quite reasonable that mem= is set smaller than that. We need to parse the command line for mem= limit and constrain the amount of memory we map initially by it if need be. Signed-off-by: Kumar Gala <galak@kernel.crashing.org> --- arch/powerpc/kernel/prom.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c index 174e1e9..87902de 100644 --- a/arch/powerpc/kernel/prom.c +++ b/arch/powerpc/kernel/prom.c @@ -723,12 +723,15 @@ void __init early_init_devtree(void *params) of_scan_flat_dt(early_init_dt_scan_root, NULL); of_scan_flat_dt(early_init_dt_scan_memory_ppc, NULL); - setup_initial_memory_limit(memstart_addr, first_memblock_size); /* Save command line for /proc/cmdline and then parse parameters */ strlcpy(boot_command_line, cmd_line, COMMAND_LINE_SIZE); parse_early_param(); + /* make sure we've parsed cmdline for mem= before this */ + if (memory_limit) + first_memblock_size = min(first_memblock_size, memory_limit); + setup_initial_memory_limit(memstart_addr, first_memblock_size); /* Reserve MEMBLOCK regions used by kernel, initrd, dt, etc... */ memblock_reserve(PHYSICAL_START, __pa(klimit) - PHYSICAL_START); /* If relocatable, reserve first 32k for interrupt vectors etc. */ -- 1.7.3.4 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2] powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map 2011-09-16 15:39 [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup Kumar Gala @ 2011-09-16 15:39 ` Kumar Gala 2011-10-12 4:30 ` Kumar Gala 2011-10-12 4:29 ` [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup Kumar Gala 1 sibling, 1 reply; 4+ messages in thread From: Kumar Gala @ 2011-09-16 15:39 UTC (permalink / raw) To: linuxppc-dev On FSL Book-E devices we support multiple large TLB sizes and so we can get into situations in which the initial 1G TLB size is too big and we're asked for a size that is not mappable by a single entry (like 512M). The single entry is important because when we bring up secondary cores they need to ensure any data structure they need to access (eg PACA or stack) is always mapped. So we really need to determine what size will actually be mapped by the first TLB entry to ensure we limit early memory references to that region. We refactor the map_mem_in_cams() code to provider a helper function that we can utilize to determine the size of the first TLB entry while taking into account size and alignment constraints. Signed-off-by: Kumar Gala <galak@kernel.crashing.org> --- arch/powerpc/mm/fsl_booke_mmu.c | 31 +++++++++++++++++++------------ arch/powerpc/mm/mmu_decl.h | 2 ++ arch/powerpc/mm/tlb_nohash.c | 21 ++++++++++++++++++--- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c index f7802c8..6f593bd 100644 --- a/arch/powerpc/mm/fsl_booke_mmu.c +++ b/arch/powerpc/mm/fsl_booke_mmu.c @@ -146,29 +146,36 @@ static void settlbcam(int index, unsigned long virt, phys_addr_t phys, loadcam_entry(index); } +unsigned long calc_cam_sz(unsigned long ram, unsigned long virt, + phys_addr_t phys) +{ + unsigned int camsize = __ilog2(ram) & ~1U; + unsigned int align = __ffs(virt | phys) & ~1U; + unsigned long max_cam = (mfspr(SPRN_TLB1CFG) >> 16) & 0xf; + + /* Convert (4^max) kB to (2^max) bytes */ + max_cam = max_cam * 2 + 10; + + if (camsize > align) + camsize = align; + if (camsize > max_cam) + camsize = max_cam; + + return 1UL << camsize; +} + 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; /* 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; + cam_sz = calc_cam_sz(ram, virt, phys); settlbcam(i, virt, phys, cam_sz, PAGE_KERNEL_X, 0); ram -= cam_sz; diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h index dd0a258..83eb5d5 100644 --- a/arch/powerpc/mm/mmu_decl.h +++ b/arch/powerpc/mm/mmu_decl.h @@ -142,6 +142,8 @@ extern unsigned long mmu_mapin_ram(unsigned long top); #elif defined(CONFIG_PPC_FSL_BOOK3E) extern unsigned long map_mem_in_cams(unsigned long ram, int max_cam_idx); +extern unsigned long calc_cam_sz(unsigned long ram, unsigned long virt, + phys_addr_t phys); #ifdef CONFIG_PPC32 extern void MMU_init_hw(void); extern unsigned long mmu_mapin_ram(unsigned long top); diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c index afc95c7..6c2eabf 100644 --- a/arch/powerpc/mm/tlb_nohash.c +++ b/arch/powerpc/mm/tlb_nohash.c @@ -642,13 +642,28 @@ void __cpuinit early_init_mmu_secondary(void) void setup_initial_memory_limit(phys_addr_t first_memblock_base, phys_addr_t first_memblock_size) { - /* On Embedded 64-bit, we adjust the RMA size to match + /* On non-FSL Embedded 64-bit, we adjust the RMA size to match * the bolted TLB entry. We know for now that only 1G * entries are supported though that may eventually - * change. We crop it to the size of the first MEMBLOCK to + * change. + * + * on FSL Embedded 64-bit, we adjust the RMA size to match the + * first bolted TLB entry size. We still limit max to 1G even if + * the TLB could cover more. This is due to what the early init + * code is setup to do. + * + * We crop it to the size of the first MEMBLOCK to * avoid going over total available memory just in case... */ - ppc64_rma_size = min_t(u64, first_memblock_size, 0x40000000); +#ifdef CONFIG_PPC_FSL_BOOK3E + if (mmu_has_feature(MMU_FTR_TYPE_FSL_E)) { + unsigned long linear_sz; + linear_sz = calc_cam_sz(first_memblock_size, PAGE_OFFSET, + first_memblock_base); + ppc64_rma_size = min_t(u64, linear_sz, 0x40000000); + } else +#endif + ppc64_rma_size = min_t(u64, first_memblock_size, 0x40000000); /* Finally limit subsequent allocations */ memblock_set_current_limit(first_memblock_base + ppc64_rma_size); -- 1.7.3.4 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2] powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map 2011-09-16 15:39 ` [PATCH 2/2] powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map Kumar Gala @ 2011-10-12 4:30 ` Kumar Gala 0 siblings, 0 replies; 4+ messages in thread From: Kumar Gala @ 2011-10-12 4:30 UTC (permalink / raw) To: Kumar Gala; +Cc: linuxppc-dev On Sep 16, 2011, at 10:39 AM, Kumar Gala wrote: > On FSL Book-E devices we support multiple large TLB sizes and so we can > get into situations in which the initial 1G TLB size is too big and > we're asked for a size that is not mappable by a single entry (like > 512M). The single entry is important because when we bring up secondary > cores they need to ensure any data structure they need to access (eg > PACA or stack) is always mapped. > > So we really need to determine what size will actually be mapped by the > first TLB entry to ensure we limit early memory references to that > region. We refactor the map_mem_in_cams() code to provider a helper > function that we can utilize to determine the size of the first TLB > entry while taking into account size and alignment constraints. > > Signed-off-by: Kumar Gala <galak@kernel.crashing.org> > --- > arch/powerpc/mm/fsl_booke_mmu.c | 31 +++++++++++++++++++------------ > arch/powerpc/mm/mmu_decl.h | 2 ++ > arch/powerpc/mm/tlb_nohash.c | 21 ++++++++++++++++++--- > 3 files changed, 39 insertions(+), 15 deletions(-) applied - k ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup 2011-09-16 15:39 [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup Kumar Gala 2011-09-16 15:39 ` [PATCH 2/2] powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map Kumar Gala @ 2011-10-12 4:29 ` Kumar Gala 1 sibling, 0 replies; 4+ messages in thread From: Kumar Gala @ 2011-10-12 4:29 UTC (permalink / raw) To: Kumar Gala; +Cc: linuxppc-dev On Sep 16, 2011, at 10:39 AM, Kumar Gala wrote: > For those MMUs that have some form of bolt'd linear mapping (TLB) > required its rare that one ever sets mem= smaller than the size of that > mapping. > > However, on Book-E 64 parts the initial linear mapping is quite large > (1G) so its quite reasonable that mem= is set smaller than that. > > We need to parse the command line for mem= limit and constrain the > amount of memory we map initially by it if need be. > > Signed-off-by: Kumar Gala <galak@kernel.crashing.org> > --- > arch/powerpc/kernel/prom.c | 5 ++++- > 1 files changed, 4 insertions(+), 1 deletions(-) applied - k ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-10-12 4:30 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-09-16 15:39 [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup Kumar Gala 2011-09-16 15:39 ` [PATCH 2/2] powerpc/fsl-booke: Fix setup_initial_memory_limit to not blindly map Kumar Gala 2011-10-12 4:30 ` Kumar Gala 2011-10-12 4:29 ` [PATCH 1/2] powerpc: respect mem= setting for early memory limit setup Kumar Gala
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).