diff options
author | Daniel Hellstrom <daniel@gaisler.com> | 2011-12-20 15:58:05 +0100 |
---|---|---|
committer | Daniel Hellstrom <daniel@gaisler.com> | 2015-04-17 01:10:17 +0200 |
commit | e67b2b8d0552068d5d2859c02ffb5c2e110056de (patch) | |
tree | 161f7d400a93c7d54569e8b34ceefa45fcaa0aff /c/src/lib/libbsp/sparc/leon2/cchip/cchip.c | |
parent | LEON2: added support for LEON2-GRLIB systems (diff) | |
download | rtems-e67b2b8d0552068d5d2859c02ffb5c2e110056de.tar.bz2 |
LEON: updated and added PCI peripherals for LEON BSPs
The CCHIP driver is replaced with the GR_701 driver. The
RASTA driver is replaced by the GR-RASTA-IO driver.
All drivers are now compatible with both LEON2 and LEON3,
drivers were initialized directly by the PCI-board drivers
are now initialized by the driver manager and therefore
does not require the double code created by including for
example grcan.c into grcan_rasta.c. The other drivers needs
to be updated to the driver manager framework however.
Added support for:
* GR-701 (only LEON2 before)
* GR-RASTA-IO (only LEON2 before)
* GR-RASTA-ADCDAC
* GR-RASTA-TMTC
* GR-RASTA-SPW-ROUTER
* GR-TMTC-1553
Diffstat (limited to '')
-rw-r--r-- | c/src/lib/libbsp/sparc/leon2/cchip/cchip.c | 375 |
1 files changed, 0 insertions, 375 deletions
diff --git a/c/src/lib/libbsp/sparc/leon2/cchip/cchip.c b/c/src/lib/libbsp/sparc/leon2/cchip/cchip.c deleted file mode 100644 index 72419d58aa..0000000000 --- a/c/src/lib/libbsp/sparc/leon2/cchip/cchip.c +++ /dev/null @@ -1,375 +0,0 @@ -/** - * @file - * - * @ingroup cchip - * - * @brief GR-701 (Companion Chip) PCI board driver - */ - -/* - * COPYRIGHT (c) 2007. - * Aeroflex Gaisler AB. - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - */ - -#include <bsp.h> -#include <rtems/bspIo.h> -#include <rtems.h> -#include <string.h> - -#include <rtems.h> -#include <leon.h> -#include <ambapp.h> -#include <pci.h> - -#include <b1553brm_pci.h> -#include <occan_pci.h> -#include <grspw_pci.h> -#include <apbuart_pci.h> - -#include <cchip.h> - -/* -#define DEBUG -#define DEBUG_IRQS -*/ -#define BOARD_INFO -/*#define PRINT_SPURIOUS*/ - -/* AT697 Register MAP */ -static LEON_Register_Map *regs = (LEON_Register_Map *)0x80000000; - -/* initializes interrupt management for companionship board */ -void cchip1_irq_init(void); - -/* register interrupt handler (called from drivers) */ -void cchip1_set_isr(void *handler, int irqno, void *arg); - -#define READ_REG(address) _READ_REG((unsigned int)address) -static __inline__ unsigned int _READ_REG(unsigned int addr) { - unsigned int tmp; - __asm__ ("lda [%1]1, %0 " - : "=r"(tmp) - : "r"(addr) - ); - return tmp; -} - -/* PCI bride reg layout on AMBA side */ -typedef struct { - unsigned int bar0; - unsigned int bar1; - unsigned int bar2; - unsigned int bar3; - unsigned int bar4;/* 0x10 */ - - unsigned int unused[4*3-1]; - - unsigned int ambabars[1]; /* 0x40 */ -} amba_bridge_regs; - -/* PCI bride reg layout on PCI side */ -typedef struct { - unsigned int bar0; - unsigned int bar1; - unsigned int bar2; - unsigned int bar3; - unsigned int bar4; /* 0x10 */ - - unsigned int ilevel; - unsigned int ipend; - unsigned int iforce; - unsigned int istatus; - unsigned int iclear; - unsigned int imask; -} pci_bridge_regs; - -typedef struct { - pci_bridge_regs *pcib; - amba_bridge_regs *ambab; - - /* AT697 PCI */ - uint32_t bars[5]; - int bus, dev, fun; - - /* AMBA bus */ - struct ambapp_bus amba_bus; - struct ambapp_mmap amba_maps[2]; - - /* FT AHB SRAM */ - int ftsram_size; /* kb */ - unsigned int ftsram_start; - unsigned int ftsram_end; - -} cchip1; - -cchip1 cc1; - -static int init_pcif(void) -{ - uint32_t com1; - int i,bus,dev,fun; - pci_bridge_regs *pcib; - amba_bridge_regs *ambab; - struct ambapp_bus *abus; - - if ( BSP_pciFindDevice(0x1AC8, 0x0701, 0, &bus, &dev, &fun) == 0 ) { - ; - }else if (BSP_pciFindDevice(0x16E3, 0x0210, 0, &bus, &dev, &fun) == 0) { - ; - } else { - /* didn't find any Companionship board on the PCI bus. */ - return -1; - } - - /* found Companionship PCI board, Set it up: */ - - pci_read_config_dword(bus, dev, fun, 0x10, &cc1.bars[0]); - pci_read_config_dword(bus, dev, fun, 0x14, &cc1.bars[1]); - pci_read_config_dword(bus, dev, fun, 0x18, &cc1.bars[2]); - pci_read_config_dword(bus, dev, fun, 0x1c, &cc1.bars[3]); - pci_read_config_dword(bus, dev, fun, 0x20, &cc1.bars[4]); - -#ifdef DEBUG - for(i=0; i<5; i++){ - printk("PCI: BAR%d: 0x%x\n\r",i,cc1.bars[i]); - } -#endif - - /* Set up PCI ==> AMBA */ - pcib = (void *)cc1.bars[0]; - pcib->bar0 = 0xfc000000; - /* pcib->bar1 = 0xff000000;*/ -#ifdef BOARD_INFO - printk("Found CCHIP1 Board at 0x%lx\n\r",(unsigned int)pcib); -#endif - - /* AMBA MAP cc1.bars[1] (in CPU) ==> 0xf0000000(remote amba address) */ - cc1.amba_maps[0].size = 0x04000000; - cc1.amba_maps[0].local_adr = cc1.bars[1]; - cc1.amba_maps[0].remote_adr = 0xfc000000; - - /* Mark end of table */ - cc1.amba_maps[1].size=0; - cc1.amba_maps[1].local_adr = 0; - cc1.amba_maps[1].remote_adr = 0; - - /* Enable I/O and Mem accesses */ - pci_read_config_dword(bus, dev, fun, 0x4, &com1); - com1 |= 0x3; - pci_write_config_dword(bus, dev, fun, 0x4, com1); - pci_read_config_dword(bus, dev, fun, 0x4, &com1); - - /* Set up AMBA Masters ==> PCI */ - ambab = (void *)(cc1.bars[1]+0x400); -#ifdef DEBUG - printk("AMBA: PCIBAR[%d]: 0x%x, 0x%x\n\r",0,ambab->bar0,pcib->bar0); - printk("AMBA: PCIBAR[%d]: 0x%x, 0x%x\n\r",1,ambab->bar1,pcib->bar1); - printk("AMBA: PCIBAR[%d]: 0x%x, 0x%x\n\r",2,ambab->bar2,pcib->bar2); -#endif - /* 0xe0000000(AMBA) ==> 0x40000000(PCI) ==> 0x40000000(AT697 AMBA) */ - ambab->ambabars[0] = 0x40000000; - - /* Scan bus for AMBA devices */ - abus = &cc1.amba_bus; - memset(abus,0,sizeof(*abus)); - ambapp_scan(abus, cc1.bars[1]+0x3f00000, NULL, &cc1.amba_maps[0]); - - /* Init all msters, max 16 */ - for(i=1; i<16; i++) { - ambab->ambabars[i] = 0x40000000; - if (READ_REG(&ambab->ambabars[i]) != 0x40000000) - break; - } - - /* Enable PCI Master */ - pci_read_config_dword(bus, dev, fun, 0x4, &com1); - com1 |= 0x4; - pci_write_config_dword(bus, dev, fun, 0x4, com1); - pci_read_config_dword(bus, dev, fun, 0x4, &com1); - - cc1.pcib = pcib; - cc1.ambab = ambab; - cc1.bus = bus; - cc1.dev = dev; - cc1.fun = fun; - - return 0; -} - -#ifndef GAISLER_FTAHBRAM - #define GAISLER_FTAHBRAM 0x50 -#endif -static int init_onboard_sram(void) -{ - struct ambapp_ahb_info ahb; - struct ambapp_apb_info apb; - unsigned int conf, size; - - /* Find SRAM controller - * 1. AHB slave interface - * 2. APB slave interface - */ - if ( ambapp_find_apbslv(&cc1.amba_bus, VENDOR_GAISLER, - GAISLER_FTAHBRAM, &apb) != 1 ){ - printk("On Board FT SRAM not found (APB)\n"); - return -1; - } - - if ( ambapp_find_ahbslv(&cc1.amba_bus, VENDOR_GAISLER, - GAISLER_FTAHBRAM, &ahb) != 1 ){ - printk("On Board FT SRAM not found (AHB)\n"); - return -1; - } - - /* We have found the controller. - * Get it going. - * - * Get size of SRAM - */ - conf = *(unsigned int *)apb.start; - size = (conf >>10) & 0x7; - - /* 2^x kb */ - cc1.ftsram_size = 1<<size; - cc1.ftsram_start = ahb.start[0]; - cc1.ftsram_end = size*1024 + cc1.ftsram_start; -#ifdef BOARD_INFO - printk("Found FT AHB SRAM %dkb at 0x%lx\n",cc1.ftsram_size,cc1.ftsram_start); -#endif - return 0; -} - -int cchip1_register(void) -{ - - /* Init AT697 PCI Controller */ - init_pci(); - - /* Find & init CChip board . - * Also scan AMBA Plug&Play info for us. - */ - if ( init_pcif() ){ - printk("Failed to initialize CCHIP board\n\r"); - return -1; - } - - /* Set interrupt common board stuff */ - cchip1_irq_init(); - - /* Find on board SRAM */ - if ( init_onboard_sram() ){ - printk("Failed to register On Board SRAM. It is needed by b1553BRM\n"); - return -1; - } - - /* Register interrupt install functions */ - b1553brm_pci_int_reg = cchip1_set_isr; - occan_pci_int_reg = cchip1_set_isr; - grspw_pci_int_reg = cchip1_set_isr; - apbuart_pci_int_reg = cchip1_set_isr; - - /* register the BRM PCI driver, use 16k FTSRAM... */ - if ( b1553brm_pci_register(&cc1.amba_bus,0,0,3,cc1.ftsram_start,0xffa00000) ){ - printk("Failed to register BRM PCI driver\n"); - return -1; - } - - /* register the BRM PCI driver, no DMA memory... */ - if ( occan_pci_register(&cc1.amba_bus) ){ - printk("Failed to register OC_CAN PCI driver\n"); - return -1; - } - - /* register the GRSPW PCI driver, use malloc... */ - if ( grspw_pci_register(&cc1.amba_bus,0,0xe0000000) ){ - printk("Failed to register GRSPW PCI driver\n"); - return -1; - } - - /* register the APBUART PCI driver, no DMA memory */ - if ( apbuart_pci_register(&cc1.amba_bus) ){ - printk("Failed to register APBUART PCI driver\n"); - return -1; - } - - return 0; -} - -static rtems_isr cchip1_interrupt_dispatcher(rtems_vector_number v); -static unsigned int cchip1_spurious_cnt; - -typedef struct { - unsigned int (*handler)(int irqno, void *arg); - void *arg; -} int_handler; - -static int_handler int_handlers[16]; - -void cchip1_irq_init(void){ - - /* Configure AT697 ioport bit 7 to input pci irq */ - regs->PIO_Direction &= ~(1<<7); - regs->PIO_Interrupt = 0x87; /* level sensitive */ - - /* Set up irq controller (mask all IRQs) */ - cc1.pcib->imask = 0x0000; - cc1.pcib->ipend = 0; - cc1.pcib->iclear = 0xffff; - cc1.pcib->iforce = 0; - cc1.pcib->ilevel = 0x0; - - memset(int_handlers,0,sizeof(int_handlers)); - - /* Reset spurious counter */ - cchip1_spurious_cnt = 0; - - /* Register interrupt handler */ - set_vector(cchip1_interrupt_dispatcher,LEON_TRAP_TYPE(CCHIP_IRQ),1); -} - -void cchip1_set_isr(void *handler, int irqno, void *arg){ - int_handlers[irqno].handler = handler; - int_handlers[irqno].arg = arg; -#ifdef DEBUG - printk("Registering IRQ %d to 0x%lx(%d,0x%lx)\n\r", - irqno,(unsigned int)handler,irqno,(unsigned int)arg); -#endif - cc1.pcib->imask |= 1<<irqno; /* Enable the registered IRQ */ -} - -static rtems_isr cchip1_interrupt_dispatcher(rtems_vector_number v){ - unsigned int pending = READ_REG(&cc1.pcib->ipend); - unsigned int (*handler)(int irqno, void *arg); - unsigned int clr = pending; - int irq=1; - - if ( !pending ){ -#ifdef PRINT_SPURIOUS - printk("Spurious IRQ %d: %d\n",v,cchip1_spurious_cnt); -#endif - cchip1_spurious_cnt++; - return; - } -#ifdef DEBUG_IRQS - printk("CCIRQ: 0x%x\n",(unsigned int)pending); -#endif - /* IRQ 0 doesn't exist */ - irq=1; - pending = pending>>1; - - while ( pending ){ - if ( (pending & 1) && (handler=int_handlers[irq].handler) ){ - handler(irq,int_handlers[irq].arg); - } - irq++; - pending = pending>>1; - } - - cc1.pcib->iclear = clr; - - /*LEON_Clear_interrupt( brd->irq );*/ -} |