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

📄 sysbuspci.c

📁 MPC8241:本程序是freescale的824*系列的BSP源程序
💻 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 + -