📄 sysbuspci.c
字号:
/* sysBusPci.c - prpmc600 autoconfig support */
/* Copyright 1997-2000 Wind River Systems, Inc. All Rights Reserved */
/* Copyright 1999-2000 Motorola, Inc. All Rights Reserved */
/*
modification history
--------------------
01b,21jun00,rhk documentation cleanup - updste address map layout in the
sysPciAutoConfig module header.
01a,28feb00,rhk created from version 01f, MV2100 BSP.
*/
/*
DESCRIPTION
This module contains the "non-generic" or "board specific" PCI-PCI
bridge initialization code. The module contains code to:
1. Determine if a particular function is to be excluded from the
automatic configuration process.
2. Program the "interrupt line" field of the PCI configuration header.
*/
/* includes */
#include "vxWorks.h"
#include "logLib.h"
#include "taskLib.h"
#include "config.h"
#include "drv/pci/pciConfigLib.h"
#if 0
# include "pci/pciAutoConfigLib.h"
#else
# include "./pci/pciAutoConfigLib.h"
#endif
/* defines */
/* typedefs */
/* globals */
extern int pci1200;
PCI_SYSTEM sysParams;
OTHER_DEVICE otherdev;
#ifdef INTERRUPT_ROUTING_TABLE
INTERRUPT_ROUTING_TABLE /* see config.h for definition */
#endif
/* locals */
/* forward declarations */
LOCAL UCHAR sysPciAutoConfigIntAsgn ( PCI_SYSTEM * pSys, PCI_LOC * pFunc,
UCHAR intPin );
LOCAL STATUS sysPciAutoConfigInclude ( PCI_SYSTEM *pSys, PCI_LOC *pciLoc,
UINT devVend );
/******************************************************************************
*
* sysPciAutoConfigInclude - Determine if function is to be autoConfigured
*
* This function is called with PCI bus, device, function, and vendor
* information. It returns an indication of whether or not the particular
* function should be included in the automatic configuration process.
* This capability is useful if it is desired that a particular function
* NOT be automatically configured. Of course, if the device is not
* included in automatic configuration, it will be unusable unless the
* user's code made provisions to configure the function outside of the
* the automatic process.
*
* RETURNS: TRUE if function is to be included in automatic configuration,
* FALSE otherwise.
*/
LOCAL STATUS sysPciAutoConfigInclude
(
PCI_SYSTEM *pSys, /* input: AutoConfig system information */
PCI_LOC *pciLoc, /* input: PCI address of this function */
UINT devVend /* input: Device/vendor ID number */
)
{
BOOL retVal = OK;
/* If it's the host bridge then exclude it */
if ((pciLoc->bus == 0) && (pciLoc->device == 0) && (pciLoc->function == 0))
return ERROR;
switch(devVend)
{
/* EXCLUDED Devices */
#ifndef INCLUDE_DEC2155X
case PCI_ID_BR_DEC21554:
retVal = ERROR;
PCI_AUTO_DEBUG_MSG(
"sysPciAutoconfigInclude: Excluding DEC 21554 bridge\n",
0, 0, 0, 0, 0, 0);
break;
#endif
/* EXCLUDED Devices */
case PCI_ID_HAWK:
retVal = ERROR;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Excluding Hawk\n",
0, 0, 0, 0, 0, 0);
break;
case PCI_ID_IBC:
retVal = ERROR;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Excluding IBC\n",
0, 0, 0, 0, 0, 0);
break;
case PCI_ID_IDE:
retVal = ERROR;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Excluding IDE\n",
0, 0, 0, 0, 0, 0);
break;
case PCI_ID_UNIVERSE:
retVal = ERROR;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Excluding Universe\n",
0, 0, 0, 0, 0, 0);
break;
case PCI_ID_W83C553: /* added by xdg */
retVal = ERROR;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Excluding PCI/ISA bridge\n",
0, 0, 0, 0, 0, 0);
break;
/* case PCI9030_ID:
retVal = ERROR;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Excluding PCI9030\n",
0, 0, 0, 0, 0, 0);
break;*/
case GT48004_ID:
retVal = ERROR;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Excluding GT48004\n",
0, 0, 0, 0, 0, 0);
break;
/* INCLUDED Devices */
case PCI_ID_MPC8240_CFG:
retVal = OK;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Including Mpc8240\n",
0, 0, 0, 0, 0, 0);
break;
case PCI_ID_LN_DEC21143:
retVal = OK;
PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Including DEC 21140\n",
0, 0, 0, 0, 0, 0);
break;
#ifdef INCLUDE_DEC2155X
case PCI_ID_BR_DEC21554:
retVal = OK;
PCI_AUTO_DEBUG_MSG(
"sysPciAutoconfigInclude: Including DEC 21554 bridge\n",
0, 0, 0, 0, 0, 0);
break;
#endif
case PCI_ID_LN_I82559:
case PCI_ID_LN_I82559ER:
retVal = OK;
logMsg(
"sysPciAutoconfigInclude: Including INTEL 82559 \n",
0, 0, 0, 0, 0, 0);
break;
/* case PCI_1200_ID:
if(pci1200==1)
retVal = ERROR;
else
retVal = OK;
PCI_AUTO_DEBUG_MSG(
"sysPciAutoconfigInclude: Including INTEL 1200 \n",
0, 0, 0, 0, 0, 0);
break;*/
default:
retVal = OK;
logMsg("sysPciAutoconfigInclude: Including unknown device\n",
0, 0, 0, 0, 0, 0);
break;
}
return retVal;
}
/******************************************************************************
*
* sysPciAutoConfigIntAssign - Assign the "interrupt line" value
*
* RETURNS: "interrupt line" value.
*
*/
LOCAL UCHAR sysPciAutoConfigIntAsgn
(
PCI_SYSTEM * pSys, /* input: AutoConfig system information */
PCI_LOC * pFunc,
UCHAR intPin /* input: interrupt pin number */
)
{
UCHAR irqValue = 0xff; /* Calculated value */
if (intPin == 0)
return irqValue;
irqValue = intLine [(pFunc->device)][(intPin - 1)];
/*****************kongfq**********************/
logMsg("intAssign called for device [%d %d %d] IRQ: %d\n",
pFunc->bus, pFunc->device, pFunc->function,
irqValue, 0, 0 );
return (irqValue);
}
/*******************************************************************************
*
* sysPciAutoConfig - PCI autoConfig support routine
*
* This routine instantiates the PCI_SYSTEM structure needed to configure
* the system. This consists of assigning address ranges to each category
* of PCI system resource: Prefetchable and Non-Prefetchable 32-bit Memory, and
* 16- and 32-bit I/O. The "MASK_PCI_xxx_BITS is dependant on the memory map,
* (i.e. if CHRP_ADRS_MAP is defined). Global values for the Cache Line Size
* and Maximum Latency are also specified. Finally, the four supplemental
* routines for device inclusion/exclusion, interrupt assignment, and pre- and
* post-enumeration bridge initialization are specified.
*
* ADDRESS MAPS:
*
* CPU Space PCI Space (these are the values used
* for autoconfig setup)
* PReP Mapping
* 0x80000000 ----------------- ISA_MSTR_IO_BUS
* | ISA LEGACY |
* 0x80004000 ----------------- ISA_MSTR_IO_BUS + ISA_LEGACY_SIZE
* | PCI 16-bit I/O |
* 0x81010000 -----------------
* | Unused |
* 0x81000000 ----------------- PCI_MSTR_IO_BUS
* | PCI 32-bit I/O |
* 0x81800000 -----------------
* : :
*
* 0xC1000000 ----------------- PCI_MSTR_MEMIO_BUS
* | NPREF PCI MEM |
* 0xC5000000 ----------------- PCI_MSTR_MEM_BUS
* | PCI 32-bit MEM |
* 0xC5800000 -----------------
*
*
* CHRP Mapping
* 0x80000000 ----------------- PCI_MSTR_MEMIO_BUS
* | PCI 32-bit MEM |
* 0x84000000 ----------------- PCI_MSTR_MEM_BUS
* | NPREF PCI MEM |
* 0x84800000 -----------------
* : :
*
* 0xFE000000 ----------------- ISA_MSTR_IO_BUS
* | ISA LEGACY |
* 0xFE004000 ----------------- ISA_MSTR_IO_BUS + ISA_LEGACY_SIZE
* | PCI 16-bit I/O |
* 0xFE800000 ----------------- PCI_MSTR_IO_BUS
* | PCI 32-bit I/O |
* 0xFEC00000 -----------------
*
*
* RETURNS: N/A
*/
void sysPciAutoConfig (void)
{
/*
* 32-bit Non-prefetchable Memory Space,
* offset by 0x100 so that it doesn't start at PCI address 0x0
*/
sysParams.pciMemIo32 = (PCI_MSTR_MEMIO_BUS + 0x100);
sysParams.pciMemIo32Size = PCI_MSTR_MEMIO_SIZE;
/*
* if address range starts at 0, force non-zero to avoid allocating zero
* which turns off BAR (per PCI spec).
*/
if (sysParams.pciMemIo32 == 0)
{
sysParams.pciMemIo32 += 1;
sysParams.pciMemIo32Size -= 1;
}
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciMemIo32 = 0x%08x (0x%08x)\n",
sysParams.pciMemIo32,
TRANSLATE(sysParams.pciMemIo32,PCI_MSTR_MEMIO_BUS,
PCI_MSTR_MEMIO_LOCAL),
0,0,0,0);
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciMemIo32Size = 0x%08x\n",
sysParams.pciMemIo32Size,0,0,0,0,0);
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciMemIo32End = 0x%08x (0x%08x)\n",
sysParams.pciMemIo32+sysParams.pciMemIo32Size,
TRANSLATE(sysParams.pciMemIo32+sysParams.pciMemIo32Size,
PCI_MSTR_MEMIO_BUS, PCI_MSTR_MEMIO_LOCAL),
0,0,0,0);
/* 32-bit Prefetchable Memory Space */
sysParams.pciMem32 = PCI_MSTR_MEM_BUS;
sysParams.pciMem32Size = PCI_MSTR_MEM_SIZE;
/*
* if address range starts at 0, force non-zero to avoid allocating zero
* which turns off BAR (per PCI spec).
*/
if (sysParams.pciMem32 == 0)
{
sysParams.pciMem32 += 1;
sysParams.pciMem32Size -= 1;
}
/* 16-bit ISA I/O Space - start after legacy devices, kbd, com1, ... */
sysParams.pciIo16 = (ISA_MSTR_IO_BUS + ISA_LEGACY_SIZE);
sysParams.pciIo16Size = (ISA_MSTR_IO_SIZE - ISA_LEGACY_SIZE);
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciIo16 = 0x%08x (0x%08x)\n",
sysParams.pciIo16,
TRANSLATE(sysParams.pciIo16,ISA_MSTR_IO_BUS,
ISA_MSTR_IO_LOCAL),
0,0,0,0);
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciIo16Size = 0x%08x\n",
sysParams.pciIo16Size,0,0,0,0,0);
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciIo16End = 0x%08x (0x%08x)\n",
sysParams.pciIo16+sysParams.pciIo16Size,
TRANSLATE(sysParams.pciIo16+sysParams.pciIo16Size,
ISA_MSTR_IO_BUS, ISA_MSTR_IO_LOCAL),
0,0,0,0);
/* 32-bit PCI I/O Space */
sysParams.pciIo32 = PCI_MSTR_IO_BUS;
sysParams.pciIo32Size = PCI_MSTR_IO_SIZE;
/*
* if address range starts at 0, force non-zero to avoid allocating zero
* which turns off BAR (per PCI spec).
*/
if (sysParams.pciIo32 == 0)
{
sysParams.pciIo32 += 1;
sysParams.pciIo32Size -= 1;
}
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciIo32 = 0x%08x (0x%08x)\n",
sysParams.pciIo32,
TRANSLATE(sysParams.pciIo32,PCI_MSTR_IO_BUS,
PCI_MSTR_IO_LOCAL),
0,0,0,0);
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciIo32Size = 0x%08x\n",
sysParams.pciIo32Size,0,0,0,0,0);
PCI_AUTO_DEBUG_MSG("sysPciAutoConfig: pciIo32End = 0x%08x (0x%08x)\n",
sysParams.pciIo32+sysParams.pciIo32Size,
TRANSLATE(sysParams.pciIo32+sysParams.pciIo32Size,
PCI_MSTR_IO_BUS, PCI_MSTR_IO_LOCAL),
0,0,0,0);
/* Configuration space parameters */
sysParams.cacheSize = (_CACHE_ALIGN_SIZE/4);
sysParams.maxLatency = PCI_LAT_TIMER;
sysParams.autoIntRouting = TRUE;
sysParams.includeRtn = sysPciAutoConfigInclude;
#ifdef INTERRUPT_ROUTING_TABLE
sysParams.intAssignRtn = sysPciAutoConfigIntAsgn;
#else
sysParams.intAssignRtn = NULL;
#endif
sysParams.bridgePreConfigInit = NULL;
sysParams.bridgePostConfigInit = NULL;
/* Perform AutoConfig */
pciAutoConfig (&sysParams);
otherdev.pciMem32 = sysParams.pciMem32;
otherdev.pciMem32Size = sysParams.pciMem32Size;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -