po_hi_driver_rasta_common.c 10.9 KB
Newer Older
1 2 3 4 5
/*
 * This is a part of PolyORB-HI-C distribution, a minimal
 * middleware written for generated code from AADL models.
 * You should use it with the Ocarina toolsuite.
 *
yoogx's avatar
yoogx committed
6
 * For more informations, please visit http://taste.tuxfamily.org/wiki
jhugues's avatar
jhugues committed
7
 *
yoogx's avatar
yoogx committed
8
 * Copyright (C) 2010-2017 ESA & ISAE.
9 10 11 12 13 14
 */

#include <deployment.h>
/* Generated code header */

#if ((defined __PO_HI_NEED_DRIVER_SPACEWIRE_RASTA) || \
yoogx's avatar
yoogx committed
15 16 17 18
     (defined __PO_HI_NEED_DRIVER_SERIAL_RASTA) || \
     (defined __PO_HI_NEED_DRIVER_ETH_LEON ))
     
#include <rtems.h>
19 20 21
#include <rtems/bspIo.h>
#include <ambapp.h>

yoogx's avatar
yoogx committed
22 23
#ifdef GRLEON2
#include <grspw_rasta.h>
24 25 26
#include <pci.h>
#include <rasta.h>
#include <apbuart_rasta.h>
yoogx's avatar
yoogx committed
27 28
#endif

29 30
/* Rasta includes from GAISLER drivers */

yoogx's avatar
yoogx committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
#if defined GRLEON3 && defined RTEMS412 
#include <amba.h>
#include <ambapp.h>
#include <drvmgr/drvmgr.h>
#include <drvmgr/ambapp_bus_grlib.h>
#include <drvmgr/ambapp_bus.h>
/* GRSPW0 resources  */
struct drvmgr_key grlib_grspw0_res[] =

{
	{"txDesc", DRVMGR_KT_INT, {(unsigned int)16}},
	{"rxDesc", DRVMGR_KT_INT, {(unsigned int)32}},
	DRVMGR_KEY_EMPTY
};
/* GRSPW1 and GRSPW2 resources */
struct drvmgr_key grlib_grspw1_res[] =

{
	{"txDesc", DRVMGR_KT_INT, {(unsigned int)16}},
	{"rxDesc", DRVMGR_KT_INT, {(unsigned int)32}},
	DRVMGR_KEY_EMPTY
};
/* GRSPW1 and GRSPW2 resources */
struct drvmgr_key grlib_grspw2_res[] =

{
	{"txDesc", DRVMGR_KT_INT, {(unsigned int)16}},
	{"rxDesc", DRVMGR_KT_INT, {(unsigned int)32}},
	DRVMGR_KEY_EMPTY
};
struct drvmgr_key grlib_greth0_res[] =

{
	{"txDescs", DRVMGR_KT_INT, {(unsigned int)16}},
	{"rxDescs", DRVMGR_KT_INT, {(unsigned int)32}},
	DRVMGR_KEY_EMPTY
};
struct drvmgr_key grlib_grcan0_res[] =

{
	{"txDescs", DRVMGR_KT_INT, {(unsigned int)16}},
	{"rxDescs", DRVMGR_KT_INT, {(unsigned int)32}},
	DRVMGR_KEY_EMPTY
};
/* GRLIB Plug & Play bus driver resources */
struct drvmgr_drv_res grlib_drv_resources[] =

{
	{DRIVER_AMBAPP_GAISLER_GRSPW2_ID, 0, &grlib_grspw0_res[0]},
	{DRIVER_AMBAPP_GAISLER_GRSPW2_ID, 1, &grlib_grspw1_res[0]},
	{DRIVER_AMBAPP_GAISLER_GRSPW2_ID, 2, &grlib_grspw2_res[0]},
	{DRIVER_AMBAPP_GAISLER_GRCAN_ID, 0, &grlib_grcan0_res[0]},
	{DRIVER_AMBAPP_GAISLER_GRETH_ID, 0, &grlib_greth0_res[0]},
	DRVMGR_RES_EMPTY
};

struct grlib_config grlib_bus_config = 
{
	&ambapp_plb,		/* AMBAPP bus setup */
	&grlib_drv_resources,	/* Driver configuration */
};
#endif

94 95 96
#include <po_hi_debug.h>
/* PolyORB-HI-C includes */

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
#define DBG printk

/* If RASTA_SRAM is defined SRAM will be used, else SDRAM */
/*#define RASTA_SRAM 1*/

#define RASTA_IRQ  5

/* Offset from 0x80000000 (dual bus version) */
#define AHB1_IOAREA_BASE_ADDR 0x80100000
#define APB2_OFFSET    0x200000
#define IRQ_OFFSET     0x200500
#define GRHCAN_OFFSET  0x201000
#define BRM_OFFSET     0x100000
#define SPW_OFFSET     0xa00
#define UART_OFFSET    0x200200
#define GPIO0_OFF      0x200600
#define GPIO1_OFF      0x200700

115 116 117
#ifndef GAISLER_GPIO
#define GAISLER_GPIO         0x01a
#endif
118

119 120
int __po_hi_c_driver_rasta_common_is_init = 0;

yoogx's avatar
yoogx committed
121
#if defined RTEMS48 || defined RTEMS410
122
int apbuart_rasta_register(amba_confarea_type *bus);
123 124 125 126 127 128 129 130
static amba_confarea_type abus;
extern LEON3_IrqCtrl_Regs_Map *irq;
extern LEON_Register_Map      *regs;

amba_confarea_type* __po_hi_driver_rasta_common_get_bus ()
{
   return &abus;
}
131 132 133 134 135 136 137 138 139 140 141
#elif RTEMS411
extern int apbuart_rasta_register(struct ambapp_bus *bus);
static struct ambapp_bus  abus;
/* Why do we have LEON3 specifics here ???
extern LEON3_IrqCtrl_Regs_Map *irq;
extern LEON_Register_Map      *regs;
*/
struct ambapp_bus * __po_hi_driver_rasta_common_get_bus ()
{
   return &abus;
}
yoogx's avatar
yoogx committed
142 143
#elif RTEMS412
 ;
144 145 146
#else
#error "o<"
#endif
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161

void *uart0_int_arg, *uart1_int_arg;
void *spw0_int_arg, *spw1_int_arg, *spw2_int_arg;
void *grcan_int_arg;
void *brm_int_arg;

extern void (*uart0_int_handler)(int irq, void *arg);
extern void (*uart1_int_handler)(int irq, void *arg);
extern void (*spw0_int_handler)(int irq, void *arg);
extern void (*spw1_int_handler)(int irq, void *arg);
extern void (*spw2_int_handler)(int irq, void *arg);
extern void (*grcan_int_handler)(int irq, void *arg);
extern void (*brm_int_handler)(int irq, void *arg);


162

163
unsigned int __po_hi_driver_rasta_bar0, __po_hi_driver_rasta_bar1;
164

165
/*
166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234

void __po_hi_rasta_interrrupt_register(void *handler, int irqno, void *arg)
{
  DBG("RASTA: Registering irq %d\n",irqno);
  if ( irqno == UART0_IRQNO ){
    DBG("RASTA: Registering uart0 handler: 0x%x, arg: 0x%x\n",handler,arg);
    uart0_int_handler = handler;
    uart0_int_arg = arg;
    
    irq->iclear = UART0_IRQ;
    irq->mask[0] |= UART0_IRQ;
  }
  
  if ( irqno == UART1_IRQNO ){
    DBG("RASTA: Registering uart1 handler: 0x%x, arg: 0x%x\n",handler,arg);
    uart1_int_handler = handler;
    uart1_int_arg = arg;
    
    irq->iclear = UART1_IRQ;
    irq->mask[0] |= UART1_IRQ;
  }
  
  if ( irqno == SPW0_IRQNO ){
    DBG("RASTA: Registering spw0 handler: 0x%x, arg: 0x%x\n",handler,arg);
    spw0_int_handler = handler;
    spw0_int_arg = arg;
    
    irq->iclear = SPW0_IRQ;
    irq->mask[0] |= SPW0_IRQ;
  }

  if ( irqno == SPW1_IRQNO ){
    DBG("RASTA: Registering spw1 handler: 0x%x, arg: 0x%x\n",handler,arg);
    spw1_int_handler = handler;
    spw1_int_arg = arg;
    
    irq->iclear = SPW1_IRQ;
    irq->mask[0] |= SPW1_IRQ;
  }
  
  if ( irqno == SPW2_IRQNO ){
    DBG("RASTA: Registering spw2 handler: 0x%x, arg: 0x%x\n",handler,arg);
    spw2_int_handler = handler;
    spw2_int_arg = arg;
    
    irq->iclear = SPW2_IRQ;
    irq->mask[0] |= SPW2_IRQ;
  }
  
  if ( irqno == GRCAN_IRQNO ){
    DBG("RASTA: Registering GRCAN handler: 0x%x, arg: 0x%x\n",handler,arg);
    grcan_int_handler = handler;
    grcan_int_arg = arg;
    
    irq->iclear = GRCAN_IRQ;
    irq->mask[0] |= GRCAN_IRQ;
  }
  
  if ( irqno == BRM_IRQNO ){
    DBG("RASTA: Registering BRM handler: 0x%x, arg: 0x%x\n",handler,arg);
    brm_int_handler = handler;
    brm_int_arg = arg;
    
    irq->iclear = BRM_IRQ;
    irq->mask[0] |= BRM_IRQ;
  } 
}


235
static rtems_isr __po_hi_rasta_interrupt_handler (rtems_vector_number v)
236
{
237 238 239
    unsigned int status;
 
    status = irq->ipend;
240

241 242 243 244 245 246 247 248
    if ( (status & GRCAN_IRQ) && grcan_int_handler ) {
      grcan_int_handler(GRCAN_IRQNO,grcan_int_arg);
    }
    
    if (status & SPW_IRQ) {
      if ( (status & SPW0_IRQ) && spw0_int_handler ){
        spw0_int_handler(SPW0_IRQNO,spw0_int_arg);
      }
249

250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
      if ( (status & SPW1_IRQ) && spw1_int_handler ){
        spw1_int_handler(SPW1_IRQNO,spw1_int_arg);
      }
      
      if ( (status & SPW2_IRQ) && spw2_int_handler ){
        spw2_int_handler(SPW2_IRQNO,spw2_int_arg);
      }
    }
    if ((status & BRM_IRQ) && brm_int_handler ){ 
        brm_int_handler(BRM_IRQNO,brm_int_arg);
    }
    if ( (status & UART0_IRQ) && uart0_int_handler ) {
      uart0_int_handler(UART0_IRQNO,uart0_int_arg);
    }
    if ( (status & UART1_IRQ) && uart1_int_handler) {
      uart1_int_handler(UART1_IRQNO,uart1_int_arg);
    }
    
    DBG("RASTA-IRQ: 0x%x\n",status);
    irq->iclear = status;
 
}
272 273 274 275


int __po_hi_rasta_register(void) 
{
276 277
       unsigned int bar0, bar1, data;

278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297
    unsigned int *page0 = NULL;
    unsigned int *apb_base = NULL;
    int found=0;
    

    DBG("Searching for RASTA board ...");
    
    if (BSP_pciFindDevice(0x1AC8, 0x0010, 0, &bus, &dev, &fun) == 0) {
      found = 1;
    }
    
    if ( (!found) && (BSP_pciFindDevice(0x16E3, 0x0210, 0, &bus, &dev, &fun) == 0) ) {
      found = 1;
    }
    
    if ( !found )
      return -1;
    
    DBG(" found it (dev/fun: %d/%d).\n", dev, fun);

298 299
    pci_read_config_dword(bus, dev, fun, 0x10, &bar0);
    pci_read_config_dword(bus, dev, fun, 0x14, &bar1);
300

301 302
    page0 = (unsigned int *)(bar0 + 0x400000); 
    *page0 = 0x80000000;
303

304
    apb_base = (unsigned int *)(bar0+APB2_OFFSET);
305 306 307 308 309 310 311 312 313 314

#ifdef RASTA_SRAM
    apb_base[0] = 0x000002ff;
    apb_base[1] = 0x00001260;
    apb_base[2] = 0x000e8000;
#else 
    apb_base[0] = 0x000002ff;
    apb_base[1] = 0x82206000;
    apb_base[2] = 0x000e8000;
#endif
315
    irq = (LEON3_IrqCtrl_Regs_Map *) (bar0+IRQ_OFFSET); 
316 317 318 319 320
    irq->iclear = 0xffff;
    irq->ilevel = 0;
    irq->mask[0] = 0xffff & ~(UART0_IRQ|UART1_IRQ|SPW0_IRQ|SPW1_IRQ|SPW2_IRQ|GRCAN_IRQ|BRM_IRQ);

    regs->PIO_Direction &= ~(1<<7);
321
    regs->PIO_Interrupt |= (0x87<<8);
322

323 324
    apb_base[0x100] |= 0x40000000;
    apb_base[0x104] =  0x40000000;
325

326
    
327 328 329 330 331 332 333 334
    pci_read_config_dword(bus, dev, fun, 0x4, &data);
    pci_write_config_dword(bus, dev, fun, 0x4, data|0x40);
     
    pci_master_enable(bus, dev, fun);

    set_vector(__po_hi_rasta_interrupt_handler, RASTA_IRQ+0x10, 1);

    amba_maps[0].size = 0x10000000;
335
    amba_maps[0].cpu_adr = bar0;
336 337 338
    amba_maps[0].remote_amba_adr = 0x80000000;

    amba_maps[1].size = 0x10000000;
339
    amba_maps[1].cpu_adr = bar1;
340 341 342 343 344 345 346 347
    amba_maps[1].remote_amba_adr = 0x40000000;

    amba_maps[2].size=0;
    amba_maps[2].cpu_adr = 0;
    amba_maps[2].remote_amba_adr = 0;
        
    memset(&abus,0,sizeof(abus));
        
348 349 350
    amba_scan(&abus,bar0+(AHB1_IOAREA_BASE_ADDR&~0xf0000000),&amba_maps[0]);
        
    printk("Registering RASTA BRM driver\n\r");
351

352 353 354 355 356 357 358 359 360 361
    b1553brm_rasta_int_reg=__po_hi_rasta_interrrupt_register;
          if ( b1553brm_rasta_register(&abus,2,0,3,bar1,0x40000000) ){
      printk("Failed to register BRM RASTA driver\n");
      return -1;
    }
        
    grspw_rasta_int_reg=__po_hi_rasta_interrrupt_register;
    if ( grspw_rasta_register(&abus,bar1) ){
      printk("Failed to register RASTA GRSPW driver\n\r");
      return -1;
362
    }
363

364 365 366 367 368
    apbuart_rasta_int_reg=__po_hi_rasta_interrrupt_register;
    if ( apbuart_rasta_register(&abus) ){
      printk("Failed to register RASTA APBUART driver\n\r");
      return -1;
    }
369

370 371
    if ( rasta_get_gpio(&abus,0,&gpio0,NULL) ){
      printk("Failed to get address for RASTA GPIO0\n\r");
372 373
      return -1;
    }
374 375 376 377 378 379
        
    if ( rasta_get_gpio(&abus,1,&gpio1,NULL) ){
      printk("Failed to get address for RASTA GPIO1\n\r");
      return -1;
    }
    
380 381
    return 0;
}
382 383
*/

384

385 386 387 388
void __po_hi_c_driver_rasta_common_init ()
{
   if (__po_hi_c_driver_rasta_common_is_init == 1)
   {
389
      __PO_HI_DEBUG_DEBUG ("[RASTA COMMON] RASTA already initialized, pass init\n");
390 391 392
      return;
   }

yoogx's avatar
yoogx committed
393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
#if defined GRLEON3 && defined RTEMS412
   /* Register GRLIB root bus */
   ambapp_grlib_root_register(&grlib_bus_config);

   /* Initializing Driver Manager if not alread performed by BSP */
   __PO_HI_DEBUG_DEBUG("Initializing Driver manager...\n");
   if ( drvmgr_init() ) {
        __PO_HI_DEBUG_DEBUG ("Driver manager Failed to initialize\n");
        exit(-1);
        }
#if __PO_HI_DEBUG_LEVEL >= __PO_HI_DEBUG_LEVEL_DEBUG
   /* Print Driver manager drivers and their assigned devices */
   __PO_HI_DEBUG_DEBUG("[drvmgr] ");
   drvmgr_summary();
#endif

#elif GRLEON2
   
411
   __PO_HI_DEBUG_DEBUG ("[RASTA COMMON] Init\n");
412
   init_pci();
413
   __PO_HI_DEBUG_DEBUG ("[RASTA COMMON] Initializing RASTA ...");
414
  /*
415
  if  (__po_hi_rasta_register() ){
416
    __PO_HI_DEBUG_DEBUG (" ERROR !\n");
417 418
    return;
  }
419
  */
420

421
  if  (rasta_register() ){
422
    __PO_HI_DEBUG_DEBUG(" ERROR !\n");
423 424
    return;
  }
yoogx's avatar
yoogx committed
425
#endif   
426
    __PO_HI_DEBUG_DEBUG (" OK !\n");
427 428 429 430 431

   __po_hi_c_driver_rasta_common_is_init = 1;
}

#endif