bsps/powerpc: Add load section for .nocache

This commit is contained in:
Sebastian Huber
2012-05-31 16:37:02 +02:00
parent 105ccdd55e
commit 6273201b14
13 changed files with 48 additions and 21 deletions

View File

@@ -22,5 +22,6 @@ REGION_ALIAS ("REGION_RWEXTRA", RAM_EXT);
REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT);
REGION_ALIAS ("REGION_STACK", RAM); REGION_ALIAS ("REGION_STACK", RAM);
REGION_ALIAS ("REGION_NOCACHE", NOCACHE); REGION_ALIAS ("REGION_NOCACHE", NOCACHE);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NOCACHE);
INCLUDE linkcmds.mpc55xx INCLUDE linkcmds.mpc55xx

View File

@@ -22,5 +22,6 @@ REGION_ALIAS ("REGION_RWEXTRA", RAM_EXT);
REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT);
REGION_ALIAS ("REGION_STACK", RAM); REGION_ALIAS ("REGION_STACK", RAM);
REGION_ALIAS ("REGION_NOCACHE", NOCACHE); REGION_ALIAS ("REGION_NOCACHE", NOCACHE);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NOCACHE);
INCLUDE linkcmds.mpc55xx INCLUDE linkcmds.mpc55xx

View File

@@ -22,5 +22,6 @@ REGION_ALIAS ("REGION_RWEXTRA", RAM_EXT);
REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT);
REGION_ALIAS ("REGION_STACK", RAM); REGION_ALIAS ("REGION_STACK", RAM);
REGION_ALIAS ("REGION_NOCACHE", NOCACHE); REGION_ALIAS ("REGION_NOCACHE", NOCACHE);
REGION_ALIAS ("REGION_NOCACHE_LOAD", ROM);
INCLUDE linkcmds.mpc55xx INCLUDE linkcmds.mpc55xx

View File

@@ -31,5 +31,6 @@ REGION_ALIAS ("REGION_RWEXTRA", RAM_EXT);
REGION_ALIAS ("REGION_WORK", RAM_EXT); REGION_ALIAS ("REGION_WORK", RAM_EXT);
REGION_ALIAS ("REGION_STACK", RAM); REGION_ALIAS ("REGION_STACK", RAM);
REGION_ALIAS ("REGION_NOCACHE", NOCACHE); REGION_ALIAS ("REGION_NOCACHE", NOCACHE);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NOCACHE);
INCLUDE linkcmds.mpc55xx INCLUDE linkcmds.mpc55xx

View File

@@ -27,5 +27,6 @@ REGION_ALIAS ("REGION_RWEXTRA", RAM_0);
REGION_ALIAS ("REGION_WORK", RAM_1); REGION_ALIAS ("REGION_WORK", RAM_1);
REGION_ALIAS ("REGION_STACK", RAM_1); REGION_ALIAS ("REGION_STACK", RAM_1);
REGION_ALIAS ("REGION_NOCACHE", NOCACHE); REGION_ALIAS ("REGION_NOCACHE", NOCACHE);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NOCACHE);
INCLUDE linkcmds.mpc55xx INCLUDE linkcmds.mpc55xx

View File

