📄 sysbcmpciinit.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 + -