Changeset 80b9c8ac in rtems


Ignore:
Timestamp:
Dec 20, 2013, 1:03:10 PM (5 years ago)
Author:
Daniel Hellstrom <daniel@…>
Branches:
4.11, master
Children:
9b8e04e
Parents:
fc76056e
git-author:
Daniel Hellstrom <daniel@…> (12/20/13 13:03:10)
git-committer:
Daniel Hellstrom <daniel@…> (04/16/15 23:10:20)
Message:

GR-RASTA-IO: updated for new version

From this driver's point of view the major new thing is that the
GRPCI peripheral PCI bridge has been updated to GRPCI2, the second
version. This means that both Big and Little Endian systems are now
supported and autodetected on runtime.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/sparc/shared/pci/gr_rasta_io.c

    rfc76056e r80b9c8ac  
    4545#define AHB1_BASE_ADDR 0x80000000
    4646#define AHB1_IOAREA_BASE_ADDR 0x80100000
     47#define AHB1_IOAREA_OFS (AHB1_IOAREA_BASE_ADDR - AHB1_BASE_ADDR)
     48
     49/* Second revision constants (GRPCI2) */
     50#define GRPCI2_BAR0_TO_AHB_MAP 0x04  /* Fixme */
     51#define GRPCI2_BAR1_TO_AHB_MAP 0x08  /* Fixme */
     52#define GRPCI2_PCI_CONFIG      0x20  /* Fixme */
     53
    4754
    4855/* #define DEBUG 1 */
     
    7077};
    7178
     79struct grpci2_regs {
     80        volatile unsigned int ctrl;
     81        volatile unsigned int statcap;
     82        volatile unsigned int pcimstprefetch;
     83        volatile unsigned int ahbtopciiomap;
     84        volatile unsigned int dmactrl;
     85        volatile unsigned int dmadesc;
     86        volatile unsigned int dmachanact;
     87        volatile unsigned int reserved;
     88        volatile unsigned int pcibartoahb[6];
     89        volatile unsigned int reserved2[2];
     90        volatile unsigned int ahbtopcimemmap[16];
     91        volatile unsigned int trcctrl;
     92        volatile unsigned int trccntmode;
     93        volatile unsigned int trcadpat;
     94        volatile unsigned int trcadmask;
     95        volatile unsigned int trcctrlsigpat;
     96        volatile unsigned int trcctrlsigmask;
     97        volatile unsigned int trcadstate;
     98        volatile unsigned int trcctrlsigstate;
     99};
     100
    72101struct gr_rasta_io_ver {
    73102        const unsigned int      amba_freq_hz;   /* The frequency */
     
    93122        struct irqmp_regs               *irq;
    94123        struct grpci_regs               *grpci;
     124        struct grpci2_regs              *grpci2;
    95125        struct drvmgr_map_entry         bus_maps_down[3];
    96126        struct drvmgr_map_entry         bus_maps_up[2];
     
    224254}
    225255
     256/* PCI Hardware (Revision 0 and 1) initialization */
    226257int gr_rasta_io_hw_init(struct gr_rasta_io_priv *priv)
    227258{
     
    233264        uint32_t bar0, bar0_size;
    234265
    235         /* Select version of GR-RASTA-IO board */
    236         switch (devinfo->rev) {
    237                 case 0:
    238                         priv->version = &gr_rasta_io_ver0;
    239                         break;
    240                 case 1:
    241                         priv->version = &gr_rasta_io_ver1;
    242                         break;
    243                 default:
    244                         return -2;
    245         }
    246 
    247266        bar0 = devinfo->resources[0].address;
    248267        bar0_size = devinfo->resources[0].size;
     
    250269
    251270        /* Point PAGE0 to start of Plug and Play information */
    252         *page0 = priv->version->amba_ioarea & 0xf0000000;
     271        *page0 = priv->version->amba_ioarea & 0xff000000;
    253272
    254273#if 0
     
    272291        priv->amba_maps[0].size = bar0_size/2;
    273292        priv->amba_maps[0].local_adr = bar0;
    274         priv->amba_maps[0].remote_adr = 0x80000000;
     293        priv->amba_maps[0].remote_adr = AHB1_BASE_ADDR;
    275294
    276295        /* AMBA MAP bar1 (in CPU) ==> 0x40000000(remote amba address) */
     
    291310        /* Start AMBA PnP scan at first AHB bus */
    292311        ambapp_scan(&priv->abus,
    293                         bar0 + (priv->version->amba_ioarea & ~0xf0000000),
     312                        bar0 + (priv->version->amba_ioarea & ~0xff000000),
    294313                        NULL, &priv->amba_maps[0]);
    295314
     
    298317
    299318        /* Point PAGE0 to start of APB area */
    300         *page0 = 0x80000000;   
     319        *page0 = AHB1_BASE_ADDR;       
    301320
    302321        /* Find GRPCI controller */
     
    366385
    367386        /* Successfully registered the RASTA board */
     387        return 0;
     388}
     389
     390/* PCI Hardware (Revision 1) initialization */
     391int gr_rasta_io2_hw_init(struct gr_rasta_io_priv *priv)
     392{
     393        int i;
     394        uint32_t data;
     395        unsigned int ctrl;
     396        uint8_t tmp2;
     397        struct ambapp_dev *tmp;
     398        int status;
     399        struct ambapp_ahb_info *ahb;
     400        uint8_t cap_ptr;
     401        pci_dev_t pcidev = priv->pcidev;
     402        struct pci_dev_info *devinfo = priv->devinfo;
     403        unsigned int pci_freq_hz;
     404
     405        /* Check capabilities list bit */
     406        pci_cfg_r8(pcidev, PCI_STATUS, &tmp2);
     407
     408        if (!((tmp2 >> 4) & 1)) {
     409                /* Capabilities list not available which it should be in the
     410                 * GRPCI2
     411                 */
     412                return -3;
     413        }
     414
     415        /* Read capabilities pointer */
     416        pci_cfg_r8(pcidev, PCI_CAP_PTR, &cap_ptr);
     417
     418        /* Set AHB address mappings for target PCI bars
     419         * BAR0: 16MB  : Mapped to I/O at 0x80000000
     420         * BAR1: 256MB : Mapped to MEM at 0x40000000
     421         */
     422        pci_cfg_w32(pcidev, cap_ptr+GRPCI2_BAR0_TO_AHB_MAP, AHB1_BASE_ADDR);
     423        pci_cfg_w32(pcidev, cap_ptr+GRPCI2_BAR1_TO_AHB_MAP, 0x40000000);
     424
     425        /* Set PCI bus to be same endianess as PCI system */
     426        pci_cfg_r32(pcidev, cap_ptr+GRPCI2_PCI_CONFIG, &data);
     427        if (pci_endian == PCI_BIG_ENDIAN)
     428                data = data & 0xFFFFFFFE;
     429        else
     430                data = data | 0x00000001;
     431        pci_cfg_w32(pcidev, cap_ptr+GRPCI2_PCI_CONFIG, data);
     432
     433#if 0
     434        /* set parity error response */
     435        pci_cfg_r32(pcidev, PCI_COMMAND, &data);
     436        pci_cfg_w32(pcidev, PCI_COMMAND, (data|PCI_COMMAND_PARITY));
     437#endif
     438
     439        /* Scan AMBA Plug&Play */
     440
     441        /* AMBA MAP bar0 (in PCI) ==> 0x40000000 (remote amba address) */
     442        priv->amba_maps[0].size = devinfo->resources[0].size;
     443        priv->amba_maps[0].local_adr = devinfo->resources[0].address;
     444        priv->amba_maps[0].remote_adr = AHB1_BASE_ADDR;
     445
     446        /* AMBA MAP bar0 (in PCI) ==> 0x80000000 (remote amba address) */
     447        priv->amba_maps[1].size = devinfo->resources[1].size;
     448        priv->amba_maps[1].local_adr = devinfo->resources[1].address;
     449        priv->amba_maps[1].remote_adr = 0x40000000;
     450
     451        /* Addresses not matching with map be untouched */
     452        priv->amba_maps[2].size = 0xfffffff0;
     453        priv->amba_maps[2].local_adr = 0;
     454        priv->amba_maps[2].remote_adr = 0;
     455
     456        /* Mark end of table */
     457        priv->amba_maps[3].size=0;
     458
     459        /* Start AMBA PnP scan at first AHB bus */
     460        ambapp_scan(
     461                &priv->abus,
     462                devinfo->resources[0].address + AHB1_IOAREA_OFS,
     463                NULL,
     464                &priv->amba_maps[0]);
     465
     466        /* Initialize Frequency of AMBA bus. The AMBA bus runs at same
     467         * frequency as PCI bus
     468         */
     469        ambapp_freq_init(&priv->abus, NULL, priv->version->amba_freq_hz);
     470
     471        /* Find IRQ controller, Clear all current IRQs */
     472        tmp = (struct ambapp_dev *)ambapp_for_each(&priv->abus,
     473                                (OPTIONS_ALL|OPTIONS_APB_SLVS),
     474                                VENDOR_GAISLER, GAISLER_IRQMP,
     475                                ambapp_find_by_idx, NULL);
     476        if ( !tmp ) {
     477                return -4;
     478        }
     479        priv->irq = (struct irqmp_regs *)DEV_TO_APB(tmp)->start;
     480        /* Set up GR-RASTA-SPW-ROUTER irq controller */
     481        priv->irq->mask[0] = 0;
     482        priv->irq->iclear = 0xffff;
     483        priv->irq->ilevel = 0;
     484
     485        priv->bus_maps_down[0].name = "PCI BAR0 -> AMBA";
     486        priv->bus_maps_down[0].size = priv->amba_maps[0].size;
     487        priv->bus_maps_down[0].from_adr = (void *)priv->amba_maps[0].local_adr;
     488        priv->bus_maps_down[0].to_adr = (void *)priv->amba_maps[0].remote_adr;
     489        priv->bus_maps_down[1].name = "PCI BAR1 -> AMBA";
     490        priv->bus_maps_down[1].size = priv->amba_maps[1].size;
     491        priv->bus_maps_down[1].from_adr = (void *)priv->amba_maps[1].local_adr;
     492        priv->bus_maps_down[1].to_adr = (void *)priv->amba_maps[1].remote_adr;
     493        priv->bus_maps_down[2].size = 0;
     494
     495        /* Find GRPCI2 controller AHB Slave interface */
     496        tmp = (void *)ambapp_for_each(&priv->abus,
     497                                        (OPTIONS_ALL|OPTIONS_AHB_SLVS),
     498                                        VENDOR_GAISLER, GAISLER_GRPCI2,
     499                                        ambapp_find_by_idx, NULL);
     500        if ( !tmp ) {
     501                return -5;
     502        }
     503        ahb = (struct ambapp_ahb_info *)tmp->devinfo;
     504        priv->bus_maps_up[0].name = "AMBA GRPCI2 Window";
     505        priv->bus_maps_up[0].size = ahb->mask[0]; /* AMBA->PCI Window on GR-RASTA-SPW-ROUTER board */
     506        priv->bus_maps_up[0].from_adr = (void *)ahb->start[0];
     507        priv->bus_maps_up[0].to_adr = (void *)
     508                                (priv->ahbmst2pci_map & ~(ahb->mask[0]-1));
     509        priv->bus_maps_up[1].size = 0;
     510
     511        /* Find GRPCI2 controller APB Slave interface */
     512        tmp = (void *)ambapp_for_each(&priv->abus,
     513                                        (OPTIONS_ALL|OPTIONS_APB_SLVS),
     514                                        VENDOR_GAISLER, GAISLER_GRPCI2,
     515                                        ambapp_find_by_idx, NULL);
     516        if ( !tmp ) {
     517                return -6;
     518        }
     519        priv->grpci2 = (struct grpci2_regs *)
     520                ((struct ambapp_apb_info *)tmp->devinfo)->start;
     521
     522        /* Set AHB to PCI mapping for all AMBA AHB masters */
     523        for(i = 0; i < 16; i++) {
     524                priv->grpci2->ahbtopcimemmap[i] = priv->ahbmst2pci_map &
     525                                                        ~(ahb->mask[0]-1);
     526        }
     527
     528        /* Make sure dirq(0) sampling is enabled */
     529        ctrl = priv->grpci2->ctrl;
     530        ctrl = (ctrl & 0xFFFFFF0F) | (1 << 4);
     531        priv->grpci2->ctrl = ctrl;
     532
     533        /* Successfully registered the RASTA-SPW-ROUTER board */
    368534        return 0;
    369535}
     
    449615        }
    450616
    451         status = gr_rasta_io_hw_init(priv);
     617        /* Select version of GR-RASTA-IO board */
     618        switch (devinfo->rev) {
     619                case 0:
     620                        priv->version = &gr_rasta_io_ver0;
     621                        status = gr_rasta_io_hw_init(priv);
     622                        break;
     623                case 1:
     624                        priv->version = &gr_rasta_io_ver1;
     625                        status = gr_rasta_io_hw_init(priv);
     626                        break;
     627                case 2:
     628                        priv->version = &gr_rasta_io_ver1; /* same cfg as 1 */
     629                        status = gr_rasta_io2_hw_init(priv);
     630                        break;
     631                default:
     632                        return -2;
     633        }
     634
    452635        if ( status != 0 ) {
    453636                genirq_destroy(priv->genirq);
Note: See TracChangeset for help on using the changeset viewer.