mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ARC: mm: Decouple RAM base address from kernel link address
[Needed for HSDK]
Currently the first page of system (hence RAM base) is assumed to be
@ CONFIG_LINUX_LINK_BASE, where kernel itself is linked.
However is case of HSDK platform, for reasons explained in that patch,
this is not true. kernel needs to be linked @ 0x9000_0000 while DDR
is still wired at 0x8000_0000. To properly account for this 256M of RAM,
we need to introduce a new option and base page frame accountiing off of
it.
Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
[vgupta: renamed  CONFIG_KERNEL_RAM_BASE_ADDRESS => CONFIG_LINUX_RAM_BASE
       : simplified changelog]
			
			
This commit is contained in:
		
							parent
							
								
									bee91c3a3c
								
							
						
					
					
						commit
						9ed68785f7
					
				
					 8 changed files with 18 additions and 10 deletions
				
			
		| 
						 | 
					@ -418,7 +418,7 @@ endif	# ISA_ARCV2
 | 
				
			||||||
endmenu   # "ARC CPU Configuration"
 | 
					endmenu   # "ARC CPU Configuration"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config LINUX_LINK_BASE
 | 
					config LINUX_LINK_BASE
 | 
				
			||||||
	hex "Linux Link Address"
 | 
						hex "Kernel link address"
 | 
				
			||||||
	default "0x80000000"
 | 
						default "0x80000000"
 | 
				
			||||||
	help
 | 
						help
 | 
				
			||||||
	  ARC700 divides the 32 bit phy address space into two equal halves
 | 
						  ARC700 divides the 32 bit phy address space into two equal halves
 | 
				
			||||||
| 
						 | 
					@ -431,6 +431,14 @@ config LINUX_LINK_BASE
 | 
				
			||||||
	  If you don't know what the above means, leave this setting alone.
 | 
						  If you don't know what the above means, leave this setting alone.
 | 
				
			||||||
	  This needs to match memory start address specified in Device Tree
 | 
						  This needs to match memory start address specified in Device Tree
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					config LINUX_RAM_BASE
 | 
				
			||||||
 | 
						hex "RAM base address"
 | 
				
			||||||
 | 
						default LINUX_LINK_BASE
 | 
				
			||||||
 | 
						help
 | 
				
			||||||
 | 
						  By default Linux is linked at base of RAM. However in some special
 | 
				
			||||||
 | 
						  cases (such as HSDK), Linux can't be linked at start of DDR, hence
 | 
				
			||||||
 | 
						  this option.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
