[U-Boot] [PATCH v1 09/21] sparc: leon3: Move snoop detection from startup.S to arch_cpu_init()

Francois Retief fgretief at spaceteq.co.za
Mon Nov 23 16:38:50 CET 2015


Signed-off-by: Francois Retief <fgretief at spaceteq.co.za>
---

 arch/sparc/cpu/leon3/cpu_init.c      | 13 ++++++++++++-
 arch/sparc/cpu/leon3/start.S         | 15 ---------------
 arch/sparc/cpu/leon3/usb_uhci.c      |  7 ++++---
 arch/sparc/include/asm/global_data.h |  7 +++++--
 4 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/arch/sparc/cpu/leon3/cpu_init.c b/arch/sparc/cpu/leon3/cpu_init.c
index a0526cd..421859e 100644
--- a/arch/sparc/cpu/leon3/cpu_init.c
+++ b/arch/sparc/cpu/leon3/cpu_init.c
@@ -30,7 +30,6 @@ DECLARE_GLOBAL_DATA_PTR;
 ambapp_dev_irqmp *irqmp = NULL;
 ambapp_dev_gptimer *gptimer = NULL;
 unsigned int gptimer_irq = 0;
-int leon3_snooping_avail = 0;
 
 /*
  * Breath some life into the CPU...
@@ -63,12 +62,24 @@ void cpu_init_f2(void)
 	ambapp_bus_init(CONFIG_AMBAPP_IOAREA, CONFIG_SYS_CLK_FREQ, &ambapp_plb);
 }
 
+/* If cache snooping is available in hardware the result will be set
+ * to 0x800000, otherwise 0.
+ */
+static unsigned int snoop_detect(void)
+{
+	unsigned int result;
+	asm("lda [%%g0] 2, %0" : "=r"(result));
+	return result & 0x00800000;
+}
+
 int arch_cpu_init(void)
 {
 	gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
 	gd->bus_clk = CONFIG_SYS_CLK_FREQ;
 	gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
 
+	gd->arch.snooping_available = snoop_detect();
+
 	return 0;
 }
 
diff --git a/arch/sparc/cpu/leon3/start.S b/arch/sparc/cpu/leon3/start.S
index fe4795c..1988ee1 100644
--- a/arch/sparc/cpu/leon3/start.S
+++ b/arch/sparc/cpu/leon3/start.S
@@ -209,8 +209,6 @@ _trap_table:
 	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! f8-fb
 	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! fc-ff
 
-	.extern leon3_snooping_avail
-
 	.section	".text"
 	.extern	_nomem_amba_init, _nomem_memory_ctrl_init
 	.align 4
@@ -401,19 +399,6 @@ prom_relocate_loop:
 	nop
 	nop
 
-/* If CACHE snooping is available in hardware the
- * variable leon3_snooping_avail will be set to
- * 0x800000 else 0.
- */
-snoop_detect:
-	sethi	%hi(0x00800000), %o0
-	lda	[%g0] 2, %o1
-	and	%o0, %o1, %o0
-	sethi	%hi(leon3_snooping_avail+CONFIG_SYS_RELOC_MONITOR_BASE-CONFIG_SYS_TEXT_BASE), %o1
-	st	%o0, [%lo(leon3_snooping_avail+CONFIG_SYS_RELOC_MONITOR_BASE-CONFIG_SYS_TEXT_BASE)+%o1]
-
-/*	call	relocate*/
-	nop
 /* Call relocated init functions */
 jump:
 	SPARC_LOAD_ADDRESS(cpu_init_f2, l7, o1)
diff --git a/arch/sparc/cpu/leon3/usb_uhci.c b/arch/sparc/cpu/leon3/usb_uhci.c
index 1be84c6..242b83f 100644
--- a/arch/sparc/cpu/leon3/usb_uhci.c
+++ b/arch/sparc/cpu/leon3/usb_uhci.c
@@ -85,10 +85,11 @@
 #include <usb.h>
 #include "usb_uhci.h"
 
+DECLARE_GLOBAL_DATA_PTR;
+
 #define USB_MAX_TEMP_TD      128	/* number of temporary TDs for bulk and control transfers */
 #define USB_MAX_TEMP_INT_TD  32	/* number of temporary TDs for Interrupt transfers */
 
-extern int leon3_snooping_avail;
 /*
 #define out16r(address,data) (*(unsigned short *)(address) = \
  (unsigned short)( \
@@ -573,7 +574,7 @@ void usb_check_skel(void)
 	if (qh_cntrl.dev_ptr != 0) {	/* it's a device assigned check if this caused IRQ */
 		dev = (struct usb_device *)qh_cntrl.dev_ptr;
 		/* Flush cache now that hardware updated DATA and TDs/QHs */
-		if (!leon3_snooping_avail)
+		if (!gd->arch.snooping_avail)
 			sparc_dcache_flush_all();
 		usb_get_td_status(&tmp_td[0], dev);	/* update status */
 		if (!(dev->status & USB_ST_NOT_PROC)) {	/* is not active anymore, disconnect devices */
@@ -584,7 +585,7 @@ void usb_check_skel(void)
 	if (qh_bulk.dev_ptr != 0) {	/* it's a device assigned check if this caused IRQ */
 		dev = (struct usb_device *)qh_bulk.dev_ptr;
 		/* Flush cache now that hardware updated DATA and TDs/QHs */
-		if (!leon3_snooping_avail)
+		if (!gd->arch.snooping_avail)
 			sparc_dcache_flush_all();
 		usb_get_td_status(&tmp_td[0], dev);	/* update status */
 		if (!(dev->status & USB_ST_NOT_PROC)) {	/* is not active anymore, disconnect devices */
diff --git a/arch/sparc/include/asm/global_data.h b/arch/sparc/include/asm/global_data.h
index 71820f0..8c6557a 100644
--- a/arch/sparc/include/asm/global_data.h
+++ b/arch/sparc/include/asm/global_data.h
@@ -2,8 +2,8 @@
  * (C) Copyright 2002-2010
  * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
  *
- * (C) Copyright 2007
- * Daniel Hellstrom, Gaisler Research, daniel at gaisler.com.
+ * (C) Copyright 2007, 2015
+ * Daniel Hellstrom, Cobham, Gaisler, daniel at gaisler.com.
  *
  * SPDX-License-Identifier:	GPL-2.0+
  */
@@ -17,6 +17,9 @@
 struct arch_global_data {
 	void *uart;
 	unsigned int uart_freq;
+#ifdef CONFIG_LEON3
+	unsigned int snooping_available;
+#endif
 };
 
 #include <asm-generic/global_data.h>
-- 
2.4.3



More information about the U-Boot mailing list