Commit ba9c4f88 authored by Steven J. Magnani's avatar Steven J. Magnani Committed by Michal Simek

microblaze: Allow PAGE_SIZE configuration

Allow developer to configure memory page size at compile time.
Larger pages can improve performance on some workloads.

Based on PowerPC code.
Signed-off-by: default avatarSteven J. Magnani <steve@digidescorp.com>
Signed-off-by: default avatarMichal Simek <monstr@monstr.eu>
parent 0d9ec762
...@@ -223,6 +223,36 @@ config TASK_SIZE ...@@ -223,6 +223,36 @@ config TASK_SIZE
hex "Size of user task space" if TASK_SIZE_BOOL hex "Size of user task space" if TASK_SIZE_BOOL
default "0x80000000" default "0x80000000"
choice
prompt "Page size"
default MICROBLAZE_4K_PAGES
depends on ADVANCED_OPTIONS && !MMU
help
Select the kernel logical page size. Increasing the page size
will reduce software overhead at each page boundary, allow
hardware prefetch mechanisms to be more effective, and allow
larger dma transfers increasing IO efficiency and reducing
overhead. However the utilization of memory will increase.
For example, each cached file will using a multiple of the
page size to hold its contents and the difference between the
end of file and the end of page is wasted.
If unsure, choose 4K_PAGES.
config MICROBLAZE_4K_PAGES
bool "4k page size"
config MICROBLAZE_8K_PAGES
bool "8k page size"
config MICROBLAZE_16K_PAGES
bool "16k page size"
config MICROBLAZE_32K_PAGES
bool "32k page size"
endchoice
endmenu endmenu
source "mm/Kconfig" source "mm/Kconfig"
......
...@@ -77,7 +77,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; ...@@ -77,7 +77,7 @@ typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
#define ELF_DATA ELFDATA2MSB #define ELF_DATA ELFDATA2MSB
#endif #endif
#define ELF_EXEC_PAGESIZE 4096 #define ELF_EXEC_PAGESIZE PAGE_SIZE
#define ELF_CORE_COPY_REGS(_dest, _regs) \ #define ELF_CORE_COPY_REGS(_dest, _regs) \
......
...@@ -23,8 +23,16 @@ ...@@ -23,8 +23,16 @@
#ifdef __KERNEL__ #ifdef __KERNEL__
/* PAGE_SHIFT determines the page size */ /* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT (12) #if defined(CONFIG_MICROBLAZE_32K_PAGES)
#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT) #define PAGE_SHIFT 15
#elif defined(CONFIG_MICROBLAZE_16K_PAGES)
#define PAGE_SHIFT 14
#elif defined(CONFIG_MICROBLAZE_8K_PAGES)
#define PAGE_SHIFT 13
#else
#define PAGE_SHIFT 12
#endif
#define PAGE_SIZE (ASM_CONST(1) << PAGE_SHIFT)
#define PAGE_MASK (~(PAGE_SIZE-1)) #define PAGE_MASK (~(PAGE_SIZE-1))
#define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_KERNEL_BASE_ADDR)) #define LOAD_OFFSET ASM_CONST((CONFIG_KERNEL_START-CONFIG_KERNEL_BASE_ADDR))
......
...@@ -126,6 +126,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) ...@@ -126,6 +126,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
cpuinfo.pvr_user1, cpuinfo.pvr_user1,
cpuinfo.pvr_user2); cpuinfo.pvr_user2);
count += seq_printf(m, "Page size:\t%lu\n", PAGE_SIZE);
return 0; return 0;
} }
......
...@@ -43,10 +43,10 @@ ...@@ -43,10 +43,10 @@
.global empty_zero_page .global empty_zero_page
.align 12 .align 12
empty_zero_page: empty_zero_page:
.space 4096 .space PAGE_SIZE
.global swapper_pg_dir .global swapper_pg_dir
swapper_pg_dir: swapper_pg_dir:
.space 4096 .space PAGE_SIZE
#endif /* CONFIG_MMU */ #endif /* CONFIG_MMU */
......
...@@ -55,7 +55,7 @@ SECTIONS { ...@@ -55,7 +55,7 @@ SECTIONS {
*/ */
.sdata2 : AT(ADDR(.sdata2) - LOAD_OFFSET) { .sdata2 : AT(ADDR(.sdata2) - LOAD_OFFSET) {
_ssrw = .; _ssrw = .;
. = ALIGN(4096); /* page aligned when MMU used - origin 0x8 */ . = ALIGN(PAGE_SIZE); /* page aligned when MMU used */
*(.sdata2) *(.sdata2)
. = ALIGN(8); . = ALIGN(8);
_essrw = .; _essrw = .;
...@@ -70,7 +70,7 @@ SECTIONS { ...@@ -70,7 +70,7 @@ SECTIONS {
/* Reserve some low RAM for r0 based memory references */ /* Reserve some low RAM for r0 based memory references */
. = ALIGN(0x4) ; . = ALIGN(0x4) ;
r0_ram = . ; r0_ram = . ;
. = . + 4096; /* a page should be enough */ . = . + PAGE_SIZE; /* a page should be enough */
/* Under the microblaze ABI, .sdata and .sbss must be contiguous */ /* Under the microblaze ABI, .sdata and .sbss must be contiguous */
. = ALIGN(8); . = ALIGN(8);
...@@ -120,7 +120,7 @@ SECTIONS { ...@@ -120,7 +120,7 @@ SECTIONS {
__init_end_before_initramfs = .; __init_end_before_initramfs = .;
.init.ramfs ALIGN(4096) : AT(ADDR(.init.ramfs) - LOAD_OFFSET) { .init.ramfs ALIGN(PAGE_SIZE) : AT(ADDR(.init.ramfs) - LOAD_OFFSET) {
__initramfs_start = .; __initramfs_start = .;
*(.init.ramfs) *(.init.ramfs)
__initramfs_end = .; __initramfs_end = .;
...@@ -132,11 +132,11 @@ SECTIONS { ...@@ -132,11 +132,11 @@ SECTIONS {
* so that __init_end == __bss_start. This will make image.elf * so that __init_end == __bss_start. This will make image.elf
* consistent with the image.bin * consistent with the image.bin
*/ */
/* . = ALIGN(4096); */ /* . = ALIGN(PAGE_SIZE); */
} }
__init_end = .; __init_end = .;
.bss ALIGN (4096) : AT(ADDR(.bss) - LOAD_OFFSET) { .bss ALIGN (PAGE_SIZE) : AT(ADDR(.bss) - LOAD_OFFSET) {
/* page aligned when MMU used */ /* page aligned when MMU used */
__bss_start = . ; __bss_start = . ;
*(.bss*) *(.bss*)
...@@ -145,7 +145,7 @@ SECTIONS { ...@@ -145,7 +145,7 @@ SECTIONS {
__bss_stop = . ; __bss_stop = . ;
_ebss = . ; _ebss = . ;
} }
. = ALIGN(4096); . = ALIGN(PAGE_SIZE);
_end = .; _end = .;
DISCARDS DISCARDS
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment