pciconfig.c

来自「大名鼎鼎的mpc8260的bsp源代码」· C语言 代码 · 共 329 行

C
329
字号
#include <vxworks.h>
#include <drv/pci/PCIConfigLib.h>
#include "PCIConfig.h"

UINT32 PCIDeviceTable[PCI_DEVICE_NUM] =
    {
    /* vendid+deviceid*/
    0x102c00c0
	};

UINT32	PCIDeviceBASE[PCI_DEVICE_NUM][2] =
{
	/*IO-space BASE,Memory-space BASE*/
	{0,0x80000000}

};

/******************************************************************************
*
* SysQspanHwInit - initialize the QSpan PCIBus bridge controller
*
* This function's purpose is to initialize the QSpan device.  This
* device spans the QBus to PCIBus.
*
* RETURNS: N/A
*/

void SysQspanHwInit(PQSPAN qspanAdr)
{
	/*Enable the qspan as the PCI Master*/
	qspanHostEnable(qspanAdr);

    /*
     * setup the synchronous bus grant and bus grant acknowledge,
     * setup the byte ordering: big endian or little endian
     * setup the master/slave mode
     * for QSPAN chips of rev. 1.2 or greater, set the Master Abort
     * bit to disable Bus error mapping
     */
     qspanAdr->misc_ctl = QSPAN_SET_S_BG | QSPAN_SET_S_BB |
		    QSPAN_BOC_BE | QSPAN_MA_BE_D | QSPAN_MSTSLV_3 ;	/*0x800*/

	/*setup the PCI BUS to Access the memory space*/
	qspanSpaceAccesses(qspanAdr,PCI_CS_MS);

	sysPCISpaceAssign();
	
	qspanIOControl(qspanAdr,PCI_CS_MS);
}



/******************************************************************************
*
* qspanHostReset - reset the QSpan PCIBus bridge controller
*
* This function's purpose is to reset the QSpan device.
*
* RETURNS: N/A
*/
void qspanHostReset
    (
    PQSPAN qspanAdr        /* base address of the QSpan device regs. */
    )
{

    /*
     * clear all PCI error status
     * disable SERR, and PERR
     * disable I/O-space, memory-space, and bus mastering
     */
	qspanAdr->pci_cs = QSPAN_CLR_D_PE | QSPAN_CLR_S_SERR | QSPAN_CLR_R_MA |
                QSPAN_CLR_R_TA | QSPAN_CLR_S_TA | QSPAN_CLR_DP_D;

    EIEIO_SYNC;
}

/******************************************************************************
*
* qspanHostEnable - enable the bridge
*
* This function enables I/O-space, memory-space, and bus mastering on
* the host.
*
* RETURNS: N/A
*/

void qspanHostEnable
    (
    PQSPAN      qspanAdr        /* base address of the QSpan device regs. */
    )
{
    UINT32 temp;

    /*
     * clear all QBus error status
     * enable QBus error log
     */

	qspanAdr->qb_errcs = QSPAN_ENABLE_ERR_LOG | QSPAN_CLR_QES;	/*0xF80*/

    /* enable I/O-space, memory-space, and bus mastering */

    EIEIO_SYNC;
    qspanAdr->pci_cs |= QSPAN_ENABLE_BM;	/*0x004*/
    EIEIO_SYNC;
}

/******************************************************************************
*
* qspanSpaceAccesses - enable the PCI access space
*
* This function enables I/O-space or memory-space
*
* RETURNS: N/A
*/

void qspanSpaceAccesses
	(
	PQSPAN 	qspanAdr,
	UINT8 	status
	)
{
	UINT32 Temp;
	UINT32 Base;

	if((status&PCI_CS_IOS)==PCI_CS_IOS)
	{	/*I/O space*/

		qspanAdr->qbsi1_ctl |= QBSI0_CTL_PAS;	/*0xF10*/

		qspanAdr->pci_cs &= (~PCI_CS_MS);
		qspanAdr->pci_cs |= PCI_CS_IOS;
	}
	else
	if((status&PCI_CS_MS)==PCI_CS_MS)
	{	/*MEM space*/
		qspanAdr->qbsi1_ctl &= (~QBSI0_CTL_PAS);

		qspanAdr->pci_cs |= PCI_CS_MS;
		qspanAdr->pci_cs &= (~PCI_CS_IOS);
	}
}