config HIGHMEM
 | 
					config HIGHMEM
 | 
				
			||||||
	bool "High Memory Support"
 | 
						bool "High Memory Support"
 | 
				
			||||||
	select ARCH_DISCONTIGMEM_ENABLE
 | 
						select ARCH_DISCONTIGMEM_ENABLE
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -99,7 +99,7 @@ mb_intc: dw-apb-ictl@0xe0012000 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memory {
 | 
						memory {
 | 
				
			||||||
		device_type = "memory";
 | 
							device_type = "memory";
 | 
				
			||||||
		/* CONFIG_KERNEL_RAM_BASE_ADDRESS needs to match low mem start */
 | 
							/* CONFIG_LINUX_RAM_BASE needs to match low mem start */
 | 
				
			||||||
		reg = <0x0 0x80000000 0x0 0x1b000000>;	/* (512 - 32) MiB */
 | 
							reg = <0x0 0x80000000 0x0 0x1b000000>;	/* (512 - 32) MiB */
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -109,7 +109,7 @@ mb_intc: dw-apb-ictl@0xe0012000 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memory {
 | 
						memory {
 | 
				
			||||||
		device_type = "memory";
 | 
							device_type = "memory";
 | 
				
			||||||
		/* CONFIG_KERNEL_RAM_BASE_ADDRESS needs to match low mem start */
 | 
							/* CONFIG_LINUX_RAM_BASE needs to match low mem start */
 | 
				
			||||||
		reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MiB low mem */
 | 
							reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MiB low mem */
 | 
				
			||||||
		       0x1 0xc0000000 0x0 0x40000000>;	/* 1 GiB highmem */
 | 
							       0x1 0xc0000000 0x0 0x40000000>;	/* 1 GiB highmem */
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,7 +115,7 @@ mb_intc: dw-apb-ictl@0xe0012000 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memory {
 | 
						memory {
 | 
				
			||||||
		device_type = "memory";
 | 
							device_type = "memory";
 | 
				
			||||||
		/* CONFIG_KERNEL_RAM_BASE_ADDRESS needs to match low mem start */
 | 
							/* CONFIG_LINUX_RAM_BASE needs to match low mem start */
 | 
				
			||||||
		reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MiB low mem */
 | 
							reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MiB low mem */
 | 
				
			||||||
		       0x1 0xc0000000 0x0 0x40000000>;	/* 1 GiB highmem */
 | 
							       0x1 0xc0000000 0x0 0x40000000>;	/* 1 GiB highmem */
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ / {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memory {
 | 
						memory {
 | 
				
			||||||
		device_type = "memory";
 | 
							device_type = "memory";
 | 
				
			||||||
		/* CONFIG_LINUX_LINK_BASE needs to match low mem start */
 | 
							/* CONFIG_LINUX_RAM_BASE needs to match low mem start */
 | 
				
			||||||
		reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MB low mem */
 | 
							reg = <0x0 0x80000000 0x0 0x20000000	/* 512 MB low mem */
 | 
				
			||||||
		       0x1 0x00000000 0x0 0x40000000>;	/* 1 GB highmem */
 | 
							       0x1 0x00000000 0x0 0x40000000>;	/* 1 GB highmem */
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,7 +85,7 @@ typedef pte_t * pgtable_t;
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)
 | 
					#define virt_to_pfn(kaddr)	(__pa(kaddr) >> PAGE_SHIFT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ARCH_PFN_OFFSET		virt_to_pfn(CONFIG_LINUX_LINK_BASE)
 | 
					#define ARCH_PFN_OFFSET		virt_to_pfn(CONFIG_LINUX_RAM_BASE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_FLATMEM
 | 
					#ifdef CONFIG_FLATMEM
 | 
				
			||||||
#define pfn_valid(pfn)		(((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
 | 
					#define pfn_valid(pfn)		(((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1173,7 +1173,7 @@ noinline void __init arc_ioc_setup(void)
 | 
				
			||||||
	write_aux_reg(ARC_REG_IO_COH_AP0_SIZE, order_base_2(mem_sz >> 10) - 2);
 | 
						write_aux_reg(ARC_REG_IO_COH_AP0_SIZE, order_base_2(mem_sz >> 10) - 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* for now assume kernel base is start of IOC aperture */
 | 
						/* for now assume kernel base is start of IOC aperture */
 | 
				
			||||||
	ioc_base = CONFIG_LINUX_LINK_BASE;
 | 
						ioc_base = CONFIG_LINUX_RAM_BASE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (ioc_base % mem_sz != 0)
 | 
						if (ioc_base % mem_sz != 0)
 | 
				
			||||||
		panic("IOC Aperture start must be aligned to the size of the aperture");
 | 
							panic("IOC Aperture start must be aligned to the size of the aperture");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ pgd_t swapper_pg_dir[PTRS_PER_PGD] __aligned(PAGE_SIZE);
 | 
				
			||||||
char empty_zero_page[PAGE_SIZE] __aligned(PAGE_SIZE);
 | 
					char empty_zero_page[PAGE_SIZE] __aligned(PAGE_SIZE);
 | 
				
			||||||
EXPORT_SYMBOL(empty_zero_page);
 | 
					EXPORT_SYMBOL(empty_zero_page);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const unsigned long low_mem_start = CONFIG_LINUX_LINK_BASE;
 | 
					static const unsigned long low_mem_start = CONFIG_LINUX_RAM_BASE;
 | 
				
			||||||
static unsigned long low_mem_sz;
 | 
					static unsigned long low_mem_sz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_HIGHMEM
 | 
					#ifdef CONFIG_HIGHMEM
 | 
				
			||||||
| 
						 | 
					@ -63,7 +63,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!low_mem_sz) {
 | 
						if (!low_mem_sz) {
 | 
				
			||||||
		if (base != low_mem_start)
 | 
							if (base != low_mem_start)
 | 
				
			||||||
			panic("CONFIG_LINUX_LINK_BASE != DT memory { }");
 | 
								panic("CONFIG_LINUX_RAM_BASE != DT memory { }");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		low_mem_sz = size;
 | 
							low_mem_sz = size;
 | 
				
			||||||
		in_use = 1;
 | 
							in_use = 1;
 | 
				
			||||||
| 
						 | 
					@ -161,7 +161,7 @@ void __init setup_arch_memory(void)
 | 
				
			||||||
	 * We can't use the helper free_area_init(zones[]) because it uses
 | 
						 * We can't use the helper free_area_init(zones[]) because it uses
 | 
				
			||||||
	 * PAGE_OFFSET to compute the @min_low_pfn which would be wrong
 | 
						 * PAGE_OFFSET to compute the @min_low_pfn which would be wrong
 | 
				
			||||||
	 * when our kernel doesn't start at PAGE_OFFSET, i.e.
 | 
						 * when our kernel doesn't start at PAGE_OFFSET, i.e.
 | 
				
			||||||
	 * PAGE_OFFSET != CONFIG_LINUX_LINK_BASE
 | 
						 * PAGE_OFFSET != CONFIG_LINUX_RAM_BASE
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	free_area_init_node(0,			/* node-id */
 | 
						free_area_init_node(0,			/* node-id */
 | 
				
			||||||
			    zones_size,		/* num pages per zone */
 | 
								    zones_size,		/* num pages per zone */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue