⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysbcmpciinit.c

📁 vxworks MPC8541 BSP
💻 C
字号:
/* sysBcmPciInit.c - PCI configuration for BCM */

/* Copyright 2006 - 2006 ZTE, Inc. */

/*
modification history
--------------------
01a,31mar06,lzq  created.
*/

/* includes */
#ifndef __BOOTROM__
#include "common/include/projectSSP.h"/*hongtao:2006-11-16:add*/
#else
#ifdef INSTALL_GCSA
#define BCM_DEV_NUM 2
#else
#define BCM_DEV_NUM 3
#endif
#endif
#include "vxWorks.h"
#include "config.h"
#include "sysBcmPciInit.h"
#ifdef INCLUDE_SDK
#include "bde/vxworks/vxbde.h"
#endif /* INCLUDE_SDK */

/* globle */

BCM_PCI_INFO bcmPciInfo[BCM_DEV_NUM];

#ifdef BCM_PCI_FORCECFG
static struct {
    UINT32 memBase;
    UINT32 ioBase;
    UINT32 intVec;
} bcmPciReso[] = { {BCM_MEM_BASE1, BCM_IO_BASE1, BCM_INT_VEC1},
                   {BCM_MEM_BASE2, BCM_IO_BASE2, BCM_INT_VEC2}
             #ifdef INSTALL_GCSD
                    , 
                   {BCM_MEM_BASE3, BCM_IO_BASE3, BCM_INT_VEC3}
             #endif
                 };
#endif /* BCM_PCI_FORCECFG */

#ifdef INCLUDE_SDK
ibde_t *bde;
#endif /* INCLUDE_SDK */

/*******************************************************************************
*
* sysBcmPciInit - BCM PCI Initialization
*
* This routine find out the PCI device, and map its memory and IO address.
*
* RETURNS: OK or ERROR.
*/

STATUS sysBcmPciInit (void)
{
    BCM_PCI_INFO *pInfo;
    int pciBus;
    int pciDevice;
    int pciFunction;
    int unit;
    BOOL duplicate;
    UINT32 membaseCsr;
    UINT32 iobaseCsr;
    char irq;
    int ix;
#ifdef BCM_PCI_FORCECFG
    UINT32 barAddr;
    UINT32 addrInfo;
    UINT32 sizeMask;
    /*UINT32 memSize[3];*/
    int bar;
#endif /* BCM_PCI_FORCECFG */

    for (unit = 0; unit < BCM_DEV_NUM; unit++)
    {
        if (pciFindDevice (BCM_VENDOR_ID, BCM_DEVICE_ID, unit,
                           &pciBus, &pciDevice, &pciFunction) != OK)
            return (ERROR);

        /* check the duplicate */

        pInfo     = &bcmPciInfo[0];
        duplicate = FALSE;

        for (ix = 0; ix < BCM_DEV_NUM; ix++, pInfo++)
        {
            if ((ix != unit) && (pInfo->pciBus == (UINT32)pciBus) &&
                (pInfo->pciDevice == (UINT32)pciDevice) && (pInfo->pciFunction == (UINT32)pciFunction))
                duplicate = TRUE;
        }

        if (duplicate)
            continue;

        /* we found the right one */

        pInfo = &bcmPciInfo[unit];
        if (pInfo->initialized == TRUE)
            continue;

        pInfo->pciBus        = pciBus;
        pInfo->pciDevice     = pciDevice;
        pInfo->pciFunction   = pciFunction;

#ifdef BCM_PCI_FORCECFG

        /* Disable I/O, Memory and Bus Mastering, preserve status bits */

        pciConfigOutWord (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_COMMAND, 0x0);

        /* Achieve requied Memory or I/O space for each implemented base addr register */

        for (bar = 0; bar < 3; bar++)
        {
            barAddr = PCI_CFG_BASE_ADDRESS_0 + bar * 4;

            pciConfigOutLong (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                              barAddr, 0xFFFFFFFF);

            pciConfigInLong (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                             barAddr, &addrInfo);

            addrInfo &= PCI_BAR_ALL_MASK;

            if ((addrInfo & PCI_BAR_SPACE_MASK) == PCI_BAR_SPACE_IO)
                sizeMask = (1 << 2);
            else
                sizeMask = (1 << 4);

            for ( ; sizeMask; sizeMask <<= 1)
            {
                if (addrInfo & sizeMask)
                {
                    /*memSize[bar] = sizeMask;*/
                    break;
                }
            }
        }

        /* Allocate Memory space for BAR0 */

        pciConfigOutLong (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_BASE_ADDRESS_0, bcmPciReso[unit].memBase);

        /* Allocate Memory space for BAR1 */

        pciConfigOutLong (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_BASE_ADDRESS_1, 0);

        /* Allocate I/O space for BAR2 */

        pciConfigOutLong (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_BASE_ADDRESS_2, bcmPciReso[unit].ioBase);

        /* Initialize the cache line size register */

        pciConfigOutByte (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_CACHE_LINE_SIZE, BCM_CLINE_SZ);

        /* Initialize the latency timer */

        pciConfigOutByte (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_LATENCY_TIMER, BCM_LAT_TIMER);

        /* Assign the interrupt vector and record interrupt line in config header */

        pciConfigOutByte (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                         PCI_CFG_DEV_INT_LINE, bcmPciReso[unit].intVec);

        /* enable mapped memory and IO addresses */

        pciConfigOutWord (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_COMMAND, PCI_CMD_IO_ENABLE |
                          PCI_CMD_MEM_ENABLE | PCI_CMD_MASTER_ENABLE);


        /* Reset all writeable status bits */

        pciConfigOutWord (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                          PCI_CFG_STATUS, 0xFFFF);

#endif /* BCM_PCI_FORCECFG */

        /* get memory base address and IO base address */

        pciConfigInLong (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                         PCI_CFG_BASE_ADDRESS_0, &membaseCsr);
        pciConfigInLong (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                         PCI_CFG_BASE_ADDRESS_2, &iobaseCsr);
        pciConfigInByte (pInfo->pciBus, pInfo->pciDevice, pInfo->pciFunction,
                         PCI_CFG_DEV_INT_LINE, &irq);

        membaseCsr &= PCI_MEMBASE_MASK;
        iobaseCsr  &= PCI_IOBASE_MASK;

        /* over write the resource table with read value */

        pInfo->memBase = PCI_MEMIO2LOCAL(membaseCsr);
        pInfo->ioBase  = PCI_IO2LOCAL(iobaseCsr);
        pInfo->intVec  = irq;

        pInfo->initialized = TRUE;
    }

    return (OK);
}

#ifdef INCLUDE_SDK
/******************************************************************************
*
* bde_create - 
*
* RETURNS: OK or ERROR.
*/

int bde_create(unit)
{
    vxbde_bus_t bus;

    bus.base_addr_start = bcmPciInfo[unit].memBase;
    bus.int_line = bcmPciInfo[unit].intVec;
    bus.be_pio = 1;
    bus.be_packet = 0;
    bus.be_other = 1;

    return vxbde_create(&bus, &bde);
}
#endif /* INCLUDE_SDK */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -