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: Steven J. Magnani <steve@digidescorp.com>
Signed-off-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
Steven J. Magnani 2010-05-13 10:48:27 -05:00 committed by Michal Simek
parent 0d9ec762af
commit ba9c4f88d7
6 changed files with 50 additions and 11 deletions

View File

@ -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"

View File

@ -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) \

View File

@ -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))

View File

@ -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;
} }

View File

@ -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 */

View File

@ -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 {
/* 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 {
__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 {
* 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 {
__bss_stop = . ; __bss_stop = . ;
_ebss = . ; _ebss = . ;
} }
. = ALIGN(4096); . = ALIGN(PAGE_SIZE);
_end = .; _end = .;
DISCARDS DISCARDS