summaryrefslogtreecommitdiffstats
path: root/c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-09-06 00:07:44 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-09-06 00:07:44 +0000
commit921bb59a83a3e9112bb83f67ef886a0ce685367d (patch)
tree2bd11eddb8ea431818d4bdf9abe6c93a6190cffe /c
parent2007-09-05 Daniel Hellstrom <daniel@gaisler.com> (diff)
downloadrtems-921bb59a83a3e9112bb83f67ef886a0ce685367d.tar.bz2
2007-09-05 Daniel Hellstrom <daniel@gaisler.com>
* clock/ckinit.c, console/console.c, leon_greth/leon_greth.c, leon_smc91111/leon_smc91111.c: LEON3 BSP drivers updated to use new AMBA PnP scanning functions. Affected drivers: amba/amba.c,clock/ckinit.c,console/console.c, leon_greth/leon_greth.c, leon_smc9111.c.
Diffstat (limited to 'c')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/ChangeLog8
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c33
-rw-r--r--c/src/lib/libbsp/sparc/leon3/console/console.c63
-rw-r--r--c/src/lib/libbsp/sparc/leon3/leon_greth/leon_greth.c21
-rw-r--r--c/src/lib/libbsp/sparc/leon3/leon_smc91111/leon_smc91111.c105
5 files changed, 106 insertions, 124 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog
index ad22325cf5..73a10a0d81 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>
+ * clock/ckinit.c, console/console.c, leon_greth/leon_greth.c,
+ leon_smc91111/leon_smc91111.c: LEON3 BSP drivers updated to use new
+ AMBA PnP scanning functions. Affected drivers:
+ amba/amba.c,clock/ckinit.c,console/console.c,
+ leon_greth/leon_greth.c, leon_smc9111.c.
+
+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
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
index 4b0ce519e6..9054200436 100644
--- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
+++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
@@ -44,29 +44,20 @@ static int clkirq;
#define Clock_driver_support_at_tick()
#define Clock_driver_support_find_timer() \
- do { \
- int i; \
- unsigned int iobar, conf; \
+ do { \
+ int cnt; \
+ amba_apb_device dev; \
\
- /* Find GP Timer */ \
- i = 0; \
- while (i < amba_conf.apbslv.devnr) { \
- conf = amba_get_confword(amba_conf.apbslv, i, 0); \
- if ((amba_vendor(conf) == VENDOR_GAISLER) && \
- (amba_device(conf) == GAISLER_GPTIMER)) { \
- iobar = amba_apb_get_membar(amba_conf.apbslv, i); \
- LEON3_Timer_Regs = (volatile LEON3_Timer_Regs_Map *) \
- amba_iobar_start(amba_conf.apbmst, iobar); \
- break; \
+ /* Find LEON3 Interrupt controler */ \
+ cnt = amba_find_apbslv(&amba_conf,VENDOR_GAISLER,GAISLER_IRQMP,&dev); \
+ if ( cnt > 0 ){ \
+ /* Found APB IRQ_MP Interrupt Controller */ \
+ LEON3_IrqCtrl_Regs = (volatile LEON3_IrqCtrl_Regs_Map *) dev.start; \
+ clkirq = (LEON3_Timer_Regs->status & 0xfc) >> 3; \
+ \
+ if (Configuration.User_multiprocessing_table != NULL) { \
+ clkirq += LEON3_Cpu_Index; \
} \
- i++; \
- } \
- \
- clkirq = (LEON3_Timer_Regs->status & 0xfc) >> 3; \
- \
- /* MP */ \
- if (Configuration.User_multiprocessing_table != NULL) { \
- clkirq += LEON3_Cpu_Index; \
} \
} while (0)
diff --git a/c/src/lib/libbsp/sparc/leon3/console/console.c b/c/src/lib/libbsp/sparc/leon3/console/console.c
index 41dd26c449..01209503f8 100644
--- a/c/src/lib/libbsp/sparc/leon3/console/console.c
+++ b/c/src/lib/libbsp/sparc/leon3/console/console.c
@@ -22,6 +22,7 @@
#include <stdlib.h>
#include <assert.h>
#include <rtems/bspIo.h>
+#include <amba.h>
/*
* Should we use a polled or interrupt drived console?
@@ -85,8 +86,26 @@ int console_write_support (int minor, const char *buf, int len)
* Console Device Driver Entry Points
*
*/
+int uarts = 0;
+static int isinit = 0;
+volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
-volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
+int scan_uarts() {
+ unsigned int iobar, conf;
+ int i;
+ amba_apb_device apbuarts[LEON3_APBUARTS];
+
+ if (isinit == 0) {
+ i = 0; uarts = 0;
+
+ uarts = amba_find_apbslvs(&amba_conf,VENDOR_GAISLER,GAISLER_APBUART,apbuarts,LEON3_APBUARTS);
+ for(i=0; i<uarts; i++){
+ LEON3_Console_Uart[i] = apbuarts[i].start;
+ }
+ isinit = 1;
+ }
+ return uarts;
+}
rtems_device_driver console_initialize(
rtems_device_major_number major,
@@ -95,37 +114,30 @@ rtems_device_driver console_initialize(
)
{
rtems_status_code status;
- unsigned int iobar, conf;
- int i, uarts;
- char *console_name = "/dev/console_a";
-
+ int i, uart0;
+ char console_name[16];
+ extern rtems_configuration_table Configuration;
rtems_termios_initialize();
/* Find UARTs */
-
- i = 0; uarts = 0;
- while (i < amba_conf.apbslv.devnr)
- {
- conf = amba_get_confword(amba_conf.apbslv, i, 0);
- if ((amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_APBUART))
- {
- iobar = amba_apb_get_membar(amba_conf.apbslv, i);
- LEON3_Console_Uart[uarts] = (volatile LEON3_UART_Regs_Map *) amba_iobar_start(amba_conf.apbmst, iobar);
- uarts++;
- }
- i++;
- }
+ scan_uarts();
+
+ if (Configuration.User_multiprocessing_table != NULL)
+ uart0 = LEON3_Cpu_Index;
+ else
+ uart0 = 0;
/* Register Device Names */
- if (uarts)
+ if (uarts && (uart0 < uarts))
{
status = rtems_io_register_name( "/dev/console", major, 0 );
if (status != RTEMS_SUCCESSFUL)
rtems_fatal_error_occurred(status);
- for (i = 1; i < uarts; i++)
+ strcpy(console_name,"/dev/console_a");
+ for (i = uart0+1; i < uarts; i++)
{
console_name[13]++;
status = rtems_io_register_name( console_name, major, i);
@@ -136,11 +148,14 @@ rtems_device_driver console_initialize(
/*
* Initialize Hardware
*/
-
- for (i = 0; i < uarts; i++)
+ if ((Configuration.User_multiprocessing_table == NULL) ||
+ ((Configuration.User_multiprocessing_table)->node == 1))
{
- LEON3_Console_Uart[i]->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
- LEON3_Console_Uart[i]->status = 0;
+ for (i = uart0; i < uarts; i++)
+ {
+ LEON3_Console_Uart[i]->ctrl |= LEON_REG_UART_CTRL_RE | LEON_REG_UART_CTRL_TE;
+ LEON3_Console_Uart[i]->status = 0;
+ }
}
return RTEMS_SUCCESSFUL;
diff --git a/c/src/lib/libbsp/sparc/leon3/leon_greth/leon_greth.c b/c/src/lib/libbsp/sparc/leon3/leon_greth/leon_greth.c
index 29684ebae7..9b6f1260da 100644
--- a/c/src/lib/libbsp/sparc/leon3/leon_greth/leon_greth.c
+++ b/c/src/lib/libbsp/sparc/leon3/leon_greth/leon_greth.c
@@ -36,24 +36,15 @@ int rtems_leon_greth_driver_attach(
unsigned int conf, iobar;
unsigned int base_addr = 0; /* avoid warnings */
unsigned int eth_irq = 0; /* avoid warnings */
+ amba_apb_device apbgreth;
/* Scan for MAC AHB slave interface */
- for (i = 0; i < amba_conf.apbslv.devnr; i++)
- {
- conf = amba_get_confword(amba_conf.apbslv, i, 0);
- if ((amba_vendor(conf) == VENDOR_GAISLER) &&
- (amba_device(conf) == GAISLER_ETHMAC))
- {
- iobar = amba_apb_get_membar(amba_conf.apbslv, i);
- base_addr = amba_iobar_start(amba_conf.apbmst, iobar);
- eth_irq = amba_irq(conf) + 0x10;
- device_found = 1;
- break;
- }
- }
-
- if (device_found)
+ device_found = amba_find_apbslv(&amba_conf,VENDOR_GAISLER,GAISLER_ETHMAC,&apbgreth);
+ if (device_found == 1)
{
+ base_addr = apbgreth.start;
+ eth_irq = apbgreth.irq + 0x10;
+
/* clear control register and reset NIC */
*(volatile int *) base_addr = 0;
*(volatile int *) base_addr = GRETH_CTRL_RST;
diff --git a/c/src/lib/libbsp/sparc/leon3/leon_smc91111/leon_smc91111.c b/c/src/lib/libbsp/sparc/leon3/leon_smc91111/leon_smc91111.c
index 5929a58b25..f7743ba64e 100644
--- a/c/src/lib/libbsp/sparc/leon3/leon_smc91111/leon_smc91111.c
+++ b/c/src/lib/libbsp/sparc/leon3/leon_smc91111/leon_smc91111.c
@@ -13,83 +13,60 @@
scmv91111_configuration_t leon_scmv91111_configuration = {
SMC91111_BASE_ADDR, /* base address */
- LEON_TRAP_TYPE(SMC91111_BASE_IRQ), /* vector number */
+ LEON_TRAP_TYPE (SMC91111_BASE_IRQ), /* vector number */
SMC91111_BASE_PIO, /* PIO */
- 10, /* 10b */
+ 100, /* 100b */
1, /* fulldx */
1 /* autoneg */
};
-int _rtems_smc91111_driver_attach(
- struct rtems_bsdnet_ifconfig *config,
- scmv91111_configuration_t *scm_config
-);
+int _rtems_smc91111_driver_attach (struct rtems_bsdnet_ifconfig *config,
+ scmv91111_configuration_t * scm_config);
/*
* Attach an SMC91111 driver to the system
*/
-int rtems_smc91111_driver_attach_leon3 (
- struct rtems_bsdnet_ifconfig *config,
- int attach
-)
+int
+rtems_smc91111_driver_attach_leon3 (struct rtems_bsdnet_ifconfig *config,
+ int attach)
{
- unsigned int iobar, conf,i;
+ unsigned long addr_mctrl = 0;
+ LEON3_IOPORT_Regs_Map *io;
- {
- unsigned long irq_pio, irq_mctrl, addr_pio = 0;
- unsigned long addr_mctrl = 0, addr_timer = 0;
-
- i = 0;
- while (i < amba_conf.apbslv.devnr)
- {
- conf = amba_get_confword(amba_conf.apbslv, i, 0);
- if ((amba_vendor(conf) == VENDOR_GAISLER) &&
- (amba_device(conf) == GAISLER_PIOPORT))
- {
- irq_pio = amba_irq(conf);
- iobar = amba_apb_get_membar(amba_conf.apbslv, i);
- addr_pio = (unsigned long) amba_iobar_start(amba_conf.apbmst, iobar);
- }
- else if ((amba_vendor(conf) == VENDOR_ESA) &&
- (amba_device(conf) == ESA_MCTRL))
- {
- irq_mctrl = amba_irq(conf);
- iobar = amba_apb_get_membar(amba_conf.apbslv, i);
- addr_mctrl = (unsigned long) amba_iobar_start(amba_conf.apbmst, iobar);
- }
- else if ((amba_vendor(conf) == VENDOR_GAISLER) &&
- (amba_device(conf) == GAISLER_GPTIMER))
- {
- iobar = amba_apb_get_membar(amba_conf.apbslv, i);
- addr_timer = (unsigned long) amba_iobar_start(amba_conf.apbmst, iobar);
- }
- i++;
- }
-
- if (addr_timer) {
- LEON3_Timer_Regs_Map *timer = (LEON3_Timer_Regs_Map *)addr_timer;
- if (timer->scaler_reload >= 49)
- leon_scmv91111_configuration.ctl_rspeed = 100;
- }
-
- if (addr_pio && addr_mctrl) {
-
- LEON3_IOPORT_Regs_Map *io = (LEON3_IOPORT_Regs_Map *) addr_pio;
- printk(
- "Activating Leon3 io port for smsc_lan91cxx (pio:%x mctrl:%x)\n",
- (unsigned int)addr_pio,
- (unsigned int)addr_mctrl);
-
- *((volatile unsigned int *)addr_mctrl) |= 0x10f80000; /*mctrl ctrl 1 */
- io->irqmask |= (1 << leon_scmv91111_configuration.pio);
- io->irqpol |= (1 << leon_scmv91111_configuration.pio);
- io->irqedge |= (1 << leon_scmv91111_configuration.pio);
- io->iodir &= ~(1 << leon_scmv91111_configuration.pio);
- } else {
+ amba_apb_device apbpio, apbmctrl;
+
+ if ( amba_find_ahbslv(&amba_conf,VENDOR_GAISLER,GAISLER_PIOPORT,&apbpio) != 1 ){
+ printk("SMC9111_leon3: didn't find PIO\n");
+ return 0;
+ }
+
+ /* Find LEON2 memory controller */
+ if ( amba_find_ahbslv(&amba_conf,VENDOR_ESA,ESA_MCTRL,&apbmctrl) != 1 ){
+ /* LEON2 memory controller not found, search for fault tolerant memory controller */
+ if ( amba_find_ahbslv(&amba_conf,VENDOR_GAISLER,GAISLER_FTMCTRL,&apbmctrl) != 1 ) {
+ printk("SMC9111_leon3: didn't find any memory controller\n");
return 0;
}
}
- return _rtems_smc91111_driver_attach(config,&leon_scmv91111_configuration);
-};
+ /* Get controller address */
+ addr_mctrl = (unsigned long) apbmctrl.start;
+ io = (LEON3_IOPORT_Regs_Map *) apbpio.start;
+
+ printk(
+ "Activating Leon3 io port for smsc_lan91cxx (pio:%x mctrl:%x)\n",
+ (unsigned int)io,
+ (unsigned int)addr_mctrl);
+
+ /* Setup PIO IRQ */
+ io->irqmask |= (1 << leon_scmv91111_configuration.pio);
+ io->irqpol |= (1 << leon_scmv91111_configuration.pio);
+ io->irqedge |= (1 << leon_scmv91111_configuration.pio);
+ io->iodir &= ~(1 << leon_scmv91111_configuration.pio);
+ /* Setup memory controller I/O waitstates */
+ *((volatile unsigned int *) addr_mctrl) |= 0x10f80000; /* enable I/O area access */
+
+ return _rtems_smc91111_driver_attach (config,
+ &leon_scmv91111_configuration);
+};