Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 212694
b: refs/heads/master
c: cd3db0c
h: refs/heads/master
v: v3
  • Loading branch information
Benjamin Herrenschmidt committed Aug 5, 2010
1 parent 851b860 commit abcf884
Show file tree
Hide file tree
Showing 17 changed files with 126 additions and 41 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: e63075a3c9377536d085bc013cd3fe6323162449
refs/heads/master: cd3db0c4ca3d237e7ad20f7107216e575705d2b0
12 changes: 12 additions & 0 deletions trunk/arch/powerpc/include/asm/mmu.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
#define _ASM_POWERPC_MMU_H_
#ifdef __KERNEL__

#include <linux/types.h>

#include <asm/asm-compat.h>
#include <asm/feature-fixups.h>

Expand Down Expand Up @@ -82,6 +84,16 @@ extern unsigned int __start___mmu_ftr_fixup, __stop___mmu_ftr_fixup;
extern void early_init_mmu(void);
extern void early_init_mmu_secondary(void);

extern void setup_initial_memory_limit(phys_addr_t first_memblock_base,
phys_addr_t first_memblock_size);

#ifdef CONFIG_PPC64
/* This is our real memory area size on ppc64 server, on embedded, we
* make it match the size our of bolted TLB area
*/
extern u64 ppc64_rma_size;
#endif /* CONFIG_PPC64 */

#endif /* !__ASSEMBLY__ */

/* The kernel use the constants below to index in the page sizes array.
Expand Down
6 changes: 1 addition & 5 deletions trunk/arch/powerpc/kernel/head_40x.S
Original file line number Diff line number Diff line change
Expand Up @@ -923,11 +923,7 @@ initial_mmu:
mtspr SPRN_PID,r0
sync

/* Configure and load two entries into TLB slots 62 and 63.
* In case we are pinning TLBs, these are reserved in by the
* other TLB functions. If not reserving, then it doesn't
* matter where they are loaded.
*/
/* Configure and load one entry into TLB slots 63 */
clrrwi r4,r4,10 /* Mask off the real page number */
ori r4,r4,(TLB_WR | TLB_EX) /* Set the write and execute bits */

Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/powerpc/kernel/paca.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ void __init allocate_pacas(void)
* the first segment. On iSeries they must be within the area mapped
* by the HV, which is HvPagesToMap * HVPAGESIZE bytes.
*/
limit = min(0x10000000ULL, memblock.rmo_size);
limit = min(0x10000000ULL, ppc64_rma_size);
if (firmware_has_feature(FW_FEATURE_ISERIES))
limit = min(limit, HvPagesToMap * HVPAGESIZE);

Expand Down
29 changes: 8 additions & 21 deletions trunk/arch/powerpc/kernel/prom.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
int __initdata iommu_is_off;
int __initdata iommu_force_on;
unsigned long tce_alloc_start, tce_alloc_end;
u64 ppc64_rma_size;
#endif