@@ -7,7 +7,7 @@
*/ */
/* /*
* Copyright (c) 2008-2011 embedded brains GmbH. All rights reserved. * Copyright (c) 2008-2012 embedded brains GmbH. All rights reserved.
* *
* embedded brains GmbH * embedded brains GmbH
* Obere Lagerstr. 30 * Obere Lagerstr. 30
@@ -23,6 +23,14 @@
#include <bsp.h> #include <bsp.h>
#include <bsp/start.h> #include <bsp/start.h>
#include <bsp/mpc55xx-config.h> #include <bsp/mpc55xx-config.h>
#include <bsp/linker-symbols.h>
/* This function is defined in start.S */
BSP_START_TEXT_SECTION void mpc55xx_start_load_section(
void *dst,
const void *src,
size_t n
);
static BSP_START_TEXT_SECTION void mpc55xx_start_mmu(void) static BSP_START_TEXT_SECTION void mpc55xx_start_mmu(void)
{ {
@@ -53,6 +61,19 @@ static BSP_START_TEXT_SECTION void mpc55xx_start_internal_ram(void)
#endif #endif
} }
static BSP_START_TEXT_SECTION void mpc55xx_start_load_nocache_section(void)
{
mpc55xx_start_load_section(
bsp_section_nocache_begin,
bsp_section_nocache_load_begin,
(size_t) bsp_section_nocache_size
);
rtems_cache_flush_multiple_data_lines(
bsp_section_nocache_begin,
(size_t) bsp_section_nocache_size
);
}
static BSP_START_TEXT_SECTION void mpc55xx_start_mode_change(void) static BSP_START_TEXT_SECTION void mpc55xx_start_mode_change(void)
{ {
#ifdef MPC55XX_HAS_MODE_CONTROL #ifdef MPC55XX_HAS_MODE_CONTROL
@@ -167,6 +188,7 @@ BSP_START_TEXT_SECTION void mpc55xx_start_early(void)
mpc55xx_start_cache(); mpc55xx_start_cache();
#endif #endif
mpc55xx_start_internal_ram(); mpc55xx_start_internal_ram();
mpc55xx_start_load_nocache_section();
mpc55xx_start_mmu(); mpc55xx_start_mmu();
mpc55xx_start_mode_change(); mpc55xx_start_mode_change();
mpc55xx_start_siu(); mpc55xx_start_siu();

View File

@@ -7,7 +7,7 @@
*/ */
/* /*
* Copyright (c) 2008-2011 embedded brains GmbH. All rights reserved. * Copyright (c) 2008-2012 embedded brains GmbH. All rights reserved.
* *
* embedded brains GmbH * embedded brains GmbH
* Obere Lagerstr. 30 * Obere Lagerstr. 30
@@ -21,7 +21,7 @@
*/ */
#include <bspopts.h> #include <bspopts.h>
#include <bsp/linker-symbols.h>
#include <libcpu/powerpc-utility.h> #include <libcpu/powerpc-utility.h>
#if MPC55XX_CHIP_TYPE / 10 != 551 #if MPC55XX_CHIP_TYPE / 10 != 551
@@ -41,20 +41,12 @@
.extern __eabi .extern __eabi
.extern boot_card .extern boot_card
.extern bsp_ram_start .extern bsp_ram_start
.extern bsp_section_data_begin
.extern bsp_section_data_load_begin
.extern bsp_section_data_size
.extern bsp_section_fast_data_begin
.extern bsp_section_fast_data_load_begin
.extern bsp_section_fast_data_size
.extern bsp_section_fast_text_begin
.extern bsp_section_fast_text_load_begin
.extern bsp_section_fast_text_size
.extern mpc55xx_start_config_mmu_early .extern mpc55xx_start_config_mmu_early
.extern mpc55xx_start_config_mmu_early_count .extern mpc55xx_start_config_mmu_early_count
.extern mpc55xx_start_early .extern mpc55xx_start_early
.globl _start .globl _start
.globl mpc55xx_start_load_section
.globl mpc55xx_start_mmu_apply_config .globl mpc55xx_start_mmu_apply_config
#ifdef MPC55XX_BOOTFLAGS #ifdef MPC55XX_BOOTFLAGS
@@ -225,15 +217,15 @@ zero_intermediate_stack_loop:
LA r3, bsp_section_fast_text_begin LA r3, bsp_section_fast_text_begin
LA r4, bsp_section_fast_text_load_begin LA r4, bsp_section_fast_text_load_begin
LA r5, bsp_section_fast_text_size LA r5, bsp_section_fast_text_size
bl load_section bl mpc55xx_start_load_section
LA r3, bsp_section_fast_data_begin LA r3, bsp_section_fast_data_begin
LA r4, bsp_section_fast_data_load_begin LA r4, bsp_section_fast_data_load_begin
LA r5, bsp_section_fast_data_size LA r5, bsp_section_fast_data_size
bl load_section bl mpc55xx_start_load_section
LA r3, bsp_section_data_begin LA r3, bsp_section_data_begin
LA r4, bsp_section_data_load_begin LA r4, bsp_section_data_load_begin
LA r5, bsp_section_data_size LA r5, bsp_section_data_size
bl load_section bl mpc55xx_start_load_section
/* Set up EABI and SYSV environment */ /* Set up EABI and SYSV environment */
bl __eabi bl __eabi
@@ -270,7 +262,7 @@ mmu_init_loop:
bdnz mmu_init_loop bdnz mmu_init_loop
blr blr
load_section: mpc55xx_start_load_section:
cmpw cr7, r3, r4 cmpw cr7, r3, r4
beqlr cr7 beqlr cr7
b memcpy b memcpy

View File

@@ -25,7 +25,8 @@ REGION_ALIAS ("REGION_BSS", HIGH);
REGION_ALIAS ("REGION_RWEXTRA", HIGH); REGION_ALIAS ("REGION_RWEXTRA", HIGH);
REGION_ALIAS ("REGION_WORK", HIGH); REGION_ALIAS ("REGION_WORK", HIGH);
REGION_ALIAS ("REGION_STACK", HIGH); REGION_ALIAS ("REGION_STACK", HIGH);
REGION_ALIAS ("REGION_NOCACHE", HIGH); REGION_ALIAS ("REGION_NOCACHE", NIRVANA);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NIRVANA);
bsp_section_robarrier_align = 0x1000000; bsp_section_robarrier_align = 0x1000000;
bsp_section_rwbarrier_align = 0x1000000; bsp_section_rwbarrier_align = 0x1000000;

View File

@@ -24,7 +24,8 @@ REGION_ALIAS ("REGION_BSS", RAM);
REGION_ALIAS ("REGION_RWEXTRA", RAM); REGION_ALIAS ("REGION_RWEXTRA", RAM);
REGION_ALIAS ("REGION_WORK", RAM); REGION_ALIAS ("REGION_WORK", RAM);
REGION_ALIAS ("REGION_STACK", RAM); REGION_ALIAS ("REGION_STACK", RAM);
REGION_ALIAS ("REGION_NOCACHE", RAM); REGION_ALIAS ("REGION_NOCACHE", NIRVANA);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NIRVANA);
bsp_section_robarrier_align = 0x1000000; bsp_section_robarrier_align = 0x1000000;
bsp_section_rwbarrier_align = 0x1000000; bsp_section_rwbarrier_align = 0x1000000;

