📄 sysbuspci.c
字号:
/* sysBusPci.c - mv2400 autoconfig support *//* Copyright 1997-1999 Wind River Systems, Inc. All Rights Reserved *//* Copyright 1999 Motorola, Inc. All Rights Reserved *//*modification history--------------------01f,28may99,rhk replaced hardcoded values with define names in intLine table.01e,16apr99,rhk ensure that PCI Mem I/O space does not start at 0.01d,13apr99,rhk changed names of PCI space defines.01c,05apr99,rhk changed pciMem32Size to use entire dynamic PCI mem space.01b,12mar99,rhk changed PCI_ISA_IO_MSTR_xxx to ISA_IO_MSTR_xxx.01a,24feb99,rhk Adapted to mv2100 based on mv2400 version.*//*DESCRIPTIONThis module contains the "non-generic" or "board specific" PCI-PCIbridge 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"#include "drv/pci/pciAutoConfigLib.h"/* defines *//* typedefs *//* globals */PCI_SYSTEM sysParams;static UCHAR intLine [][4] = { { 0xff, 0xff, 0xff, 0xff }, /* device number 0 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 1 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 2 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 3 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 4 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 5 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 6 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 7 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 8 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 9 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 10 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 11 */ { 0xff, 0xff, 0xff, 0xff }, /* device number 12 */ { UNIV_INT_LVL, /* device number 13 Universe */ UNIV_INT_LVL1, UNIV_INT_LVL2, UNIV_INT_LVL3 }, { LN_INT_LVL, /* device number 14 DEC 21143 Ethernet */ 0xff, 0xff, 0xff }, { 0xff, 0xff, 0xff, 0xff }, /* device number 15 */ { PCMIPT1S1_INT_LVL, /* device number 16 PMC/PC-MIP 1 slot 0 */ PCMIPT1S1_INT_LVL, PCMIPT1S1_INT_LVL, PCMIPT1S1_INT_LVL }, { PCMIPT1S2_INT_LVL, /* device number 17 PC-MIP type 1 slot 1 */ PCMIPT1S2_INT_LVL, PCMIPT1S2_INT_LVL, PCMIPT1S2_INT_LVL }, { PCMIPT2S1_INT_LVL, /* device number 18 PC-MIP type 2 slot 0 */ PCMIPT2S1_INT_LVL, PCMIPT2S1_INT_LVL, PCMIPT2S1_INT_LVL }, { PCMIPT2S2_INT_LVL, /* device number 19 PC-MIP type 2 slot 1 */ PCMIPT2S2_INT_LVL, PCMIPT2S2_INT_LVL, PCMIPT2S2_INT_LVL }, { PCI_INTA_LVL, /* device number 20 DEC PCI-PCI bridge */ PCI_INTB_LVL, PCI_INTC_LVL, PCI_INTD_LVL } };/* 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 */ /* INCLUDED Devices */ case PCI_ID_KAHLUA_CFG: retVal = OK; PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Including Kahlua\n", 0, 0, 0, 0, 0, 0); break; case PCI_ID_UNIVERSE: retVal = OK; PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Including Universe\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; case PCI_ID_BR_DEC21150: retVal = OK; PCI_AUTO_DEBUG_MSG("sysPciAutoconfigInclude: Including DEC 21150 bridge\n", 0, 0, 0, 0, 0, 0); break; default: retVal = OK; PCI_AUTO_DEBUG_MSG("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)]; PCI_AUTO_DEBUG_MSG("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 -----------------* : :* * 0xC0000000 ----------------- PCI_MSTR_MEMIO_BUS* | NPREF PCI MEM | * 0xC0010000 ----------------- * | Unused |* 0xC1000000 ----------------- PCI_DYNAMIC_MEM_BUS* | PCI 32-bit MEM |* 0xC2000000 -----------------* * * CHRP Mapping* 0xF2000000 ----------------- PCI_DYNAMIC_MEM_BUS* | PCI 32-bit MEM | * 0xFD000000 ----------------- PCI_MSTR_MEMIO_BUS* | NPREF PCI MEM |* 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; /* 32-bit Prefetchable Memory Space */ sysParams.pciMem32 = PCI_DYNAMIC_MEM_BUS; sysParams.pciMem32Size = PCI_DYNAMIC_MEM_SIZE; /* 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); /* 32-bit PCI I/O Space */ sysParams.pciIo32 = PCI_MSTR_IO_BUS; sysParams.pciIo32Size = PCI_MSTR_IO_SIZE; /* Configuration space parameters */ sysParams.cacheSize = (_CACHE_ALIGN_SIZE/4); sysParams.maxLatency = PCI_LAT_TIMER; sysParams.autoIntRouting = TRUE; sysParams.includeRtn = sysPciAutoConfigInclude; sysParams.intAssignRtn = sysPciAutoConfigIntAsgn; sysParams.bridgePreConfigInit = NULL; sysParams.bridgePostConfigInit = NULL; /* Perform AutoConfig */ pciAutoConfig (&sysParams); return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -