summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/sparc')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/ChangeLog8
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/sparc/leon3/startup/bspstart.c27
3 files changed, 37 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog
index 6abc98391d..ad22325cf5 100644
--- a/c/src/lib/libbsp/sparc/leon3/ChangeLog
+++ b/c/src/lib/libbsp/sparc/leon3/ChangeLog
@@ -1,5 +1,13 @@
2007-09-05 Daniel Hellstrom <daniel@gaisler.com>
+ * include/bsp.h, startup/bspstart.c: LEON2 and LEON3 Data cache
+ snooping detection on startup, for drivers. (LEON2,3 are configurable
+ processors, they can be with or without DCache snooping. Caches
+ without snooping needs the drivers to flush cache or use the sparc
+ instruction lda to force cache miss...)
+
+2007-09-05 Daniel Hellstrom <daniel@gaisler.com>
+
* Makefile.am, preinstall.am, amba/amba.c, include/amba.h,
include/leon.h: LEON3 AMBA PnP bus scanning moved to
shared/amba/amba.c and shared/include/ambapp.h. The AMBA scanning was
diff --git a/c/src/lib/libbsp/sparc/leon3/include/bsp.h b/c/src/lib/libbsp/sparc/leon3/include/bsp.h
index 717395fad4..045b7c2f5a 100644
--- a/c/src/lib/libbsp/sparc/leon3/include/bsp.h
+++ b/c/src/lib/libbsp/sparc/leon3/include/bsp.h
@@ -83,6 +83,8 @@ extern int rtems_leon_greth_driver_attach(
extern void Clock_delay(uint32_t microseconds);
#define delay( microseconds ) Clock_delay(microseconds)
+extern int CPU_SPARC_HAS_SNOOPING;
+
/* Constants */
diff --git a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
index e863250614..baf1b1cbef 100644
--- a/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
+++ b/c/src/lib/libbsp/sparc/leon3/startup/bspstart.c
@@ -42,11 +42,36 @@ rtems_cpu_table Cpu_table;
extern uint32_t rdb_start;
+/*
+ * Tells us if data cache snooping is available
+ */
+
+int CPU_SPARC_HAS_SNOOPING;
+
void bsp_postdriver_hook(void);
void bsp_libc_init( void *, uint32_t, int );
extern void bsp_spurious_initialize();
/*
+ * set_snooping
+ *
+ * Read the data cache configuration register to determine if
+ * bus snooping is available. This is needed for some drivers so
+ * that they can select the most efficient copy routines.
+ *
+ */
+
+static inline int set_snooping(void)
+{
+ int tmp;
+ asm(" lda [%1] 2, %0 "
+ : "=r"(tmp)
+ : "r"(0xC)
+ );
+ return (tmp >> 27) & 1;
+}
+
+/*
* bsp_pretasking_hook
*
* BSP pretasking hook. Called just before drivers are initialized.
@@ -112,4 +137,6 @@ void bsp_start( void )
}
BSP_Configuration.work_space_start = work_space_start;
+
+ CPU_SPARC_HAS_SNOOPING = set_snooping();
}