summaryrefslogtreecommitdiffstats
path: root/bsps/arm
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2023-04-03 08:11:49 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2023-12-06 14:27:48 +0100
commit05a4c70aa90aff30788f8081037ed977b8a94144 (patch)
treef8273a3c12856a0faf293dc409914f01202eb708 /bsps/arm
parentbsp/tms570: Adjust BSP_OSCILATOR_CLOCK (diff)
downloadrtems-05a4c70aa90aff30788f8081037ed977b8a94144.tar.bz2
bsp/tms570: Improve POM handling
Place the vector table in the start section so that the overlay can be avoided if we execute from internal flash. The problem is that when the POM is enabled, the ECC cannot be enabled for the internal flash.
Diffstat (limited to 'bsps/arm')
-rw-r--r--bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk1
-rw-r--r--bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_intram1
-rw-r--r--bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_sdram1
-rw-r--r--bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_with_loader1
-rw-r--r--bsps/arm/tms570/start/tms570-pom.c12
5 files changed, 14 insertions, 2 deletions
diff --git a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk
index ca68617231..ce23803fa3 100644
--- a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk
+++ b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk
@@ -24,6 +24,7 @@ REGION_ALIAS ("REGION_STACK", RAM_INT);
REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
+bsp_vector_table_in_start_section = 1;
bsp_int_vec_overlay_start = ORIGIN(RAM_INT_VEC);
INCLUDE linkcmds.armv4
diff --git a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_intram b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_intram
index ca216204dc..c5f2d1cfaf 100644
--- a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_intram
+++ b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_intram
@@ -24,6 +24,7 @@ REGION_ALIAS ("REGION_STACK", RAM_INT);
REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
+bsp_vector_table_in_start_section = 1;
bsp_int_vec_overlay_start = ORIGIN(RAM_INT_VEC);
INCLUDE linkcmds.armv4
diff --git a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_sdram b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_sdram
index d2b924395f..fa8365bad1 100644
--- a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_sdram
+++ b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_sdram
@@ -24,6 +24,7 @@ REGION_ALIAS ("REGION_STACK", RAM_EXT);
REGION_ALIAS ("REGION_NOCACHE", RAM_EXT);
REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_EXT);
+bsp_vector_table_in_start_section = 1;
bsp_int_vec_overlay_start = ORIGIN(RAM_INT_VEC);
INCLUDE linkcmds.armv4
diff --git a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_with_loader b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_with_loader
index aa0000379d..86b602b1f1 100644
--- a/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_with_loader
+++ b/bsps/arm/tms570/start/linkcmds.tms570ls3137_hdk_with_loader
@@ -25,6 +25,7 @@ REGION_ALIAS ("REGION_STACK", RAM_INT);
REGION_ALIAS ("REGION_NOCACHE", RAM_INT);
REGION_ALIAS ("REGION_NOCACHE_LOAD", RAM_INT);
+bsp_vector_table_in_start_section = 1;
bsp_int_vec_overlay_start = ORIGIN(RAM_INT_VEC);
INCLUDE linkcmds.armv4
diff --git a/bsps/arm/tms570/start/tms570-pom.c b/bsps/arm/tms570/start/tms570-pom.c
index 8f31d01b77..1dc12f8607 100644
--- a/bsps/arm/tms570/start/tms570-pom.c
+++ b/bsps/arm/tms570/start/tms570-pom.c
@@ -87,7 +87,12 @@ void tms570_initialize_and_clear(void)
*/
void tms570_pom_remap(void)
{
- uint32_t vec_overlay_start = pom_global_overlay_target_address_start;
+ void *vec_overlay_start = (void *) pom_global_overlay_target_address_start;
+ void *addr_tab = (char *) bsp_start_vector_table_begin + 64;
+
+ if (vec_overlay_start == addr_tab) {
+ return;
+ }
/*
* Copy RTEMS the first level exception processing code
@@ -99,7 +104,10 @@ void tms570_pom_remap(void)
* table found in
* c/src/lib/libbsp/arm/shared/start/start.S
*/
- memcpy((void*)vec_overlay_start, bsp_start_vector_table_begin, 64);
+ rtems_cache_invalidate_multiple_data_lines(addr_tab, 64);
+ memcpy(vec_overlay_start, addr_tab, 64);
+ rtems_cache_flush_multiple_data_lines(vec_overlay_start, 64);
+ rtems_cache_invalidate_multiple_instruction_lines(vec_overlay_start, 64);
#if 0
{