static int __init early_parse_mem(char *p)
Expand Down Expand Up @@ -492,7 +493,7 @@ static int __init early_init_dt_scan_memory_ppc(unsigned long node,

void __init early_init_dt_add_memory_arch(u64 base, u64 size)
{
#if defined(CONFIG_PPC64)
#ifdef CONFIG_PPC64
if (iommu_is_off) {
if (base >= 0x80000000ul)
return;
Expand All @@ -501,9 +502,13 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
}
#endif

memblock_add(base, size);

/* First MEMBLOCK added, do some special initializations */
if (memstart_addr == ~(phys_addr_t)0)
setup_initial_memory_limit(base, size);
memstart_addr = min((u64)memstart_addr, base);

/* Add the chunk to the MEMBLOCK list */
memblock_add(base, size);
}

u64 __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
Expand Down Expand Up @@ -655,22 +660,6 @@ static void __init phyp_dump_reserve_mem(void)
static inline void __init phyp_dump_reserve_mem(void) {}
#endif /* CONFIG_PHYP_DUMP && CONFIG_PPC_RTAS */

static void set_boot_memory_limit(void)
{
#ifdef CONFIG_PPC32
/* 601 can only access 16MB at the moment */
if (PVR_VER(mfspr(SPRN_PVR)) == 1)
memblock_set_current_limit(0x01000000);
/* 8xx can only access 8MB at the moment */
else if (PVR_VER(mfspr(SPRN_PVR)) == 0x50)
memblock_set_current_limit(0x00800000);
else
memblock_set_current_limit(0x10000000);
#else
memblock_set_current_limit(memblock.rmo_size);
#endif
}

void __init early_init_devtree(void *params)
{
phys_addr_t limit;
Expand Down Expand Up @@ -734,8 +723,6 @@ void __init early_init_devtree(void *params)

DBG("Phys. mem: %llx\n", memblock_phys_mem_size());

set_boot_memory_limit();

/* We may need to relocate the flat tree, do it now.
* FIXME .. and the initrd too? */
move_device_tree();
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/powerpc/kernel/rtas.c
Original file line number Diff line number Diff line change
Expand Up @@ -934,7 +934,7 @@ void __init rtas_initialize(void)
*/
#ifdef CONFIG_PPC64
if (machine_is(pseries) && firmware_has_feature(FW_FEATURE_LPAR)) {
rtas_region = min(memblock.rmo_size, RTAS_INSTANTIATE_MAX);
rtas_region = min(ppc64_rma_size, RTAS_INSTANTIATE_MAX);
ibm_suspend_me_token = rtas_token("ibm,suspend-me");
}
#endif
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/powerpc/kernel/setup_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ static void __init emergency_stack_init(void)
* bringup, we need to get at them in real mode. This means they
* must also be within the RMO region.
*/
limit = min(slb0_limit(), memblock.rmo_size);
limit = min(slb0_limit(), ppc64_rma_size);

for_each_possible_cpu(i) {
unsigned long sp;
Expand Down
14 changes: 13 additions & 1 deletion trunk/arch/powerpc/mm/40x_mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,19 @@ unsigned long __init mmu_mapin_ram(unsigned long top)
* coverage with normal-sized pages (or other reasons) do not
* attempt to allocate outside the allowed range.
*/
memblock_set_current_limit(memstart_addr + mapped);
memblock_set_current_limit(mapped);

return mapped;
}

void setup_initial_memory_limit(phys_addr_t first_memblock_base,
phys_addr_t first_memblock_size)
{
/* We don't currently support the first MEMBLOCK not mapping 0
* physical on those processors
*/
BUG_ON(first_memblock_base != 0);

/* 40x can only access 16MB at the moment (see head_40x.S) */
memblock_set_current_limit(min_t(u64, first_memblock_size, 0x00800000));
}
14 changes: 14 additions & 0 deletions trunk/arch/powerpc/mm/44x_mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
*/

#include <linux/init.h>
#include <linux/memblock.h>

#include <asm/mmu.h>
#include <asm/system.h>
#include <asm/page.h>
Expand Down Expand Up @@ -213,6 +215,18 @@ unsigned long __init mmu_mapin_ram(unsigned long top)
return total_lowmem;
}

void setup_initial_memory_limit(phys_addr_t first_memblock_base,
phys_addr_t first_memblock_size)
{
/* We don't currently support the first MEMBLOCK not mapping 0
* physical on those processors
*/
BUG_ON(first_memblock_base != 0);

/* 44x has a 256M TLB entry pinned at boot */
memblock_set_current_limit(min_t(u64, first_memblock_size, PPC_PIN_SIZE));
}

#ifdef CONFIG_SMP
void __cpuinit mmu_init_secondary(int cpu)
{
Expand Down
9 changes: 9 additions & 0 deletions trunk/arch/powerpc/mm/fsl_booke_mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,3 +215,12 @@ void __init adjust_total_lowmem(void)

memblock_set_current_limit(memstart_addr + __max_low_memory);
}

void setup_initial_memory_limit(phys_addr_t first_memblock_base,
phys_addr_t first_memblock_size)
{
phys_addr_t limit = first_memblock_base + first_memblock_size;

/* 64M mapped initially according to head_fsl_booke.S */
memblock_set_current_limit(min_t(u64, limit, 0x04000000));
}
22 changes: 21 additions & 1 deletion trunk/arch/powerpc/mm/hash_utils_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@ static void __init htab_initialize(void)
#ifdef CONFIG_DEBUG_PAGEALLOC
linear_map_hash_count = memblock_end_of_DRAM() >> PAGE_SHIFT;
linear_map_hash_slots = __va(memblock_alloc_base(linear_map_hash_count,
1, memblock.rmo_size));
1, ppc64_rma_size));
memset(linear_map_hash_slots, 0, linear_map_hash_count);
#endif /* CONFIG_DEBUG_PAGEALLOC */

Expand Down Expand Up @@ -1248,3 +1248,23 @@ void kernel_map_pages(struct page *page, int numpages, int enable)
local_irq_restore(flags);
}
#endif /* CONFIG_DEBUG_PAGEALLOC */

