sparc: leon3: Move snoop detection from startup.S to arch_cpu_init()
Signed-off-by: Francois Retief <fgretief@spaceteq.co.za>
This commit is contained in:
parent
e17c5200c7
commit
d67269ba70
|
@ -30,7 +30,6 @@ DECLARE_GLOBAL_DATA_PTR;
|
||||||
ambapp_dev_irqmp *irqmp = NULL;
|
ambapp_dev_irqmp *irqmp = NULL;
|
||||||
ambapp_dev_gptimer *gptimer = NULL;
|
ambapp_dev_gptimer *gptimer = NULL;
|
||||||
unsigned int gptimer_irq = 0;
|
unsigned int gptimer_irq = 0;
|
||||||
int leon3_snooping_avail = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Breath some life into the CPU...
|
* 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);
|
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)
|
int arch_cpu_init(void)
|
||||||
{
|
{
|
||||||
gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
|
gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
|
||||||
gd->bus_clk = CONFIG_SYS_CLK_FREQ;
|
gd->bus_clk = CONFIG_SYS_CLK_FREQ;
|
||||||
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
|
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
|
||||||
|
|
||||||
|
gd->arch.snooping_available = snoop_detect();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -209,8 +209,6 @@ _trap_table:
|
||||||
SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! f8-fb
|
SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! f8-fb
|
||||||
SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! fc-ff
|
SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! fc-ff
|
||||||
|
|
||||||
.extern leon3_snooping_avail
|
|
||||||
|
|
||||||
.section ".text"
|
.section ".text"
|
||||||
.extern _nomem_amba_init, _nomem_memory_ctrl_init
|
.extern _nomem_amba_init, _nomem_memory_ctrl_init
|
||||||
.align 4
|
.align 4
|
||||||
|
@ -401,19 +399,6 @@ prom_relocate_loop:
|
||||||
nop
|
nop
|
||||||
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 */
|
/* Call relocated init functions */
|
||||||
jump:
|
jump:
|
||||||
SPARC_LOAD_ADDRESS(cpu_init_f2, l7, o1)
|
SPARC_LOAD_ADDRESS(cpu_init_f2, l7, o1)
|
||||||
|
|
|
@ -85,10 +85,11 @@
|
||||||
#include <usb.h>
|
#include <usb.h>
|
||||||
#include "usb_uhci.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_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 */
|
#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) = \
|
#define out16r(address,data) (*(unsigned short *)(address) = \
|
||||||
(unsigned short)( \
|
(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 */
|
if (qh_cntrl.dev_ptr != 0) { /* it's a device assigned check if this caused IRQ */
|
||||||
dev = (struct usb_device *)qh_cntrl.dev_ptr;
|
dev = (struct usb_device *)qh_cntrl.dev_ptr;
|
||||||
/* Flush cache now that hardware updated DATA and TDs/QHs */
|
/* Flush cache now that hardware updated DATA and TDs/QHs */
|
||||||
if (!leon3_snooping_avail)
|
if (!gd->arch.snooping_avail)
|
||||||
sparc_dcache_flush_all();
|
sparc_dcache_flush_all();
|
||||||
usb_get_td_status(&tmp_td[0], dev); /* update status */
|
usb_get_td_status(&tmp_td[0], dev); /* update status */
|
||||||
if (!(dev->status & USB_ST_NOT_PROC)) { /* is not active anymore, disconnect devices */
|
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 */
|
if (qh_bulk.dev_ptr != 0) { /* it's a device assigned check if this caused IRQ */
|
||||||
dev = (struct usb_device *)qh_bulk.dev_ptr;
|
dev = (struct usb_device *)qh_bulk.dev_ptr;
|
||||||
/* Flush cache now that hardware updated DATA and TDs/QHs */
|
/* Flush cache now that hardware updated DATA and TDs/QHs */
|
||||||
if (!leon3_snooping_avail)
|
if (!gd->arch.snooping_avail)
|
||||||
sparc_dcache_flush_all();
|
sparc_dcache_flush_all();
|
||||||
usb_get_td_status(&tmp_td[0], dev); /* update status */
|
usb_get_td_status(&tmp_td[0], dev); /* update status */
|
||||||
if (!(dev->status & USB_ST_NOT_PROC)) { /* is not active anymore, disconnect devices */
|
if (!(dev->status & USB_ST_NOT_PROC)) { /* is not active anymore, disconnect devices */
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
* (C) Copyright 2002-2010
|
* (C) Copyright 2002-2010
|
||||||
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
||||||
*
|
*
|
||||||
* (C) Copyright 2007
|
* (C) Copyright 2007, 2015
|
||||||
* Daniel Hellstrom, Gaisler Research, daniel@gaisler.com.
|
* Daniel Hellstrom, Cobham, Gaisler, daniel@gaisler.com.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-2.0+
|
* SPDX-License-Identifier: GPL-2.0+
|
||||||
*/
|
*/
|
||||||
|
@ -17,6 +17,9 @@
|
||||||
struct arch_global_data {
|
struct arch_global_data {
|
||||||
void *uart;
|
void *uart;
|
||||||
unsigned int uart_freq;
|
unsigned int uart_freq;
|
||||||
|
#ifdef CONFIG_LEON3
|
||||||
|
unsigned int snooping_available;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#include <asm-generic/global_data.h>
|
#include <asm-generic/global_data.h>
|
||||||
|
|
Loading…
Reference in New Issue