/******************************************************************************
*
* qspanBurstConfigure - enable/disable the PCI access Burst mode
*
* This function enable/disable the PCI access Burst mode
*
* RETURNS: N/A
*/
void qspanBurstConfigure
	(
	PQSPAN qspanAdr,
	UINT8 	image,
	UINT8	status
	)
{
	UINT32 Temp;
	/*enable the burst and the deep is 8 ×32 bit */

	if(image == QSPAN_PCI_CHNL0)
	{
		if(status==0x01)
		{
			/*the size of the cache line is 8*32 bit word*/
			qspanAdr->pci_misc0 = 0x00000008;
			
			qspanAdr->qbsi0_ctl |= QSPAN_QBSI_PWEN;
 		}
		else
		{
			qspanAdr->pci_misc0 = 0x00000000;
			qspanAdr->qbsi0_ctl &= (~QSPAN_QBSI_PWEN);
		}
	}
	else
	if(image == QSPAN_PCI_CHNL1)
	{
		if(status==0x01)
		{
			/*the size of the cache line is 8*32 bit word*/
			qspanAdr->pci_misc0 = 0x00000008;
			
			qspanAdr->qbsi1_ctl |= QSPAN_QBSI_PWEN;
 		}
		else
		{
			qspanAdr->pci_misc0 = 0x00000000;
			qspanAdr->qbsi1_ctl &= (~QSPAN_QBSI_PWEN);
		}
	}
}

/*************************************************************
*sysPCISpaceAssign- assign the PCI memory and IO space 
*
*
*
*/
void sysPCISpaceAssign()
{
	UINT8 temp;
	UINT32 BusNo,DevNo,FuncNo;
	PCI_HEADER_DEVICE *pPciDev;
	for(temp =0;temp<PCI_DEVICE_NUM;temp++)
	{
		pPciDev = (PCI_HEADER_DEVICE*)PCIDeviceTable[temp];
		/*pciFindDevice(pPciDev->vendorId,pPciDev->deviceId,0,&BusNo,&DevNo,&FuncNo);*/
		pciFindDevice(0x102c,0x00c0,0,&BusNo,&DevNo,&FuncNo);
		pciDevConfig(BusNo,DevNo,FuncNo,PCIDeviceBASE[temp][0],PCIDeviceBASE[temp][1],0x0002);
	}
}
/*************************************************************
*qspanPciConfigurationRead- Read the PCI Register value 
*
*
*
*/
UINT32 qspanPciConfigurationRead(
	PQSPAN qspan,
	UINT32 cycle_type,
	UINT32 bus_num,
	UINT32 dev_num,
	UINT32 func_num,
	UINT32 reg_num
	)
{
	UINT32 addr = 0;

	/*
	 * Setup Configuration Address Register
	 */

	addr = ((bus_num << 16) & CON_ADD_BUS) |
				((dev_num << 11) & CON_ADD_DEV) |
				((func_num << 8) & CON_ADD_FUNC) |
				((reg_num << 2) & CON_ADD_REG) |
				(cycle_type & CON_ADD_TYPE);

	qspan->con_add = addr;

	/* Read data from the specified PCI configuration register */
	return qspan->con_data;
}


/*************************************************************
*sysPCISpaceAssign- assign the PCI memory and IO space 
*
*
*
*/
void qspanIOControl
	(
	PQSPAN qspanAdr,
	UINT32 status
	)
{
	UINT32 Base;

	if((status&PCI_CS_IOS)==PCI_CS_IOS)
	{	/*I/O space*/

		qspanAdr->qbsi1_ctl |= QBSI0_CTL_PAS;

		qspanAdr->pci_cs &= (~PCI_CS_MS);
		qspanAdr->pci_cs |= PCI_CS_IOS;
		
	}
	else
	if((status&PCI_CS_MS)==PCI_CS_MS)
	{	/*MEM space*/
		qspanAdr->qbsi1_ctl &= (~QBSI0_CTL_PAS);

		qspanAdr->pci_cs &= (~PCI_CS_IOS);
		qspanAdr->pci_cs |= PCI_CS_MS;
	}

	/*Set the PCI Base address*/
	Base = qspanPciConfigurationRead((PQSPAN)qspanAdr,0,0,0,0,0x04);
	qspanAdr->qbsi1_at = ((Base&QBSI_AT_TA)|QBSI_AT_BS|QBSI_AT_EN);
}












































⌨️ 快捷键说明

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