Skip to content

Commit

Permalink
ARC: mm: Decouple RAM base address from kernel link address
Browse files Browse the repository at this point in the history
	[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]
  • Loading branch information
Eugeniy Paltsev authored and vineetgarc committed Sep 1, 2017
1 parent bee91c3 commit 9ed6878
Show file tree
Hide file tree
Showing 8 changed files with 18 additions and 10 deletions.
10 changes: 9 additions & 1 deletion arch/arc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion arch/arc/boot/dts/axc001.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
};

Expand Down
2 changes: 1 addition & 1 deletion arch/arc/boot/dts/axc003.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
};
Expand Down
2 changes: 1 addition & 1 deletion arch/arc/boot/dts/axc003_idu.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
};
Expand Down
2 changes: 1 addition & 1 deletion arch/arc/boot/dts/nsim_hs.dts
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
};
Expand Down
2 changes: 1 addition & 1 deletion arch/arc/include/asm/page.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion arch/arc/mm/cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
6 changes: 3 additions & 3 deletions arch/arc/mm/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 9ed6878

Please sign in to comment.