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:
Родитель
bee91c3a3c
Коммит
9ed68785f7
|
@ -418,7 +418,7 @@ endif # ISA_ARCV2
|
|||
endmenu # "ARC CPU Configuration"
|
||||
|
||||
config LINUX_LINK_BASE
|
||||
hex "Linux Link Address"
|
||||
hex "Kernel link address"
|
||||
default "0x80000000"
|
||||
help
|
||||
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.
|
||||
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
|
||||
bool "High Memory Support"
|
||||
select ARCH_DISCONTIGMEM_ENABLE
|
||||
|
|
|
@ -99,7 +99,7 @@
|
|||
|
||||
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 */
|
||||
};
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@
|
|||
|
||||
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 */
|
||||
0x1 0xc0000000 0x0 0x40000000>; /* 1 GiB highmem */
|
||||
};
|
||||
|
|
|
@ -115,7 +115,7 @@
|
|||
|
||||
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 */
|
||||
0x1 0xc0000000 0x0 0x40000000>; /* 1 GiB highmem */
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
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 */
|
||||
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 ARCH_PFN_OFFSET virt_to_pfn(CONFIG_LINUX_LINK_BASE)
|
||||
#define ARCH_PFN_OFFSET virt_to_pfn(CONFIG_LINUX_RAM_BASE)
|
||||
|
||||
#ifdef CONFIG_FLATMEM
|
||||
#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);
|
||||
|
||||
/* 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)
|
||||
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);
|
||||
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;
|
||||
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
|
@ -63,7 +63,7 @@ void __init early_init_dt_add_memory_arch(u64 base, u64 size)
|
|||
|
||||
if (!low_mem_sz) {
|
||||
if (base != low_mem_start)
|
||||
panic("CONFIG_LINUX_LINK_BASE != DT memory { }");
|
||||
panic("CONFIG_LINUX_RAM_BASE != DT memory { }");
|
||||
|
||||
low_mem_sz = size;
|
||||
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
|
||||
* PAGE_OFFSET to compute the @min_low_pfn which would be wrong
|
||||
* 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 */
|
||||
zones_size, /* num pages per zone */
|
||||
|
|
Загрузка…
Ссылка в новой задаче