void setup_initial_memory_limit(phys_addr_t first_memblock_base,
phys_addr_t first_memblock_size)
{
/* We don't currently support the first MEMBLOCK not mapping 0
* physical on those processors
*/
BUG_ON(first_memblock_base != 0);

/* On LPAR systems, the first entry is our RMA region,
* non-LPAR 64-bit hash MMU systems don't have a limitation
* on real mode access, but using the first entry works well
* enough. We also clamp it to 1G to avoid some funky things
* such as RTAS bugs etc...
*/
ppc64_rma_size = min_t(u64, first_memblock_size, 0x40000000);

/* Finally limit subsequent allocations */
memblock_set_current_limit(ppc64_rma_size);
}
14 changes: 14 additions & 0 deletions trunk/arch/powerpc/mm/init_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -237,3 +237,17 @@ void free_initrd_mem(unsigned long start, unsigned long end)
}
#endif


#ifdef CONFIG_8xx /* No 8xx specific .c file to put that in ... */
void setup_initial_memory_limit(phys_addr_t first_memblock_base,
phys_addr_t first_memblock_size)
{
/* We don't currently support the first MEMBLOCK not mapping 0
* physical on those processors
*/
BUG_ON(first_memblock_base != 0);

/* 8xx can only access 8MB at the moment */
memblock_set_current_limit(min_t(u64, first_memblock_size, 0x00800000));
}
#endif /* CONFIG_8xx */
1 change: 1 addition & 0 deletions trunk/arch/powerpc/mm/init_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,3 +328,4 @@ int __meminit vmemmap_populate(struct page *start_page,
return 0;
}
#endif /* CONFIG_SPARSEMEM_VMEMMAP */

15 changes: 15 additions & 0 deletions trunk/arch/powerpc/mm/ppc_mmu_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -271,3 +271,18 @@ void __init MMU_init_hw(void)

if ( ppc_md.progress ) ppc_md.progress("hash:done", 0x205);
}

void setup_initial_memory_limit(phys_addr_t first_memblock_base,
phys_addr_t first_memblock_size)
{
/* We don't currently support the first MEMBLOCK not mapping 0
* physical on those processors
*/
BUG_ON(first_memblock_base != 0);

/* 601 can only access 16MB at the moment */
if (PVR_VER(mfspr(SPRN_PVR)) == 1)
memblock_set_current_limit(min_t(u64, first_memblock_size, 0x01000000));
else /* Anything else has 256M mapped */
memblock_set_current_limit(min_t(u64, first_memblock_size, 0x10000000));
}
14 changes: 14 additions & 0 deletions trunk/arch/powerpc/mm/tlb_nohash.c
Original file line number Diff line number Diff line change
Expand Up @@ -446,4 +446,18 @@ void __cpuinit early_init_mmu_secondary(void)
__early_init_mmu(0);
}

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
* 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
* avoid going over total available memory just in case...
*/
ppc64_rma_size = min_t(u64, first_memblock_size, 0x40000000);

/* Finally limit subsequent allocations */
memblock_set_current_limit(ppc64_memblock_base + ppc64_rma_size);
}
#endif /* CONFIG_PPC64 */
1 change: 0 additions & 1 deletion trunk/include/linux/memblock.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ struct memblock_type {

struct memblock {
unsigned long debug;
u64 rmo_size;
u64 current_limit;
struct memblock_type memory;
struct memblock_type reserved;
Expand Down
8 changes: 0 additions & 8 deletions trunk/mm/memblock.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ void memblock_dump_all(void)
return;

pr_info("MEMBLOCK configuration:\n");
pr_info(" rmo_size = 0x%llx\n", (unsigned long long)memblock.rmo_size);
pr_info(" memory.size = 0x%llx\n", (unsigned long long)memblock.memory.size);

memblock_dump(&memblock.memory, "memory");
Expand Down Expand Up @@ -195,10 +194,6 @@ static long memblock_add_region(struct memblock_type *type, u64 base, u64 size)

long memblock_add(u64 base, u64 size)
{
/* On pSeries LPAR systems, the first MEMBLOCK is our RMO region. */
if (base == 0)
memblock.rmo_size = size;

return memblock_add_region(&memblock.memory, base, size);

}
Expand Down Expand Up @@ -459,9 +454,6 @@ void __init memblock_enforce_memory_limit(u64 memory_limit)
break;
}

if (memblock.memory.regions[0].size < memblock.rmo_size)
memblock.rmo_size = memblock.memory.regions[0].size;

memory_limit = memblock_end_of_DRAM();

/* And truncate any reserves above the limit also. */
Expand Down

0 comments on commit abcf884

Please sign in to comment.