View File

@@ -25,7 +25,8 @@ REGION_ALIAS ("REGION_BSS", HIGH);
REGION_ALIAS ("REGION_RWEXTRA", HIGH); REGION_ALIAS ("REGION_RWEXTRA", HIGH);
REGION_ALIAS ("REGION_WORK", HIGH); REGION_ALIAS ("REGION_WORK", HIGH);
REGION_ALIAS ("REGION_STACK", HIGH); REGION_ALIAS ("REGION_STACK", HIGH);
REGION_ALIAS ("REGION_NOCACHE", HIGH); REGION_ALIAS ("REGION_NOCACHE", NIRVANA);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NIRVANA);
bsp_section_robarrier_align = 0x1000000; bsp_section_robarrier_align = 0x1000000;
bsp_section_rwbarrier_align = 0x1000000; bsp_section_rwbarrier_align = 0x1000000;

View File

@@ -96,6 +96,8 @@ LINKER_SYMBOL(bsp_section_stack_size)
LINKER_SYMBOL(bsp_section_nocache_begin) LINKER_SYMBOL(bsp_section_nocache_begin)
LINKER_SYMBOL(bsp_section_nocache_end) LINKER_SYMBOL(bsp_section_nocache_end)
LINKER_SYMBOL(bsp_section_nocache_size) LINKER_SYMBOL(bsp_section_nocache_size)
LINKER_SYMBOL(bsp_section_nocache_load_begin)
LINKER_SYMBOL(bsp_section_nocache_load_end)
#define BSP_FAST_TEXT_SECTION __attribute__((section(".bsp_fast_text"))) #define BSP_FAST_TEXT_SECTION __attribute__((section(".bsp_fast_text")))

View File

@@ -328,8 +328,10 @@ SECTIONS {
bsp_section_nocache_begin = .; bsp_section_nocache_begin = .;
*(.bsp_nocache) *(.bsp_nocache)
bsp_section_nocache_end = .; bsp_section_nocache_end = .;
} > REGION_NOCACHE AT > REGION_NOCACHE } > REGION_NOCACHE AT > REGION_NOCACHE_LOAD
bsp_section_nocache_size = bsp_section_nocache_end - bsp_section_nocache_begin; bsp_section_nocache_size = bsp_section_nocache_end - bsp_section_nocache_begin;
bsp_section_nocache_load_begin = LOADADDR (.nocache);
bsp_section_nocache_load_end = bsp_section_nocache_load_begin + bsp_section_nocache_size;
/* FIXME */ /* FIXME */
RamBase = ORIGIN (REGION_WORK); RamBase = ORIGIN (REGION_WORK);

View File

@@ -18,6 +18,7 @@ REGION_ALIAS ("REGION_BSS", RAM);
REGION_ALIAS ("REGION_RWEXTRA", RAM); REGION_ALIAS ("REGION_RWEXTRA", RAM);
REGION_ALIAS ("REGION_WORK", RAM); REGION_ALIAS ("REGION_WORK", RAM);
REGION_ALIAS ("REGION_STACK", RAM); REGION_ALIAS ("REGION_STACK", RAM);
REGION_ALIAS ("REGION_NOCACHE", RAM); REGION_ALIAS ("REGION_NOCACHE", NIRVANA);
REGION_ALIAS ("REGION_NOCACHE_LOAD", NIRVANA);
INCLUDE linkcmds.base INCLUDE linkcmds.base